summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJörg Frings-Fürst <jff@merkur>2014-07-06 15:20:38 +0200
committerJörg Frings-Fürst <jff@merkur>2014-07-06 15:20:38 +0200
commit126bb8cb6b93240bb4d3a2b816b74c286c3d422b (patch)
treee66e1dfe77d53a52539489765c88d23e4423ae27
Imported Upstream version 1.7.0upstream/1.7.0
-rw-r--r--CHANGELOG1306
-rw-r--r--LICENSE340
-rw-r--r--README37
-rw-r--r--README.fr37
-rw-r--r--bin/gcstar358
-rwxr-xr-xinstall788
-rw-r--r--lib/gcstar/GCBackend/GCBackendXmlCommon.pm305
-rw-r--r--lib/gcstar/GCBackend/GCBackendXmlParser.pm491
-rw-r--r--lib/gcstar/GCBookmarks.pm729
-rw-r--r--lib/gcstar/GCBorrowings.pm662
-rw-r--r--lib/gcstar/GCCommandLine.pm395
-rw-r--r--lib/gcstar/GCData.pm970
-rw-r--r--lib/gcstar/GCDialogs.pm1519
-rw-r--r--lib/gcstar/GCDisplay.pm1146
-rw-r--r--lib/gcstar/GCExport.pm118
-rw-r--r--lib/gcstar/GCExport/GCExportBase.pm362
-rw-r--r--lib/gcstar/GCExport/GCExportCSV.pm198
-rw-r--r--lib/gcstar/GCExport/GCExportExternal.pm182
-rw-r--r--lib/gcstar/GCExport/GCExportHTML.pm592
-rw-r--r--lib/gcstar/GCExport/GCExportLatex.pm204
-rw-r--r--lib/gcstar/GCExport/GCExportPDB.pm295
-rw-r--r--lib/gcstar/GCExport/GCExportSQL.pm172
-rw-r--r--lib/gcstar/GCExport/GCExportTarGz.pm174
-rw-r--r--lib/gcstar/GCExport/GCExportTellico.pm512
-rw-r--r--lib/gcstar/GCExport/GCExportXML.pm287
-rw-r--r--lib/gcstar/GCExportImport.pm526
-rw-r--r--lib/gcstar/GCExtract.pm150
-rw-r--r--lib/gcstar/GCExtract/GCExtractFilms.pm476
-rw-r--r--lib/gcstar/GCExtract/GCExtractMusics.pm370
-rw-r--r--lib/gcstar/GCGenres.pm404
-rw-r--r--lib/gcstar/GCGraphicComponents/GCBaseWidgets.pm4023
-rw-r--r--lib/gcstar/GCGraphicComponents/GCDoubleLists.pm564
-rw-r--r--lib/gcstar/GCImport.pm139
-rw-r--r--lib/gcstar/GCImport/GCImportAMC.pm234
-rw-r--r--lib/gcstar/GCImport/GCImportAlexandria.pm205
-rw-r--r--lib/gcstar/GCImport/GCImportBase.pm217
-rw-r--r--lib/gcstar/GCImport/GCImportCSV.pm313
-rw-r--r--lib/gcstar/GCImport/GCImportDVDProfiler.pm192
-rw-r--r--lib/gcstar/GCImport/GCImportFolder.pm510
-rw-r--r--lib/gcstar/GCImport/GCImportGCfilms.pm190
-rw-r--r--lib/gcstar/GCImport/GCImportGCstar.pm106
-rw-r--r--lib/gcstar/GCImport/GCImportList.pm202
-rw-r--r--lib/gcstar/GCImport/GCImportMyMovies.pm211
-rw-r--r--lib/gcstar/GCImport/GCImportScanner.pm394
-rw-r--r--lib/gcstar/GCImport/GCImportTarGz.pm152
-rw-r--r--lib/gcstar/GCImport/GCImportTellico.pm496
-rw-r--r--lib/gcstar/GCItemsLists/GCImageListComponents.pm848
-rw-r--r--lib/gcstar/GCItemsLists/GCImageLists.pm2028
-rw-r--r--lib/gcstar/GCItemsLists/GCListOptions.pm496
-rw-r--r--lib/gcstar/GCItemsLists/GCTextLists.pm2101
-rw-r--r--lib/gcstar/GCLang.pm274
-rw-r--r--lib/gcstar/GCLang/AR/GCExport/GCExportCSV.pm52
-rw-r--r--lib/gcstar/GCLang/AR/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/AR/GCExport/GCExportHTML.pm76
-rw-r--r--lib/gcstar/GCLang/AR/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/AR/GCExport/GCExportSQL.pm53
-rw-r--r--lib/gcstar/GCLang/AR/GCExport/GCExportTarGz.pm49
-rw-r--r--lib/gcstar/GCLang/AR/GCExport/GCExportXML.pm53
-rw-r--r--lib/gcstar/GCLang/AR/GCImport/GCImportAlexandria.pm51
-rw-r--r--lib/gcstar/GCLang/AR/GCImport/GCImportCSV.pm55
-rw-r--r--lib/gcstar/GCLang/AR/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/AR/GCImport/GCImportGCstar.pm49
-rw-r--r--lib/gcstar/GCLang/AR/GCImport/GCImportList.pm54
-rw-r--r--lib/gcstar/GCLang/AR/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/AR/GCImport/GCImportTellico.pm49
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCbooks.pm68
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCcoins.pm102
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCfilms.pm104
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCgames.pm92
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCmusics.pm78
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/AR/GCstar.pm692
-rw-r--r--lib/gcstar/GCLang/BG/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/BG/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/BG/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/BG/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/BG/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/BG/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/BG/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/BG/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/BG/GCImport/GCImportCSV.pm43
-rw-r--r--lib/gcstar/GCLang/BG/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/BG/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/BG/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/BG/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/BG/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCbooks.pm68
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCcoins.pm102
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCfilms.pm91
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCgames.pm80
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCmusics.pm66
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/BG/GCstar.pm674
-rw-r--r--lib/gcstar/GCLang/CA/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/CA/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/CA/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/CA/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/CA/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/CA/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/CA/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/CA/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/CA/GCImport/GCImportCSV.pm43
-rw-r--r--lib/gcstar/GCLang/CA/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/CA/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/CA/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/CA/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/CA/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCTVepisodes.pm45
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCTVseries.pm55
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCbooks.pm68
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCcoins.pm102
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCfilms.pm93
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCgames.pm83
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCmusics.pm66
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/CA/GCstar.pm674
-rw-r--r--lib/gcstar/GCLang/CS/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/CS/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/CS/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/CS/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/CS/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/CS/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/CS/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/CS/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/CS/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/CS/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/CS/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/CS/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/CS/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/CS/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCbooks.pm73
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCcoins.pm107
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCfilms.pm96
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCgames.pm85
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCmusics.pm71
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCwines.pm68
-rw-r--r--lib/gcstar/GCLang/CS/GCstar.pm672
-rw-r--r--lib/gcstar/GCLang/DE/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/DE/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/DE/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/DE/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/DE/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/DE/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/DE/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/DE/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/DE/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/DE/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/DE/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/DE/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/DE/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/DE/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCTVepisodes.pm50
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCTVseries.pm53
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCboardgames.pm87
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCbooks.pm71
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCcoins.pm108
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCcomics.pm74
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCfilms.pm94
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCgames.pm82
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCminicars.pm179
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCmusics.pm69
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCperiodicals.pm56
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCsoftware.pm82
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCwines.pm65
-rw-r--r--lib/gcstar/GCLang/DE/GCstar.pm686
-rw-r--r--lib/gcstar/GCLang/EL/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/EL/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/EL/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/EL/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/EL/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/EL/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/EL/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/EL/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/EL/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/EL/GCImport/GCImportFolder.pm67
-rw-r--r--lib/gcstar/GCLang/EL/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/EL/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/EL/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/EL/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCTVepisodes.pm45
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCTVseries.pm55
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCbooks.pm70
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCcoins.pm104
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCfilms.pm93
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCgames.pm82
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCmusics.pm68
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCwines.pm84
-rw-r--r--lib/gcstar/GCLang/EL/GCstar.pm674
-rw-r--r--lib/gcstar/GCLang/EN/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/EN/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/EN/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/EN/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/EN/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/EN/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/EN/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/EN/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/EN/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/EN/GCImport/GCImportFolder.pm71
-rw-r--r--lib/gcstar/GCLang/EN/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/EN/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/EN/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/EN/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCTVepisodes.pm51
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCTVseries.pm55
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCboardgames.pm89
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCbooks.pm73
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCcoins.pm107
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCcomics.pm76
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCfilms.pm96
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCgames.pm85
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCgeneric.pm44
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCmusics.pm71
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCperiodicals.pm55
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCstamps.pm192
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCwines.pm68
-rw-r--r--lib/gcstar/GCLang/EN/GCstar.pm715
-rw-r--r--lib/gcstar/GCLang/ES/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/ES/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/ES/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/ES/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/ES/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/ES/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/ES/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/ES/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/ES/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/ES/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/ES/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/ES/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/ES/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/ES/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCTVepisodes.pm65
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCTVseries.pm69
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCboardgames.pm103
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCbooks.pm88
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCcoins.pm126
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCcomics.pm90
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCfilms.pm112
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCgames.pm99
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCgeneric.pm59
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCminicars.pm195
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCmusics.pm85
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCperiodicals.pm70
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCstamps.pm206
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCwines.pm82
-rw-r--r--lib/gcstar/GCLang/ES/GCstar.pm673
-rw-r--r--lib/gcstar/GCLang/FR/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/FR/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/FR/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/FR/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/FR/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/FR/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/FR/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/FR/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/FR/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/FR/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/FR/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/FR/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/FR/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/FR/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCTVepisodes.pm60
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCTVseries.pm60
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCboardgames.pm94
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCbooks.pm78
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCcoins.pm112
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCcomics.pm81
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCfilms.pm101
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCgames.pm92
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCgeneric.pm50
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCminicars.pm190
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCmusics.pm76
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCperiodicals.pm60
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCstamps.pm198
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCwines.pm72
-rw-r--r--lib/gcstar/GCLang/FR/GCstar.pm673
-rw-r--r--lib/gcstar/GCLang/GCLangUtils.pm56
-rw-r--r--lib/gcstar/GCLang/GL/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/GL/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/GL/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/GL/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/GL/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/GL/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/GL/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/GL/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/GL/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/GL/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/GL/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/GL/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/GL/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/GL/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCbooks.pm70
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCcoins.pm104
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCfilms.pm93
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCgames.pm82
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCmusics.pm68
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCwines.pm65
-rw-r--r--lib/gcstar/GCLang/GL/GCstar.pm674
-rw-r--r--lib/gcstar/GCLang/HU/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/HU/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/HU/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/HU/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/HU/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/HU/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/HU/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/HU/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/HU/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/HU/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/HU/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/HU/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/HU/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/HU/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCbooks.pm70
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCcoins.pm104
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCfilms.pm93
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCgames.pm82
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCmusics.pm68
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCwines.pm65
-rw-r--r--lib/gcstar/GCLang/HU/GCstar.pm673
-rw-r--r--lib/gcstar/GCLang/ID/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/ID/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/ID/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/ID/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/ID/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/ID/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/ID/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/ID/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/ID/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/ID/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/ID/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/ID/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/ID/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/ID/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCbooks.pm69
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCcoins.pm104
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCfilms.pm93
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCgames.pm81
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCmusics.pm67
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/ID/GCstar.pm673
-rw-r--r--lib/gcstar/GCLang/IT/GCExport/GCExportCSV.pm47
-rw-r--r--lib/gcstar/GCLang/IT/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/IT/GCExport/GCExportHTML.pm71
-rw-r--r--lib/gcstar/GCLang/IT/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/IT/GCExport/GCExportSQL.pm47
-rw-r--r--lib/gcstar/GCLang/IT/GCExport/GCExportTarGz.pm44
-rw-r--r--lib/gcstar/GCLang/IT/GCExport/GCExportXML.pm48
-rw-r--r--lib/gcstar/GCLang/IT/GCImport/GCImportAlexandria.pm46
-rw-r--r--lib/gcstar/GCLang/IT/GCImport/GCImportCSV.pm49
-rw-r--r--lib/gcstar/GCLang/IT/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/IT/GCImport/GCImportGCstar.pm44
-rw-r--r--lib/gcstar/GCLang/IT/GCImport/GCImportList.pm49
-rw-r--r--lib/gcstar/GCLang/IT/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/IT/GCImport/GCImportTellico.pm44
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCTVepisodes.pm48
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCTVseries.pm52
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCbooks.pm77
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCcoins.pm110
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCfilms.pm99
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCgames.pm89
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCmusics.pm75
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCwines.pm73
-rw-r--r--lib/gcstar/GCLang/IT/GCstar.pm678
-rw-r--r--lib/gcstar/GCLang/IT/README.txt9
-rw-r--r--lib/gcstar/GCLang/NL/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/NL/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/NL/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/NL/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/NL/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/NL/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/NL/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/NL/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/NL/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/NL/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/NL/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/NL/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/NL/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/NL/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCbooks.pm70
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCcoins.pm104
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCfilms.pm93
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCgames.pm82
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCmusics.pm68
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCwines.pm65
-rw-r--r--lib/gcstar/GCLang/NL/GCstar.pm671
-rw-r--r--lib/gcstar/GCLang/PL/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/PL/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/PL/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/PL/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/PL/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/PL/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/PL/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/PL/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/PL/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/PL/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/PL/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/PL/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/PL/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/PL/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCTVepisodes.pm51
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCTVseries.pm55
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCboardgames.pm89
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCbooks.pm73
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCcoins.pm107
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCfilms.pm96
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCgames.pm85
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCmusics.pm72
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCperiodicals.pm55
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCsoftware.pm86
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCwines.pm87
-rw-r--r--lib/gcstar/GCLang/PL/GCstar.pm673
-rw-r--r--lib/gcstar/GCLang/PT/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/PT/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/PT/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/PT/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/PT/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/PT/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/PT/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/PT/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/PT/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/PT/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/PT/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/PT/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/PT/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/PT/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCbooks.pm68
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCcoins.pm102
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCfilms.pm92
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCgames.pm80
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCmusics.pm66
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCwines.pm65
-rw-r--r--lib/gcstar/GCLang/PT/GCstar.pm673
-rw-r--r--lib/gcstar/GCLang/README42
-rw-r--r--lib/gcstar/GCLang/RO/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/RO/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/RO/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/RO/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/RO/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/RO/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/RO/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/RO/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/RO/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/RO/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/RO/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/RO/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/RO/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/RO/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCbooks.pm68
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCcoins.pm101
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCfilms.pm91
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCgames.pm80
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCmusics.pm66
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/RO/GCstar.pm672
-rw-r--r--lib/gcstar/GCLang/RU/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/RU/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/RU/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/RU/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/RU/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/RU/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/RU/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/RU/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/RU/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/RU/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/RU/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/RU/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/RU/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/RU/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCbooks.pm68
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCcoins.pm101
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCfilms.pm92
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCgames.pm80
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCmusics.pm66
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/RU/GCstar.pm672
-rw-r--r--lib/gcstar/GCLang/SR/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/SR/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/SR/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/SR/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/SR/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/SR/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/SR/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/SR/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/SR/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/SR/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/SR/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/SR/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/SR/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/SR/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCbooks.pm68
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCcoins.pm102
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCfilms.pm91
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCgames.pm80
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCmusics.pm66
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/SR/GCstar.pm669
-rw-r--r--lib/gcstar/GCLang/SV/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/SV/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/SV/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/SV/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/SV/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/SV/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/SV/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/SV/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/SV/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/SV/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/SV/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/SV/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/SV/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/SV/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCTVepisodes.pm45
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCTVseries.pm49
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCbooks.pm68
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCcoins.pm102
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCfilms.pm91
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCgames.pm80
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCmusics.pm66
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/SV/GCstar.pm670
-rw-r--r--lib/gcstar/GCLang/TR/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/TR/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/TR/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/TR/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/TR/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/TR/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/TR/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/TR/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/TR/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/TR/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/TR/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/TR/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/TR/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/TR/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCbooks.pm68
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCcoins.pm101
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCfilms.pm91
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCgames.pm80
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCmusics.pm66
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/TR/GCstar.pm677
-rw-r--r--lib/gcstar/GCLang/UK/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/UK/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/UK/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/UK/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/UK/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/UK/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/UK/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/UK/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/UK/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/UK/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/UK/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/UK/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/UK/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/UK/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCbooks.pm69
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCcoins.pm102
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCfilms.pm92
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCgames.pm81
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCmusics.pm66
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/UK/GCstar.pm674
-rw-r--r--lib/gcstar/GCLang/ZH/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/ZH/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/ZH/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/ZH/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/ZH/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/ZH/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/ZH/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/ZH/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/ZH/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/ZH/GCImport/GCImportFolder.pm70
-rw-r--r--lib/gcstar/GCLang/ZH/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/ZH/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/ZH/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/ZH/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCbooks.pm70
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCcoins.pm104
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCfilms.pm93
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCgames.pm82
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCgeneric.pm44
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCmusics.pm68
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCperiodicals.pm55
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCstamps.pm192
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCwines.pm65
-rw-r--r--lib/gcstar/GCLang/ZH/GCstar.pm654
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCImport/GCImportFolder.pm70
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCbooks.pm70
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCcoins.pm104
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCfilms.pm93
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCgames.pm82
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCgeneric.pm44
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCmusics.pm68
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCperiodicals.pm55
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCstamps.pm192
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCwines.pm65
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCstar.pm653
-rw-r--r--lib/gcstar/GCMail.pm474
-rw-r--r--lib/gcstar/GCMainWindow.pm4124
-rw-r--r--lib/gcstar/GCMenu.pm1840
-rw-r--r--lib/gcstar/GCModel.pm2896
-rw-r--r--lib/gcstar/GCModels/GCTVepisodes.gcm390
-rw-r--r--lib/gcstar/GCModels/GCTVseries.gcm417
-rw-r--r--lib/gcstar/GCModels/GCboardgames.gcm478
-rw-r--r--lib/gcstar/GCModels/GCbooks.gcm278
-rw-r--r--lib/gcstar/GCModels/GCcoins.gcm275
-rw-r--r--lib/gcstar/GCModels/GCcomics.gcm353
-rw-r--r--lib/gcstar/GCModels/GCfilms.gcm604
-rw-r--r--lib/gcstar/GCModels/GCgames.gcm492
-rw-r--r--lib/gcstar/GCModels/GCminicars.gcm892
-rw-r--r--lib/gcstar/GCModels/GCmusics.gcm250
-rw-r--r--lib/gcstar/GCModels/GCperiodicals.gcm105
-rw-r--r--lib/gcstar/GCModels/GCsmartcards.gcm379
-rw-r--r--lib/gcstar/GCModels/GCsoftware.gcm438
-rw-r--r--lib/gcstar/GCModels/GCstamps.gcm702
-rw-r--r--lib/gcstar/GCModels/GCwines.gcm356
-rw-r--r--lib/gcstar/GCOptions.pm1670
-rw-r--r--lib/gcstar/GCPanel.pm1540
-rw-r--r--lib/gcstar/GCPlugins.pm1783
-rw-r--r--lib/gcstar/GCPlugins/GCPluginsBase.pm396
-rw-r--r--lib/gcstar/GCPlugins/GCTVepisodes/GCTVepisodesCommon.pm67
-rw-r--r--lib/gcstar/GCPlugins/GCTVepisodes/GCTvdb.pm360
-rw-r--r--lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbES.pm61
-rw-r--r--lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbFR.pm61
-rw-r--r--lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbIT.pm60
-rw-r--r--lib/gcstar/GCPlugins/GCTVseries/GCTVseriesCommon.pm53
-rw-r--r--lib/gcstar/GCPlugins/GCTVseries/GCThemoviedb.pm340
-rw-r--r--lib/gcstar/GCPlugins/GCTVseries/GCTvdb.pm466
-rw-r--r--lib/gcstar/GCPlugins/GCTVseries/GCTvdbES.pm61
-rw-r--r--lib/gcstar/GCPlugins/GCTVseries/GCTvdbFR.pm61
-rw-r--r--lib/gcstar/GCPlugins/GCTVseries/GCTvdbIT.pm60
-rw-r--r--lib/gcstar/GCPlugins/GCboardgames/GCReservoirJeux.pm418
-rw-r--r--lib/gcstar/GCPlugins/GCboardgames/GCboardgamegeek.pm278
-rw-r--r--lib/gcstar/GCPlugins/GCboardgames/GCboardgamesCommon.pm58
-rw-r--r--lib/gcstar/GCPlugins/GCboardgames/GCtrictrac.pm462
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCAdlibrisFI.pm59
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCAdlibrisSV.pm59
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCAlapage.pm391
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCAmazon.pm352
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCAmazonCA.pm61
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCAmazonDE.pm56
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCAmazonFR.pm57
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCAmazonUK.pm61
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCBDGest.pm477
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCBibliotekaNarodowa.pm374
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCBokkilden.pm295
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCBol.pm485
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCBuscape.pm479
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCCasadelibro.pm420
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCChapitre.pm430
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCDoubanbook.pm238
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCFnac.pm462
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCFnacPT.pm390
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCISBNdb.pm370
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCInternetBokHandeln.pm464
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCInternetBookShop.pm376
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCLeLivre.pm334
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCLiberOnWeb.pm418
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCMareno.pm365
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCMediabooks.pm333
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCMerlin.pm389
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCNUKat.pm447
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCNooSFere.pm462
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCSaraiva.pm303
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCbooksAdlibrisCommon.pm331
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCbooksAmazonCommon.pm65
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCbooksCommon.pm61
-rw-r--r--lib/gcstar/GCPlugins/GCcomics/GCbedetheque.pm398
-rw-r--r--lib/gcstar/GCPlugins/GCcomics/GCcomicbookdb.pm546
-rw-r--r--lib/gcstar/GCPlugins/GCcomics/GCcomicsCommon.pm49
-rw-r--r--lib/gcstar/GCPlugins/GCcomics/GCmangasanctuary.pm503
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAlapage.pm267
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAllmovie.pm431
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAllocine.pm403
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAlpacineES.pm435
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAmazon.pm281
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAmazonDE.pm291
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAmazonFR.pm304
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAmazonUK.pm264
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAniDB.pm279
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAnimator.pm236
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAnimeNfoA.pm266
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAnimeka.pm295
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCBeyazPerde.pm340
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCCartelesPeliculasES.pm351
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCCinemaClock.pm271
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCCinemotions.pm284
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCCsfd.pm699
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCCulturalia.pm241
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCDVDEmpire.pm427
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCDVDFr.pm374
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCDVDPost.pm269
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCDicshop.pm343
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCDoubanfilm.pm255
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCFilmAffinityEN.pm334
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCFilmAffinityES.pm334
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCFilmUP.pm252
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCFilmWeb.pm369
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCIbs.pm409
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCImdb.pm439
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCKinopoisk.pm386
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCMediadis.pm316
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCMetropoliES.pm382
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCMonsieurCinema.pm272
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCMovieMeter.pm429
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCMoviecovers.pm246
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCNasheKino.pm222
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCOFDb.pm304
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCOdeonHU.pm305
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCOnet.pm327
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCPortHU.pm343
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCStopklatka.pm355
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCThemoviedb.pm337
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCThemoviedbDE.pm56
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCThemoviedbES.pm56
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCThemoviedbFR.pm56
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCfilmsAmazonCommon.pm59
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCfilmsCommon.pm70
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCAlapage.pm262
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCAmazon.pm115
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCAmazonCA.pm115
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCAmazonDE.pm114
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCAmazonFR.pm118
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCAmazonJP.pm120
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCAmazonUK.pm115
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCDicoDuNet.pm291
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCGameSpot.pm490
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCJeuxVideoCom.pm447
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCJeuxVideoFr.pm425
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCLudus.pm367
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCMobyGames.pm541
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCNextGame.pm480
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCTheLegacy.pm316
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCgamesAmazonCommon.pm314
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCgamesCommon.pm87
-rw-r--r--lib/gcstar/GCPlugins/GCmusics/GCDiscogs.pm333
-rw-r--r--lib/gcstar/GCPlugins/GCmusics/GCDoubanmusic.pm238
-rw-r--r--lib/gcstar/GCPlugins/GCmusics/GCMusicBrainz.pm309
-rw-r--r--lib/gcstar/GCPlugins/GCmusics/GCmusicsCommon.pm62
-rw-r--r--lib/gcstar/GCPlugins/GCstar/GCAmazonCommon.pm132
-rw-r--r--lib/gcstar/GCSplash.pm241
-rw-r--r--lib/gcstar/GCStats.pm464
-rw-r--r--lib/gcstar/GCStyle.pm67
-rw-r--r--lib/gcstar/GCUpdater.pm174
-rw-r--r--lib/gcstar/GCUtils.pm640
-rw-r--r--lib/gcstar/GCWidgets.pm429
-rw-r--r--man/gcstar.192
-rw-r--r--packages/GCstar_Packaging_Policy.txt33
-rw-r--r--packages/debian/changelog5
-rw-r--r--packages/debian/compat1
-rw-r--r--packages/debian/control25
-rw-r--r--packages/debian/copyright26
-rw-r--r--packages/debian/dirs1
-rw-r--r--packages/debian/docs3
-rw-r--r--packages/debian/gcstar.install2
-rw-r--r--packages/debian/gcstar_logo.xpm291
-rw-r--r--packages/debian/lintian/gcstar2
-rw-r--r--packages/debian/menu1
-rw-r--r--packages/debian/patches/00list5
-rw-r--r--packages/debian/patches/01-set_usr_lib.dpatch26
-rw-r--r--packages/debian/patches/02gzip-manpage.dpatch19
-rw-r--r--packages/debian/patches/03_change_default_browser.dpatch19
-rw-r--r--packages/debian/patches/04-install-set_usr_lib.dpatch21
-rw-r--r--packages/debian/patches/07_fix_manpath.dpatch19
-rw-r--r--packages/debian/postinst8
-rw-r--r--packages/debian/postrm8
-rw-r--r--packages/debian/rules112
-rw-r--r--packages/fedora/gcstar.spec111
-rw-r--r--packages/rpm/gcstar.spec41
-rw-r--r--packages/win32/createExe.bat1
-rw-r--r--packages/win32/gcs_lang.nsh65
-rw-r--r--packages/win32/gcstar.bat3
-rw-r--r--packages/win32/gcstar.nsi362
-rw-r--r--packages/win32/img/banner_left.bmpbin0 -> 154542 bytes
-rw-r--r--packages/win32/img/banner_top.bmpbin0 -> 34256 bytes
-rw-r--r--packages/win32/img/checks.bmpbin0 -> 2614 bytes
-rw-r--r--packages/win32/img/icon_install.icobin0 -> 16958 bytes
-rw-r--r--packages/win32/img/icon_uninstall.icobin0 -> 16958 bytes
-rw-r--r--packages/win32/img/uninstall_top.bmpbin0 -> 34256 bytes
-rw-r--r--packages/win32/img/website.icobin0 -> 9662 bytes
-rw-r--r--packages/win32/langs/gcs_Bulgarian.nsh70
-rw-r--r--packages/win32/langs/gcs_Czech.nsh70
-rw-r--r--packages/win32/langs/gcs_English.nsh70
-rw-r--r--packages/win32/langs/gcs_French.nsh68
-rw-r--r--packages/win32/langs/gcs_German.nsh70
-rw-r--r--packages/win32/langs/gcs_Italian.nsh70
-rw-r--r--packages/win32/langs/gcs_Polish.nsh70
-rw-r--r--packages/win32/langs/gcs_Romanian.nsh70
-rw-r--r--packages/win32/langs/gcs_Russian.nsh70
-rw-r--r--packages/win32/langs/gcs_SerbianLatin.nsh70
-rw-r--r--packages/win32/langs/gcs_Spanish.nsh70
-rw-r--r--packages/win32/langs/gcs_Turkish.nsh70
-rw-r--r--packages/win32/update.bat4
-rw-r--r--share/applications/gcstar-thumbnailer260
-rw-r--r--share/applications/gcstar.desktop18
-rw-r--r--share/applications/gcstar.xml7
-rw-r--r--share/gcstar/LICENSE340
-rw-r--r--share/gcstar/fonts/AUTHORS8
-rw-r--r--share/gcstar/fonts/COPYING340
-rw-r--r--share/gcstar/fonts/ChangeLog176
-rw-r--r--share/gcstar/fonts/LiberationSans-Regular.ttfbin0 -> 140600 bytes
-rw-r--r--share/gcstar/fonts/License.txt19
-rw-r--r--share/gcstar/fonts/README90
-rw-r--r--share/gcstar/genres/EN.genres12
-rw-r--r--share/gcstar/genres/ES.genres12
-rw-r--r--share/gcstar/genres/FR.genres4
-rw-r--r--share/gcstar/helpers/xdg-open469
-rw-r--r--share/gcstar/html_models/GCboardgames/piwi275
-rw-r--r--share/gcstar/html_models/GCboardgames/piwi.pngbin0 -> 50926 bytes
-rw-r--r--share/gcstar/html_models/GCbooks/FloFred73
-rw-r--r--share/gcstar/html_models/GCbooks/FloFred.pngbin0 -> 69747 bytes
-rw-r--r--share/gcstar/html_models/GCbooks/NellistosDark67
-rw-r--r--share/gcstar/html_models/GCbooks/NellistosDark.pngbin0 -> 26138 bytes
-rw-r--r--share/gcstar/html_models/GCbooks/NellistosLight66
-rw-r--r--share/gcstar/html_models/GCbooks/NellistosLight.pngbin0 -> 30503 bytes
-rw-r--r--share/gcstar/html_models/GCbooks/Shelf12
-rw-r--r--share/gcstar/html_models/GCbooks/Shelf.pngbin0 -> 62375 bytes
-rw-r--r--share/gcstar/html_models/GCbooks/Simple10
-rw-r--r--share/gcstar/html_models/GCbooks/Simple.pngbin0 -> 29817 bytes
-rw-r--r--share/gcstar/html_models/GCcoins/Simple11
-rw-r--r--share/gcstar/html_models/GCcoins/Simple.pngbin0 -> 20252 bytes
-rw-r--r--share/gcstar/html_models/GCfilms/Flat109
-rw-r--r--share/gcstar/html_models/GCfilms/Flat.pngbin0 -> 77945 bytes
-rw-r--r--share/gcstar/html_models/GCfilms/Shelf284
-rw-r--r--share/gcstar/html_models/GCfilms/Shelf.pngbin0 -> 86073 bytes
-rw-r--r--share/gcstar/html_models/GCfilms/Simple100
-rw-r--r--share/gcstar/html_models/GCfilms/Simple.pngbin0 -> 28419 bytes
-rw-r--r--share/gcstar/html_models/GCfilms/Tabs245
-rw-r--r--share/gcstar/html_models/GCfilms/Tabs.pngbin0 -> 51681 bytes
-rw-r--r--share/gcstar/html_models/GCfilms/Tian276
-rw-r--r--share/gcstar/html_models/GCfilms/Tian-Mario276
-rw-r--r--share/gcstar/html_models/GCfilms/Tian-Mario-Kim281
-rw-r--r--share/gcstar/html_models/GCfilms/Tian-Mario.pngbin0 -> 30879 bytes
-rw-r--r--share/gcstar/html_models/GCfilms/Tian.pngbin0 -> 43774 bytes
-rw-r--r--share/gcstar/html_models/GCfilms/float120
-rw-r--r--share/gcstar/html_models/GCfilms/float.pngbin0 -> 67698 bytes
-rw-r--r--share/gcstar/html_models/GCfilms/rootII_design118
-rw-r--r--share/gcstar/html_models/GCfilms/rootII_design.pngbin0 -> 49787 bytes
-rw-r--r--share/gcstar/html_models/GCgames/Flat111
-rw-r--r--share/gcstar/html_models/GCgames/Flat.pngbin0 -> 91347 bytes
-rw-r--r--share/gcstar/html_models/GCgames/Simple10
-rw-r--r--share/gcstar/html_models/GCgames/Simple.pngbin0 -> 28909 bytes
-rw-r--r--share/gcstar/html_models/GCgames/Tabs284
-rw-r--r--share/gcstar/html_models/GCgames/Tabs.pngbin0 -> 46938 bytes
-rw-r--r--share/gcstar/html_models/GCminicars/Tian-Jim279
-rw-r--r--share/gcstar/html_models/GCminicars/Tian-Jim.pngbin0 -> 39085 bytes
-rw-r--r--share/gcstar/html_models/GCmusics/Shelf298
-rw-r--r--share/gcstar/html_models/GCmusics/Shelf.pngbin0 -> 62357 bytes
-rw-r--r--share/gcstar/html_models/GCmusics/Simple10
-rw-r--r--share/gcstar/html_models/GCmusics/Simple.pngbin0 -> 24463 bytes
-rw-r--r--share/gcstar/html_models/GCstar/Shelf282
-rw-r--r--share/gcstar/html_models/GCstar/Shelf.pngbin0 -> 86073 bytes
-rw-r--r--share/gcstar/html_models/GCstar/Simple96
-rw-r--r--share/gcstar/html_models/GCstar/Simple.pngbin0 -> 28419 bytes
-rw-r--r--share/gcstar/icons/GCstar.icobin0 -> 25214 bytes
-rw-r--r--share/gcstar/icons/gcstar_128x128.pngbin0 -> 13072 bytes
-rw-r--r--share/gcstar/icons/gcstar_16x16.pngbin0 -> 838 bytes
-rw-r--r--share/gcstar/icons/gcstar_192x192.pngbin0 -> 21943 bytes
-rw-r--r--share/gcstar/icons/gcstar_22x22.pngbin0 -> 1266 bytes
-rw-r--r--share/gcstar/icons/gcstar_24x24.pngbin0 -> 1419 bytes
-rw-r--r--share/gcstar/icons/gcstar_256x256.pngbin0 -> 32260 bytes
-rw-r--r--share/gcstar/icons/gcstar_32x32.pngbin0 -> 2018 bytes
-rw-r--r--share/gcstar/icons/gcstar_36x36.pngbin0 -> 2398 bytes
-rw-r--r--share/gcstar/icons/gcstar_48x48.pngbin0 -> 3528 bytes
-rw-r--r--share/gcstar/icons/gcstar_64x64.pngbin0 -> 5092 bytes
-rw-r--r--share/gcstar/icons/gcstar_72x72.pngbin0 -> 6158 bytes
-rw-r--r--share/gcstar/icons/gcstar_96x96.pngbin0 -> 9134 bytes
-rw-r--r--share/gcstar/icons/gcstar_scalable.svg354
-rw-r--r--share/gcstar/icons/icon_install.icobin0 -> 16958 bytes
-rw-r--r--share/gcstar/icons/star.pngbin0 -> 982 bytes
-rw-r--r--share/gcstar/icons/star_hover.pngbin0 -> 1515 bytes
-rw-r--r--share/gcstar/icons/stardark.pngbin0 -> 1056 bytes
-rw-r--r--share/gcstar/icons/stardark_hover.pngbin0 -> 1553 bytes
-rw-r--r--share/gcstar/icons/web.icobin0 -> 9662 bytes
-rw-r--r--share/gcstar/list_bg/Box/group.pngbin0 -> 14419 bytes
-rw-r--r--share/gcstar/list_bg/Box/list_bg.pngbin0 -> 34117 bytes
-rw-r--r--share/gcstar/list_bg/Box/style2
-rw-r--r--share/gcstar/list_bg/Brick_and_Glass/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Brick_and_Glass/list_bg.pngbin0 -> 103747 bytes
-rw-r--r--share/gcstar/list_bg/Brick_and_Glass/list_fg.pngbin0 -> 18630 bytes
-rw-r--r--share/gcstar/list_bg/Brick_and_Glass/style3
-rw-r--r--share/gcstar/list_bg/Dark_Glass/group.pngbin0 -> 269 bytes
-rw-r--r--share/gcstar/list_bg/Dark_Glass/list_bg.pngbin0 -> 8186 bytes
-rw-r--r--share/gcstar/list_bg/Dark_Glass/list_fg.pngbin0 -> 10759 bytes
-rw-r--r--share/gcstar/list_bg/Dark_Glass/style4
-rw-r--r--share/gcstar/list_bg/Glass/group.pngbin0 -> 1161 bytes
-rw-r--r--share/gcstar/list_bg/Glass/list_bg.pngbin0 -> 1862 bytes
-rw-r--r--share/gcstar/list_bg/Glass/list_fg.pngbin0 -> 3170 bytes
-rw-r--r--share/gcstar/list_bg/Glass/style3
-rw-r--r--share/gcstar/list_bg/Green_Glass/group.pngbin0 -> 3279 bytes
-rw-r--r--share/gcstar/list_bg/Green_Glass/list_bg.pngbin0 -> 887 bytes
-rw-r--r--share/gcstar/list_bg/Green_Glass/list_fg.pngbin0 -> 2456 bytes
-rw-r--r--share/gcstar/list_bg/Green_Glass/style3
-rw-r--r--share/gcstar/list_bg/Luxury_Green_Glass/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Green_Glass/list_bg.pngbin0 -> 69106 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Green_Glass/list_fg.pngbin0 -> 13544 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Green_Glass/style3
-rw-r--r--share/gcstar/list_bg/Luxury_Green_Wood/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Green_Wood/list_bg.pngbin0 -> 65944 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Green_Wood/list_fg.pngbin0 -> 50584 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Green_Wood/style3
-rw-r--r--share/gcstar/list_bg/Luxury_Grey_Glass/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Grey_Glass/list_bg.pngbin0 -> 57581 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Grey_Glass/list_fg.pngbin0 -> 15128 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Grey_Glass/style3
-rw-r--r--share/gcstar/list_bg/Luxury_Grey_Wood/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Grey_Wood/list_bg.pngbin0 -> 52404 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Grey_Wood/list_fg.pngbin0 -> 50584 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Grey_Wood/style3
-rw-r--r--share/gcstar/list_bg/Luxury_Purple_Glass/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Purple_Glass/list_bg.pngbin0 -> 69863 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Purple_Glass/list_fg.pngbin0 -> 13837 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Purple_Glass/style3
-rw-r--r--share/gcstar/list_bg/Luxury_Purple_Wood/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Purple_Wood/list_bg.pngbin0 -> 66207 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Purple_Wood/list_fg.pngbin0 -> 50584 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Purple_Wood/style3
-rw-r--r--share/gcstar/list_bg/Luxury_Red_Glass/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Red_Glass/list_bg.pngbin0 -> 72062 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Red_Glass/list_fg.pngbin0 -> 14708 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Red_Glass/style3
-rw-r--r--share/gcstar/list_bg/Luxury_Red_Wood/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Red_Wood/list_bg.pngbin0 -> 66125 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Red_Wood/list_fg.pngbin0 -> 50584 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Red_Wood/style3
-rw-r--r--share/gcstar/list_bg/Marble/group.pngbin0 -> 18033 bytes
-rw-r--r--share/gcstar/list_bg/Marble/list_bg.pngbin0 -> 38610 bytes
-rw-r--r--share/gcstar/list_bg/Marble/style2
-rw-r--r--share/gcstar/list_bg/Wood/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Wood/list_bg.pngbin0 -> 48015 bytes
-rw-r--r--share/gcstar/list_bg/Wood/list_fg.pngbin0 -> 48914 bytes
-rw-r--r--share/gcstar/list_bg/Wood/style3
-rw-r--r--share/gcstar/list_bg/Wood2/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Wood2/list_bg.pngbin0 -> 49505 bytes
-rw-r--r--share/gcstar/list_bg/Wood2/list_fg.pngbin0 -> 50584 bytes
-rw-r--r--share/gcstar/list_bg/Wood2/style3
-rw-r--r--share/gcstar/list_bg/Wood_and_Glass/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Wood_and_Glass/list_bg.pngbin0 -> 53072 bytes
-rw-r--r--share/gcstar/list_bg/Wood_and_Glass/list_fg.pngbin0 -> 9708 bytes
-rw-r--r--share/gcstar/list_bg/Wood_and_Glass/style3
-rw-r--r--share/gcstar/logos/Peri.pngbin0 -> 11580 bytes
-rw-r--r--share/gcstar/logos/Peri_main_logo.pngbin0 -> 18759 bytes
-rw-r--r--share/gcstar/logos/Peri_main_logo.svg3436
-rw-r--r--share/gcstar/logos/about.pngbin0 -> 13470 bytes
-rw-r--r--share/gcstar/logos/bg_no.pngbin0 -> 7541 bytes
-rw-r--r--share/gcstar/logos/book_no.pngbin0 -> 7141 bytes
-rw-r--r--share/gcstar/logos/button.pngbin0 -> 3528 bytes
-rw-r--r--share/gcstar/logos/cd_no.pngbin0 -> 5234 bytes
-rw-r--r--share/gcstar/logos/film_no.pngbin0 -> 9744 bytes
-rw-r--r--share/gcstar/logos/find.pngbin0 -> 1258 bytes
-rw-r--r--share/gcstar/logos/install.pngbin0 -> 4087 bytes
-rw-r--r--share/gcstar/logos/no.pngbin0 -> 10747 bytes
-rw-r--r--share/gcstar/logos/no_minicars.pngbin0 -> 34678 bytes
-rw-r--r--share/gcstar/logos/no_smartcards.pngbin0 -> 30332 bytes
-rw-r--r--share/gcstar/logos/no_stamp.pngbin0 -> 14581 bytes
-rw-r--r--share/gcstar/logos/periscope_main_logo.svg1230
-rw-r--r--share/gcstar/logos/splash.pngbin0 -> 7061 bytes
-rw-r--r--share/gcstar/overlays/canevas-timbre.pngbin0 -> 28427 bytes
-rw-r--r--share/gcstar/overlays/cd.pngbin0 -> 12950 bytes
-rw-r--r--share/gcstar/overlays/dvd.pngbin0 -> 9206 bytes
-rw-r--r--share/gcstar/overlays/favourite_large.pngbin0 -> 2209 bytes
-rw-r--r--share/gcstar/overlays/favourite_med.pngbin0 -> 1480 bytes
-rw-r--r--share/gcstar/overlays/favourite_small.pngbin0 -> 1156 bytes
-rw-r--r--share/gcstar/overlays/favourite_verysmall.pngbin0 -> 868 bytes
-rw-r--r--share/gcstar/overlays/favourite_xlarge.pngbin0 -> 3713 bytes
-rw-r--r--share/gcstar/overlays/film.pngbin0 -> 34689 bytes
-rw-r--r--share/gcstar/overlays/flip.pngbin0 -> 1734 bytes
-rw-r--r--share/gcstar/overlays/flip2.pngbin0 -> 1745 bytes
-rw-r--r--share/gcstar/overlays/lend_large.pngbin0 -> 1743 bytes
-rw-r--r--share/gcstar/overlays/lend_med.pngbin0 -> 1250 bytes
-rw-r--r--share/gcstar/overlays/lend_small.pngbin0 -> 1003 bytes
-rw-r--r--share/gcstar/overlays/lend_verysmall.pngbin0 -> 744 bytes
-rw-r--r--share/gcstar/overlays/lend_xlarge.pngbin0 -> 2956 bytes
-rw-r--r--share/gcstar/overlays/minicars.pngbin0 -> 1554 bytes
-rw-r--r--share/gcstar/overlays/subtle.pngbin0 -> 8322 bytes
-rw-r--r--share/gcstar/panels/Classic29
-rw-r--r--share/gcstar/panels/Dark29
-rw-r--r--share/gcstar/panels/WebSite29
-rw-r--r--share/gcstar/schemas/gcm.xsd291
-rw-r--r--share/gcstar/style/GCstar/gtkrc277
-rw-r--r--share/gcstar/style/GCstar/icons/about/16x16.pngbin0 -> 903 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/about/64x64.pngbin0 -> 5254 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/add/16x16.pngbin0 -> 700 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/add/24x24.pngbin0 -> 1404 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/add/32x32.pngbin0 -> 1782 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/cancel/24x24.pngbin0 -> 1469 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/cancel/32x32.pngbin0 -> 2582 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/clear/24x24.pngbin0 -> 1644 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/clear/32x32.pngbin0 -> 2509 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/convert/16x16.pngbin0 -> 750 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/convert/24x24.pngbin0 -> 1547 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/convert/32x32.pngbin0 -> 2330 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/delete/16x16.pngbin0 -> 946 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/delete/24x24.pngbin0 -> 1855 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/delete/32x32.pngbin0 -> 2815 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/directory/32x32.pngbin0 -> 2052 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/dnd/16x16.pngbin0 -> 818 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/error/64x64.pngbin0 -> 4918 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/execute/16x16.pngbin0 -> 936 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/execute/24x24.pngbin0 -> 1772 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/execute/32x32.pngbin0 -> 2729 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/find/16x16.pngbin0 -> 871 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/find/24x24.pngbin0 -> 1700 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/find/32x32.pngbin0 -> 2489 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/go-back/16x16.pngbin0 -> 387 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/go-back/24x24.pngbin0 -> 572 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/go-down/16x16.pngbin0 -> 402 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/go-down/24x24.pngbin0 -> 616 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/go-forward/16x16.pngbin0 -> 380 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/go-forward/24x24.pngbin0 -> 593 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/go-up/16x16.pngbin0 -> 308 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/go-up/24x24.pngbin0 -> 571 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/help/16x16.pngbin0 -> 923 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/help/32x32.pngbin0 -> 2326 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/help/64x64.pngbin0 -> 5393 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/home/32x32.pngbin0 -> 2771 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/jump-to/24x24.pngbin0 -> 1850 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/jump-to/32x32.pngbin0 -> 2835 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/media-next/24x24.pngbin0 -> 1195 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/media-next/32x32.pngbin0 -> 1751 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/media-play/16x16.pngbin0 -> 704 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/media-play/24x24.pngbin0 -> 1050 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/media-play/32x32.pngbin0 -> 1401 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/network/32x32.pngbin0 -> 2631 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/new/16x16.pngbin0 -> 475 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/new/24x24.pngbin0 -> 775 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/new/32x32.pngbin0 -> 999 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/ok/24x24.pngbin0 -> 1589 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/ok/32x32.pngbin0 -> 2365 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/open/16x16.pngbin0 -> 562 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/open/24x24.pngbin0 -> 1546 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/open/32x32.pngbin0 -> 2311 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/preferences/16x16.pngbin0 -> 3535 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/preferences/24x24.pngbin0 -> 1553 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/preferences/32x32.pngbin0 -> 2764 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/properties/24x24.pngbin0 -> 1893 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/properties/32x32.pngbin0 -> 3048 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/quit/16x16.pngbin0 -> 1039 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/quit/32x32.pngbin0 -> 3118 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/refresh/16x16.pngbin0 -> 983 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/refresh/24x24.pngbin0 -> 1760 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/refresh/32x32.pngbin0 -> 2846 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/remove/24x24.pngbin0 -> 480 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/remove/32x32.pngbin0 -> 625 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/revert-to-saved/16x16.pngbin0 -> 736 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/revert-to-saved/24x24.pngbin0 -> 1473 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/revert-to-saved/32x32.pngbin0 -> 2247 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/save-as/16x16.pngbin0 -> 674 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/save-as/24x24.pngbin0 -> 1410 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/save-as/32x32.pngbin0 -> 1957 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/save/16x16.pngbin0 -> 515 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/save/24x24.pngbin0 -> 1166 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/save/32x32.pngbin0 -> 1512 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/select-color/32x32.pngbin0 -> 1904 bytes
-rw-r--r--share/gcstar/style/GCstar/lend.pngbin0 -> 2910 bytes
-rw-r--r--share/gcstar/style/Gtk/gtkrc1
-rw-r--r--share/gcstar/style/Gtk/lend.pngbin0 -> 2910 bytes
-rw-r--r--share/gcstar/style/kde/active.pngbin0 -> 676 bytes
-rw-r--r--share/gcstar/style/kde/active2.pngbin0 -> 176 bytes
-rw-r--r--share/gcstar/style/kde/add.pngbin0 -> 1165 bytes
-rw-r--r--share/gcstar/style/kde/arrowdown.pngbin0 -> 234 bytes
-rw-r--r--share/gcstar/style/kde/arrowleft.pngbin0 -> 203 bytes
-rw-r--r--share/gcstar/style/kde/arrowright.pngbin0 -> 204 bytes
-rw-r--r--share/gcstar/style/kde/arrowup.pngbin0 -> 235 bytes
-rw-r--r--share/gcstar/style/kde/bghonrizontalscroll.pngbin0 -> 212 bytes
-rw-r--r--share/gcstar/style/kde/bgverticalscroll.pngbin0 -> 209 bytes
-rw-r--r--share/gcstar/style/kde/box.pngbin0 -> 4412 bytes
-rw-r--r--share/gcstar/style/kde/box2.pngbin0 -> 935 bytes
-rw-r--r--share/gcstar/style/kde/box3.pngbin0 -> 893 bytes
-rw-r--r--share/gcstar/style/kde/cancel.pngbin0 -> 1468 bytes
-rw-r--r--share/gcstar/style/kde/cdrom.pngbin0 -> 5400 bytes
-rw-r--r--share/gcstar/style/kde/checked.pngbin0 -> 638 bytes
-rw-r--r--share/gcstar/style/kde/clear.pngbin0 -> 929 bytes
-rw-r--r--share/gcstar/style/kde/delete.pngbin0 -> 1591 bytes
-rw-r--r--share/gcstar/style/kde/display.pngbin0 -> 4134 bytes
-rw-r--r--share/gcstar/style/kde/exec.pngbin0 -> 6440 bytes
-rw-r--r--share/gcstar/style/kde/export.pngbin0 -> 2683 bytes
-rw-r--r--share/gcstar/style/kde/find.pngbin0 -> 7340 bytes
-rw-r--r--share/gcstar/style/kde/gtkrc746
-rw-r--r--share/gcstar/style/kde/gtkrcold253
-rw-r--r--share/gcstar/style/kde/harddisk.pngbin0 -> 1902 bytes
-rw-r--r--share/gcstar/style/kde/help.pngbin0 -> 1587 bytes
-rw-r--r--share/gcstar/style/kde/home.pngbin0 -> 5039 bytes
-rw-r--r--share/gcstar/style/kde/horizontal.pngbin0 -> 388 bytes
-rw-r--r--share/gcstar/style/kde/horizontal_hover.pngbin0 -> 420 bytes
-rw-r--r--share/gcstar/style/kde/import.pngbin0 -> 5185 bytes
-rw-r--r--share/gcstar/style/kde/internet.pngbin0 -> 7129 bytes
-rw-r--r--share/gcstar/style/kde/khelpcenter.pngbin0 -> 4107 bytes
-rw-r--r--share/gcstar/style/kde/lend.pngbin0 -> 1841 bytes
-rw-r--r--share/gcstar/style/kde/new.pngbin0 -> 902 bytes
-rw-r--r--share/gcstar/style/kde/ok.pngbin0 -> 1393 bytes
-rw-r--r--share/gcstar/style/kde/open.pngbin0 -> 2232 bytes
-rw-r--r--share/gcstar/style/kde/paths.pngbin0 -> 1944 bytes
-rw-r--r--share/gcstar/style/kde/preferences.pngbin0 -> 5104 bytes
-rw-r--r--share/gcstar/style/kde/properties.pngbin0 -> 4711 bytes
-rw-r--r--share/gcstar/style/kde/quit.pngbin0 -> 2238 bytes
-rw-r--r--share/gcstar/style/kde/radiochecked.pngbin0 -> 512 bytes
-rw-r--r--share/gcstar/style/kde/radiounchecked.pngbin0 -> 476 bytes
-rw-r--r--share/gcstar/style/kde/refresh.pngbin0 -> 1545 bytes
-rw-r--r--share/gcstar/style/kde/remove.pngbin0 -> 267 bytes
-rw-r--r--share/gcstar/style/kde/save.pngbin0 -> 1348 bytes
-rw-r--r--share/gcstar/style/kde/saveas.pngbin0 -> 2069 bytes
-rw-r--r--share/gcstar/style/kde/sortdown.pngbin0 -> 1604 bytes
-rw-r--r--share/gcstar/style/kde/sortup.pngbin0 -> 1595 bytes
-rw-r--r--share/gcstar/style/kde/spindown.pngbin0 -> 173 bytes
-rw-r--r--share/gcstar/style/kde/spinup.pngbin0 -> 173 bytes
-rw-r--r--share/gcstar/style/kde/tab_corner.pngbin0 -> 177 bytes
-rw-r--r--share/gcstar/style/kde/tonight.pngbin0 -> 1509 bytes
-rw-r--r--share/gcstar/style/kde/unchecked.pngbin0 -> 639 bytes
-rw-r--r--share/gcstar/style/kde/vertical.pngbin0 -> 414 bytes
-rw-r--r--share/gcstar/style/kde/vertical_hover.pngbin0 -> 376 bytes
-rw-r--r--share/gcstar/xml_models/GCfilms/Ant_Movie_Catalog31
-rw-r--r--share/gcstar/xml_models/GCfilms/DVDProfiler151
-rw-r--r--share/gcstar/xslt/applyXSLT.pl13
-rw-r--r--share/gcstar/xslt/createGCSValidator.xsl165
-rw-r--r--templates/GCExportTemplate.pm264
-rw-r--r--templates/GCImportTemplate.pm212
-rw-r--r--templates/GCSiteTemplate.pm271
1319 files changed, 166023 insertions, 0 deletions
diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
index 0000000..761147d
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,1306 @@
+1.7.0
+
+ * New translations
+ - Chinese (Simplified) translation added thanks to 林雪凡.
+
+ * User interface changes
+ - All the settings for the current type of list can be changed directly
+ below the list, on the bottom left of the application. By default,
+ the settings panel is hidden, but it can be shown by dragging the
+ separator.
+ - It's now possible to define default values for the fields when adding
+ a new item to a collection.
+ - New menu to show/hide menu, tool and status bars. This also appears
+ in the context menu shown when right-clicking on an element in the
+ list. It contains an option to use fullscreen mode.
+ - Slight animations have been added in image mode.
+ - A popup is displayed in image mode to show a summary of the item.
+
+ * Bugs fixed
+ - There was a bug when saving an item which date is the current one.
+ - The list of saved searches in toolbar was not reset when displaying
+ all collection items.
+ - Ranges were not handled correctly when searching.
+ - With collections of video games, the units field was not hidden if
+ user chose to hide file size.
+ - In image mode, some items were not displayed correctly when grouping.
+ - Bug fixed in some website plugins:
+ All Amazon plugins for books
+ Allocine
+ Bedetheque
+ CSFD
+ Discogs
+ GameSpot
+ IMDb
+ jeuxvideo.com
+ MobyGames
+ Saraiva
+
+-------------------------------------------------------------------
+
+1.6.2
+
+ * New features
+ - Option added for sorting items while in image views
+ * Export/Import/Fetch/Extract changes
+ - Amazon book plugins now use the Amazon Web Service, for more reliable
+ plugin operation
+ - New plugin for batch importing with a barcode scanner. It can be used
+ with GCstar Scanner for Android or any barcode scanner acting like a
+ keyboard.
+ * Default collections changes
+ - Film collection: Country field is now a list box, allowing multiple countries
+ * New plugins to fetch information from websites
+ - Books:
+ Douban (ZH) provided by BW.
+ - Movies:
+ Douban (ZH) provided by BW.
+ - Music:
+ Douban (ZH) provided by BW.
+ * Bugs fixed
+ - Set focus to the title field automatically after adding an item
+ - Correctly handle foreign characters in external filenames under Windows
+ - Correctly sort numeric fields used for grouping in image lists
+ - It was not possible to delete a unique item in image mode
+ - Fixed bug with image caching
+ - HTTP return code 302 managed correctly
+ - Removed use of Switch.pm as it is deprecated
+ - Bug fixed in some website plugins:
+ Alapage
+ Allocine
+ Bedetheque
+ Bol
+ Comic Book DB
+ CSFD.cz
+ IMDb
+ jeuxvideo.com
+ jeuxvideo.fr
+ Moby Games
+ The Movie DB
+
+-------------------------------------------------------------------
+
+1.6.1
+
+ * New features
+ - CSV plugin now allows you to select which field to use to search for
+ internet results
+ - Graphs generated from statistics are smoothed, to eliminate sharp lines
+ * Default collections changes
+ - New default collections:
+ TV shows (series) collection model. Useful for tracking dvd
+ collections of tv shows.
+ Computer Software collection, written by Qoolman
+ - Video games collection:
+ New fields: Region, Serial Number.
+ * New plugins to fetch information from websites
+ - TV shows (series):
+ Thetvdb
+ Themoviedb
+ * Bugs fixed
+ - Unable to remove more than 9 items from a collection at a time
+ - Crash when trying to create a cached image from a missing picture, or when
+ image does not exist
+ - Some characters were incorrectly encoded in read only views
+ - Add option in collection read only views for fields to "collapse" and hide
+ when they have no content
+ - Fixed problem at startup when some items were hidden in the toolbar.
+ - The "View modules" menu was not working anymore.
+ - Add play toolbar button for tv episodes collections.
+ - Item window was not properly re-constructed after changing collections.
+ - Dependency on Sort::Naturally removed.
+ - Date::Calc module was not shown as an optional dependency while it is
+ needed for statistics.
+
+-------------------------------------------------------------------
+
+1.6.0
+ * New features
+ - Generation of statistics:
+ New item in 'File' menu to create pictures based on number of items
+ having the same value for a given field (e.g. you can see how many
+ video games you have for each genre).
+ Options to select the type of graphic (bars, area, pie).
+ Histories can be created showing the evolution of the collection.
+ - Images thumbnails are now cached. This results in a dramatic speed up
+ of loading collections when hi-resolution pictures are used.
+ - Dragging and dropping a file to a collection will add it to the
+ collection if the file is:
+ A video file on a movie collection.
+ An ebook file on a book collection.
+ * New translations
+ - Chinese (Traditional) translation added thanks to 林雪凡.
+ * User interface changes
+ - Language strings are now collection dependant. This results in a
+ nicer user experience, replacing strings like "New item" with
+ "New movie", "New game", etc.
+ - New right click context menu on file chooser control, with the option
+ of choosing a folder instead of a file. Useful for dvd rips stored in
+ folders, where the folder path needs to be passed to an external
+ program.
+ - Added Update button to items, which refreshes the current item's
+ details from the web page it was originally fetched from.
+ - Fields with a history have an auto-completion feature when user
+ starts to enter text.
+ - Right click context menu works as expected when multiple items are
+ selected.
+ - The collection may be saved if something was changed without clicking
+ on an item in the list.
+ - When closing an collection without a filename, you now have the
+ option to save, cancel or discard the changes.
+ - File open dialog is no longer case sensitive when filtering
+ extensions.
+ - Video and Ebooks file chooser filters files to valid file types
+ - Lots of new skins and skin remakes thanks to Qoolman
+ - Items are now sorted using a 'natural sort' routine, for more
+ predictable sorting of mixed numeric/text titles
+ * Default collections changes
+ - New default collections:
+ Smart cards (by jimjim92).
+ - Books collections can now link to a local or online 'digital version'
+ of the book.
+ - Video games collection:
+ New fields: Exclusive, Press rating, Size and Display resolutions.
+ - Music collection
+ New fields: Press rating
+ * Export/Import/Fetch/Extract changes
+ - New plugin to export to an external disk. It just copies the
+ collection to a directory with all the pictures in a sub-directory.
+ Everything can also be compressed in one single file. Useful to copy
+ a collection for GCstar Viewer on Android.
+ http://wiki.gcstar.org/en/gcstar_viewer
+ - New plugin to export in Palm PDB format.
+ - Some plugins are now preferred by gcstar, these are for sites with
+ high quality data and with fully operational plugins. These sites are
+ now shown first in the plugins list, and are marked by a star.
+ - Default plugin choice now matches with the user's language settings.
+ - CSV Import plugin now has the option to pull information from
+ websites during import.
+ - DVDFr plugin (Movies - FR) now supports searching by EAN. That means
+ it can directly be used with a barcode scanner.
+ - Importing from Tellico handles ISBN and rank for book collections and
+ developers for game collections (patch from DanielS).
+ - HTML export handles pictures and link with generic models (e.g.
+ Shelf).
+ - Folder import is not shown when an incompatible collection is open.
+ * New plugins to fetch information from websites
+ - Movies:
+ Amazon UK (EN) and DVDEmpire (EN) provided by dingsi.
+ CartelesPeliculas (ES) provided by DoVerMan.
+ * Bugs fixed
+ - Bug fixed preventing opening of collections with custom fields in
+ some circumstances.
+ - When fields are hidden, they don't appear anymore in the expanders
+ (e.g. subtitles in movies collections).
+ - Tonight window works as expected after changing collections.
+ - Menus were not updated on Windows systems.
+ - Some urls where misinterpreted as collections when drag and dropped
+ onto main window
+ - Bug fixed in some website plugins:
+ - Massive amount of plugin fixes provided by Tenbaht, including:
+ DVDFr
+ OFDb
+ Imdb
+ Alpacine
+ BeyazPerde
+ Csfd
+ Moviemeter
+ Onet
+ Mediadis
+ * Removed plugins:
+ - dvdspot.com was shut down Oct. 2008, removed the GCfilm
+ plugin GCDVDSpot.pm
+ - movieclub.be shut down, removed GCfilm plugins
+ GCMovieClubFR.pm and GCMovieClubNL.pm
+
+-------------------------------------------------------------------
+
+1.5.0
+
+ * User interface changes
+ - When too many fields are shown in the dialog box to select which of
+ them should be displayed, scrollbars are used.
+ * Collection changes
+ - Added an optional attribute to collection fields, sorttype, which
+ overrides the sorting method for that field. Can be either 'number'
+ or 'date'.
+ * Bugs fixed
+ - Preview when fetching information was broken.
+ - Button to open the web page associated to an item was disabled when
+ locking a collection.
+ - It was not possible to modify the title to search for on websites.
+ - Some collections may not be opened if custom fields were added.
+ - The groups of fields were shown more than once in some places when
+ adding custom fields.
+ - Many bugs fixed for image mode.
+ - Cast was not fetched for every title when using imdb with an import
+ plugin
+ - Sorting by movie release date was not working with non 'yyyy-mm-dd'
+ formats
+ - On Windows systems, GCstar now stores its configuration files in the
+ users Application Data folder, rather than in the GCstar program
+ folder. This should stop GCstar needing admin rights to run. On first
+ run of the new version, GCstar should copy the configuration from the
+ old path.
+ - Exporting only visible items now works properly with "items matching
+ any of the criteria" type filters.
+ - Searching OFDB with German characters works properly
+ - No more storable warnings when searching from plugins
+ - Fix star rating widget display with small screen sizes
+ - Better sizing of image display window
+ - GCstar now correctly installs icons in the hicolor theme, and now includes
+ a scalable svg icon
+
+-------------------------------------------------------------------
+
+1.5.0 beta1
+
+ * User interface changes
+ - Items can be grouped in picture mode as in detailed mode.
+ - Pictures are resized if needed when displayed in a window.
+ - User filters can be added to toolbar.
+ - A right-click on the "Fetch information" button displays a menu
+ where the mode to use can be selected.
+ - Column used for quick searches is the one used for ordering in
+ detailed mode.
+ - File associated to an item can be a URL (http or ftp) instead of a
+ local file.
+ - Search box displays a message when no field have been selected in
+ personal model.
+
+ * Export/Import/Fetch/Extract changes
+ - User can choose for each field from which sites information should be
+ fetched and in which order (if missing from 1st, choose 2nd, etc...).
+ - FolderImport changes (by BubbleGum)
+ Can add only recent items from a folder.
+ Can update path from moved files.
+ Parse filename to retrieve infos and test for subtitle file.
+ Remove custom regular expression from filename.
+ More options when no or many results.
+
+ * Default collections changes
+ - New default collections:
+ Stamps (by Bigoud)
+ Periodicals (by yggdrasiil)
+ Mini vehicles (by jimjim92)
+ - Rank in series added to books collections
+ - Press rating added to movies collections
+
+ * New plugins to fetch information from websites:
+ - Video games:
+ Amazon (CA - EN) and NextGame (IT) provided by TPF.
+ - Movies:
+ Internet Bookshop (IT) provided by t-storm.
+ Alpacine and CartelesMetropoliGlobal (ES) provided by DoVerMan.
+ Kinopoisk (RU) provided by Nazarov Pavel.
+ - Books:
+ Saraiva (PT) provided by nirev.
+ - Comics:
+ Manga-Sanctuary (FR) provided by Biggriffon.
+
+ * Bugs fixed
+ - Collections with invalid characters are auto-repaired instead of
+ generating error message and being unusable.
+ - Prevent data corruption if a crash occurs while saving collection.
+ - Histories were lost when editing the collection model.
+ - Issues fixed with grouping when there are some spaces in lists.
+ - Default size for history of opened files is 5 instead of 1.
+ - Item window was shown after closing a picture window.
+ - Fixed problems when saving searches with numeric comparisons.
+ - Fixed issues with suffixes in plugin to import from a folder.
+ - Disable items in popup menu for pictures when collection is locked.
+ - Correctly export value in options fields when using personal models.
+ - Bug fixed when performing a search while the current item has been
+ modified.
+ - Bug fixed in some website plugins:
+ All Amazon plugins
+ All Tvdb plugins (TV shows episodes)
+ Adlibris (Books - FI, SV)
+ Alapage (Books - FR)
+ Alapage (Video Games - FR)
+ Allocine (Movies - FR)
+ Bedetheque (Comics - FR)
+ Bol (Books - IT)
+ Buscape (Books - PT)
+ Cinemotions (Movies - FR)
+ DicoDuNet (Video Games - FR)
+ Discogs (Music - EN)
+ FilmWeb (Movies - PL)
+ Fnac (Books - FR)
+ GameSpot (Video Games - EN)
+ IMDb (Movies - EN)
+ ISBNdb (Books - EN)
+ JeuxVideo.com (Video games - FR)
+ MobyGames (Video games - EN)
+ nooSFere (Books - FR)
+ OFDb (Movies - DE)
+
+-------------------------------------------------------------------
+
+1.4.3
+
+ * New translations
+ - Dutch translation added thanks to kim.
+
+ * Export/Import/Fetch/Extract changes
+ - Improved performances for plugins fetching data from websites.
+ - Discogs plugin (Music - EN) supports searches using artist or label.
+
+ * Bugs fixed
+ - Fixed display problem in image mode when removing or renaming items.
+ - Shortcuts can also be defined on saved searches.
+ - Use system ACL when ckecking file permissions.
+ - The default options were not used on first startup.
+ - Problems fixed with find-as-you-type in image mode.
+ - Web searches were broken with new versions of Storable.
+ - Bug fixed in some website plugins:
+ Amazon (Books - FR)
+ Amazon (Movies - FR)
+ Discogs (Music - EN)
+ FilmAffinity (Movies - EN and ES)
+ GameSpot (Video Games - EN)
+
+-------------------------------------------------------------------
+
+1.4.2
+
+ * Export/Import/Fetch/Extract changes
+ - Fetch can be done using writer for comics collections. Supported by
+ Bedetheque plugin.
+ - More plugins use big pictures if option is checked (Thanks to adiGuba).
+ Allocine (Movies - FR)
+ Cinemotions (Movies - FR)
+ - Import identifier and media labels from movies collections created with
+ Ant Movie Catalog.
+
+ * New plugins to fetch information from websites:
+ - nooSFere (Books - FR) provided by TPF
+ - TheLegacy (Video games - DE) provided by TPF
+
+ * Bugs fixed
+ - Title when opening items in windows was not updated.
+ - Rating was lost when displayed with stars and fetched from a website.
+ - Title in the list was incorrect for some collections when modifying
+ many items together.
+ - When changing a picture, the previous one was not always selected in
+ the file manager window.
+ - Duplicating an item also duplicates the pictures that are managed by
+ GCstar.
+ - An extra dot was added on the end of borrowers email when sending a
+ message.
+ - The option to use big pictures from websites were ignored when
+ importing from a list of name or from a directory.
+ - .tar.gz import was failing for default collections with added fields.
+ - Exporting from command line didn't copy the pictures.
+ - Bug fixed in some website plugins:
+ All Tvdb plugins (TV shows episodes)
+ Allocine (Movies - FR)
+ Bedetheque (Comics - FR). Thanks to Ogddit
+ Cinemotions (Movies - FR)
+ Fnac (Books - FR)
+ JeuxVideo.com (Video games - FR)
+
+-------------------------------------------------------------------
+
+1.4.1
+
+ * New plugin to import collections from MyMovies done by Rob Maas.
+
+ * Missing translations added for Greek and Polish.
+
+ * Bugs fixed
+ - Music collections were corrupted.
+ - Export plugins had problems with pictures without suffixes.
+ - Option to fetch big pictures from websites was hidden on Windows
+ systems.
+ - A few texts were left untranslated.
+ - Bug fixed in image mode when updating an item and filtering.
+ - Bug fixed in some website plugins:
+ - Amazon (Video games - FR)
+ - Fnac (Books - FR)
+
+-------------------------------------------------------------------
+
+1.4.0
+
+ * Default models can be modified through the graphical user interface
+ to add some user-defined fields. These fields will be in separate tabs
+ (one for each group) or in expanders depending on the kind of panel used.
+ These additional fields are stored in the collection itself to let users
+ share it between different machines/systems.
+
+ * New default models to manage comic books and episodes of TV shows.
+
+ * New translations
+ - Ukrainian translation added thanks to Ailandar.
+ - Hungarian translation added thanks to Takács László Krisztián.
+ - Greek translation added thanks to Dimitri Glentadakis.
+
+ * Toolbar improvements
+ - User can choose what controls are shown and their order.
+ - Useful items from menus can also be used as buttons in toolbar.
+ - A quick search can be added to the toolbar.
+ - New controls can be added to change the list view or the information
+ layout.
+
+ * Options/preferences changes
+ - Number of columns in image mode can be automatically calculated by
+ GCstar.
+ - A language can be specified in the properties for a collection. It will
+ be used for spell checking.
+ - Tear-off menus can be disabled.
+ - Different sizes may be specified for pictures in image and detailed
+ modes.
+ - Behaviour of user specified programs has changed, now GCstar will use
+ the system default applications for any categories with an empty command.
+ This allows the user to override the application for individual formats,
+ while leaving the other applications at the default.
+ - Added the option for a user-specified image editor.
+
+ * Search improvements
+ - Users can save an advanced search or the current one to create a
+ filter.
+ - New kinds of comparison in advanced search: 'Does not contain' and
+ 'Regular expression'.
+ - An option has been added in advanced search to select if it should be
+ case-sensitive or not.
+ - Another option in advanced search is available to ignore accents and
+ other diacritics.
+ - When comparison is 'Range', there are 2 fields to enter values in
+ criteria of advanced search.
+ - An option has been added in find and replace to select if it should
+ be case-sensitive or not.
+ - Performance enhancements.
+
+ * User interface changes
+ - New default images when none is specified.
+ - User can change default picture in the collection properties.
+ - Main picture for some default collections can be flipped to see back.
+ Flipping is done by clicking on the button that appears when hovering
+ picture or by pressing F or BackSpace when it is active.
+ - Ratings are now shown graphically, with a new star-rating control.
+ - Fields selections are done through a hierarchical view.
+ - Standard confirmation is used when trying to overwrite a file.
+ - Window title conforms to GNOME HIG with collection name first.
+ - Right clicking on an image field gives the option to open with an image
+ editor. If Gnome2::VFS is present, this list will be populated with
+ all installed applications associated with images on the system.
+ - The button linking to the web page displays the plugin used to fetch
+ the information.
+
+ * Export/Import/Fetch/Extract changes
+ - Information could be extracted from audio CDs using FreeDB thanks to
+ DomiX.
+ - It's possible to add items or to create a new collection of movies or
+ music from files in a directory (Menu File > Import > Folder).
+ - A new option is available to fetch big pictures when available. For
+ the moment, it only has some effect with:
+ JeuxVideo.com (Video games - FR)
+ MobyGames (Video games - EN)
+ - The order for sorting can be specified when exporting.
+ - The HTML export resizes the pictures using specified height.
+ - New template for HTML export for board games collections created by
+ Piwi.
+ - Default templates for HTML export are available even if specific ones
+ are defined.
+ - A charset can be speficied for CSV export.
+
+ * Default collections changes
+ - A back cover added to these collections: Video Games.
+ - New field 'Region' for movies collections.
+ - New field 'Origin' for music collections.
+
+ * New plugins to fetch information from websites:
+ - Books:
+ Chapitre.com and Le-Livre (FR) provided by TPF
+ - Comics:
+ Bedetheque (FR) provided by Chessnico
+ - Movies:
+ Onet and Stopklatka (PL) provided by Marek Cendrowicz
+ - Video games:
+ Amazon (JP) provided by TPF
+
+ * Other improvements
+ - It's possible to set an item as returned from the window displaying
+ the list of borrowed items. It also displays the lending history.
+ - When opening a collection that was created with a more recent
+ version, a warning is displayed to let the user know some data could
+ be lost if it is saved.
+ - Install script registers mime-types and .desktop files, to properly
+ associate .gcs files with the system.
+ - When trying to play the file associated to an item, an error is
+ displayed if it can't be found.
+
+ * Bugs fixed
+ - Borrowers filter was empty when using read-only layout.
+ - Problem fixed when there was special characters in the mail template
+ for borrowers.
+ - Date format was not used in the read-only panel, the advanced search
+ and the history of borrowings.
+ - There was a problem when filtering a collection with grouped items.
+ - Find and Replace was broken for complex fields.
+ - After importing, the item count was not updated in detailed list.
+ - Next button when using 'Many sites' for information fetching was broken.
+ - Prevented a problem with user-defined collections if a field has been
+ removed.
+ - .tar.gz export didn't add the model when it was a personal one with a
+ name.
+ - Problem fixed when grouping field contains a number between
+ parentheses.
+ - Sorting by a number or a date was incorrect when exporting.
+ - Bug fixed with import/export plugins that have a translated name when
+ using them from command line.
+ - Bug fixed with plugin importing from a list of name when using it
+ from command line.
+ - When extracting information from a video file, nothing happened if
+ some values were not selected.
+ - With Tian and Tian-Mario templates for HTML exports, the internal
+ links were wrong.
+ - Bug fixed in some website plugins:
+ All Amazon plugins
+ CulturaliaNet (Movies - ES)
+ FilmWeb (Movies - PL)
+ IMDb (Movies - EN)
+ JeuxVideo.com (Video games - FR)
+ JeuxVideo.fr (Video games - FR)
+ OFDb (Movies - DE)
+
+-------------------------------------------------------------------
+
+1.3.2
+
+ * Galician translation added thanks to Daniel Espineira.
+
+ * New plugin to fetch information from websites:
+ - Music: Discogs (EN) provided by TPF
+
+ * New template for HTML export: Float (Movies)
+
+ * Changes for fetching
+ - Rating is fetched from IMDb website (Movies - EN).
+ - Empty fields are not fetched.
+
+ * Bugs fixed
+ - There was a problem when grouping and with articles on the end.
+ - Bug occured when removing the last item of a group.
+ - Some invalid characters were added to collections.
+ - The date format was not used when exporting.
+ - Number of items in status bar was sometimes not updated.
+ - Decimal numbers were truncated in detailed list.
+ - Fields used to sort when exporting was not restored when exporting
+ again.
+ - 'Serie' was left untranslated in books collections.
+ - Correct order for Favourite and Keywords in Tags panel when
+ choosing items to display.
+ - Bug fixed in some website plugins:
+ All Amazon plugins
+ BDGest (Books - FR)
+ DVDFr (Movies - FR)
+ FilmUP (Movies - IT)
+ JeuxVideo.com (Video games - FR)
+ JeuxVideo.fr (Video games - FR)
+ MusicBrainz (Music - EN)
+
+-------------------------------------------------------------------
+
+1.3.1
+
+ * New plugin to fetch information from websites:
+ - Video games:
+ Ludus (IT) provided by TPF
+ - Books:
+ ISBNdb (EN), Buscape (PT) and LiberOnWeb (IT) provided by TPF.
+
+ * Bugs fixed
+ - When modifying the cover picture from a window, it was not updated
+ in the main panel.
+ - For new books, Read field is initialized to 'not read'.
+ - Removing many items in picture mode sometimes failed.
+ - XML export plugin didn't list the default models and had problems
+ opening a specified one.
+ - Spelling checked is deactivated if required dictionary is not
+ installed instead of generating an error.
+ - Bug fixed in some website plugins:
+ All Amazon plugins
+ Alapage (Video games - FR)
+ BDGest (Books - FR)
+ Gamespot (Video Games - EN)
+ JeuxVideo.com (Video games - FR)
+ JeuxVideo.fr (Video games - FR)
+ TricTrac (Boardgames - FR)
+
+--------------------------------------------------------------------
+
+1.3.0
+
+ * Multiple selections
+ - Many items may be selected in the list using Control and Shift keys.
+ They can be modified or deleted together.
+ - It is possible to select many items after searching on websites. All
+ of them will be added to current collection. Information for the
+ first one will be fetched in current item.
+
+ * Collections of board games added thanks to Zombiepig.
+
+ * Improvements for image mode
+ - It is possible to add an overlay picture in image mode to make them
+ look better.
+ - New skin has been added to image mode when using a background
+ picture: Glass and DarkGlass. They add some reflection under the
+ pictures.
+ - Improved look for borrowed items.
+ - A color could be used for selection, even with a background picture.
+
+ * New or changed fields
+ - For movies collections, the list of actors is now a real list. A
+ role can be attached to each actor.
+ - Some tags could be assigned to items. It is also possible to mark
+ some of them as favorites.
+
+ * Options/preferences changes
+ - A spelling checker is available for long text fields. It could be
+ activated or deactivated in the Features tab of preferences.
+ - User may change the accelerators associated to items in menus. The
+ menu should be highlighted, and then the keys to use should be
+ pressed.
+ - Users may choose the format to display dates. This format follows
+ the same rules as the one for strftime(3).
+ - A new option let users select what should be done when text in
+ expanders is too long.
+ - It's possible to define a cookie jar that will be used by the
+ fetch plugins who need it.
+ - A new skin has been added to read-only panels: Dark.
+ - In detailed mode, another field could be used to sort items grouped
+ in a parent item.
+ - Small reorganization in preferences window
+
+ * Advanced search improvements
+ - The fields for entering values are changed according to the expected
+ data. As an example, fields will have their histories when one
+ exists.
+ - Users could select to search in all of the fields for given text.
+
+ * New plugin to fetch information from websites:
+ - Board games:
+ Board Game Geek (EN) provided by Zombiepig
+ Reservoir Jeux and Tric Trac (FR) provided by Florent
+ - Movies:
+ NasheKino and Animator (RU) provided by zserghei
+
+ * CSV import
+ - Some fields could be ignored.
+ - A charset could be specified.
+
+ * Command line
+ - A new command line option --list-plugins is available to list all
+ the plugins of a given collection type.
+ - When using a wrong name for a plugin in command line, an explicit
+ error is displayed.
+ - Better management of pictures.
+
+ * Bugs fixed
+ - Default shortcut to add a new item has been changed from Ctrl-A to
+ Ctrl-T. Then Ctrl-A is available again for selecting all text.
+ - The tooltip in results for web searches is hidden when clicking on
+ it.
+ - When canceling creation of a new collection, current one was closed.
+ - Drag and drop of a picture works also when the path contains some
+ spaces.
+ - Picture selection is done by opening the previously used directory
+ if there is no picture.
+ - Some plugins for website did not set a suffix for fetched pictures.
+ - Bugs fixed with sort when exporting.
+ - After import, the number of items in status bar was not changed when
+ needed.
+ - Bug fixed when importing from a list of items if a plugin returned
+ no picture.
+ - Bug fixed in some website plugins:
+ All Amazon plugins
+ Biblioteka Narodowa (Books - PL)
+ Allmovie (Movies - EN)
+ Beyaz Perde (Movies - TR)
+ Alapage (Video Games - FR)
+ Gamespot (Video Games - EN)
+
+--------------------------------------------------------------------
+
+1.2.2
+
+ * Bug fixed in some plugins:
+ IMDb (Movies - EN)
+ MusicBrainz (Music - EN)
+
+ * Bugs fixed with extraction of information from playlist for
+ music collections.
+
+ * Bug fixed when filtering soon after startup a collection
+ displayed in picture mode.
+
+ * In picture mode, if modification on an item changed its
+ place in the list, it was not selected after clicking on
+ it.
+
+ * When updating GCstar, the extract plugins are also updated
+ if required.
+
+--------------------------------------------------------------------
+
+1.2.1
+
+ * New plugin to fetch information from Allmovie (EN) provided
+ by Zombiepig.
+
+ * 2 extra spaces were added on the end of long text fields
+ when saving.
+
+ * Size of the fields list in the settings for user-defined
+ collections could be changed.
+
+ * In preferences, toolbar size could be set to system setting
+ instead of a specific value.
+
+ * Labels for Tonight and Play buttons were always shown, even
+ if the user choose to display only icons in toolbars (this is
+ a system setting, not a GCstar's one).
+
+ * A bug prevented a user from creating a new kind of collection
+ on startup.
+
+--------------------------------------------------------------------
+
+1.2.0
+
+ * Bug fixed when fetching information for an item while in
+ image mode.
+
+ * If a fetch was canceled and a different one was launched,
+ the previous results were used again.
+
+ * When changing the main picture of an item, it was loaded
+ two times.
+
+ * Bug fixed in some plugins because of websites changes:
+ Allocine (Movies - FR)
+ CSFD.cz (Movies - CS)
+ IMDb (Movies - EN)
+
+ * Some missing translations have been added to
+ DE, ES and SV versions.
+
+--------------------------------------------------------------------
+
+1.2.0.beta3
+
+ * Correct number of displayed items is used in status
+ bar when filtering in image mode.
+
+ * An error is displayed when trying to export from
+ command line to HTML with a non existing model.
+
+ * The query field in the window where the user may
+ select the plugin to use was sometimes not initialized.
+
+ * It's now possible to perform a quick search also in image
+ mode. Quick search begins when the user enters some characters
+ while the list is active.
+
+ * These keys are managed in picture mode: Page Up, Page Down,
+ Home and End.
+
+ * When a critical error occurs, user may report a bug
+ semi-automatically.
+
+ * The progress bars in splash screen and in status area
+ of main window are more accurate.
+
+ * Search dialog was not centered on first opening. The same
+ applied to the window used to create a new collection type.
+
+ * Bug fixed in some plugins because of websites changes:
+ Alapage (Books - FR)
+ Cinemotions (Movies - FR)
+ Dicshop (Movies - SV)
+ Merlin (Books - PL)
+
+ * Some missing translations have been added to
+ FR, SV, PL and CA versions.
+
+--------------------------------------------------------------------
+
+1.2.0.beta2
+
+ * When the picture was hidden in one of the default
+ collections, all the fields next to it were also
+ hidden.
+
+ * When using some searches of filters, if nothing was
+ displayed, the panel displayed the warning message
+ instead of the "View All" button.
+
+ * Escape XML entities in long text fields for saved
+ collections.
+
+ * Fixed a bug when there is no active collection and
+ another one could not be opened.
+
+ * Fixed a potential problem when using command line actions
+ if no explicit model has been specified.
+
+ * HTML export on command line has a default template
+
+--------------------------------------------------------------------
+
+1.2.0.beta1
+
+ * Swedish translation added thanks to Ramon Radnoci.
+
+ * Indonesian translation added thanks to Nugrahadi.
+
+ * Brazilian Protuguese translation added thanks to Daniel Valença.
+
+ * Wine collections added thanks to Yves Martin.
+
+ * New plugin to fetch information from websites:
+ Movies:
+ DVDSpot (EN)
+ provided by Marc Deslauriers
+ CSFD.cz (CS)
+ provided by Pajdus
+ Beyaz Perde (TR)
+ provided by Zuencap
+ MovieMeter (NL)
+ provided by MaTiZ
+ Port.hu (HU)
+ provided by an anonymous contributor
+ Books:
+ BDGest (FR)
+ provided by Rataflo
+ National Library, Merlin, NUKat and Mareno (PL)
+ provided by WG
+ Bokkilden (NO)
+ provided by Tian
+ Fnac and Mediabooks (PT), Bol and InternetBookShop (IT),
+ provided by TPF
+ Video Games:
+ DicoDuNet (FR)
+ provided by TPF
+
+ * New plugin to export to Latex format created by Zserghei.
+
+ * When creating a new collection or at first startup, user can
+ import an existing collection with some of the available
+ plugins.
+
+ * When grouping items, a new option is available to add the
+ number of items in a category.
+
+ * An option has been added for grouping of orphaned
+ items or not. Items whitout a master, when grouping is
+ activated, are together on the end of the list by
+ default. But they could be mixed with masters for
+ ordering.
+
+ * In detailed view, the order of the columns could be
+ changed using drag and drop on their headers.
+
+ * It's possible to select a field for sorting when
+ exporting (if applicable).
+
+ * Only the required pictures are copied during export.
+
+ * New field in movies collections to store a numeric
+ identifier. The unique identifier displayed next to
+ the title is now read-only.
+
+ * Added a field to collections of video games: Executable.
+ This field could contain the path to a program that
+ could be launched directly from a Play button in
+ GCstar's toolbar.
+
+ * When changing field to use for fetching, the value from
+ panel is used.
+
+ * Delete key removes current item in multiple lists.
+
+ * When opening window to perform searches, the first
+ field has focus.
+
+ * Removed dot from picture format when exporting to
+ Tellico (Patch from Robby Stephenson).
+
+ * Use proxy for updates (Patch from Javier Donaire).
+
+ * Bug fixed in some plugins because of websites changes:
+ All Amazon plugins
+ IMDb (Movies - EN)
+ Allocine (Movies - FR)
+ FilmUP (Movies - IT)
+ Alapage, JeuxVideo.com (Games - FR)
+ Gamespot (Games - EN)
+ Adlibris (Books - FI, SV)
+ Casadelibro (Books - ES)
+
+ * Bug fixed when performing an update (gcstar -u) if
+ a new directory should be created.
+
+ * Bug fixed with plugin to import a collection
+ generated from Ant Movie Catalog that contains
+ some semicolons.
+
+ * Bug fixed in read only mode when data contains some
+ HTML tags.
+
+ * Bug fixed with the title of the window when using
+ "Tonight" feature.
+
+ * When opening a collection of a type different than the
+ current one, if a filter was present, nothing was
+ displayed.
+
+ * Updated bug report URL in man page and when using
+ -h or --help on command line.
+
+ * Reduced time for startup and to load a collection
+
+--------------------------------------------------------------------
+
+1.1.1
+
+ * Bug fixed when items are grouped and the grouping field is
+ changed.
+
+ * FilmWeb plugin was not working anymore because of website
+ changes.
+
+ * Better layout for Paths tab in preferences.
+
+--------------------------------------------------------------------
+
+1.1.0
+
+ * Instead of specifying many external applications (for web
+ pages, video and audio files), you may use the settings
+ defined by the system. It works for any Unix (including
+ GNU/Linux) using XFCE, Gnome or KDE) and also for MacOS X and
+ for Microsoft Windows.
+
+ * Numismatic collections added thanks to szdavid.
+ They could be imported and exported from/to Tellico.
+
+ * Catala translation added thanks to Ponç J. Llaneras.
+
+ * Arabic translation added thanks to Muhammad Bashir Al-Noimi.
+
+ * New plugins to get information from websites. All of them
+ are made by TPF.
+ Books: Adlibris (FI, SV), Casadelibro (ES), Fnac (FR)
+ Video games: Alapage (FR), Amazon (US, DE, FR, UK)
+
+ * The directory used to store pictures could be specific to a
+ collection. It's defined in the collection properties
+ (File menu > Properties)
+
+ * Path of directory used to store pictures could contain some
+ special text.
+ - %WORKING_DIR% or . will be replaced with collection directory
+ (use only on beginning of path)
+ - %FILE_BASE% will be replaced by collection file name
+ without suffix (.gcs)
+ Default value (that could be restored) is now:
+ ./%FILE_BASE%_pictures/
+
+ * A new type of field is available for user-defined
+ collections: "Dependant on other fields". It will be generated
+ thanks to other fields. The Default value should then contain the
+ format were %Name of other field% will be replaced with the
+ value of the field.
+
+ * New fields for default collections: Add date. Its default
+ value when adding a new item is the current date.
+
+ * If the Fetch button is clicked with right button of the mouse,
+ the plugin to use will be asked to the user, even if one is
+ specified in preferences.
+
+ * When a value is truncated in web search results, a tooltip
+ popup containing the whole text is displayed when the mouse
+ pointer is over it.
+
+ * Some options not useful for most users are hidden until the
+ expert mode is activated
+
+ * In dialog for date selection, double-clicking on a date
+ validate it.
+
+ * When importing from GCfilms, it's possible to reuse unique
+ identifiers instead of generating them.
+
+ * Image was not updated in images list when downloading
+ information.
+
+ * Bug fixed when dropping a picture dragged from a web page.
+
+ * Number of items was not updated when an item was removed.
+
+ * Windows installation program doesn't install dependencies.
+ More information here:
+ http://wiki.gcstar.org/en/install_windows
+
+--------------------------------------------------------------------
+
+Task and bugs number refer to items on Gna! project page:
+https://gna.org/projects/gcstar/
+
+1.0.0
+
+ * Management of music collection.
+
+ * Extraction of video information from a file has been
+ re-added (it has been removed when creating GCstar
+ from GCfilms).
+ (bug #7157)
+
+ * Plugin for music collection using MusicBrainz website.
+
+ * Import and export music collections from and to Tellico.
+
+ * Information about an album could be extracted from a
+ playlist.
+
+ * New plugin for video games using MobyGames (EN) made by TPF.
+
+ * New plugin for books using Alapage (FR) made by TPF.
+
+ * New plugin for movies using MovieCovers.com (FR) made by
+ Patrick Fratczak.
+
+ * It's possible to search using EAN or UPC code (barcode)
+ instead of ISBN for books using one of the plugins for Amazon.
+
+ * In file properties dialog, there are also the full file
+ path, the file size and the number of items in the collection.
+
+ * Lists used for some data (such as genre for movies or codes
+ for video games) could be reordered using drag and drop.
+
+ * Widths of columns in detailed mode are saved when leaving the
+ application or opening another file.
+ (bug #7666)
+
+ * In list of plugins for web searches, the fields that could
+ be used for searches are displayed.
+
+ * New item in Help menu to display all the available plugins
+ for web searches.
+
+ * Templates provided for HTML export of music collections.
+
+ * New template for HTML export of book collections: FloFred
+ provided by Florent.
+
+ * --verbose option added to installation program.
+
+ * All Amazon plugins changed because of website changes.
+
+ * Patch from tiwek to get original titles from FilmWeb.
+
+ * Added in search dialog some information about the kind of
+ comparison that will be performed.
+
+ * When specifying a grouping field from toolbar, the master
+ is always auto-generated.
+ (bug #7500)
+
+ * Fixed bug with CVS import for collections that are not movies
+ collections.
+
+ * Fixed bug with character encoding in XML files.
+ (bug #7584)
+
+ * Fixed bug with installation program that prevented an upgrade
+ without manual removal of previous files.
+ (bug #7481)
+
+ * Fixed bugs with external programs that contains spaces in
+ their paths on Win32 systems.
+
+--------------------------------------------------------------------
+
+0.5.0
+
+ * Bookmarks management (Menu "My Collections").
+ It could be used to organize your collections and have
+ a quicker access to them from GCstar.
+
+ * New "Advanced" search where the user could define the filter
+ to use.
+
+ * Internet search could be made according to many fields. It
+ concerns for the moment only books collections where search
+ could be made using ISBN.
+ (bug #6898)
+
+ * Results of web search could be previewed.
+
+ * New import plugin to merge 2 GCstar collections.
+ (sr #1293)
+
+ * New plugins for video games using JeuxVideo.com (FR) website
+ provided by TPF.
+
+ * New plugins for books using Amazon.de (DE) website
+ provided by Frenkx.
+
+ * New plugins for books using Amazon.uk (EN) website.
+
+ * German translation updated by Frenkx.
+
+ * New item in "Help" menu to report a bug.
+
+ * ISBN field could contain an 'X' character.
+
+ * Bugs fixed with import plugins when inserting items in current
+ collection.
+
+ * Export plugin for .tar.gz also stores collection information
+ (description, owner,...)
+
+ * HTML template "Shelf" has a new feature. Information within a
+ group could be hidden or shown.
+
+ * Bug has been fixed for Windows installation program
+ (bug #7122)
+
+--------------------------------------------------------------------
+
+0.4.1
+
+ * Mail programs could be defined. They will be used to
+ send e-mails instead of Sendmail or direct SMTP server.
+ Default configuration provided for Sylpheed-Claws,
+ Thunderbird and Evolution.
+
+ * Search could be performed according to original
+ title for movies collections.
+ (sr #1246)
+
+ * Bug fixed with old HTTP::Headers versions.
+ (sr #1245)
+
+ * Bug fixed for Windows users with launch of external
+ programs.
+ (bug #6762)
+
+--------------------------------------------------------------------
+
+0.4
+
+ * Added books collection management.
+
+ * 2 plugins for books: Amazon.com (EN) and Amazon.fr (FR).
+
+ * Import book collections from Tellico and Alexandria.
+ Export book collections to Tellico.
+
+ * If grouping is done using a value that is a list, it will
+ be splitted. So an item will appear many times, for each
+ value.
+
+ * New command line options to execute some tasks automatically.
+ More information here:
+ http://www.gcstar.org/doc.execute
+
+ * "gcstar --help" is more verbose. A man page has also been
+ created.
+
+ * Borrowers information (Name and e-mail address) could be
+ imported from these formats: LDIF, Sylpheed-Claws, VCARD.
+
+ * Pictures could be saved with a file name that is prefixed
+ with the item title or name (instead of gcstar_).
+ (sr #1175)
+
+ * It is now possible to set some properties on a collection
+ (a name, owner name and e-mail address, description). It is
+ done through File menu, Properties item.
+
+ * A play button is in toolbar for collections that needs one
+ (as for movies collections). It could also be set for
+ user-defined collections.
+
+ * For user-defined collections, a read-only layout is also
+ generated.
+
+ * HTML export is also possible for user-defined collections.
+
+ * Saving is faster and gives more feedback to user.
+
+ * When importing data from Internet, if the preview for an
+ image is used, it won't be downloaded only once.
+
+ * Some templates used by HTML export have been made valid
+ XHTML 1.0 Strict: Shelf, Tabs, Tian, Tian-Mario
+
+ * New option in preferences to set if the previous
+ collection should be loaded on startup.
+
+ * Locked status is stored in the collection itself and not
+ globally.
+
+ * Force UTF-8 encoding for models files.
+ (bug #6545)
+
+ * Bug fixed with search.
+ (bug #6536)
+
+ * Bug fixed when no user-defined collection exists.
+ (bug #6520)
+
+--------------------------------------------------------------------
+
+0.3
+
+ * It is now possible to create personal collections.
+ Such a collection will contain some fields set by the
+ user according to her or his needs. More information
+ in the documentation:
+ http://www.gcstar.org/doc.models.en.php
+
+ * If something is changed in a collection and the
+ auto-save feature is not activated, the user is warned
+ when closing the collection.
+
+ * Installer failed when an unsupported locale was used.
+ (bug #6324)
+
+ * CSV import didn't correcty set the charset to UTF-8.
+
+ * Added an update shortcut in Start menu for Windows users.
+
+ * HTML templates was not listed on Windows systems.
+ (bug #6366)
+
+ * Website plugins works also if sites send pages in a compressed
+ format (useful for AniDB that was broken).
+
+--------------------------------------------------------------------
+
+0.2
+
+ * Added Video games management: GCgames.
+
+ * 2 plugins for video games to import from websites:
+ GameSpot.com (EN) and JeuxVideo.fr (FR). They also
+ import screenshots and the tips that could be found.
+
+ * Added Turkish translation thanks to KaraGarga.
+
+ * Collections member could be grouped directly from toolbar.
+ More options are available for different kind of grouping
+ in preferences dialog.
+
+ * A picture could be dragged and dropped from a web browser
+ to any displayed picture (movie cover for GCfilms,
+ box picture or screenshot for GCgames).
+
+ * Bug fixes and performances enhancements.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..3912109
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 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.
+
+ 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 Library 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 St, 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 Library General
+Public License instead of this License.
diff --git a/README b/README
new file mode 100644
index 0000000..a206948
--- /dev/null
+++ b/README
@@ -0,0 +1,37 @@
+GCstar, personal collections manager
+
+Application useful to manage your collections.
+More information available on http://www.gcstar.org/
+
+Install
+-------
+
+You need to have Gtk2, perl and perl-gtk2 on your system.
+
+Then launch install script (being root for a system wide installation).
+Here are available options:
+
+Graphic mode installation:
+./install
+
+Text mode installation:
+./install --text
+
+Automatic installation in a directory
+./install --prefix=/path/to/directory
+
+
+Contribution
+------------
+
+If you want to contribute to GCstar, consult this page:
+
+http://gcstar.org/contribute
+
+
+Bug submission
+--------------
+
+To submit a bug, go there:
+
+http://forums.gcstar.org/viewforum.php?id=4
diff --git a/README.fr b/README.fr
new file mode 100644
index 0000000..19d59a2
--- /dev/null
+++ b/README.fr
@@ -0,0 +1,37 @@
+GCstar, gestionnaire de collections personnelles
+
+Application permettant de gérer ses collections.
+Plus d'informations : http://www.gcstar.org/
+
+Installation
+------------
+
+Vous devez avoir au préalable installé Gtk2, perl et perl-gtk2.
+Puis lancez le script install comme indiqué ci-dessous.
+Pour faire une installation sur tout le systeme, lancez le en tant que root.
+
+Pour installer en mode graphique :
+./install
+
+Pour installer en mode texte :
+./install --text
+
+Pour automatiquement installer dans un répertoire :
+./install --prefix=/chemin/vers/le/repertoire
+
+
+Contribution
+------------
+
+Si vous souhaitez contribuer à GCstar, consultez cette page :
+
+http://gcstar.org/contribute
+
+
+Rapport d'anomalie
+------------------
+
+Pour soumettre un rapport d'anomalie, rendez vous ici :
+
+http://forums.gcstar.org/viewforum.php?id=9
+
diff --git a/bin/gcstar b/bin/gcstar
new file mode 100644
index 0000000..4f83b71
--- /dev/null
+++ b/bin/gcstar
@@ -0,0 +1,358 @@
+#!/usr/bin/perl
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+my $initTime;
+$ENV{GCS_PROFILING} = 0 if ! exists $ENV{GCS_PROFILING};
+if ($ENV{GCS_PROFILING} > 0)
+{
+ eval 'use Time::HiRes';
+ eval '$initTime = [Time::HiRes::gettimeofday()]';
+}
+
+my $VERSION = '1.7.0';
+
+my $MULTI_PROCESS = ((!exists $ENV{GCS_PROFILING}) || ($ENV{GCS_PROFILING} == 0));
+
+use Getopt::Long;
+use File::Path;
+use File::Spec;
+use FindBin qw($RealBin);
+use POSIX qw(locale_h);
+
+$ENV{GCS_BIN_DIR} = $RealBin;
+($ENV{GCS_LIB_DIR} = $ENV{GCS_BIN_DIR}) =~ s/bin\/?$/lib\/gcstar/;
+($ENV{GCS_SHARE_DIR} = $ENV{GCS_BIN_DIR}) =~ s/bin\/?$/share\/gcstar/;
+use lib File::Spec->canonpath("$RealBin/../lib/gcstar");
+if (exists $ENV{PAR_TEMP})
+{
+ unshift @INC, "$RealBin/../lib/gcstar";
+}
+
+# For win32, redirect all the output to files
+if ($^O =~ /win32/i)
+{
+ my $logdir = $ENV{'APPDATA'};
+ $logdir =~ s/\\/\//g;
+ mkpath $logdir;
+ close(STDOUT);
+ close(STDERR);
+ open(STDOUT, ">$logdir/gcstar.log");
+ open STDERR, ">&STDOUT";
+ select STDERR; $| = 1;
+}
+
+#XDG stuff
+my $home = $ENV{'HOME'};
+$home = $ENV{'APPDATA'} if ($^O =~ /win32/i);
+$home =~ s/\\/\//g if ($^O =~ /win32/i);
+
+$ENV{XDG_CONFIG_HOME} = $home.'/gcstar/config' if ($^O =~ /win32/i);
+$ENV{XDG_CONFIG_HOME} = $home.'/.config' if ! exists $ENV{XDG_CONFIG_HOME};
+
+$ENV{XDG_DATA_HOME} = $home.'/gcstar' if ($^O =~ /win32/i);
+$ENV{XDG_DATA_HOME} = $home.'/.local/share' if ! exists $ENV{XDG_DATA_HOME};
+
+$ENV{GCS_CONFIG_HOME} = $ENV{XDG_CONFIG_HOME}.'/gcstar';
+$ENV{GCS_CONFIG_HOME} = $ENV{XDG_CONFIG_HOME} if ($^O =~ /win32/i);
+
+# Migrate settings from old windows data path if required
+if (($^O =~ /win32/i) && !(-d $ENV{XDG_DATA_HOME}))
+{
+ if (-d $RealBin.'/../config')
+ {
+ print ("Need to migrate settings from old gcstar data store\n");
+ mkpath $ENV{XDG_CONFIG_HOME};
+ mkpath $ENV{XDG_DATA_HOME};
+ my $winRealBin = $RealBin;
+ $winRealBin =~ s/\//\\/g;
+ my $winXDGConfig = $ENV{XDG_CONFIG_HOME};
+ $winXDGConfig =~ s/\//\\/g;
+ my $winXDGData = $ENV{XDG_CONFIG_HOME};
+ $winXDGData =~ s/\//\\/g;
+ system "xcopy /Y \"".$winRealBin."\\..\\config\" \"".$winXDGConfig."\"";
+ system "xcopy /Y \"".$winRealBin."\\..\\data\" \"".$winXDGData."\"";
+ }
+}
+
+mkpath $ENV{XDG_CONFIG_HOME};
+mkpath $ENV{XDG_DATA_HOME};
+
+mkdir $ENV{GCS_CONFIG_HOME};
+mkdir $ENV{GCS_CONFIG_HOME}.'/GCModels/';
+$ENV{GCS_CONFIG_FILE} = $ENV{GCS_CONFIG_HOME}.'/GCstar.conf';
+$ENV{GCS_DATA_HOME} = $ENV{XDG_DATA_HOME}.'/gcstar';
+$ENV{GCS_DATA_HOME} = $ENV{XDG_DATA_HOME} if ($^O =~ /win32/i);
+mkdir $ENV{GCS_DATA_HOME};
+
+use GCOptions;
+my $options = new GCOptionLoader($ENV{GCS_CONFIG_FILE}, 1);
+
+my $lang = $options->getFullLang;
+$ENV{LANG} = $lang;
+$ENV{LANGUAGE} = $lang;
+$ENV{LC_ALL} = $lang;
+$ENV{LC_CTYPE} = $lang;
+setlocale(LC_ALL, $lang);
+
+sub usage
+{
+ print "Usage: $0 [-u UPDATE-OPTIONS] [-x EXECUTE-OPTIONS] [FILENAME]
+
+Launch GCstar, a personal collection manager. Without any option, it will open
+FILENAME if specified or the previously opened file.
+
+Update options:
+
+ -u, --update Tell GCstar to look for available updates
+ -a, --all Update all components
+ -c, --collection Update collection models
+ -w, --website Update plugins to download information
+ -i, --import Update plugins to import data
+ -e, --export Update plugins to export data
+ -l, --lang Update translations
+ -n, --noproxy Don't ask for a proxy
+
+Execute options:
+
+ -x, --execute Enter non-interactive mode
+ -c, --collection MODEL Specify the collection type
+ -w, --website PLUGIN Specify the plugin to use to download information
+ -i, --import PLUGIN Specify the plugin to use to import a collection
+ -e, --export PLUGIN Specify the plugin to use to export the collection
+ -f, --fields FILENAME File containing fields list to use for import/export
+ -o, --output FILENAME Write output in FILENAME instead of standard output
+ --download TITLE Search for the item with TITLE as name
+ --importprefs PREFERENCES Preferences for the import plugin
+ --exportprefs PREFERENCES Preferences for the export plugin
+ --list-plugins List all the plugins available to download information
+
+ Preferences for import/export plugins are specified using this schema:
+ \"Key1=>Value1,Key2=>Value2\"
+
+Environment variables:
+
+ \$HOME Used to define following variables if needed
+ \$XDG_CONFIG_HOME Where configuration files should be stored
+ If not defined: \$HOME/.config
+ \$XDG_DATA_HOME Where some data will be stored
+ If not defined: \$HOME/.local/share
+
+Bugs reporting:
+
+ To report bugs, please use this forum:
+ http://forums.gcstar.org/viewforum.php?id=4
+
+";
+}
+
+sub version
+{
+ print "GCstar $VERSION\n";
+}
+
+Getopt::Long::Configure ('bundling');
+my ($help, $version, $update, $toBeUpdated, $noProxy, $listPlugins) = (0, 0, 0, {}, 0);
+my ($collection, $website, $import, $export) = (undef, undef, undef, undef);
+my ($execute, $title, $output, $inPrefs, $outPrefs, $fields) = (0, '', '', '', '', '');
+(usage, exit 1) if !GetOptions("h|help" => \$help,
+ "v|version" => \$version,
+ "u|update" => \$update,
+ "x|execute" => \$execute,
+ "a|all" => \$toBeUpdated->{all},
+ "c|collection:s" => \$collection,
+ "w|website:s" => \$website,
+ "i|import:s" => \$import,
+ "e|export:s" => \$export,
+ "l|lang" => \$toBeUpdated->{lang},
+ "n|noproxy" => \$noProxy,
+ "download=s" => \$title,
+ "o|output=s" => \$output,
+ "importprefs=s" => \$inPrefs,
+ "exportprefs=s" => \$outPrefs,
+ "f|fields=s" => \$fields,
+ "list-plugins" => \$listPlugins,
+ );
+
+my $atLeastOne = 0;
+foreach (keys %$toBeUpdated)
+{
+ $atLeastOne = 1 if $toBeUpdated->{$_};
+}
+(usage, exit 1) if $help || ($atLeastOne && !$update);
+(version, exit 0) if $version;
+
+if ($update)
+{
+ eval '
+ use GCUpdater;
+ use GCLang;
+ ';
+ my $langContainer = $GCLang::langs{$options->lang};
+ $toBeUpdated->{all} = 1 if !$atLeastOne;
+ $toBeUpdated->{models} = defined($collection);
+ $toBeUpdated->{plugins} = defined($website);
+ $toBeUpdated->{import} = defined($import);
+ $toBeUpdated->{export} = defined($export);
+ my $updater = new GCTextUpdater($langContainer,
+ $ENV{GCS_LIB_DIR},
+ $toBeUpdated,
+ $noProxy,
+ $VERSION);
+ $updater->update;
+ exit 0;
+}
+elsif ($execute)
+{
+ use GCCommandLine;
+
+ my $execution = new GCCommandExecution($options,
+ $collection,
+ $website,
+ $import,
+ $export,
+ $output);
+ if ($listPlugins)
+ {
+ if ($collection)
+ {
+ $execution->listPlugins;
+ exit 0;
+ }
+ else
+ {
+ print "A kind of collection should be specified (with -c) when using --list-plugins\n";
+ exit 1;
+ }
+ }
+
+ if ($ARGV[0])
+ {
+ if ($import)
+ {
+ $execution->import($ARGV[0], $inPrefs);
+ }
+ else
+ {
+ $execution->open($ARGV[0]);
+ }
+ }
+ $execution->setFields($fields) if $fields;
+ $execution->load($title) if $title;
+ if ($export)
+ {
+ $execution->export($outPrefs);
+ }
+ else
+ {
+ $execution->save;
+ }
+ exit 0;
+}
+if ($ARGV[0])
+{
+ # We have to make it absolute if needed
+ my $file = $ARGV[0];
+ $file = File::Spec->rel2abs($file)
+ if (!File::Spec->file_name_is_absolute($file));
+ $options->file($file);
+}
+
+my $pid;
+if ($MULTI_PROCESS)
+{
+ pipe(RCOMMAND, WCOMMAND);
+ pipe(RDATA, WDATA);
+ if ($^O !~ /win32/i)
+ {
+ if (!($pid = fork))
+ {
+ use GCPlugins;
+ close WCOMMAND;
+ close RDATA;
+ my $searchJob = new GCPluginJob(\*RCOMMAND, \*WDATA);
+
+ $searchJob->run;
+ }
+ }
+}
+
+use Gtk2;
+use GCMainWindow;
+
+my %searchJob = ();
+
+if ($MULTI_PROCESS)
+{
+ close RCOMMAND;
+ close WDATA;
+ %searchJob = (
+ pid => $pid,
+ command => \*WCOMMAND,
+ data => \*RDATA
+ );
+
+ if ($^O =~ /win32/i)
+ {
+ close WCOMMAND;
+ close RDATA;
+ }
+}
+Gtk2->init;
+my $window = new GCFrame($options, $VERSION, \%searchJob);
+
+#Gtk2->set_locale;
+Gtk2->main;
+
+if ($^O =~ /win32/i)
+{
+ # We store the language in .bat file if possible
+
+ my $batch = 'gcstar.bat';
+ if (-w $batch)
+ {
+ local $/ = undef;
+ open BATCH, "<$batch";
+ my $lang = $options->lang;
+ my $bat = <BATCH>;
+ $bat =~ s/LANG=.*$/LANG=$lang/m;
+ close BATCH;
+ open BATCH, ">$batch" or die "Cannot open .bat to save language\n";
+ print BATCH $bat;
+ close BATCH;
+ }
+ close(STDOUT);
+ close(STDERR);
+}
+
+if ($ENV{GCS_PROFILING} > 0)
+{
+ my $elapsed;
+ eval '$elapsed = Time::HiRes::tv_interval($initTime)';
+ print "Elapsed : $elapsed\n";
+}
+
+0;
diff --git a/install b/install
new file mode 100755
index 0000000..6bedf76
--- /dev/null
+++ b/install
@@ -0,0 +1,788 @@
+#!/usr/bin/perl
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use FindBin qw($RealBin);
+use File::Copy;
+use File::Find;
+use File::Path;
+use File::Basename;
+
+use lib "$RealBin/lib/gcstar";
+use GCLang;
+
+sub usage
+{
+ print "Usage: install [options]\n";
+ print " --text Force text installation\n";
+ print " --prefix=PREFIX Installs GCstar in PREFIX [/usr/local]\n";
+ print " --nomenu Don't install menu entry\n";
+ print " --noclean Don't remove previous installation files\n";
+ print " --verbose Display more information during installation\n";
+ print " --remove Remove GCstar from system\n";
+ print " --help Show this message\n";
+}
+
+use Getopt::Long;
+my ($withHelp, $withText, $withPrefix, $withoutMenu, $withoutClean, $verbose, $remove);
+(usage, exit 1) if !GetOptions("help" => \$withHelp,
+ "text" => \$withText,
+ "prefix=s" => \$withPrefix,
+ "nomenu" => \$withoutMenu,
+ "noclean" => \$withoutClean,
+ "verbose" => \$verbose,
+ "remove" => \$remove);
+
+(usage, exit 1) if ($ARGV[0]);
+
+sub verbosePrint
+{
+ print @_,"\n" if $verbose;
+}
+
+our $binName = 'gcstar';
+
+chdir $RealBin;
+$ENV{GCS_LIB_DIR} = 'lib/gcstar';
+
+our %lang;
+
+GCLang::loadLangs;
+(my $langCode = uc $ENV{LANG}) =~ s/(^.{2}).*$/$1/;
+$langCode = 'EN' if !$langCode || !$GCLang::langs{$langCode};
+%lang = %{$GCLang::langs{$langCode}};
+
+our $type = 'graphic';
+
+$type = 'text' if (($withPrefix) || ($withHelp) || ($withText) || ($withoutMenu) || ($withoutClean) || ($remove));
+
+sub checkDependencies;
+
+our ($mand, $opt, $optModules) = checkDependencies('GC');
+
+sub clean
+{
+ my $baseDir = shift;
+
+ my $home = $ENV{HOME};
+
+ verbosePrint $lang{InstallCleanDirectory}, $baseDir;
+ foreach (glob $baseDir.'/lib/gcstar/*')
+ {
+ unlink if -f $_;
+ if (-d _)
+ {
+ unlink foreach (glob "$_");
+ }
+ }
+
+ foreach (glob $baseDir.'/share/gcstar/*')
+ {
+ unlink if -f $_;
+ if (-d _)
+ {
+ unlink foreach (glob "$_");
+ }
+ }
+
+ unlink $baseDir.'/bin/'.$binName;
+ unlink $baseDir.'/man/man1/'.$binName.'.1.gz';
+
+ # remove menu and mime items
+
+ if (-w '/usr/share/applications')
+ {
+ unlink '/usr/share/applications/gcstar.desktop';
+ }
+ else
+ {
+ unlink $home.'/.local/share/applications/gcstar.desktop';
+ }
+
+ unlink '/usr/share/pixmaps/gcstar.png'
+ if (-w '/usr/share/pixmaps');
+
+ # Remove icons
+ unlink '/usr/share/icons/hicolor/16x16/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/16x16/apps');
+ unlink '/usr/share/icons/hicolor/22x22/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/16x16/apps');
+ unlink '/usr/share/icons/hicolor/24x24/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/24x24/apps');
+ unlink '/usr/share/icons/hicolor/32x32/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/32x32/apps');
+ unlink '/usr/share/icons/hicolor/36x36/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/36x36/apps');
+ unlink '/usr/share/icons/hicolor/48x48/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/48x48/apps');
+ unlink '/usr/share/icons/hicolor/64x64/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/64x64/apps');
+ unlink '/usr/share/icons/hicolor/72x72/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/72x72/apps');
+ unlink '/usr/share/icons/hicolor/96x96/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/96x96/apps');
+ unlink '/usr/share/icons/hicolor/128x128/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/128x128/apps');
+ unlink '/usr/share/icons/hicolor/192x192/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/192x192/apps');
+ unlink '/usr/share/icons/hicolor/256x256/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/256x256/apps');
+ unlink '/usr/share/icons/hicolor/scalable/apps/gcstar.svg'
+ if (-w '/usr/share/icons/hicolor/scalable/apps');
+ system 'gtk-update-icon-cache /usr/share/icons/hicolor';
+
+ # Remove mime type
+ unlink '/usr/share/mime/packages/gcstar.xml'
+ if (-w '/usr/share/mime/packages');
+
+ system 'update-desktop-database';
+ system 'update-mime-database /usr/share/mime';
+
+}
+
+sub recursiveCopy
+{
+ my ($orig, $dest) = @_;
+
+ mkpath $dest;
+
+ foreach (glob $orig.'/*')
+ {
+ next if /CVS/;
+ copy $_, $dest if -f $_;
+ if (-d $_)
+ {
+ my $dir = basename($_);
+ recursiveCopy($_, $dest.'/'.$dir);
+ }
+ }
+}
+
+sub installMenu
+{
+ my $home = $ENV{HOME};
+
+ if (-w '/usr/share/applications')
+ {
+ verbosePrint $lang{InstallCopyDesktop}, '/usr/share/applications';
+ copy 'share/applications/gcstar.desktop', '/usr/share/applications';
+ }
+ else
+ {
+ verbosePrint $lang{InstallCopyDesktop}, $home.'/.local/share/applications';
+ copy 'share/applications/gcstar.desktop', $home.'/.local/share/applications';
+ }
+
+ copy 'share/gcstar/icons/gcstar_48x48.png', '/usr/share/pixmaps/gcstar.png'
+ if (-w '/usr/share/pixmaps');
+
+ copy 'share/gcstar/icons/gcstar_16x16.png', '/usr/share/icons/hicolor/16x16/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/16x16/apps');
+ copy 'share/gcstar/icons/gcstar_22x22.png', '/usr/share/icons/hicolor/22x22/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/16x16/apps');
+ copy 'share/gcstar/icons/gcstar_24x24.png', '/usr/share/icons/hicolor/24x24/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/24x24/apps');
+ copy 'share/gcstar/icons/gcstar_32x32.png', '/usr/share/icons/hicolor/32x32/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/32x32/apps');
+ copy 'share/gcstar/icons/gcstar_36x36.png', '/usr/share/icons/hicolor/36x36/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/36x36/apps');
+ copy 'share/gcstar/icons/gcstar_48x48.png', '/usr/share/icons/hicolor/48x48/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/48x48/apps');
+ copy 'share/gcstar/icons/gcstar_64x64.png', '/usr/share/icons/hicolor/64x64/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/64x64/apps');
+ copy 'share/gcstar/icons/gcstar_72x72.png', '/usr/share/icons/hicolor/72x72/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/72x72/apps');
+ copy 'share/gcstar/icons/gcstar_96x96.png', '/usr/share/icons/hicolor/96x96/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/96x96/apps');
+ copy 'share/gcstar/icons/gcstar_128x128.png', '/usr/share/icons/hicolor/128x128/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/128x128/apps');
+ copy 'share/gcstar/icons/gcstar_192x192.png', '/usr/share/icons/hicolor/192x192/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/192x192/apps');
+ copy 'share/gcstar/icons/gcstar_256x256.png', '/usr/share/icons/hicolor/256x256/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/256x256/apps');
+ copy 'share/gcstar/icons/gcstar_scalable.svg', '/usr/share/icons/hicolor/scalable/apps/gcstar.svg'
+ if (-w '/usr/share/icons/hicolor/scalable/apps');
+ system 'gtk-update-icon-cache /usr/share/icons/hicolor';
+
+ copy 'share/applications/gcstar.xml', '/usr/share/mime/packages'
+ if (-w '/usr/share/mime/packages');
+
+ system 'update-desktop-database';
+ system 'update-mime-database /usr/share/mime';
+
+
+}
+
+sub doInstall
+{
+ my ($baseDir, $baseDir2) = @_;
+ $baseDir = $baseDir2->get_text if $baseDir2;
+
+ $baseDir .= '/' if $baseDir !~ /\/$/;
+ print $lang{InstallDirInfo}.$baseDir."\n";
+
+ verbosePrint $lang{InstallCopyDirectory}, $baseDir.'/bin';
+ mkpath $baseDir.'/bin';
+ copy 'bin/gcstar', $baseDir.'/bin/'.$binName;
+
+ verbosePrint $lang{InstallCopyDirectory}, $baseDir.'/man/man1';
+ mkpath $baseDir.'/man/man1';
+ my $manPage = "$baseDir/man/man1/$binName.1";
+ copy 'man/gcstar.1', $manPage;
+ `gzip -f $manPage 2>&1 >/dev/null`;
+
+ chmod 0755, $baseDir.'/bin/'.$binName;
+
+ #Copying lib
+ verbosePrint $lang{InstallCopyDirectory}, $baseDir.'/lib/gcstar';
+ recursiveCopy('lib/gcstar', $baseDir.'/lib/gcstar');
+
+ #Copying share
+ verbosePrint $lang{InstallCopyDirectory}, $baseDir.'/share/gcstar';
+ recursiveCopy('share/gcstar', $baseDir.'/share/gcstar');
+
+ chmod 0755, $baseDir.'/share/gcstar/helpers/xdg-open';
+}
+
+if ($type eq 'text')
+{
+ if ($withHelp)
+ {
+ usage;
+ exit 0;
+ }
+ elsif ($remove)
+ {
+ my $dir;
+ if ($withPrefix)
+ {
+ $dir = $withPrefix;
+ }
+ else
+ {
+ print $lang{InstallPrompt};
+
+ $| = 1;
+ $_ = <stdin>;
+ chomp;
+ $dir = ($_ ? $_ : '/usr/local/');
+ }
+ clean $dir;
+ print "\nRemoved\n";
+
+ exit 0;
+ }
+
+ print "\n".$lang{InstallMandatory}."\n\n";
+ my %mand = %$mand;
+ my @missing = ();
+ foreach (sort keys %mand)
+ {
+ print $_, ' 'x(35-length($_)), $mand{$_}, "\n";
+ push @missing, $_ if ($mand{$_} eq $lang{InstallMissing});
+ }
+
+ print "\n".$lang{InstallOptional}."\n\n";
+ my %opt = %$opt;
+ foreach (sort keys %opt)
+ {
+ print $_, ' 'x(35-length($_)), $opt{$_}, "\n";
+ }
+ print "\n";
+ if (scalar(@missing))
+ {
+ print "\n".$lang{InstallErrorMissing}."\n\n";
+ print "$_\n" foreach (@missing);
+ exit 1;
+ }
+
+ my $dir;
+ if ($withPrefix)
+ {
+ $dir = $withPrefix;
+ }
+ else
+ {
+ print $lang{InstallPrompt};
+
+ $| = 1;
+ $_ = <stdin>;
+ chomp;
+ $dir = ($_ ? $_ : '/usr/local/');
+ }
+
+ $dir =~ s/^~/$ENV{HOME}/;
+
+ my $dirError = 0;
+ if (! -e $dir)
+ {
+ eval { mkpath $dir };
+ $dirError = 1 if $@;
+ }
+ if (-w $dir && !$dirError)
+ {
+ clean $dir unless ($withoutClean);
+ installMenu unless ($withoutMenu);
+ doInstall $dir;
+ $dir .= '/' if $dir !~ /\/$/;
+ print "\n",$lang{InstallEnd},"\n",$lang{InstallNoError},"\n",$lang{InstallLaunch},$dir,"bin/",$binName,"\n";
+
+ exit 0;
+ }
+ else
+ {
+ print $lang{InstallNoPermission}."\n";
+ exit 0;
+ }
+
+}
+
+sub checkDependencies
+{
+ my $pref = shift;
+
+ my @dependencies = ();
+ my @optionals = ();
+ my $optionalsModules = {};
+
+ my @files = glob 'lib/gcstar/*';
+ for my $component('GCPlugins', 'GCExport', 'GCImport', 'GCExtract', 'GCBackend', 'GCItemsLists')
+ {
+ foreach (glob "lib/gcstar/$component/*")
+ {
+ if (-d $_)
+ {
+ push @files, glob "lib/gcstar/$component/$_/*.pm";
+ }
+ else
+ {
+ push @files, $_;
+ }
+ }
+ }
+
+ foreach my $file(@files)
+ {
+ open FILE, $file;
+ while (<FILE>)
+ {
+ push (@dependencies, $1) if ((/^\s*use\s*(.*?)\s*(qw.*?)?;/) && ($1 !~ /base|vars|locale|integer|^lib|utf8|strict|^$pref/));
+ if (
+ ((/eval.*?[\"\']use\s*(.*?)[\"\'];/) && ($1 !~ /base|vars|locale|integer|^lib|utf8|strict|\$opt|\$module|^$pref/))
+ ||
+ (/checkModule\([\"\'](.*?)[\"\']\)/)
+ )
+ #"
+ {
+ next if $1 eq 'Time::HiRes';
+ push (@optionals, $1);
+ push @{$optionalsModules->{$1}}, $file;
+ }
+
+ }
+ close FILE;
+ }
+
+ my %saw1;
+ @saw1{@dependencies} = ();
+ @dependencies = sort keys %saw1;
+
+ my %saw2;
+ @saw2{@optionals} = ();
+ @optionals = sort keys %saw2;
+
+ my %mandatoryResults = ();
+ my %optionalResults = ();
+
+ foreach (@dependencies)
+ {
+ $mandatoryResults{$_} = $lang{InstallOK};
+ eval "use $_";
+ $mandatoryResults{$_} = $lang{InstallMissing} if ($@);
+ }
+ foreach (@optionals)
+ {
+ $optionalResults{$_} = $lang{InstallOK};
+ eval "use $_";
+ $optionalResults{$_} = $lang{InstallMissing} if ($@);
+ }
+
+ return \%mandatoryResults, \%optionalResults, $optionalsModules;
+}
+
+eval
+'
+ use Gtk2 \'-init\';
+ use GCDialogs;
+';
+
+our $installDialog = Gtk2::Window->new('toplevel');
+
+sub graphicInstall
+{
+ my $widget = shift;
+
+ my $dir = $installDialog->{path}->get_text;
+ my $dirError = 0;
+ if (! -e $dir)
+ {
+ eval { mkpath $dir };
+ $dirError = 1 if $@;
+ }
+ if (-w $dir && !$dirError)
+ {
+ clean($installDialog->{path}->get_text)
+ if $installDialog->{clean}->get_active;
+
+ installMenu if $installDialog->{menu}->get_active;
+
+ doInstall($installDialog->{path}->get_text);
+
+ $dir .= '/' if $dir !~ /\/$/;
+
+ my $dialog = Gtk2::MessageDialog->new($installDialog,
+ [qw/modal destroy-with-parent/],
+ 'info',
+ 'ok',
+ $lang{InstallEnd}."\n\n".$lang{InstallNoError}."\n\n".$lang{InstallLaunch}.$dir."bin/".$binName);
+ $dialog->run();
+ $dialog->destroy ;
+
+ Gtk2->main_quit;
+ }
+ else
+ {
+ my $dialog = Gtk2::MessageDialog->new($installDialog,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $lang{InstallNoPermission}."\n\n");
+ $dialog->run();
+ $dialog->destroy ;
+ }
+}
+
+sub browse
+{
+ my $widget = shift;
+ my $dialog = new GCFileChooserDialog($lang{InstallDirectory}, $installDialog, 'select-folder');
+ $dialog->set_filename($installDialog->{path}->get_text);
+ my $response = $dialog->run;
+ if ($response eq 'ok')
+ {
+ $installDialog->{path}->set_text($dialog->get_filename);
+ }
+ $dialog->destroy;
+
+}
+
+sub updateLabel
+{
+ my ($tabs, $tabLabel) = @_;
+
+ my $current = $tabs->get_current_page;
+ $current = 0 if ($current <= 0);
+ my $label = $tabs->get_tab_label_text($tabs->get_nth_page($current));
+ $tabLabel->set_markup("<span size='xx-large' weight='bold' background='#ffffff' foreground='#1c86ee'>$label</span>");
+}
+
+$installDialog->set_title($lang{InstallTitle});
+my $iconPrefix = 'share/gcstar/icons/gcstar_';
+my $pixbuf16 = Gtk2::Gdk::Pixbuf->new_from_file($iconPrefix.'16x16.png');
+my $pixbuf32 = Gtk2::Gdk::Pixbuf->new_from_file($iconPrefix.'32x32.png');
+my $pixbuf48 = Gtk2::Gdk::Pixbuf->new_from_file($iconPrefix.'48x48.png');
+my $pixbuf64 = Gtk2::Gdk::Pixbuf->new_from_file($iconPrefix.'64x64.png');
+$installDialog->set_icon_list($pixbuf16, $pixbuf32, $pixbuf48, $pixbuf64);
+#$installDialog->set_icon_from_file('share/gcstar/icons/gcstar_16x16.png');
+
+my $vbox = new Gtk2::VBox(0,0);
+
+my %mand = %$mand;
+my %opt = %$opt;
+my $tableDepend = new Gtk2::Table(3 + scalar(keys %mand) + scalar(keys %opt),2, 0);
+$tableDepend->set_row_spacings(10);
+$tableDepend->set_col_spacings(20);
+$tableDepend->set_border_width(10);
+
+my $mandMissing = 0;
+my $optMissing = 0;
+my $labelMand = new Gtk2::Label;
+$labelMand->set_markup('<b>'.$lang{InstallMandatory}.'</b>');
+$labelMand->set_alignment(0.5, 0.0);
+$tableDepend->attach($labelMand, 0, 2, 0, 1, 'expand', 'fill', 0, 10);
+my @missings;
+my @oks;
+foreach (sort keys %mand)
+{
+ my $label1 = new Gtk2::Label($_);
+ my $label2 = new Gtk2::Label;
+
+ if ($mand{$_} eq $lang{InstallMissing})
+ {
+ $label2->set_markup("<span color='red' weight='bold'>".$lang{InstallMissing}."</span>");
+ $mandMissing = 1;
+ push @missings, [$label1, $label2];
+ }
+ else
+ {
+ $label2->set_markup("<span color='green' weight='bold'>".$lang{InstallOK}."</span>");
+ push @oks, [$label1, $label2];
+ }
+
+}
+my $i = 1;
+foreach (@missings)
+{
+ $tableDepend->attach($_->[0], 0, 1, $i, $i+1, 'fill', 'fill', 0, 0);
+ $tableDepend->attach($_->[1], 1, 2, $i, $i+1, 'fill', 'fill', 0, 0);
+
+ $i++;
+}
+foreach (@oks)
+{
+ $tableDepend->attach($_->[0], 0, 1, $i, $i+1, 'fill', 'fill', 0, 0);
+ $tableDepend->attach($_->[1], 1, 2, $i, $i+1, 'fill', 'fill', 0, 0);
+
+ $i++;
+}
+
+%opt = %$opt;
+my $labelOpt = new Gtk2::Label;
+$labelOpt->set_markup('<b>'.$lang{InstallOptional}.'</b>');
+$tableDepend->attach(new Gtk2::HSeparator, 0, 2, $i, $i+1, 'fill', 'fill', 0, 10);
+$i++;
+$tableDepend->attach($labelOpt, 0, 2, $i, $i+1, 'expand', 'fill', 0, 10);
+
+$i++;
+@missings = ();
+@oks = ();
+foreach (sort keys %opt)
+{
+ my $label1 = new Gtk2::Label($_);
+ my $label2 = new Gtk2::Label;
+
+ if ($opt{$_} eq $lang{InstallMissing})
+ {
+ my $value;
+ foreach my $module (@{$optModules->{$_}})
+ {
+ $module =~ s/.*?GC([^\/]*?)\.pm$/$1/;
+ $value .= $module.",\n";
+ }
+ $value =~ s/,\n$//;
+ $label2->set_markup("<span color='orange' weight='bold'>".$lang{InstallMissingFor}." $value</span>");
+ $label2->set_line_wrap(1);
+ $label2->set_justify('left');
+ $optMissing = 1;
+ push @missings, [$label1, $label2];
+ }
+ else
+ {
+ $label2->set_markup("<span color='green' weight='bold'>".$lang{InstallOK}."</span>");
+ push @oks, [$label1, $label2];
+ }
+}
+foreach (@missings)
+{
+ $tableDepend->attach($_->[0], 0, 1, $i, $i+1, 'fill', 'fill', 0, 0);
+ $tableDepend->attach($_->[1], 1, 2, $i, $i+1, 'fill', 'fill', 0, 0);
+
+ $i++;
+}
+foreach (@oks)
+{
+ $tableDepend->attach($_->[0], 0, 1, $i, $i+1, 'fill', 'fill', 0, 0);
+ $tableDepend->attach($_->[1], 1, 2, $i, $i+1, 'fill', 'fill', 0, 0);
+
+ $i++;
+}
+
+my $scrollDepend = new Gtk2::ScrolledWindow;
+$scrollDepend->set_policy ('automatic', 'automatic');
+$scrollDepend->set_shadow_type('none');
+$scrollDepend->add_with_viewport($tableDepend);
+$scrollDepend->set_size_request(300, 200);
+
+my $hasErrors = 0;
+my $errorLabel = new Gtk2::Label;
+$errorLabel->set_line_wrap(1);
+$errorLabel->set_justify('center');
+my $vboxDepend = new Gtk2::VBox(0,0);
+my $vboxPath = new Gtk2::VBox(0,0);
+my $hboxActions = new Gtk2::HBox(0,0);
+my $hboxControls = new Gtk2::HBox(0,1);
+my $vboxOptions = new Gtk2::VBox(0,0);
+my $ok = new Gtk2::Button->new_from_stock('gtk-ok');
+my $cancel = new Gtk2::Button->new_from_stock('gtk-cancel');
+my $next = new Gtk2::Button->new_from_stock('gtk-go-forward');
+my $previous = new Gtk2::Button->new_from_stock('gtk-go-back');
+
+$ok->can_default(1);
+$cancel->can_default(1);
+$next->can_default(1);
+
+$hboxControls->pack_end($ok, 0, 1, 5);
+$hboxControls->pack_end($next, 0, 1, 5);
+$hboxControls->pack_end($previous, 0, 1, 5);
+$hboxControls->pack_end($cancel, 0, 1, 5);
+
+$vboxOptions->set_border_width(10);
+
+if ($mandMissing)
+{
+ $errorLabel->set_markup('<b>'.$lang{InstallMissingMandatory}.'</b>');
+ $hasErrors = 2;
+}
+else
+{
+ if ($optMissing)
+ {
+ $errorLabel->set_markup('<b>'.$lang{InstallMissingOptional}.'</b>');
+ $hasErrors = 1;
+ }
+ else
+ {
+ $errorLabel->set_markup('<b>'.$lang{InstallMissingNone}.'</b>');
+ }
+
+ $installDialog->{menu} = new Gtk2::CheckButton($lang{InstallWithMenu});
+ $installDialog->{menu}->set_active(1);
+ $vboxOptions->pack_start($installDialog->{menu},0,0,10);
+
+ $installDialog->{clean} = new Gtk2::CheckButton($lang{InstallWithClean});
+ $installDialog->{clean}->set_active(1);
+ $vboxOptions->pack_start($installDialog->{clean},0,0,10);
+
+ $hboxActions->set_border_width(20);
+ my $pathLabel = new Gtk2::Label($lang{InstallSelectDirectory});
+ $installDialog->{path} = new Gtk2::Entry;
+ $installDialog->{path}->set_text('/usr/local/');
+ $installDialog->{path}->set_activates_default(1);
+ $hboxActions->pack_start($installDialog->{path},1,1,5);
+ my $openButton = Gtk2::Button->new_from_stock('gtk-open');
+ $openButton->signal_connect('clicked', \&browse, $installDialog);
+ $hboxActions->pack_start($openButton,0,0,5);
+ $vboxPath->pack_start($pathLabel,0,0,5);
+ $vboxPath->pack_start($hboxActions,0,0,5);
+}
+
+$vboxDepend->pack_start($errorLabel,0,0,10);
+$vboxDepend->pack_start($scrollDepend,1,1,0);
+
+
+my $sep1 = new Gtk2::HSeparator;
+my $sep2 = new Gtk2::HSeparator;
+
+#my $image = Gtk2::Image->new_from_file('share/gcstar/logos/about.png');
+#$vbox->pack_start($image,0,0,10);
+
+my $tabs = Gtk2::Notebook->new();
+$tabs->set_border_width(0);
+$tabs->set_tab_pos('left');
+$tabs->set_show_border(1);
+$tabs->set_show_tabs(0);
+
+$tabs->append_page($vboxDepend, $lang{InstallDependencies});
+$tabs->append_page($vboxPath, $lang{InstallPath});
+$tabs->append_page($vboxOptions, $lang{InstallOptions});
+
+my $headerBox = new Gtk2::EventBox;
+my $colorHeaderBg = Gtk2::Gdk::Color->parse('#ffffff');
+$headerBox->modify_bg('normal', $colorHeaderBg);
+my $hboxLabel = new Gtk2::HBox;
+my $leftBox = new Gtk2::EventBox;
+$leftBox->modify_bg('normal', $colorHeaderBg);
+$leftBox->set_size_request(83,57);
+my $tabLabel = new Gtk2::Label;
+my $image = Gtk2::Image->new_from_file('share/gcstar/logos/install.png');
+$hboxLabel->pack_start($leftBox,0,0,0);
+$hboxLabel->pack_start($tabLabel,1,1,0);
+$hboxLabel->pack_start($image,0,0,0);
+$headerBox->add($hboxLabel);
+
+$previous->set_sensitive(0);
+updateLabel($tabs, $tabLabel);
+$next->signal_connect('clicked' => sub {
+ $tabs->next_page;
+ my $currentPage = $tabs->get_current_page;
+ updateLabel($tabs, $tabLabel);
+ if ($currentPage == 2)
+ {
+ my $allocation = $next->allocation;
+ $ok->set_size_request($allocation->width, $allocation->height);
+ $ok->show;
+ $next->hide;
+ $ok->grab_default;
+ }
+ $previous->set_sensitive(1) if $currentPage >= 1;
+});
+
+$previous->signal_connect('clicked' => sub {
+ $tabs->prev_page;
+ my $currentPage = $tabs->get_current_page;
+ updateLabel($tabs, $tabLabel);
+ $previous->set_sensitive(0) if $currentPage == 0;
+ if ($currentPage <= 1)
+ {
+ $ok->hide;
+ $next->show;
+ $next->grab_default;
+ }
+});
+
+my $vboxIn = new Gtk2::VBox(0,0);
+$vboxIn->pack_start($headerBox,0,0,0);
+$vboxIn->pack_start(Gtk2::HSeparator->new,0,0,5);
+$vboxIn->pack_start($tabs,1,1,0);
+my $hboxSpace = new Gtk2::HBox(0,0);
+$hboxSpace->pack_start($vboxIn,1,1,12);
+$vbox->pack_start($hboxSpace,1,1,10);
+
+$vbox->pack_start($sep2,0,0,0);
+$vbox->pack_start($hboxControls,0,0,5);
+
+$installDialog->add($vbox);
+
+$ok->signal_connect('clicked' => \&graphicInstall);
+$cancel->signal_connect('clicked' => sub { Gtk2->main_quit; });
+$installDialog->signal_connect(destroy => sub { Gtk2->main_quit; });
+
+$installDialog->show_all;
+$ok->hide;
+$installDialog->resize(500,400);
+
+if ($hasErrors > 1)
+{
+ $ok->set_sensitive(0);
+ $next->set_sensitive(0);
+ $cancel->grab_default;
+}
+else
+{
+ $next->grab_default;
+}
+
+Gtk2->main;
+
+0;
diff --git a/lib/gcstar/GCBackend/GCBackendXmlCommon.pm b/lib/gcstar/GCBackend/GCBackendXmlCommon.pm
new file mode 100644
index 0000000..b8a3054
--- /dev/null
+++ b/lib/gcstar/GCBackend/GCBackendXmlCommon.pm
@@ -0,0 +1,305 @@
+package GCBackend::GCBackendXmlCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+use filetest 'access';
+
+{
+ package GCBackend::GCBeXmlBase;
+
+ use File::Temp qw/ tempfile /;
+ use File::Copy;
+
+ my %xmlConv = (
+ '&' => '&amp;',
+ '"' => '&quot;',
+ '<' => '&lt;',
+ '>' => '&gt;',
+ '' => '',
+ );
+ my $toBeReplaced = join '', keys %xmlConv;
+
+ sub new
+ {
+ my ($proto, $modelLoader) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {modelLoader => $modelLoader};
+ bless $self, $class;
+ return $self;
+ }
+
+ sub getVersion
+ {
+ my $self = shift;
+ my $version = undef;
+ return $version if (! -r $self->{file});
+ open DATA, $self->{file};
+ binmode(DATA, ':utf8');
+ while (<DATA>)
+ {
+ next if ! /^\s*<collection.*/;
+ $version = $1
+ if /version="([^"]*)"/;
+ last;
+ }
+ close DATA;
+ return $version;
+ }
+
+ sub prepareModel
+ {
+ my ($self, $file) = @_;
+ open COLLECTION, $file;
+ my $model;
+ while (<COLLECTION>)
+ {
+ if (/type="(.*?)"/)
+ {
+ $model = $1;
+ last;
+ }
+ }
+ close COLLECTION;
+ $self->{modelLoader}->preloadModel($model);
+ }
+
+ sub setParameters
+ {
+ my ($self, %options) = @_;
+ $self->{$_} = $options{$_} foreach keys %options;
+ }
+
+ sub hashToXMLString
+ {
+ my %hash = @_;
+ my $result = '';
+ foreach (keys %hash)
+ {
+ $result .= " $_=\"".$hash{$_}.'"';
+ }
+ return $result;
+ }
+
+ sub listToXml
+ {
+ my $value = shift;
+ my $xml = '';
+ my $col;
+ foreach (@{$value})
+ {
+ $xml .= ' <line>
+';
+ foreach $col(@{$_})
+ {
+ (my $newCol = $col) =~ s/([$toBeReplaced])/$xmlConv{$1}/go;
+ #"
+ $xml .= " <col>$newCol</col>\n";
+ }
+ $xml .= ' </line>
+';
+ }
+ return $xml;
+ }
+
+ sub setHistories
+ {
+ my ($self, $histories) = @_;
+
+ $self->{histories} = $histories;
+ }
+
+ sub save
+ {
+ my ($self, $data, $info, $splash, $keepCurrentValueForDate) = @_;
+
+ # Save into a new file to prevent crashes during saving
+ (my ($tmpFd, $tmpFile)) = tempfile();
+ if (!$tmpFd)
+ {
+ my @error = ('SaveError', '');
+ return {error => \@error};
+ }
+
+ binmode($tmpFd, ':utf8');
+
+ my $xmlModel = '';
+ my $xmlPreferences = '';
+ my $collectionType;
+ my $versionString = '';
+
+ if (exists $self->{version})
+ {
+ $versionString = ' version="'.$self->{version}.'"';
+ }
+ if (($self->{modelLoader}->{model}->isInline)
+ || ($self->{modelLoader}->{model}->isPersonal && $self->{standAlone}))
+ {
+ $xmlModel = $self->{modelLoader}->{model}->toString('collectionInlineDescription', 1);
+ $xmlPreferences = $self->{modelLoader}->{model}->{preferences}->toXmlString;
+ $collectionType = 'inline';
+ }
+ else
+ {
+ $collectionType = $self->{modelLoader}->{model}->getName;
+ $xmlModel = $self->{modelLoader}->{model}->toStringAddedFields('userCollection');
+ }
+ my $information = ' <information>
+';
+ $information .= " <$_>".GCUtils::encodeEntities($info->{$_})."</$_>\n"
+ foreach (sort keys %{$info});
+ $information .= ' </information>';
+
+ # Change this to 1 to save history. Not fully functional yet
+ # Because we don't remove item that are no more present in data.
+ my $withHistory = 0;
+ my $histories;
+ if ($withHistory)
+ {
+ $histories = ' <histories>
+';
+ foreach (keys %{$self->{histories}})
+ {
+ $histories .= " <history name=\"$_\">\n";
+ foreach my $value(@{$self->{histories}->{$_}})
+ {
+ if (ref($value) eq 'ARRAY')
+ {
+ $histories .= ' <values>
+';
+ foreach my $entry(@$value)
+ {
+ next if $entry eq '';
+ $entry =~ GCUtils::encodeEntities($entry);
+ $histories .= " <value>$entry</value>\n";
+ }
+ $histories .= ' </values>
+';
+ }
+ else
+ {
+ next if $value eq '';
+ $histories .= ' <value>'.GCUtils::encodeEntities($value)."</value>\n";
+ }
+ }
+ $histories .= ' </history>
+';
+ }
+ $histories .= ' </histories>';
+ }
+
+ my $number = 0;
+ $number = scalar @$data;
+
+ print $tmpFd '<?xml version="1.0" encoding="UTF-8"?>
+<collection type="',$collectionType,'" items="',$number,'"', $versionString,'>
+',$information,'
+',$xmlModel,'
+',$xmlPreferences,'
+',$histories,'
+';
+ my $i = 1;
+ foreach (@$data)
+ {
+ #Perform the transformation for each image value
+ foreach my $pic(@{$self->{modelLoader}->{model}->{managedImages}})
+ {
+ $_->{$pic}
+ = $self->{modelLoader}->transformPicturePath($_->{$pic}, undef, $_, $pic);
+ }
+
+ print $tmpFd ' <item
+';
+ my @complexFields;
+ my @longFields;
+ foreach my $field(@{$self->{modelLoader}->{model}->{fieldsNames}})
+ {
+ if (ref($_->{$field}) eq 'ARRAY')
+ {
+ push @complexFields, $field;
+ }
+ elsif ($self->{modelLoader}->{model}->{fieldsInfo}->{$field}->{type}
+ eq 'long text')
+ {
+ push @longFields, $field;
+ }
+ else
+ {
+ (my $data = $_->{$field}) =~ s/([$toBeReplaced])/$xmlConv{$1}/go;
+ if (($self->{modelLoader}->{model}->{fieldsInfo}->{$field}->{type} eq 'date')
+ && ($data eq 'current')
+ && (!$keepCurrentValueForDate))
+ {
+ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+ $data = sprintf('%02d/%02d/%4d', $mday, $mon+1, 1900+$year);
+ }
+ print $tmpFd ' ', $field, '="', $data, '"
+';
+ }
+ }
+ print $tmpFd ' >
+';
+ foreach my $field(@longFields)
+ {
+ #(my $data = $_->{$field}) =~ s/&/&amp;/g;
+ #$data =~ s/</&lt;/g;
+ #$data =~ s/>/&gt;/g;
+ #$data =~ s/"/&quot;/g;
+ (my $data = $_->{$field}) =~ s/([$toBeReplaced])/$xmlConv{$1}/go;
+ #"
+ print $tmpFd ' <', $field, '>', $data, '</', $field, '>
+';
+ }
+ foreach my $field(@complexFields)
+ {
+ print $tmpFd ' <', $field, '>
+', listToXml($_->{$field}), ' </', $field, '>
+';
+ }
+
+ print $tmpFd ' </item>
+';
+ $splash->setProgressForItemsDisplay($i) if $splash;
+
+ $self->{modelLoader}->restoreInfo($_)
+ if $self->{wantRestore};
+
+ $i++;
+ }
+ print $tmpFd '</collection>
+';
+ close $tmpFd;
+
+ # Now everything is OK, we move the temporary file over the correct one
+ if (!move($tmpFile, $self->{file}))
+ {
+ my @error = ('SaveError', $!);
+ return {error => \@error};
+ }
+
+ return {error => undef};
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCBackend/GCBackendXmlParser.pm b/lib/gcstar/GCBackend/GCBackendXmlParser.pm
new file mode 100644
index 0000000..091823b
--- /dev/null
+++ b/lib/gcstar/GCBackend/GCBackendXmlParser.pm
@@ -0,0 +1,491 @@
+package GCBackend::GCBackendXmlParser;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+use filetest 'access';
+use GCBackend::GCBackendXmlCommon;
+
+{
+ package GCBackend::GCBeXmlParser;
+
+ use File::Temp qw/ tempfile /;
+ use File::Copy;
+
+ use base 'GCBackend::GCBeXmlBase';
+
+ my $globalInstance;
+ my $globalSplash;
+ my $globalModelLoader;
+ #my @data;
+ #my %information;
+ #my %histories;
+ my $maxId;
+ my $savedMaxId;
+ my $historyInline;
+
+ sub load
+ {
+ my ($self, $splash) = @_;
+
+ if (! -r $self->{file})
+ {
+ my @error = ('OpenError', '');
+ return {error => \@error};
+ }
+
+ $self->{data} = [];
+ $self->{information} = {};
+ $self->{histories} = ();
+ $maxId = 0;
+ $savedMaxId = 0;
+
+ $globalInstance = $self;
+ $globalSplash = $splash;
+ $globalModelLoader = $self->{modelLoader};
+
+ my $parser = XML::Parser->new(Handlers => {
+ Init => \&StartDocument,
+ Final => \&EndDocument,
+ Start => \&StartTag,
+ End => \&EndTag,
+ Char => \&Text,
+ });
+ # We have to preload the model into cache because XML::Parser is not
+ # re-entrant. Then when we begin parsing, we cannot parse the model
+ $self->prepareModel($self->{file});
+ my $error = undef;
+ while (1)
+ {
+ eval {
+ $parser->parsefile($self->{file});
+ };
+ if ($@)
+ {
+ my $errorDesc = $@;
+
+ # Here we will fix the collection if an invalid character was found by trying to remove it.
+ # There should be room for optimisation here
+
+ if ($errorDesc =~ /not\s*well-formed\s*\(invalid\s*token\)\s*.*?byte\s*(\d+)/)
+ {
+ my $charPosition = $1;
+ # We would have failed before if it cannot be opened, so we don't check that.
+ open COL, $self->{file};
+ seek COL, $charPosition, 0;
+ my $badChar;
+ read COL, $badChar, 1;
+ seek COL, 0, 0;
+ (my ($newCol, $tmpFile)) = tempfile();
+ while (<COL>)
+ {
+ s/$badChar//g;
+ print $newCol $_;
+ }
+ close $newCol;
+ close COL;
+ move($tmpFile, $self->{file});
+ }
+ else
+ {
+ $errorDesc =~ s/^\n*//;
+ my @errorArray = ('OpenFormatError', $errorDesc);
+ $error = \@errorArray;
+ last;
+ }
+ }
+ else
+ {
+ last;
+ }
+ }
+
+ # TODO : Compare performances with and without the compact below because the duplicates are checked
+ # also when adding to the graphical components
+ # Compact histories. We didn't filtered previously for performances issues
+ #GCUtils::compactHistories(\%histories);
+
+ $self->{information}->{maxId} = $maxId
+ if ! exists $self->{information}->{maxId};
+
+ # gotHistory:
+ # 0: Nothing done
+ # 1: Returning history
+ # 2: Already initialized
+
+ return {
+ error => $error,
+ data => $self->{data},
+ information => $self->{information},
+ histories => \$self->{histories},
+ gotHistory => (1 + ($historyInline ? 0 : 1)), # We always have an initalized history with this BE.
+ };
+ }
+
+ # Parser routines
+
+ # Some globals to speed up things
+ my $inCol;
+ my $inLine;
+ my $currentTag;
+ my $currentCol;
+ my $currentCount;
+ my $currentIsList;
+ my $isItem;
+ my $isInfo;
+ my $newItem;
+ my $modCap;
+ my $prefCap;
+ my $anyCap;
+ my $isInline;
+ my $inlineModel;
+ my $inlinePreferences;
+
+ my $inHistories;
+ my $historyField;
+ # history type :
+ # 1 : Single list
+ # 2 : Multiple list
+ my $historyType;
+ my $historyCap;
+
+ sub StartDocument
+ {
+ $isItem = 0;
+ $inLine = 0;
+ $inCol = 0;
+ $currentCol = '';
+ $currentCount = 0;
+ $modCap = 0;
+ $prefCap = 0;
+ $anyCap = 0;
+ $inlineModel = '';
+ $inlinePreferences = '';
+
+# SAVED HISTORIES DEACTIVATED
+# $inHistories = 0;
+# $historyField = '';
+# $historyCap = 0;
+ $historyInline = 0;
+ }
+
+ sub EndDocument
+ {
+ if (($inlineModel) && ($isInline))
+ {
+ $globalModelLoader->setCurrentModelFromInline({inlineModel => $inlineModel,
+ inlinePreferences => $inlinePreferences});
+ }
+ }
+
+ sub StartTag
+ {
+ #my ($expat, $tag, %attrs) = @_;
+ if ($isItem)
+ {
+ if ($inLine)
+ {
+ #Only a col could start in a line
+ $inCol = 1;
+ }
+ elsif ($_[1] eq 'line')
+ {
+ $inLine = 1;
+ $currentIsList = 1;
+ $newItem->{$currentTag} = [] if (ref($newItem->{$currentTag}) ne 'ARRAY');
+ push @{$newItem->{$currentTag}}, [];
+ }
+ else
+ {
+ $currentIsList = 0;
+ $currentTag = $_[1];
+ }
+ }
+ elsif ($isInfo)
+ {
+ $currentTag = $_[1];
+ $savedMaxId = 1 if $currentTag eq 'maxId';
+ }
+ else
+ {
+ my ($expat, $tag, %attrs) = @_;
+ if ($modCap)
+ {
+ $tag =~ s/^user(.)/\L$1\E/;;
+ $inlineModel .= "<$tag".GCBackend::GCBeXmlBase::hashToXMLString(%attrs).'>';
+ }
+ elsif ($prefCap)
+ {
+ $inlinePreferences .= "<$tag".GCBackend::GCBeXmlBase::hashToXMLString(%attrs).'>';
+ }
+ elsif ($tag eq 'item')
+ {
+ $newItem = \%attrs;
+ $isItem = 1;
+ }
+ elsif ($tag eq 'information')
+ {
+ $isInfo = 1;
+ }
+ elsif (($tag eq 'collectionInlineDescription') || ($tag eq 'userCollection'))
+ {
+ $modCap = 1;
+ $anyCap = 1;
+ $inlineModel = '<collection'.GCBackend::GCBeXmlBase::hashToXMLString(%attrs).">\n";
+ }
+ elsif ($tag eq 'collectionInlinePreferences')
+ {
+ $prefCap = 1;
+ $anyCap = 1;
+ $inlinePreferences = '<preferences'.GCBackend::GCBeXmlBase::hashToXMLString(%attrs).">\n";
+ }
+ elsif ($tag eq 'collection')
+ {
+ $globalSplash->setItemsTotal($attrs{items})
+ if $globalSplash;
+ if ($attrs{type} eq 'inline')
+ {
+ $isInline = 0;
+ }
+ else
+ {
+ if (! $globalModelLoader->setCurrentModel($attrs{type}))
+ {
+ die $globalModelLoader->{lang}->{ErrorModelNotFound}.$attrs{type}
+ ."\n\n"
+ .$globalModelLoader->getUserModelsDirError."\n";
+ }
+ }
+ }
+# SAVED HISTORIES DEACTIVATED
+# elsif ($tag eq 'histories')
+# {
+# $inHistories = 1;
+# $historyInline = 1;
+# }
+# elsif ($inHistories)
+# {
+# if ($tag eq 'history')
+# {
+# $historyField = $attrs{name};
+# # Default is single
+# $historyType = 1;
+# }
+# elsif ($tag eq 'values')
+# {
+# push @{$globalInstance->{histories}->{$historyField}}, [];
+# $historyType = 2;
+# }
+# elsif ($tag eq 'value')
+# {
+# if ($historyType == 1)
+# {
+# push @{$globalInstance->{histories}->{$historyField}}, '';
+# }
+# else
+# {
+# push @{$globalInstance->{histories}->{$historyField}->[-1]}, '';
+# }
+# $historyCap = 1;
+# }
+# }
+ }
+ }
+
+ sub EndTag
+ {
+ if ($anyCap)
+ {
+ if ($modCap)
+ {
+ if (($_[1] eq 'collectionInlineDescription') || ($_[1] eq 'userCollection'))
+ {
+ $anyCap = $prefCap;
+ $modCap = 0;
+ $inlineModel .= '</collection>';
+ if ($inlinePreferences)
+ {
+ $globalModelLoader->setCurrentModelFromInline({inlineModel => $inlineModel,
+ inlinePreferences => $inlinePreferences});
+ $inlineModel = undef;
+ }
+ elsif($_[1] eq 'userCollection')
+ {
+ $globalModelLoader->addFieldsToDefaultModel($inlineModel);
+ $inlineModel = undef;
+ }
+
+ }
+ else
+ {
+ (my $tag = $_[1]) =~ s/^user(.)/\L$1\E/;
+ $inlineModel .= "</$tag>\n";
+ }
+ return;
+ }
+ else
+ {
+ if ($_[1] eq 'collectionInlinePreferences')
+ {
+ $anyCap = $modCap;
+ $prefCap = 0;
+ $inlinePreferences .= '</preferences>';
+ if ($inlineModel)
+ {
+ $globalModelLoader->setCurrentModelFromInline({inlineModel => $inlineModel,
+ inlinePreferences => $inlinePreferences});
+ $inlineModel = '';
+ }
+ }
+ else
+ {
+ $inlinePreferences .= '</'.$_[1].">\n";
+ }
+ return;
+ }
+ }
+
+ if ($_[1] eq 'item')
+ {
+ push @{$globalInstance->{data}}, $newItem;
+ $currentCount++;
+# SAVED HISTORIES DEACTIVATED
+# if (!$historyInline)
+# {
+ #foreach (@{$globalModelLoader->{model}->{fieldsHistory}})
+ #{
+ # push @{$globalInstance->{histories}->{$_}}, $newItem->{$_};
+ #}
+ if ($globalModelLoader->{panel})
+ {
+ foreach (@{$globalModelLoader->{model}->{fieldsHistory}})
+ {
+ $globalModelLoader->{panel}->{$_}->addHistory($newItem->{$_}, 1);
+ }
+ }
+# }
+ foreach (@{$globalModelLoader->{model}->{fieldsNotNull}})
+ {
+ $newItem->{$_} = $globalModelLoader->{model}->{fieldsInfo}->{$_}->{init} if ! $newItem->{$_};
+ }
+
+ if (!$savedMaxId)
+ {
+ my $id = $newItem->{$globalModelLoader->{model}->{commonFields}->{id}};
+ $maxId = $id
+ if $id > $maxId;
+ }
+
+ $globalSplash->setProgressForItemsLoad($currentCount)
+ if $globalSplash;
+
+ $isItem = 0;
+ }
+ elsif ($_[1] eq 'information')
+ {
+ $isInfo = 0 if !$isItem;
+ }
+ elsif ($inCol)
+ {
+ # We are closing a col as it could not have tags inside
+ push @{$newItem->{$currentTag}->[-1]}, $currentCol;
+ $currentCol = '';
+ $inCol = 0;
+ }
+# SAVED HISTORIES DEACTIVATED
+# elsif ($inHistories)
+# {
+# $inHistories = 0 if $_[1] eq 'histories';
+# $historyField = '' if $_[1] eq 'history';
+# $historyCap = 0 if $_[1] eq 'value';
+#
+# }
+ else
+ {
+ # The only tag that could prevent us from closing a line is col, but it has
+ # already been managed
+ if ($inLine)
+ {
+ $inLine = 0;
+ }
+ else
+ {
+ $currentTag = '';
+ }
+ }
+ }
+
+ sub Text
+ {
+ if ($isItem)
+ {
+ if ((! $currentTag)
+ || $inLine
+ || $currentIsList
+ || ((!$newItem->{$currentTag}) && ($_[1] =~ /^\s*$/oms)))
+ {
+ if ($inCol)
+ {
+ return if $_[1] =~ /^\s*$/oms;
+ $currentCol .= $_[1];
+ }
+ }
+ else
+ {
+ $newItem->{$currentTag} .= $_[1];
+ }
+ }
+ elsif ($isInfo)
+ {
+ return if $_[1] =~ /^\s*$/oms;
+ $globalInstance->{information}->{$currentTag} .= $_[1];
+ }
+ else
+ {
+ if ($modCap)
+ {
+ $inlineModel .= $_[1];
+ }
+ elsif ($prefCap)
+ {
+ $inlinePreferences .= $_[1];
+ }
+# elsif ($historyCap)
+# {
+# if ($historyType == 1)
+# {
+# $globalInstance->{histories}->{$historyField}->[-1] .= $_[1];
+# }
+# else
+# {
+# $globalInstance->{histories}->{$historyField}->[-1]->[-1] .= $_[1];
+# }
+# }
+ }
+ }
+
+}
+
+
+1;
diff --git a/lib/gcstar/GCBookmarks.pm b/lib/gcstar/GCBookmarks.pm
new file mode 100644
index 0000000..e771113
--- /dev/null
+++ b/lib/gcstar/GCBookmarks.pm
@@ -0,0 +1,729 @@
+package GCBookmarks;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+use utf8;
+use Gtk2;
+
+our $bookmarksFile = 'GCbookmarks.conf';
+
+use strict;
+{
+ package GCBookmarksLoader;
+
+ sub new
+ {
+ my ($proto, $parent, $menu) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {parent => $parent,
+ menu => $menu};
+ bless ($self, $class);
+ $self->load;
+ return $self;
+ }
+
+ sub load
+ {
+ my $self = shift;
+
+ open BOOKMARKS, $ENV{GCS_CONFIG_HOME}."/$bookmarksFile";
+ my $xmlString = do {local $/; <BOOKMARKS>};
+ close BOOKMARKS;
+ $self->{menu}->clearBookmarks;
+ my $bookmarks;
+ if ($xmlString)
+ {
+ my $xs = XML::Simple->new;
+ $bookmarks = $xs->XMLin($xmlString,
+ ForceArray => ['file', 'dir'],
+ KeyAttr => {
+ 'dir' => 'id'
+ });
+ $self->{menu}->setBookmarks($bookmarks);
+ }
+ $self->{bookmarks} = $bookmarks;
+ }
+
+ sub save
+ {
+ my ($self, $bookmarks) = @_;
+
+ return if !$bookmarks->{file};
+ $self->{bookmarks} = $bookmarks;
+ my $xs = XML::Simple->new;
+ my $xmlString = $xs->XMLout($bookmarks,
+ XMLDecl => '<?xml version="1.0" encoding="UTF-8"?>',
+ RootName => 'bookmarks');
+ open BOOKMARKS, '>'.$ENV{GCS_CONFIG_HOME}."/$bookmarksFile";
+ binmode(BOOKMARKS, ':utf8');
+ print BOOKMARKS $xmlString;
+ close BOOKMARKS;
+ $self->{menu}->clearBookmarks;
+ $self->{menu}->setBookmarks($bookmarks);
+ }
+}
+
+{
+ package GCBookmarksFolders;
+ use base 'Gtk2::TreeView';
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new();
+ $self->{class} = $class;
+ $self->{model} = new Gtk2::TreeStore('Glib::String', 'Glib::Int');
+ $self->set_model($self->{model});
+ $self->{parent} = $parent;
+ my $column = Gtk2::TreeViewColumn->new_with_attributes($parent->{lang}->{BookmarksFolder}, Gtk2::CellRendererText->new,
+ 'text' => 0, 'editable' => 1);
+ $self->append_column($column);
+
+ $self->signal_connect (cursor_changed => sub {
+ my ($sl, $path, $column) = @_;
+ my $iter = $sl->get_selection->get_selected;
+ $self->{currentIdx} = ($self->{model}->get($iter))[1];
+ $self->{parent}->setBookmarksList($self->{bookmarks}->[$self->{currentIdx}]);
+ });
+
+ my $targetEntryReorder = {
+ target => 'text/plain',
+ flags => ['same-widget'],
+ info => 0,
+ };
+ my $targetEntryMove = {
+ target => 'text/plain',
+ flags => ['same-app'],
+ info => 1,
+ };
+
+ $self->enable_model_drag_source('button1-mask','move', $targetEntryReorder, $targetEntryMove);
+ $self->enable_model_drag_dest('move', $targetEntryReorder, $targetEntryMove);
+ $self->signal_connect_after('drag_data_received' => \&dropHandler, $self);
+
+ $self->signal_connect('key-press-event' => sub {
+ my ($widget, $event) = @_;
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+ if ($key eq 'Delete')
+ {
+ $self->removeFolder;
+ return 1;
+ }
+ return 0;
+ });
+
+ bless($self, $class);
+ return $self;
+ }
+
+ sub dropHandler
+ {
+ my ($treeview, $context, $widget_x, $widget_y, $data, $info,$time, $self) = @_;
+ my $source = $context->get_source_widget;
+ my ($targetPath, $targetPos) = $treeview->get_dest_row_at_pos($widget_x, $widget_y);
+ return if !$targetPath;
+ my $targetIter = $self->get_model->get_iter($targetPath);
+ my $origIter = $source->get_selection->get_selected;
+ if ($source == $self)
+ {
+ if (($targetPath->to_string eq $self->get_model->get_path($origIter)->to_string)
+ || ($self->{model}->is_ancestor($origIter, $targetIter)))
+ {
+ $context->finish(1,0,$time);
+ return;
+ }
+ my $newIter;
+ my $parent;
+ my $pos;
+ my $ref;
+ if ($targetPos =~ /^into/)
+ {
+ $parent = $targetIter;
+ $pos = 0;
+ $ref = 0;
+ }
+ else
+ {
+ $parent = $self->{model}->iter_parent($targetIter);
+ $pos = ($targetPos eq 'before') ? 1 : 0;
+ $ref = $targetIter;
+ }
+ $self->copyIter($origIter, $parent, $pos, $ref);
+ }
+ else
+ {
+ my @origData = $source->get_model->get_value($origIter);
+ my $bookmark = {'name' => $origData[0], 'path' => $origData[1]};
+ my $idx = ($self->{model}->get($targetIter))[1];
+ push @{$self->{bookmarks}->[$idx]}, $bookmark;
+ my @bookmarks;
+ my $i = -1;
+ my $selected = ($source->get_selected_indices)[0];
+ foreach (@{$source->{data}})
+ {
+ $i++;
+ next if $i == $selected;
+ push @bookmarks, {name => $_->[0], path => $_->[1]};
+ }
+ $self->{bookmarks}->[$self->{currentIdx}] = \@bookmarks;
+ }
+ $context->finish(1,1,$time);
+ }
+
+ sub copyIter
+ {
+ my ($self, $iter, $parent, $pos, $ref) = @_;
+
+ my @origData;
+ my $i = 0;
+ foreach ($self->get_model->get_value($iter))
+ {
+ push @origData, $i, $_;
+ $i++;
+ }
+ my $newIter;
+ if ($ref)
+ {
+ if ($pos)
+ {
+ $newIter = $self->{model}->insert_before($parent,
+ $ref);
+ }
+ else
+ {
+ $newIter = $self->{model}->insert_after($parent,
+ $ref);
+ }
+ }
+ else
+ {
+ $newIter = $self->{model}->append($parent);
+ }
+ $self->{model}->set($newIter, @origData);
+ my $childIter = $self->{model}->iter_children($iter);
+ while ($childIter)
+ {
+ $self->copyIter($childIter, $newIter);
+ $childIter = $self->{model}->iter_next($childIter);
+ }
+ }
+
+ sub setBookmarks
+ {
+ my ($self, $bookmarks) = @_;
+ $self->{bookmarks} = [];
+ $self->{bookmarkIdx} = 0;
+ $self->{currentIdx} = 0;
+ $self->{model}->clear;
+ $self->addBookmarksDir($bookmarks, undef);
+ $self->expand_row(Gtk2::TreePath->new_from_string('0'), 0);
+ $self->{parent}->setBookmarksList($self->{bookmarks}->[$self->{currentIdx}]);
+ }
+
+ sub addBookmarksDir
+ {
+ my ($self, $dir, $parent) = @_;
+ my $name = $dir->{name};
+ ($name = $self->{parent}->{lang}->{MenuBookmarks}) =~ s/_//g if !$parent;
+ my @data = (0 => $name, 1 => $self->{bookmarkIdx});
+ $self->{bookmarks}->[$self->{bookmarkIdx}] = $dir->{file};
+ $self->{bookmarkIdx}++;
+ my $newDir = $self->{model}->append($parent);
+ $self->{model}->set($newDir, @data);
+ foreach my $sub(@{$dir->{dir}})
+ {
+ $self->addBookmarksDir($sub, $newDir);
+ }
+ }
+
+ sub addBookmark
+ {
+ my ($self, $path, $name) = @_;
+ push(@{$self->{bookmarks}->[$self->{currentIdx}]}, {name => $name, path => $path});
+ }
+
+ sub addFolder
+ {
+ my ($self, $name) = @_;
+ my @data = (0 => $name, 1 => $self->{bookmarkIdx});
+ $self->{bookmarks}->[$self->{bookmarkIdx}] = [];
+ $self->{bookmarkIdx}++;
+ my $parent = $self->get_selection->get_selected;
+ $parent ||= $self->{model}->get_iter_first;
+ $self->{model}->set($self->{model}->append($parent), @data);
+ }
+
+ sub removeFolder
+ {
+ my $self = shift;
+ my $iter = $self->get_selection->get_selected;
+ $self->{model}->remove($iter);
+ }
+
+ sub getBookmarks
+ {
+ my $self = shift;
+
+ my $result = {};
+ $self->dumpTree($result, $self->{model}->get_iter_first, 1);
+ return $result;
+ }
+
+ sub dumpTree
+ {
+ my ($self, $dir, $iter, $first) = @_;
+ my @data = $self->{model}->get($iter);
+ $dir->{name} = $data[0] if ! $first;
+ $dir->{file} = $self->{bookmarks}->[$data[1]];
+ $dir->{dir} = [];
+ my $i = 0;
+ my $child;
+ while ($child = $self->{model}->iter_nth_child($iter, $i))
+ {
+ $dir->{dir}->[$i] = {};
+ $self->dumpTree($dir->{dir}->[$i], $child);
+ $i++;
+ }
+ }
+
+ sub setBookmarksInCurrentFolder
+ {
+ my ($self, $bookmarksList) = @_;
+
+ $self->{bookmarks}->[$self->{currentIdx}] = $bookmarksList;
+ }
+}
+
+use GCDialogs;
+
+{
+ package GCBookmarkNewFolderDialog;
+ use base 'GCModalDialog';
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{BookmarksNewFolder},
+ 'gtk-add',
+ );
+ bless($self, $class);
+ $self->{entry} = new GCShortText;
+ $self->{entry}->signal_connect('activate' => sub {$self->response('ok')} );
+ my $hbox = new Gtk2::HBox(0,0);
+ $hbox->pack_start($self->{entry},1,1,$GCUtils::margin);
+ $self->vbox->pack_start($hbox,1,1,$GCUtils::margin);
+ return $self;
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+ $self->{entry}->grab_focus;
+ my $code = $self->run;
+ $self->hide;
+ return ($code eq 'ok');
+ }
+}
+
+{
+ package GCBookmarkPropertiesDialog;
+ use base 'GCModalDialog';
+
+ sub new
+ {
+ my ($proto, $parent, $title, $okLabel) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $title,
+ $okLabel,
+ );
+ bless($self, $class);
+
+ my $table = new Gtk2::Table(2, 2);
+ $table->set_row_spacings($GCUtils::halfMargin);
+ $table->set_col_spacings($GCUtils::margin);
+ $table->set_border_width($GCUtils::margin);
+ my $labelLabel = new GCLabel($parent->{lang}->{BookmarksLabel});
+ $self->{label} = new GCShortText;
+ $self->{label}->signal_connect('activate' => sub {$self->response('ok')} );
+ my $pathLabel = new GCLabel($parent->{lang}->{BookmarksPath});
+ $self->{path} = new GCShortText;
+ $self->{path}->signal_connect('activate' => sub {$self->response('ok')} );
+ $table->attach($labelLabel, 0, 1, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{label}, 1, 2, 0, 1, ['fill', 'expand'], 'fill', 0, 0);
+ $table->attach($pathLabel, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{path}, 1, 2, 1, 2, ['fill', 'expand'], 'fill', 0, 0);
+ $self->vbox->pack_start($table, 1, 1, 0);
+ $table->show_all;
+ return $self;
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+ $self->{label}->grab_focus;
+ my $code = $self->run;
+ $self->hide;
+ return ($code eq 'ok');
+ }
+}
+
+
+{
+ package GCBookmarkAdderDialog;
+ use base 'GCModalDialog';
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ (my $title = $parent->{lang}->{MenuBookmarksAdd}) =~ s/_//g;
+ my $self = $class->SUPER::new($parent,
+ $title,
+ 'gtk-add',
+ 0,
+ $parent->{lang}->{BookmarksNewFolder} => 'yes',
+ );
+
+ $self->{lang} = $parent->{lang};
+
+ my $table = new Gtk2::Table(2, 2);
+ $table->set_row_spacings($GCUtils::halfMargin);
+ $table->set_col_spacings($GCUtils::margin);
+ $table->set_border_width($GCUtils::margin);
+ my $labelLabel = new GCLabel($parent->{lang}->{BookmarksLabel});
+ $self->{label} = new GCShortText;
+ my $pathLabel = new GCLabel($parent->{lang}->{BookmarksPath});
+ $self->{path} = new GCShortText;
+
+ $table->attach($labelLabel, 0, 1, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{label}, 1, 2, 0, 1, ['fill', 'expand'], 'fill', 0, 0);
+ $table->attach($pathLabel, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{path}, 1, 2, 1, 2, ['fill', 'expand'], 'fill', 0, 0);
+
+ $self->{folders} = new GCBookmarksFolders($self);
+ my $scroller = new Gtk2::ScrolledWindow;
+ $scroller->set_policy ('automatic', 'automatic');
+ $scroller->add($self->{folders});
+ $table->attach($scroller, 0, 2, 2, 3, ['fill', 'expand'], ['fill', 'expand'], 0, 0);
+
+ $self->vbox->pack_start($table, 1, 1, 0);
+ $self->set_default_size(400, 300);
+
+ bless ($self, $class);
+ }
+
+ sub setBookmark
+ {
+ my ($self, $path, $label) = @_;
+ $self->{path}->setValue($path);
+ $self->{label}->setValue($label);
+ }
+
+ sub setBookmarksFolders
+ {
+ my ($self, $bookmarks) = @_;
+ $self->{folders}->setBookmarks($bookmarks);
+
+ }
+
+ sub setBookmarksList
+ {
+ }
+
+ sub getBookmarks
+ {
+ my $self = shift;
+ return $self->{folders}->getBookmarks;
+ }
+
+ sub addFolder
+ {
+ my $self = shift;
+ my $dialog = new GCBookmarkNewFolderDialog($self);
+ $self->{folders}->addFolder($dialog->{entry}->getValue) if $dialog->show;
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+ my $response;
+ my $done = 0;
+ while (!$done)
+ {
+ $response = $self->run;
+ if ($response eq 'ok')
+ {
+ $self->{folders}->addBookmark($self->{path}->getValue, $self->{label}->getValue);
+ }
+ $self->addFolder if ($response eq 'yes');
+ $done = 1 if ($response eq 'ok') || ($response eq 'cancel') || ($response eq 'delete-event');
+ }
+ $self->hide;
+ return ($response eq 'ok');
+ }
+}
+
+{
+ package GCBookmarksEditDialog;
+ use base 'GCModalDialog';
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ (my $title = $parent->{lang}->{MenuBookmarksEdit}) =~ s/_//g;
+ my $self = $class->SUPER::new($parent,
+ $title,
+ 'gtk-save',
+ );
+ bless ($self, $class);
+
+ $self->{lang} = $parent->{lang};
+
+ $self->{folders} = new GCBookmarksFolders($self);
+ my $scroller1 = new Gtk2::ScrolledWindow;
+ $scroller1->set_policy ('automatic', 'automatic');
+ $scroller1->set_shadow_type('etched-in');
+ $scroller1->add($self->{folders});
+ $self->{bookmarksList} = new Gtk2::SimpleList($parent->{lang}->{BookmarksBookmarks} => 'text',
+ 'Path' => 'text');
+ $self->{blockAddSignal} = 0;
+ $self->{bookmarksList}->get_model->signal_connect('row-inserted' => sub {
+ return if $self->{blockAddSignal};
+ $self->saveBookmarks;
+ });
+ $self->{bookmarksList}->set_rules_hint(1);
+ $self->{bookmarksList}->get_column(1)->set_visible(0);
+ my $targetEntryMove = {
+ target => 'text/plain',
+ flags => ['same-app'],
+ info => 14,
+ };
+ $self->{bookmarksList}->enable_model_drag_source('button1-mask','move', $targetEntryMove);
+ $self->{bookmarksList}->signal_connect('key-press-event' => sub {
+ my ($widget, $event) = @_;
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+ if ($key eq 'Delete')
+ {
+ $self->deleteBookmark;
+ return 1;
+ }
+ return 0;
+ });
+
+ my $hboxFolders = new Gtk2::HBox(0,0);
+ my $vboxFolders = new Gtk2::VBox(0,0);
+ my $newFolder = new Gtk2::Button->new_from_stock('gtk-new');
+ $newFolder->signal_connect('clicked' => sub {
+ $self->addFolder;
+ });
+ my $removeFolder = new Gtk2::Button->new_from_stock('gtk-delete');
+ $removeFolder->signal_connect('clicked' => sub {
+ $self->{folders}->removeFolder;
+ });
+ $vboxFolders->pack_start($newFolder,0,0,$GCUtils::halfMargin);
+ $vboxFolders->pack_start($removeFolder,0,0,$GCUtils::halfMargin);
+ $hboxFolders->pack_start($vboxFolders,0,0,$GCUtils::margin);
+ $hboxFolders->pack_start($scroller1,1,1,0);
+
+
+ my $scroller2 = new Gtk2::ScrolledWindow;
+ $scroller2->set_policy ('automatic', 'automatic');
+ $scroller2->set_shadow_type('etched-in');
+ $scroller2->add($self->{bookmarksList});
+
+ my $hboxList = new Gtk2::HBox(0,0);
+ $hboxList->pack_start($scroller2,1,1,0);
+ my $vboxList = new Gtk2::VBox(0,0);
+ $hboxList->pack_start($vboxList,0,0,$GCUtils::margin);
+
+ my $up = new Gtk2::Button->new_from_stock('gtk-go-up');
+ $up->signal_connect('clicked' => sub {
+ $self->moveDownUp(-1);
+ });
+ my $down = new Gtk2::Button->new_from_stock('gtk-go-down');
+ $down->signal_connect('clicked' => sub {
+ $self->moveDownUp(1);
+ });
+ my $edit = new Gtk2::Button->new_from_stock('gtk-edit');
+ $edit->signal_connect('clicked' => sub {
+ $self->edit;
+ });
+ my $new = new Gtk2::Button->new_from_stock('gtk-new');
+ $new->signal_connect('clicked' => sub {
+ $self->newBookmark;
+ });
+ my $delete = new Gtk2::Button->new_from_stock('gtk-delete');
+ $delete->signal_connect('clicked' => sub {
+ $self->deleteBookmark;
+ });
+ $vboxList->pack_start($up,0,0,$GCUtils::halfMargin);
+ $vboxList->pack_start($down,0,0,$GCUtils::halfMargin);
+ $vboxList->pack_start($edit,0,0,$GCUtils::halfMargin);
+ $vboxList->pack_start($new,0,0,$GCUtils::halfMargin);
+ $vboxList->pack_start($delete,0,0,$GCUtils::halfMargin);
+
+ my $paned = new Gtk2::HPaned;
+ $paned->pack1($hboxFolders, 1, 0);
+ $paned->pack2($hboxList, 1, 0);
+
+ $self->vbox->pack_start($paned, 1, 1, $GCUtils::margin);
+ $self->set_default_size(600, 400);
+ return $self;
+ }
+
+ sub edit
+ {
+ my $self = shift;
+ my $currentId = ($self->{bookmarksList}->get_selected_indices)[0];
+ return if (!defined($currentId)) || ($currentId < 0);
+ my ($label, $path) = @{$self->{bookmarksList}->{data}->[$currentId]};
+ (my $title = Gtk2::Stock->lookup('gtk-edit')->{label}) =~ s/_//;
+ my $dialog = new GCBookmarkPropertiesDialog($self, $title);
+ $dialog->{label}->setValue($label);
+ $dialog->{path}->setValue($path);
+ if ($dialog->show)
+ {
+ $self->{bookmarksList}->{data}->[$currentId] = [$dialog->{label}->getValue,
+ $dialog->{path}->getValue];
+ $self->saveBookmarks;
+ }
+ $dialog->destroy;
+ }
+
+ sub newBookmark
+ {
+ my $self = shift;
+ $self->{blockAddSignal} = 1;
+ (my $title = Gtk2::Stock->lookup('gtk-new')->{label}) =~ s/_//;
+ my $dialog = new GCBookmarkPropertiesDialog($self, $title, 'gtk-new');
+ $dialog->{label}->clear();
+ $dialog->{path}->clear();
+ if ($dialog->show)
+ {
+ push @{$self->{bookmarksList}->{data}}, [$dialog->{label}->getValue, $dialog->{path}->getValue];
+ $self->saveBookmarks;
+ $self->{bookmarksList}->select($#{$self->{bookmarksList}->{data}});
+ }
+ $dialog->destroy;
+ $self->{blockAddSignal} = 0;
+ }
+
+ sub deleteBookmark
+ {
+ my $self = shift;
+ my $currentId = ($self->{bookmarksList}->get_selected_indices)[0];
+ return if (!defined($currentId)) || ($currentId < 0);
+ splice (@{$self->{bookmarksList}->{data}}, $currentId, 1);
+ $currentId--;
+ $currentId = 0 if $currentId < 0;
+ $self->saveBookmarks;
+ $self->{bookmarksList}->select($currentId);
+ }
+
+ sub moveDownUp
+ {
+ my ($self, $dir) = @_;
+ $self->{blockAddSignal} = 1;
+ my $currentId = ($self->{bookmarksList}->get_selected_indices)[0];
+ my $newId = $currentId + $dir;
+ return if ($newId < 0) || ($newId >= scalar @{$self->{bookmarksList}->{data}});
+ my @data;
+ foreach (@{$self->{bookmarksList}->{data}})
+ {
+ push @data, [$_->[0], $_->[1]];
+ }
+ ($data[$currentId], $data[$newId]) = ($data[$newId], $data[$currentId]);
+ @{$self->{bookmarksList}->{data}} = @data;
+ $self->{bookmarksList}->select($newId);
+ $self->saveBookmarks;
+ $self->{blockAddSignal} = 0;
+ }
+
+ sub addFolder
+ {
+ my $self = shift;
+ my $dialog = new GCBookmarkNewFolderDialog($self);
+ $self->{folders}->addFolder($dialog->{entry}->getValue) if $dialog->show;
+ }
+
+ sub setBookmarksFolders
+ {
+ my ($self, $bookmarks) = @_;
+
+ $self->{folders}->setBookmarks($bookmarks);
+
+ }
+
+ sub setBookmarksList
+ {
+ my ($self, $list) = @_;
+ $self->{blockAddSignal} = 1;
+ @{$self->{bookmarksList}->{data}} = ();
+ foreach (@$list)
+ {
+ push @{$self->{bookmarksList}->{data}}, [$_->{name}, $_->{path}];
+ }
+ $self->{blockAddSignal} = 0;
+ }
+
+ sub getBookmarks
+ {
+ my $self = shift;
+ return $self->{folders}->getBookmarks;
+ }
+
+ sub saveBookmarks
+ {
+ my $self = shift;
+ my @bookmarks;
+ foreach (@{$self->{bookmarksList}->{data}})
+ {
+ push @bookmarks, {name => $_->[0], path => $_->[1]};
+ }
+ $self->{folders}->setBookmarksInCurrentFolder(\@bookmarks);
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+ my $done = 0;
+ my $response = $self->run;
+ $self->hide;
+ return ($response eq 'ok');
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCBorrowings.pm b/lib/gcstar/GCBorrowings.pm
new file mode 100644
index 0000000..d93c444
--- /dev/null
+++ b/lib/gcstar/GCBorrowings.pm
@@ -0,0 +1,662 @@
+package GCBorrowings;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCDialogs;
+use GCUtils;
+
+{
+ package GCImportBorrowersDialog;
+ use base 'GCModalDialog';
+
+ use XML::Simple;
+
+ sub importClaws
+ {
+ my ($self, $file) = @_;
+ my @result;
+ open XML, $file;
+ my $xmlString = do {local $/; <XML>};
+ close XML;
+ my $xs = XML::Simple->new;
+ my $addressBook = $xs->XMLin($xmlString,
+ ForceArray => ['address', 'person']
+ );
+ foreach (@{$addressBook->{person}})
+ {
+ push @result, [$_->{cn}, $_->{'address-list'}->{address}->[0]->{email}];
+ }
+ return \@result;
+ }
+
+ sub importLdif
+ {
+ my ($self, $file) = @_;
+ my @result;
+ open DATA, $file;
+ my %current;
+ while (<DATA>)
+ {
+ if (/^dn/)
+ {
+ push @result, [$current{name}, $current{email}] if %current;
+ %current = {};
+ }
+ $current{name} = $1 if (/^cn:\s*(.*)$/);
+ $current{email} = $1 if (/^mail:\s*(.*)$/);
+ }
+ close DATA;
+ push @result, [$current{name}, $current{email}] if %current;
+ return \@result;
+ }
+
+ sub importVcard
+ {
+ my ($self, $file) = @_;
+ my @result;
+ open DATA, $file;
+ my %current;
+ while (<DATA>)
+ {
+ push @result, [$current{name}, $current{email}] if /^END:VCARD/i;
+ $current{name} = $1 if (/^FN:(.*)$/i);
+ $current{email} = $1 if (/^EMAIL;INTERNET:(.*)$/);
+ }
+ close DATA;
+ return \@result;
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+ $self->set_position('center');
+ my $done = 0;
+ my $code;
+ while (!$done)
+ {
+ $code = $self->run;
+ if ($code ne 'ok')
+ {
+ $done = 1;
+ }
+ else
+ {
+ my $type = $self->{type}->getValue;
+ my $file = $self->{file}->getValue;
+ if (!$file)
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{parent}->{lang}->{ImportExportFileEmpty});
+
+ $dialog->set_position('center-on-parent');
+ $dialog->run();
+ $dialog->destroy;
+ next;
+ }
+ if ($type eq 'claws')
+ {
+ $self->{borrowers} = $self->importClaws($file);
+ }
+ elsif ($type eq 'ldif')
+ {
+ $self->{borrowers} = $self->importLdif($file);
+ }
+ elsif ($type eq 'vcard')
+ {
+ $self->{borrowers} = $self->importVcard($file);
+ }
+ $done = 1;
+ }
+ }
+ $self->hide;
+ return ($code eq 'ok');
+ }
+
+ sub getBorrowers
+ {
+ my $self = shift;
+ return $self->{borrowers};
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{BorrowersImportTitle},
+ 'gtk-convert'
+ );
+ bless ($self, $class);
+ $self->{parent} = $parent;
+ $self->{lang} = $parent->{lang};
+
+ my $table = new Gtk2::Table(2,2,0);
+ $table->set_row_spacings($GCUtils::halfMargin);
+ $table->set_col_spacings($GCUtils::halfMargin);
+ $table->set_border_width($GCUtils::margin);
+
+ my $typeLabel = new GCLabel($parent->{lang}->{BorrowersImportType});
+ $self->{type} = new GCMenuList;
+ $self->{type}->setValues([
+ {value => 'ldif', displayed => 'LDIF'},
+ {value => 'claws', displayed => 'Claws Mail'},
+ {value => 'vcard', displayed => 'VCARD'},
+ ]);
+ my $fileLabel = new GCLabel($parent->{lang}->{BorrowersImportFile});
+ $self->{file} = new GCFile($self);
+
+ $table->attach($typeLabel, 0, 1, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{type}, 1, 2, 0, 1, ['expand', 'fill'], 'fill', 0, 0);
+ $table->attach($fileLabel, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{file}, 1, 2, 1, 2, ['expand', 'fill'], 'fill', 0, 0);
+
+ $self->vbox->pack_start($table, 1, 1, 0);
+
+ return $self;
+ }
+}
+
+{
+ package GCBorrowersDialog;
+ use base 'GCModalDialog';
+
+ sub initValues
+ {
+ use locale;
+
+ my $self = shift;
+ my $keepPrevious = shift;
+
+ my @borrowers;
+ my @emails;
+
+ if ($keepPrevious)
+ {
+ foreach my $line(@{$self->{people}->{data}})
+ {
+ push @borrowers, $line->[0];
+ push @emails, $line->[1];
+ }
+ }
+ else
+ {
+ @borrowers = split m/\|/, $self->{options}->borrowers;
+ @emails = split m/\|/, $self->{options}->emails;
+ }
+
+ @{$self->{people}->{data}} = ();
+ my %directory;
+
+ for (my $i = 0; $i < scalar(@borrowers); $i++)
+ {
+ $directory{$borrowers[$i]} = $emails[$i];
+ }
+
+ my @keys = sort keys %directory;
+ @keys = reverse @keys if $self->{reverse};
+ foreach (@keys)
+ {
+ my @infos = [$_, $directory{$_}];
+ push @{$self->{people}->{data}}, @infos;
+ }
+ $self->{people}->select(0);
+
+ (my $template = $self->{options}->template) =~ s|<br/>|\n|g;
+ $self->{mailTemplate}->setValue($template);
+
+ $self->{subject}->set_text($self->{options}->subject);
+ }
+
+ sub saveValues
+ {
+ my $self = shift;
+
+ my $borrowers = '';
+ my $emails = '';
+ foreach (@{$self->{people}->{data}})
+ {
+ $borrowers .= $_->[0].'|';
+ $emails .= $_->[1].'|';
+ }
+ $borrowers =~ s/.$//;
+ $emails =~ s/.$//;
+ $self->{options}->borrowers($borrowers);
+ $self->{options}->emails($emails);
+
+ (my $template = $self->{mailTemplate}->getValue) =~ s/\n/<br\/>/g;
+ $self->{options}->template($template);
+
+ $self->{options}->subject($self->{subject}->get_text);
+
+ $self->{options}->save;
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->initValues;
+
+ $self->SUPER::show();
+ $self->show_all;
+
+ if ($self->run eq 'ok')
+ {
+ $self->saveValues;
+ }
+ $self->hide;
+ }
+
+ sub importBorrowers
+ {
+ my $self = shift;
+
+ $self->{importDialog} = new GCImportBorrowersDialog($self)
+ if ! $self->{importDialog};
+
+ if ($self->{importDialog}->show)
+ {
+ unshift @{$self->{people}->{data}}, @{$self->{importDialog}->getBorrowers};
+ }
+ }
+
+ sub removeCurrent
+ {
+ my $self = shift;
+ my @idx = $self->{people}->get_selected_indices;
+
+ if ($^O =~ /win32/i)
+ {
+ my @newData;
+ my $i = 0;
+ foreach (@{$self->{people}->{data}})
+ {
+ push @newData, [$_->[0], $_->[1]] if $i != $idx[0];
+ $i++;
+ }
+ @{$self->{people}->{data}} = @newData;
+ }
+ else
+ {
+ splice @{$self->{people}->{data}}, $idx[0], 1;
+ }
+ }
+
+ sub add
+ {
+ my $self = shift;
+
+ my $dialog = new Gtk2::Dialog($self->{parent}->{lang}->{BorrowersAdd},
+ $self,
+ [qw/modal destroy-with-parent/],
+ @GCDialogs::okCancelButtons
+ );
+
+ my $table = new Gtk2::Table(2,2,0);
+
+ my $labelName = new Gtk2::Label($self->{parent}->{lang}->{BorrowersName});
+ $table->attach($labelName, 0, 1, 0, 1, 'expand', 'fill', 5, 5);
+ my $name = new Gtk2::Entry;
+ $name->signal_connect('activate' => sub {$dialog->response('ok')});
+ $table->attach($name, 1, 2, 0, 1, 'expand', 'fill', 5, 5);
+
+ my $labelEmail = new Gtk2::Label($self->{parent}->{lang}->{BorrowersEmail});
+ $table->attach($labelEmail, 0, 1, 1, 2, 'expand', 'fill', 5, 5);
+ my $email = new Gtk2::Entry;
+ $email->signal_connect('activate' => sub {$dialog->response('ok')});
+ $table->attach($email, 1, 2, 1, 2, 'expand', 'fill', 5, 5);
+
+ $dialog->vbox->pack_start($table,1,1,0);
+ $dialog->vbox->show_all;
+
+ if ($dialog->run eq 'ok')
+ {
+ unshift @{$self->{people}->{data}}, [$name->get_text, $email->get_text];
+ }
+
+ $dialog->destroy;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{BorrowersTitle},
+ );
+
+ bless ($self, $class);
+
+ #$self->set_modal(1);
+ $self->set_position('center');
+ $self->set_default_size(400,400);
+
+ $self->{reverse} = 0;
+
+ $self->{parent} = $parent;
+ $self->{lang} = $parent->{lang};
+ $self->{options} = $parent->{options};
+
+ my $borrowersFrame = new GCGroup($self->{parent}->{lang}->{BorrowersList});
+ my $hbox = new Gtk2::HBox(0,0);
+
+ $self->{people} = new Gtk2::SimpleList($parent->{lang}->{BorrowersName} => "text",
+ $parent->{lang}->{BorrowersEmail} => "text");
+ $self->{people}->set_column_editable(1, 1);
+ $self->{people}->set_rules_hint(1);
+
+ $self->{people}->get_column(0)->set_sort_column_id(0);
+ $self->{people}->get_model->set_sort_column_id(0, 'ascending');
+
+ for my $i (0..1)
+ {
+ $self->{people}->get_column($i)->set_resizable(1);
+ }
+ $self->{order} = 1;
+ $self->{sort} = -1;
+
+ my $scrollPanelList = new Gtk2::ScrolledWindow;
+ $scrollPanelList->set_policy ('never', 'automatic');
+ $scrollPanelList->set_shadow_type('etched-in');
+ $scrollPanelList->set_border_width(0);
+ $scrollPanelList->add($self->{people});
+
+ my $vboxButtons = new Gtk2::VBox(0,0);
+ my $addButton = Gtk2::Button->new_from_stock('gtk-add');
+ $addButton->signal_connect('clicked' => sub {
+ $self->add;
+ });
+ my $removeButton = Gtk2::Button->new_from_stock('gtk-remove');
+ $removeButton->signal_connect('clicked' => sub {
+ $self->removeCurrent;
+ });
+
+ my $importButton = Gtk2::Button->new_from_stock('gtk-convert');
+ $importButton->signal_connect('clicked' => sub {
+ $self->importBorrowers;
+ });
+
+ #my $editButton = new Gtk2::Button($parent->{lang}->{BorrowersEdit});
+ $vboxButtons->pack_start($addButton,0,0,$GCUtils::halfMargin);
+ $vboxButtons->pack_start($removeButton,0,0,$GCUtils::halfMargin);
+ $vboxButtons->pack_start($importButton,0,0,$GCUtils::halfMargin);
+ #$vboxButtons->pack_start($editButton,0,0,0);
+
+ $hbox->pack_start($scrollPanelList,1,1,0);
+ $hbox->pack_start($vboxButtons,0,0,$GCUtils::margin);
+ $hbox->set_border_width(0);
+ $borrowersFrame->addWidget($hbox);
+ $self->vbox->pack_start($borrowersFrame,1,1,0);
+
+ my $templateFrame = new GCGroup($self->{parent}->{lang}->{BorrowersTemplate});
+ my $templateBox = new Gtk2::VBox(0,0);
+ $templateFrame->addWidget($templateBox);
+
+ $self->{mailTemplate} = new GCLongText;
+ $self->{mailTemplate}->set_size_request(-1,80);
+
+ my $hboxSubject = new Gtk2::HBox(0,0);
+ my $labelSubject = new Gtk2::Label($self->{parent}->{lang}->{BorrowersSubject});
+ $self->{subject} = new Gtk2::Entry;
+ $hboxSubject->pack_start($labelSubject,0,0,0);
+ $hboxSubject->pack_start($self->{subject},0,0,$GCUtils::halfMargin);
+
+
+# $templateBox->pack_start($labelTemplate,0,0,$GCUtils::halfMargin);
+ $templateBox->pack_start($hboxSubject,0,0,0);
+ $templateBox->pack_start($self->{mailTemplate},1,1,$GCUtils::halfMargin);
+
+ my $label1 = new Gtk2::Label($self->{parent}->{lang}->{BorrowersNotice1});
+ $label1->set_alignment(0,0);
+ my $label2 = new Gtk2::Label($self->{parent}->{lang}->{BorrowersNotice2});
+ $label2->set_alignment(0,0);
+ my $label3 = new Gtk2::Label($self->{parent}->{lang}->{BorrowersNotice3});
+ $label3->set_alignment(0,0);
+ $templateBox->pack_start($label1,0,0,0);
+ $templateBox->pack_start($label2,0,0,0);
+ $templateBox->pack_start($label3,0,0,0);
+
+ $self->vbox->pack_start($templateFrame, 1, 1, 0);
+
+ return $self;
+ }
+
+}
+
+{
+ package GCBorrowedDialog;
+ use base "Gtk2::Dialog";
+
+ sub setList
+ {
+ my ($self, $data, $model) = @_;
+
+ $self->setModel($model);
+ my $items = $data->getItemsListFiltered;
+ $self->{data} = $data;
+
+ $self->{itemsList} = [];
+ $self->{listModel}->clear;
+ my ($listId, $dataId) = (-1, -1);
+ foreach (@{$items})
+ {
+ $dataId++;
+ next if (!$_->{$self->{borrowerField}}) || ($_->{$self->{borrowerField}} eq 'none');
+ $listId++;
+ my $borrower = $_->{$self->{borrowerField}};
+ $borrower = $self->{parent}->{model}->getDisplayedText('PanelUnknown')
+ if $borrower eq 'unknown';
+ my $lendDate = GCUtils::timeToStr($_->{$self->{lendDateField}},
+ $self->{parent}->{options}->dateFormat);
+ push @{$self->{itemsList}}, {
+ $self->{titleField} => $_->{$self->{titleField}},
+ $self->{borrowerField} => $borrower,
+ $self->{lendDateField} => $_->{$self->{lendDateField}}
+ };
+ $self->{listModel}->set($self->{listModel}->append,
+ 0 => $_->{$self->{titleField}},
+ 1 => $borrower,
+ 2 => $lendDate,
+ 3 => $listId,
+ 4 => $dataId);
+ }
+
+ $self->{listView}->columns_autosize;
+ return if $listId == -1;
+ $self->{listView}->get_selection->select_iter($self->{listModel}->get_iter_first);
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show();
+ $self->show_all;
+ $self->run;
+ $self->hide;
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+ $self->{titleField} = $model->{commonFields}->{title};
+ $self->{borrowerField} = $model->{commonFields}->{borrower}->{name};
+ $self->{lendDateField} = $model->{commonFields}->{borrower}->{date};
+ $self->{historyField} = $model->{commonFields}->{borrower}->{history};
+
+ $self->{titleColumn}->set_title($model->getDisplayedItems);
+ }
+
+ sub displayItem
+ {
+ my ($self, $idx) = @_;
+ $self->{data}->display($idx);
+ $self->{data}->select($idx);
+ }
+
+ sub returnItem
+ {
+ my $self = shift;
+ my $current = $self->{data}->getCurrent;
+ my $iter = $self->{listView}->get_selection->get_selected;
+ my $idx = $self->{listModel}->get($iter, 4);
+ $self->displayItem($idx);
+ if ($self->{data}->{panel}->itemBack)
+ {
+ $self->{listModel}->remove($iter);
+ }
+ $self->displayItem($current);
+ return;
+ }
+
+ sub showHistory
+ {
+ my $self = shift;
+ my $iter = $self->{listView}->get_selection->get_selected;
+ return if !$iter;
+ my $idx = $self->{listModel}->get($iter, 4);
+ $self->{history}->setValue(
+ $self->{data}->getValue($idx, $self->{historyField})
+ );
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent->{lang}->{BorrowedTitle},
+ $parent,
+ [qw/modal destroy-with-parent/],
+ 'gtk-ok' => 'ok'
+ );
+
+ bless ($self, $class);
+
+ $self->{parent} = $parent;
+
+ $self->set_modal(1);
+ $self->set_position('center');
+ $self->set_default_size(400,400);
+
+ $self->{parent} = $parent;
+ $self->{options} = $parent->{options};
+
+ my $hbox = new Gtk2::HBox(0,0);
+
+ $self->{listModel} = new Gtk2::ListStore('Glib::String', 'Glib::String', 'Glib::String',
+ 'Glib::Int', 'Glib::Int');
+ $self->{listView} = Gtk2::TreeView->new_with_model($self->{listModel});
+ $self->{listView}->set_rules_hint(1);
+ $self->{listView}->set_headers_clickable(1);
+
+ my @columns;
+ push @columns, Gtk2::TreeViewColumn->new_with_attributes('',
+ Gtk2::CellRendererText->new,
+ 'text' => 0);
+ push @columns, Gtk2::TreeViewColumn->new_with_attributes($parent->{lang}->{PanelBorrower},
+ Gtk2::CellRendererText->new,
+ 'text' => 1);
+ push @columns, Gtk2::TreeViewColumn->new_with_attributes($parent->{lang}->{BorrowedDate},
+ Gtk2::CellRendererText->new,
+ 'text' => 2);
+ $self->{titleColumn} = $columns[0];
+ for my $i (0..2)
+ {
+ $columns[$i]->set_resizable(1);
+ $columns[$i]->set_sort_column_id($i);
+ $columns[$i]->set_reorderable(1);
+ $self->{listView}->append_column($columns[$i]);
+ }
+ $self->{listModel}->set_sort_func(2, sub {
+ my ($model, $a, $b) = @_;
+ my ($day, $month, $year) = split m/\//,
+ $self->{itemsList}->[$model->get($a, 3)]->{$self->{lendDateField}};
+ my $dateA = join "_", $year, $month, $day;
+ ($day, $month, $year) = split m/\//,
+ $self->{itemsList}->[$model->get($b, 3)]->{$self->{lendDateField}};
+ my $dateB = join "_", $year, $month, $day;
+ return $dateA cmp $dateB;
+
+ });
+
+ $self->{listView}->get_selection->signal_connect ('changed' => sub {
+ $self->showHistory;
+ });
+
+ my $scrollPanelList = new Gtk2::ScrolledWindow;
+ $scrollPanelList->set_policy ('never', 'automatic');
+ $scrollPanelList->set_shadow_type('etched-in');
+ $scrollPanelList->set_border_width($GCUtils::margin);
+ $scrollPanelList->add($self->{listView});
+
+ $self->{context} = new Gtk2::Menu;
+ $self->{returned} = Gtk2::MenuItem->new($parent->{lang}->{PanelReturned});
+ $self->{returned}->signal_connect('activate', sub {
+ $self->returnItem;
+ });
+ $self->{context}->append($self->{returned});
+ $self->{display} = Gtk2::MenuItem->new($parent->{lang}->{BorrowedDisplayInPanel});
+ $self->{display}->signal_connect('activate', sub {
+ my $iter = $self->{listView}->get_selection->get_selected;
+ my $idx = $self->{listModel}->get($iter, 4);
+ $self->displayItem($idx);
+ });
+ $self->{context}->append($self->{display});
+ $self->{context}->show_all;
+
+ $self->{listView}->signal_connect('button_press_event' => sub {
+ my ($widget, $event) = @_;
+ return 0 if $event->button ne 3;
+ $self->{context}->popup(undef, undef, undef, undef, $event->button, $event->time);
+ return 0;
+ });
+
+ my $historyExpander = new GCExpander($parent->{lang}->{PanelHistory});
+ $historyExpander->setValue($parent->{lang}->{PanelHistory});
+
+ my @labels = ($parent->{lang}->{PanelBorrower},
+ $parent->{lang}->{PanelLendDate},
+ $parent->{lang}->{PanelReturnDate});
+ $self->{history} = new GCMultipleList($self, 3, \@labels, 0, 2);
+
+ my $historyBox = new Gtk2::VBox(0,0);
+ $historyBox->set_border_width($GCUtils::margin);
+ $historyBox->pack_start($self->{history}, 1, 1, 0);
+
+ $historyExpander->add($historyBox);
+ $historyExpander->show_all;
+
+ $self->vbox->pack_start($scrollPanelList,1,1,0);
+ $self->vbox->pack_start($historyExpander,0,0, $GCUtils::halfMargin);
+
+ return $self;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCCommandLine.pm b/lib/gcstar/GCCommandLine.pm
new file mode 100644
index 0000000..17d2cf3
--- /dev/null
+++ b/lib/gcstar/GCCommandLine.pm
@@ -0,0 +1,395 @@
+package GCCommandLine;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+{
+ package GCPseudoFrame;
+
+ use File::Basename;
+ use File::Temp qw(tempdir);
+ use GCUtils;
+
+ sub new
+ {
+ my ($proto, $parent, $options, $lang, $keepPictures) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {
+ options => $options,
+ imagePrefix => 'gcstar_',
+ lang => $lang,
+ parent => $parent,
+ agent => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041111 Firefox/1.0',
+ };
+ bless ($self, $class);
+ $self->{tmpImageDir} = tempdir(CLEANUP => ($keepPictures ? 0 : 1));
+ return $self;
+ }
+
+ sub setCurrentModel
+ {
+ my ($self, $model) = @_;
+ return $self->{parent}->setModel($model);
+ }
+
+ sub transformTitle
+ {
+ my ($self, $title) = @_;
+ return $title;
+ }
+
+ sub getImagesDir
+ {
+ my ($self, $suffix, $itemTitle, $imagesDir) = @_;
+ return GCFrame::getImagesDir(@_);
+ }
+
+ sub getUniqueImageFileName
+ {
+ my ($self, $suffix, $itemTitle, $imagesDir) = @_;
+ return GCFrame::getUniqueImageFileName(@_);
+ }
+
+ sub transformPicturePath
+ {
+ my ($self, $path, $file) = @_;
+ return GCFrame::transformPicturePath(@_);
+ }
+
+ sub preloadModel
+ {
+ my ($self, $model) = @_;
+ # Preload the model into the factory cache
+ $self->{model} = $self->{modelsFactory}->getModel($model);
+ }
+
+ sub AUTOLOAD
+ {
+ our $AUTOLOAD;
+ (my $name = $AUTOLOAD) =~ s/.*?::(.*)/$1/;
+ }
+}
+
+{
+
+ package GCCommandExecution;
+
+ use File::Temp qw/ :POSIX /;
+ use File::Basename;
+ use GCData;
+ use GCDisplay;
+ use GCExport;
+ use GCImport;
+ use GCPlugins;
+ use GCModel;
+
+ sub new
+ {
+ my ($proto, $options, $model, $plugin, $import, $export, $output) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {};
+ bless ($self, $class);
+
+ $self->{file} = $output;
+ $self->{useStdOut} = 0;
+ if (!$output)
+ {
+ (undef, $self->{file}) = tmpnam;
+ $self->{useStdOut} = 1;
+ }
+
+ GCPlugins::loadAllPlugins;
+ $self->{lang} = $GCLang::langs{$options->lang};
+ $self->{parent} = new GCPseudoFrame($self, $options, $self->{lang}, $self->{useStdOut});
+
+ $self->{modelsFactory} = new GCModelsCache($self->{parent});
+ $self->{model} = $self->{modelsFactory}->getModel($model);
+ $self->{parent}->{model} = $self->{model};
+ $self->{parent}->{modelsFactory} = $self->{modelsFactory};
+
+ $self->{plugin} = $pluginsMap{$model}->{$plugin};
+ $self->leave("Fetch plugin $plugin doesn't exist") if $plugin && (!$self->{plugin});
+
+ if ($import)
+ {
+ GCImport::loadImporters;
+ foreach (@importersArray)
+ {
+ $_->setLangName($options->lang);
+ if (($_->getName =~ /\Q$import/) || ($_ =~ /GCExport::GCExporter$export/))
+ {
+ $self->{importer} = $_;
+ last;
+ }
+ }
+ $self->leave("Import plugin $import doesn't exist") if $import && (!$self->{importer});
+ $self->{importer}->setModel($self->{model});
+ $self->{importOptions} = {};
+ foreach (@{$self->{importer}->getOptions})
+ {
+ $self->{importOptions}->{$_->{name}} = $_->{default};
+ }
+ }
+ if ($export)
+ {
+ GCExport::loadExporters;
+ foreach (@exportersArray)
+ {
+ $_->setLangName($options->lang);
+ if (($_->getName eq $export) || ($_ =~ /GCExport::GCExporter$export/))
+ {
+ $self->{exporter} = $_;
+ last;
+ }
+ }
+ $self->leave("Export plugin $export doesn't exist") if $export && (!$self->{exporter});
+ $self->{exporter}->setModel($self->{model});
+ $self->{exportOptions} = {
+ lang => $self->{lang}
+ };
+ foreach (@{$self->{exporter}->getOptions})
+ {
+ $self->{exportOptions}->{$_->{name}} = $_->{default};
+ }
+ }
+
+ $self->{toBeRemoved} = [];
+
+ $self->{data} = new GCItems($self->{parent});
+ $self->{data}->{options} = $options;
+
+ return $self;
+ }
+
+ sub DESTROY
+ {
+ my $self = shift;
+
+ unlink $_ foreach (@{$self->{toBeRemoved}});
+ }
+
+ sub leave
+ {
+ my ($self, $message) = @_;
+ print "$message\n";
+ $self->DESTROY;
+ exit 1;
+ }
+
+ sub listPlugins
+ {
+ my $self = shift;
+
+ foreach (sort keys %{$pluginsMap{$self->{model}->getName}})
+ {
+ print "$_\n";
+ print "\t", $pluginsMap{$self->{model}->getName}->{$_}->getAuthor,"\n";
+ print "\n";
+ }
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+ $self->{model} = $self->{modelsFactory}->getModel($model);
+ if ($self->{exporter})
+ {
+ $self->{exporter}->setModel($self->{model});
+ foreach (@{$self->{exporter}->getOptions})
+ {
+ $self->{exportOptions}->{$_->{name}} = $_->{default};
+ }
+ }
+ if ($self->{importer})
+ {
+ $self->{importer}->setModel($self->{model});
+ foreach (@{$self->{importer}->getOptions})
+ {
+ $self->{importOptions}->{$_->{name}} = $_->{default};
+ }
+ }
+ return 1;
+ }
+
+ sub setFields
+ {
+ my ($self, $fieldsFile) = @_;
+
+ $self->{fields} = [];
+ open FIELDS, '<'.$fieldsFile;
+ my $model = <FIELDS>;
+ chop $model;
+ while (<FIELDS>)
+ {
+ chop;
+ push @{$self->{fields}}, $_;
+ }
+ }
+
+ sub load
+ {
+ my ($self, $title) = @_;
+ my @data;
+ $self->leave("No fetch plugin specified") if !$self->{plugin};
+ $self->{plugin}->{title} = $title;
+ $self->{plugin}->{type} = 'load';
+ $self->{plugin}->{urlField} = $self->{model}->{commonFields}->{url};
+ $self->{plugin}->load;
+ my $itemNumber = $self->{plugin}->getItemsNumber();
+ $self->{plugin}->{type} = 'info';
+ for (my $i = 0;
+ $i < $itemNumber;
+ $i++)
+ {
+ $self->{plugin}->{wantedIdx} = $i;
+ my $info = $self->{plugin}->getItemInfo;
+ foreach (@{$self->{model}->{managedImages}})
+ {
+ $info->{$_} = $self->downloadPicture($info->{$_});
+ }
+ push @data, $info;
+ }
+ $self->{data}->setItemsList(\@data);
+ }
+
+ sub save
+ {
+ my $self = shift;
+ my $previousFile = $self->{data}->{options}->file;
+ my $previousRelativePaths = $self->{data}->{options}->useRelativePaths;
+ my $prevImages = $self->{parent}->getImagesDir;
+
+
+ my $newFile = GCUtils::pathToUnix(File::Spec->rel2abs($self->{file}));
+ $self->{data}->{options}->file($newFile);
+ $self->{parent}->{file} = $newFile;
+
+ # We re-generate it because it could have changed with new file name
+ my $newImages = $self->{parent}->getImagesDir;
+ if ($prevImages ne $newImages)
+ {
+ # The last parameter is for copy. When saving a new file, we move.
+ $self->{data}->setNewImagesDirectory($newImages, $prevImages, 1);
+ }
+
+ $self->{data}->{model} = $self->{model};
+ $self->{data}->{backend} = new GCBackend::GCBeXmlParser($self->{parent})
+ if ! $self->{data}->{backend};
+ $self->{data}->{options}->useRelativePaths(0) if $self->{useStdOut};
+ $self->{data}->save;
+ $self->{data}->{options}->useRelativePaths($previousRelativePaths);
+ $self->{data}->{options}->file($previousFile);
+ open IN, $self->{file};
+ if ($self->{useStdOut})
+ {
+ print $_ while (<IN>);
+ }
+ close IN;
+ unlink $self->{file} if $self->{useStdOut};
+ }
+
+ sub open
+ {
+ my ($self, $file) = @_;
+ $self->{data}->load($file, undef, undef, 1);
+ $self->{original} = $file;
+ }
+
+ sub import
+ {
+ my ($self, $file, $prefs) = @_;
+ $self->{importOptions}->{parent} = $self->{parent};
+ $self->{importOptions}->{file} = $file;
+ $self->{importOptions}->{fields} = $self->{fields};
+ $self->parsePrefs($prefs, $self->{importOptions});
+ $self->{importer}->{options} = $self->{importOptions};
+ $self->{data}->setItemsList($self->{importer}->getItemsArray($file));
+ $self->setModel($self->{importer}->getModelName);
+ $self->{data}->{model} = $self->{model}
+ if $self->{data};
+ }
+
+ sub export
+ {
+ my ($self, $prefs) = @_;
+
+ if (!scalar $self->{fields})
+ {
+ $self->{fields} = $self->{model}->{fieldsNames};
+ }
+ $self->{exportOptions}->{parent} = $self->{parent};
+ $self->{exportOptions}->{fields} = $self->{fields};
+ $self->{exportOptions}->{originalList} = $self->{data};
+ $self->{exportOptions}->{withPictures} = 1;
+ $self->{exportOptions}->{file} = $self->{file};
+ $self->{exportOptions}->{collection} = $self->{original};
+ $self->{exportOptions}->{fieldsInfo} = $self->{model}->{fieldsInfo};
+ $self->{exportOptions}->{items} = $self->{data}->getItemsListFiltered;
+ $self->{exportOptions}->{defaultImage} = $ENV{GCS_SHARE_DIR}.'/logos/no.png';
+ $self->parsePrefs($prefs, $self->{exportOptions});
+ $self->{data}->{model} = $self->{model}
+ if $self->{data};
+
+ $self->{exporter}->process($self->{exportOptions});
+
+ CORE::open IN, $self->{exportOptions}->{file};
+ if ($self->{useStdOut})
+ {
+ print $_ while (<IN>);
+ }
+ close IN;
+ unlink $self->{exportOptions}->{file} if $self->{useStdOut};
+ }
+
+ sub downloadPicture
+ {
+ my ($self, $pictureUrl) = @_;
+
+ return '' if ! $pictureUrl;
+ my ($name,$path,$suffix) = fileparse($pictureUrl, "\.gif", "\.jpg", "\.jpeg", "\.png");
+ (undef, my $picture) = tmpnam;
+ $picture .= $suffix;
+
+ GCUtils::downloadFile($pictureUrl, $picture, $self->{parent});
+ push @{$self->{toBeRemoved}}, $picture;
+ return $picture;
+ }
+
+ sub parsePrefs
+ {
+ my ($self, $prefs, $cont) = @_;
+
+ foreach (split /,/, $prefs)
+ {
+ my @option = split /=>/, $_;
+ $option[0] =~ s/^\s*//g;
+ $option[0] =~ s/\s*$//g;
+ $option[1] =~ s/^\s*//g;
+ $option[1] =~ s/\s*$//g;
+ $cont->{$option[0]} = $option[1];
+ }
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCData.pm b/lib/gcstar/GCData.pm
new file mode 100644
index 0000000..84582f3
--- /dev/null
+++ b/lib/gcstar/GCData.pm
@@ -0,0 +1,970 @@
+package GCData;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+
+{
+ package GCItems;
+ #
+ # This is seen as $main->{items}
+ #
+ use XML::Parser;
+ use Storable;
+ use File::Copy;
+ use File::Path;
+ use File::Basename;
+
+ use GCModel;
+ use GCBackend::GCBackendXmlParser;
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {};
+
+ $self->{parent} = $parent;
+
+ $self->{imagesToBeRemoved} = [];
+ $self->{imagesToBeAdded} = [];
+ $self->{loaded} = {};
+
+ $self->{currentItem} = -1;
+ $self->{hasBeenDeleted} = 0;
+ $self->{block} = 0;
+ $self->{previousFile} = 0;
+ #$self->{filterSearch} = new GCFilterSearch;
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub initModel
+ {
+ #if $modelChanged is set, that means we updated the currently used model
+ # and not that we changed the model
+ my ($self, $model, $modelUpdated) = @_;
+ $self->{model} = $model;
+ $self->{parent}->notifyModelChange($modelUpdated);
+ }
+
+ sub setPanel
+ {
+ my ($self, $panel) = @_;
+ $self->{panel} = $panel;
+ }
+
+ sub unselect
+ {
+ my ($self) = @_;
+
+ $self->{currentItem} = -1;
+ }
+
+ sub updateSelectedItemInfoFromGivenPanel
+ {
+ my ($self, $panel) = @_;
+ my $previousPanel = $self->{panel};
+ $self->{panel} = $panel;
+ $self->updateSelectedItemInfoFromPanel(1);
+ $self->{panel} = $previousPanel;
+ }
+
+ sub getInfoFromPanel
+ {
+ # $info contains default values that will be merged with new ones
+ my ($self, $panel, $info) = @_;
+
+ my $idField = $self->{model}->{commonFields}->{id};
+ my $panelId = $panel->$idField;
+ my $previousId = $info->{$idField};
+
+ my $changed = 0;
+ if ($panelId &&
+ ($panelId != $previousId))
+ {
+ $info->{$idField} = $panel->$idField;
+ $self->{loaded}->{information}->{maxId} = $panelId
+ if ($panelId > $self->{loaded}->{information}->{maxId});
+ $self->findMaxId if $previousId == $self->{loaded}->{information}->{maxId};
+ $changed = 1;
+ }
+ $panel->$idField($info->{$idField}) if $panel->$idField;
+
+ my $previous = {$idField => $previousId};
+
+ for my $field (@{$self->{model}->{fieldsNames}})
+ {
+ next if $field eq $idField;
+ $previous->{$field} = $info->{$field};
+ next if !$panel->{$field}->hasChanged;
+ $panel->{$field}->addHistory if ($self->{model}->{fieldsInfo}->{$field}->{hasHistory});
+ $changed = 1;
+ $info->{$field} = $panel->$field;
+ $self->{parent}->{menubar}->checkFilter($field);
+ }
+
+ return ($changed, $info, $previous);
+ }
+
+ sub updateSelectedItemInfoFromPanel
+ {
+ my ($self, $withSelect, $forced) = @_;
+ my $selectedChanged = 0;
+ my $filtered = 0;
+ return $selectedChanged if $self->{currentItem} == -1;
+ my $info;
+ if ($self->{multipleMode})
+ {
+ $info = {};
+ }
+ else
+ {
+ $info = ($self->getItemsListFiltered)->[$self->{currentItem}];
+ }
+
+ my $changed;
+ my $previous;
+ ($changed, $info, $previous) = $self->getInfoFromPanel($self->{panel}, $info);
+ if ($forced)
+ {
+ $previous->{$_} = 'GCS_FORCED' foreach @$forced;
+ }
+ if ($changed)
+ {
+ if ($self->{multipleMode})
+ {
+ my $newIdx;
+ # Propagate the changes to all the items
+ foreach (@{$self->{multipleCurrentItems}})
+ {
+ my $previous = Storable::dclone(($self->getItemsListFiltered)->[$_]);
+ my $item = ($self->getItemsListFiltered)->[$_];
+ for my $field (keys %$info)
+ {
+ $item->{$field} = $info->{$field};
+ }
+ $self->{panel}->dataChanged($item, 1);
+ $newIdx = $self->{parent}->{itemsView}->changeItem($_, $previous, $item);
+ if ($newIdx != $_)
+ {
+ $selectedChanged = 1;
+ }
+ }
+ if ($selectedChanged)
+ {
+ $self->{currentItem} = $self->{parent}->{itemsView}->getCurrentIdx;
+ $self->{multipleMode} = 0;
+ $self->displayCurrent;
+ }
+ }
+ else
+ {
+ $self->{panel}->dataChanged($info);
+ my $current = $self->{parent}->{itemsView}->changeCurrent($previous,
+ $info,
+ $self->{currentItem},
+ $withSelect);
+ # If we didn't selected the same, the selection didn't change
+ if ($current != $self->{currentItem})
+ {
+ $self->{currentItem} = $current;
+ $self->displayCurrent if $withSelect;
+ $selectedChanged = 1;
+ }
+ if ($selectedChanged)
+ {
+ $filtered = 1;
+ $selectedChanged = 0 if !$withSelect;
+ }
+ }
+ $self->{parent}->checkPanelVisibility;
+ $self->{parent}->markAsUpdated;
+ }
+ return ($selectedChanged, $filtered);
+ }
+
+ sub getTitle
+ {
+ my ($self, $idx) = @_;
+ if ($self->{multipleMode})
+ {
+ # Multiple items selected, so just use collection title or filename
+ my $name;
+ if ($self->{parent}->{options}->file)
+ {
+ $name = $self->{parent}->{items}->getInformation->{name}
+ if $self->{parent}->{items};
+ $name ||= basename($self->{parent}->{options}->file);
+ }
+ else
+ {
+ $name = $self->{parent}->{lang}->{UnsavedCollection};
+ }
+ return $name;
+ }
+ else
+ {
+ my $realIdx = $idx;
+ $realIdx = $self->{currentItem} if ! defined $idx;
+ return ($self->getItemsListFiltered)->[$realIdx]->{$self->{model}->{commonFields}->{title}};
+ }
+ }
+
+ sub getCurrent
+ {
+ my ($self) = @_;
+ return $self->{currentItem};
+ }
+
+ sub displayCurrent
+ {
+ my ($self) = @_;
+ $self->displayInPanel($self->{panel}, undef);
+ }
+
+ sub displayInPanel
+ {
+ my ($self, $panel, $idx) = @_;
+ my $info;
+ if ($self->{multipleMode})
+ {
+ # We merge all the items here
+ my %fields = map {$_ => 1} @{$self->{model}->{fieldsNotFormatted}};
+ foreach (@{$self->{multipleCurrentItems}})
+ {
+ my $item = ($self->getItemsListFiltered)->[$_];
+ for my $field (keys %fields)
+ {
+ if (exists $info->{$field})
+ {
+ if ($self->transformValue($info->{$field}, $field)
+ ne
+ $self->transformValue($item->{$field}, $field))
+ {
+ $info->{$field} = '';
+ delete $fields{$field};
+ # TODO store the information also elsewhere to mark
+ # the fields in panel. Or mark it immediately with something
+ # such as
+ # panel->markAsDirty($field);
+ }
+ }
+ else
+ {
+ $info->{$field} = $item->{$field};
+ }
+ }
+ }
+ }
+ else
+ {
+ $idx = $self->{currentItem} if ! defined $idx;
+ return if $self->{currentItem} < 0;
+ $info = ($self->getItemsListFiltered)->[$idx];
+ }
+ $self->displayDataInPanel($panel, $info);
+ }
+
+ sub displayDataInPanel
+ {
+ my ($self, $panel, $info) = @_;
+ for my $field (@{$self->{model}->{fieldsNotFormatted}})
+ {
+ $panel->$field($info->{$field});
+ $panel->{$field}->resetChanged
+ if $panel->{$field};
+ }
+
+ $panel->dataChanged;
+ $GCGraphicComponent::somethingChanged = 0;
+ }
+
+ sub display
+ {
+ my $self = shift;
+ return if (! $self->{itemArray}) || (! scalar @{$self->{itemArray}});
+ my @numbers = @_;
+ my $number;
+ my $multipleMode;
+ my $withSelect = 0;
+ my $noUpdate = 0;
+ if ($#numbers > 0)
+ {
+ $multipleMode = 1;
+ $self->{multipleCurrentItems} = \@numbers;
+ }
+ else
+ {
+ $multipleMode = 0;
+ $number = $numbers[0];
+ if ($number == -1)
+ {
+ $number = 0;
+ $noUpdate = 1;
+ }
+ # We want a selection if user clicked on the same one
+ $withSelect = ($number == $self->{currentItem});
+ }
+ my ($selectedHasChanged, $filtered) = (0, 0);
+
+ if ((!$noUpdate) && ($self->{currentItem} > -1) && !($self->{hasBeenDeleted}))
+ {
+ ($selectedHasChanged, $filtered) = $self->updateSelectedItemInfoFromPanel($withSelect);
+ }
+ else
+ {
+ $self->{currentItem} = $number
+ if !$multipleMode;
+ }
+ $self->{multipleMode} = $multipleMode;
+ $self->{hasBeenDeleted} = 0;
+
+ $self->{currentItem} = $number if !$selectedHasChanged && !$multipleMode;
+ $self->displayCurrent if !$selectedHasChanged;
+ return ($selectedHasChanged || $filtered);
+ }
+
+ sub valueToDisplayed
+ {
+ my ($self, $value, $field) = @_;
+ my $displayed = $self->{model}->getDisplayedValue($self->{model}->{fieldsInfo}->{$field}->{values}, $value);
+ return $displayed if $displayed;
+ # For personal models, it won't return a value. Then we keep the original one.
+ return $value;
+ }
+
+ sub transformValue
+ {
+ my ($self, $value, $field, $type) = @_;
+
+ $type ||= $self->{model}->{fieldsInfo}->{$field}->{type};
+ $value = $self->{parent}->transformTitle($value) if $field eq $self->{model}->{commonFields}->{title};
+ #$value = GCPreProcess::reverseDate($value) if $type eq 'date';
+ $value = GCUtils::timeToStr($value, $self->{parent}->{options}->dateFormat)
+ if $type eq 'date';
+ $value = $self->valueToDisplayed($value, $field) if $type eq 'options';
+ $value = GCPreProcess::multipleList($value, $type) if $type =~ /list$/o;
+ return $value;
+ }
+
+ sub getValue
+ {
+ my ($self, $idx, $field) = @_;
+
+ return ($self->getItemsListFiltered)->[$idx]->{$field};
+ }
+
+ sub setValue
+ {
+ my ($self, $idx, $field, $value) = @_;
+
+ ($self->getItemsListFiltered)->[$idx]->{$field} = $value;
+ if ($idx == $self->{currentItem})
+ {
+ $self->{panel}->$field($value);
+ $self->{panel}->dataChanged;
+ }
+ }
+
+ sub getItemsListFiltered
+ {
+ my ($self, $filter) = @_;
+
+ return $self->{itemArray} if ! $filter;
+ my @results = ();
+ foreach (@{$self->{itemArray}})
+ {
+ if ($self->{parent}->{filterSearch}->test($_))
+ {
+ push @results, $_;
+ }
+ }
+ return \@results;
+ }
+
+ # Should only be used by GCCommandExecution
+ sub setItemsList
+ {
+ my ($self, $itemsList) = @_;
+
+ $self->{itemArray} = $itemsList;
+ }
+
+ sub getInformation
+ {
+ my $self = shift;
+ $self->{loaded}->{information} ||= {};
+ return $self->{loaded}->{information};
+ }
+
+ sub setInformation
+ {
+ my ($self, $info) = @_;
+ $self->{loaded}->{information} = $info;
+ }
+
+ sub reloadList
+ {
+ my ($self, $splash, $fullProgress, $filtering) = @_;
+ return if $self->{block};
+ if ($splash)
+ {
+ $splash->initProgress if $fullProgress;
+ $splash->setItemsTotal(scalar @{$self->{itemArray}})
+ if $self->{itemArray};
+ }
+ $self->{parent}->{itemsView}->reset if $self->{parent}->{itemsView};
+
+ my $lastDisplayed = -1;
+ my $hasId = 0;
+ my $j = 0;
+ my $idField = $self->{model}->{commonFields}->{id};
+ my $currentId;
+
+ # If we don't get an history from BE, we will have to initialize it now
+ my $historyNeeded = ! $self->{loaded}->{gotHistory};
+ my %histories;
+
+ foreach (@{$self->{itemArray}})
+ {
+ if ($historyNeeded)
+ {
+ foreach my $field (@{$self->{model}->{fieldsHistory}})
+ {
+ #push @{$histories{$field}}, $_->{$field};
+ $self->{panel}->addHistory($_->{$field}, 1);
+ }
+ }
+
+ $currentId = $_->{$idField};
+
+ $self->{parent}->{itemsView}->addItem($_, 0);
+ $lastDisplayed = $j;
+ $splash->setProgressForItemsDisplay($j) if $splash;
+ $j++;
+ }
+
+ if ($historyNeeded)
+ {
+ for my $hfield(@{$self->{model}->{fieldsHistory}})
+ {
+ $self->{panel}->{$hfield}->setDropDown;
+ }
+ # Now we are sure we got one
+ $self->{loaded}->{gotHistory} = 2;
+ }
+
+ $self->{panel}->show if $j;
+
+ #if ($splash && $fullProgress)
+ #{
+ # $splash->endProgress;
+ #}
+
+ if (! $self->{parent}->{initializing})
+ {
+ $self->{parent}->reloadDone(0, $splash);
+ $self->select($self->{currentItem}, 0);
+ }
+ }
+
+ sub select
+ {
+ my ($self, $value, $init) = @_;
+ return if !$self->{parent}->{itemsView};
+ return $self->{parent}->{itemsView}->select($value, $init) unless $value < -1;
+ }
+
+ sub removeCurrentItems
+ {
+ my $self = shift;
+
+ my $numbers = $self->{parent}->{itemsView}->getCurrentItems;
+
+ my $nbRemoved = 0;
+ # Numerically sort list
+ foreach my $number(sort {$a <=> $b} @$numbers)
+ {
+ # We need to adjust it because we already removed other ones.
+ my $actualNumber = $number - $nbRemoved;
+ foreach (@{$self->{model}->{managedImages}})
+ {
+ my $image = $self->{itemArray}->[$actualNumber]->{$_};
+ $self->{parent}->checkPictureToBeRemoved($image);
+ }
+
+ splice @{$self->{itemArray}}, $actualNumber, 1;
+ $nbRemoved++;
+ }
+ my $newIdx = $self->{parent}->{itemsView}->removeCurrentItems; #($number);
+
+ $self->{currentItem} = $newIdx;
+ $self->{multipleMode} = 0;
+ $self->{hasBeenDeleted} = 1;
+ $self->displayCurrent;
+ }
+
+ sub addItem
+ {
+ my ($self, $info, $keepId, $noSelect) = @_;
+ my $nbItems = scalar @{$self->{itemArray}};
+# $self->{panel}->show if ! $nbItems;
+
+ my $currentId;
+ if ($keepId)
+ {
+ $currentId = $self->{itemArray}->[$nbItems]->{$self->{model}->{commonFields}->{id}};
+ }
+ else
+ {
+ $self->{loaded}->{information}->{maxId}++;
+ $currentId = $self->{loaded}->{information}->{maxId};
+ $self->{itemArray}->[$nbItems]->{$self->{model}->{commonFields}->{id}} = $currentId;
+ }
+
+ for my $field (@{$self->{model}->{fieldsNames}})
+ {
+ next if $field eq $self->{model}->{commonFields}->{id};
+ if ($self->{model}->{fieldsInfo}->{$field}->{hasHistory})
+ {
+ $self->{panel}->{$field}->addHistory($info->{$field});
+ }
+ $self->{itemArray}->[$nbItems]->{$field} = $info->{$field};
+ }
+
+ $self->{parent}->{itemsView}->addItem($self->{itemArray}->[$nbItems], 1);
+
+ $self->{multipleMode} = 0;
+ $self->{currentItem} = $nbItems;
+ $self->displayCurrent;
+ $self->select($nbItems, 0)
+ if !$noSelect;
+
+ $self->{parent}->{itemsView}->showCurrent;
+
+ return $currentId;
+ }
+
+ sub setOptions
+ {
+ my ($self, $options) = @_;
+
+ $self->{options} = $options;
+
+ #return $self->load($options->file, $splash, 0);
+ }
+
+ sub markToBeRemoved
+ {
+ my ($self, $image) = @_;
+ push @{$self->{imagesToBeRemoved}}, $image;
+ }
+
+ sub markToBeAdded
+ {
+ my ($self, $image) = @_;
+ push @{$self->{imagesToBeAdded}}, $image;
+ }
+
+ sub removeMarkedPictures
+ {
+ my $self = shift;
+ my $image;
+ foreach $image(@{$self->{imagesToBeRemoved}})
+ {
+ unlink $image;
+ }
+
+ $self->{imagesToBeRemoved} = [];
+ }
+
+ sub addMarkedPictures
+ {
+ my $self = shift;
+
+ $self->{imagesToBeAdded} = [];
+ }
+
+ sub clean
+ {
+ my $self = shift;
+ my $image;
+ foreach (@{$self->{imagesToBeAdded}})
+ {
+ unlink $_;
+ }
+ $self->{oldImagesDirectory} = {};
+ $self->{newImagesDirectory} = undef;
+ $self->{copyImagesWhenChangingDir} = 0;
+ }
+
+ sub setNewImagesDirectory
+ {
+ # $prev is also a parameter because we didn't store it here
+ my ($self, $new, $prev, $withCopy) = @_;
+ $new =~ s|/$||;
+ $self->{newImagesDirectory} = $new;
+ $self->{copyImagesWhenChangingDir} = $withCopy;
+ # We stored the previous one as a hash so it will be easier for tests
+ $prev =~ s|/$||;
+ $self->{oldImagesDirectory}->{$prev} = 1;
+ }
+
+ sub setPreviousFile
+ {
+ my ($self, $prev) = @_;
+
+ $self->{previousFile} = $prev;
+ }
+
+ sub queryReplace
+ {
+ my ($self, $field, $old, $new, $caseSensitive) = @_;
+ foreach (@{$self->{itemArray}})
+ {
+ if (ref($_->{$field}) eq 'ARRAY')
+ {
+ foreach my $subval(@{$_->{$field}})
+ {
+ foreach my $val(@$subval)
+ {
+ if ($caseSensitive)
+ {
+ $val =~ s/$old/$new/g;
+ }
+ else
+ {
+ $val =~ s/$old/$new/gi;
+ }
+ }
+ }
+ }
+ else
+ {
+ if ($caseSensitive)
+ {
+ $_->{$field} =~ s/$old/$new/g;
+ }
+ else
+ {
+ $_->{$field} =~ s/$old/$new/gi;
+ }
+ }
+ }
+ $self->displayCurrent;
+ $self->reloadList;
+ }
+
+ sub findMaxId
+ {
+ my $self = shift;
+
+ $self->{loaded}->{information}->{maxId} = -1;
+ foreach (@{$self->{itemArray}})
+ {
+ $self->{loaded}->{information}->{maxId} = $_->{$self->{model}->{commonFields}->{id}}
+ if $_->{$self->{model}->{commonFields}->{id}} > $self->{loaded}->{information}->{maxId};
+ }
+ }
+
+ sub clearList
+ {
+ my $self = shift;
+ $self->{currentItem} = -1;
+ $self->{loaded} = {};
+ $self->{itemArray} = [];
+ $self->{panel}->hide if $self->{panel};
+ $self->{parent}->{itemsView}->clearCache if $self->{parent}->{itemsView};
+ $self->{parent}->{itemsView}->reset if $self->{parent}->{itemsView};
+ #$self->{parent}->reloadDone(1) if ! $self->{parent}->{initializing};
+ #$self->reloadList if ! $self->{parent}->{initializing};
+ }
+
+ sub getNbItems
+ {
+ my $self = shift;
+ return 0 if ! $self->{itemArray};
+ return scalar @{$self->{itemArray}};
+ }
+
+ sub setLock
+ {
+ my ($self, $value) = @_;
+ $self->{loaded}->{information}->{locked} = $value;
+ }
+
+ sub getLock
+ {
+ my $self = shift;
+ return $self->{loaded}->{information}->{locked};
+ }
+
+ sub getBackend
+ {
+ my ($self, $file) = @_;
+ $self->{backend} = new GCBackend::GCBeXmlParser($self->{parent})
+ if !$self->{backend};
+ $self->{backend}->setParameters(file => $file,
+ version => $self->{parent}->{version});
+ return $self->{backend};
+ }
+
+ sub getVersion
+ {
+ my ($self, $file) = @_;
+
+ return $self->getBackend($file)->getVersion;
+ }
+
+ sub load
+ {
+ my ($self, $file, $splash, $fullProgress, $noReload) = @_;
+
+ my $initTime;
+ if ($ENV{GCS_PROFILING} > 0)
+ {
+ eval 'use Time::HiRes';
+ eval '$initTime = [Time::HiRes::gettimeofday()]';
+ }
+
+ $self->clean;
+ if (!$file)
+ {
+ $self->{parent}->setCurrentModel;
+ return 0;
+ }
+
+ my $collection;
+
+ $self->{block} = 1;
+ $self->clearList;
+ $self->{block} = 0;
+ $self->{splash} = $splash;
+ my $backend;
+ eval
+ {
+ $backend = $self->getBackend($file);
+
+ $self->{loaded} = $backend->load($splash);
+ # We keep a direct access to this one
+ $self->{itemArray} = $self->{loaded}->{data};
+ };
+ if ($@)
+ {
+ my @error = ('Fatal error while reading file', $@);
+ return (0, \@error);
+ }
+ elsif ($self->{loaded}->{error})
+ {
+ return (0, $self->{loaded}->{error});
+ }
+
+ # Perform Models Change if needed
+ if(!$self->{model}->{isInline} && ($backend->getVersion() ne $backend->{version}))
+ {
+ my $modelFormatUpdater=GCModelsChanges->new($self,$self->{model}->{collection}->{name});
+ $modelFormatUpdater->applyChanges($self->{itemArray}, $backend->getVersion(), $backend->{version});
+ }
+
+ # Hide the panel if no item
+ if (! scalar @{$self->{itemArray}})
+ {
+ $self->{panel}->hide;
+ }
+
+ # gotHistory = 1 means we got one but it has not been set in components
+ if ($self->{loaded}->{gotHistory} == 1)
+ {
+ for my $hfield(@{$self->{model}->{fieldsHistory}})
+ {
+ if (exists $self->{loaded}->{histories}->{$hfield})
+ {
+ $self->{panel}->{$hfield}->setValues($self->{loaded}->{histories}->{$hfield}, 1);
+ }
+ $self->{panel}->{$hfield}->setDropDown;
+ }
+# $self->{loaded}->{gotHistory} = 2;
+ }
+ elsif ($self->{loaded}->{gotHistory} == 2)
+ {
+ for my $hfield(@{$self->{model}->{fieldsHistory}})
+ {
+ $self->{panel}->{$hfield}->setDropDown;
+ }
+ }
+
+ $self->reloadList($splash, $fullProgress) unless $noReload;
+
+ if ($ENV{GCS_PROFILING} > 0)
+ {
+ my $elapsed;
+ eval '$elapsed = Time::HiRes::tv_interval($initTime)';
+ print "Load time : $elapsed\n";
+ }
+
+ return 1;
+ }
+
+ sub movePictures
+ {
+ my ($self) = @_;
+ eval {
+ mkpath $self->{newImagesDirectory};
+ my $file;
+ my $dataFile = $self->{previousFile} ? $self->{previousFile} : $self->{options}->file;
+ foreach (@{$self->getItemsListFiltered})
+ {
+ foreach my $pic(@{$self->{model}->{fieldsImage}})
+ {
+ $file = GCUtils::getDisplayedImage($_->{$pic},
+ '',
+ $dataFile);
+ # Not moving picture if it is not in the previous directory
+ next if !$file;
+ next if ! exists $self->{oldImagesDirectory}->{Cwd::realpath(dirname($file))};
+ (my $suffix = $file) =~ s/.*?(\.[^.]*)$/$1/;
+ my $new =
+ $self->{parent}->getUniqueImageFileName(
+ $suffix,
+ $_->{$self->{model}->{commonFields}->{title}});
+
+ if ($self->{copyImagesWhenChangingDir})
+ {
+ copy $file, $new;
+ }
+ else
+ {
+ move $file, $new;
+ }
+ $_->{$pic} = $new;
+ }
+ }
+ };
+ $self->{previousFile} = 0;
+ return $@ if $@;
+ $self->displayCurrent;
+ $self->{newImagesDirectory} = undef;
+ $self->{copyImagesWhenChangingDir} = 0;
+ $self->{oldImagesDirectory} = {};
+ return 0;
+ }
+
+ sub save
+ {
+ my ($self, $splash) = @_;
+
+ my $initTime;
+ if ($ENV{GCS_PROFILING} > 0)
+ {
+ eval 'use Time::HiRes';
+ eval '$initTime = [Time::HiRes::gettimeofday()]';
+ }
+
+ $self->updateSelectedItemInfoFromPanel if ($self->{currentItem} > -1);
+
+ # TODO : Use progress bar for this operation also
+ my $moveError = $self->movePictures
+ if $self->{newImagesDirectory};
+ return (0, ['SaveError', $moveError])
+ if $moveError;
+
+
+ if ($splash)
+ {
+ $splash->initProgress($self->{parent}->{lang}->{StatusSave});
+ $splash->setItemsTotal(scalar @{$self->{itemArray}});
+ }
+ $self->addMarkedPictures;
+ $self->removeMarkedPictures;
+
+ my $backend = $self->getBackend($self->{options}->file);
+
+ # We re-generate histories to give it to backend
+ # Deactivated for the moment
+# if ($self->{panel})
+# {
+# my %histories;
+# for my $hfield(@{$self->{model}->{fieldsHistory}})
+# {
+# $histories{$hfield} = $self->{panel}->{$hfield}->getValues;
+# }
+# $backend->setHistories(\%histories);
+# }
+
+ my $result = $backend->save($self->{itemArray},
+ $self->{loaded}->{information},
+ $splash);
+
+ $self->{parent}->endProgress;
+ if ($result->{error})
+ {
+ return (0, $result->{error});
+ }
+ $self->{parent}->removeUpdatedMark;
+
+ if ($ENV{GCS_PROFILING} > 0)
+ {
+ my $elapsed;
+ eval '$elapsed = Time::HiRes::tv_interval($initTime)';
+ print "Save time : $elapsed\n";
+ }
+ return 1;
+ }
+
+ sub getSummary
+ {
+ my ($self, $idx) = @_;
+
+ my $info = ($self->getItemsListFiltered)->[$idx];
+
+ my $summary = "<b>".GCUtils::encodeEntities($info->{$self->{model}->{commonFields}->{title}})."</b>\n";
+
+ for my $field (@{$self->{model}->getSummaryFields})
+ {
+ my $value = $info->{$field};
+
+ if ($field eq $self->{model}->{commonFields}->{borrower}->{name})
+ {
+ $value = $self->{parent}->{lang}->{PanelNobody}
+ if $value eq 'none';
+ $value = $self->{parent}->{lang}->{PanelUnknown}
+ if $value eq 'unknown';
+ }
+ else
+ {
+ $value = GCUtils::encodeEntities($self->transformValue($value, $field));
+ }
+ $summary .= "\n<b>"
+ .GCUtils::encodeEntities($self->{model}->getDisplayedLabel($field))
+ .$self->{parent}->{lang}->{Separator}
+ ."</b>"
+ .$value;
+ }
+ return $summary;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCDialogs.pm b/lib/gcstar/GCDialogs.pm
new file mode 100644
index 0000000..19908cd
--- /dev/null
+++ b/lib/gcstar/GCDialogs.pm
@@ -0,0 +1,1519 @@
+package GCDialogs;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use Gtk2;
+use utf8;
+
+our @okCancelButtons = ('gtk-cancel'=>'cancel', 'gtk-ok'=>'ok');
+
+my $hasAboutDialog = 1;
+eval 'Gtk2::AboutDialog->set_email_hook(undef, undef)';
+$hasAboutDialog = 0 if $@;
+
+{
+ package GCModalDialog;
+ use base "Gtk2::Dialog";
+
+ sub showMe
+ {
+ my $self = shift;
+
+ $self->present;
+ }
+
+ sub activateOkButton
+ {
+ my ($self, $value) = @_;
+ ($self->action_area->get_children)[$self->{okPosition}]->set_sensitive($value);
+ }
+
+ sub activateExtraButton
+ {
+ my ($self, $value) = @_;
+ ($self->action_area->get_children)[$self->{extraPosition}]->set_sensitive($value);
+ }
+
+ sub setOkLabel
+ {
+ my ($self, $label) = @_;
+ my @buttons = $self->action_area->get_children;
+ my $tmpWidget = $buttons[0];
+ $tmpWidget = $tmpWidget->child while ! $tmpWidget->isa('Gtk2::HBox');
+ ($tmpWidget->get_children)[1]->set_label($label);
+ }
+
+ sub setCancelLabel
+ {
+ my ($self, $label) = @_;
+ my @buttons = $self->action_area->get_children;
+ my $tmpWidget = $buttons[1];
+ $tmpWidget = $tmpWidget->child while ! $tmpWidget->isa('Gtk2::HBox');
+ ($tmpWidget->get_children)[1]->set_label($label);
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $title, $okLabel, $extraAfter, @extraButtons) = @_;
+ $title =~ s/_//g;
+ my $class = ref($proto) || $proto;
+ my @buttons;
+ if ((defined $okLabel) && ($okLabel =~ /^gtk-/))
+ {
+ @buttons = ('gtk-cancel'=>'cancel', $okLabel=>'ok');
+ $okLabel = '';
+ }
+ else
+ {
+ @buttons = @GCDialogs::okCancelButtons;
+ }
+ my ($okPosition, $extraPosition) = (0, -1);
+ if (@extraButtons)
+ {
+ if ($extraAfter)
+ {
+ $okPosition = 1;
+ $extraPosition = 0;
+ push @buttons, @extraButtons;
+ }
+ else
+ {
+ $okPosition = 0;
+ $extraPosition = 2;
+ unshift @buttons, @extraButtons;
+ }
+ }
+ my $self = $class->SUPER::new($title,
+ $parent,
+ [qw/modal destroy-with-parent/],
+ @buttons
+ );
+ bless ($self, $class);
+
+ ($self->{okPosition}, $self->{extraPosition}) = ($okPosition, $extraPosition);
+
+ $self->setOkLabel($okLabel) if $okLabel;
+ $self->set_default_response('ok');
+
+ $self->{parent} = $parent;
+
+ $self->vbox->set_border_width($GCUtils::margin);
+
+ return $self;
+ }
+}
+
+{
+ package GCAboutDialog;
+ if (!$hasAboutDialog)
+ {
+ use base "Gtk2::Dialog";
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ if ($hasAboutDialog)
+ {
+ $self->{about}->set_position('center-on-parent');
+ $self->{about}->run;
+ $self->{about}->hide;
+ }
+ else
+ {
+ $self->SUPER::show();
+ $self->show_all;
+ my $code = $self->run;
+ $self->hide;
+ }
+ }
+
+ sub changeStyle
+ {
+ my $self = shift;
+ $self->{vBox}->set_border_width(0);
+ ($self->{vBox}->get_children)[1]->set_border_width($self->{border});
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $version) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self;
+
+ my $logoFile = $parent->{logosDir}.'about.png';
+
+ if ($hasAboutDialog)
+ {
+ $self = {
+ about => new Gtk2::AboutDialog,
+ parent => $parent
+ };
+ bless ($self, $class);
+
+ open LICENSE, "<".$ENV{GCS_SHARE_DIR}.'/LICENSE';
+ my $license = do {local $/; <LICENSE>};
+ close LICENSE;
+ my @authors = split m/\n/, $parent->{lang}->{AboutWho};
+
+ $self->{about}->set_transient_for($parent);
+ $self->{about}->set_url_hook( sub {
+ my ($widget, $url) = @_;
+ $self->{parent}->launch($url, 'url');
+ });
+
+ if (-f $logoFile)
+ {
+ my $logo = Gtk2::Gdk::Pixbuf->new_from_file($logoFile);
+ $self->{about}->set_logo($logo);
+ }
+ $self->{about}->set_program_name('GCstar');
+ $self->{about}->set_comments($parent->{lang}->{AboutDesc});
+ $self->{about}->set_version($version);
+ $self->{about}->set_authors('', @authors);
+ $self->{about}->set_documenters(("",'Christian Jodar (Tian)','http://wiki.gcstar.org/'));
+ $self->{about}->set_artists("",$parent->{lang}->{AboutDesign});
+ $self->{about}->set_copyright($parent->{lang}->{AboutLicense});
+ $self->{about}->set_license($license);
+ $self->{about}->set_translator_credits("\n".$parent->{lang}->{AboutTranslation});
+ $self->{about}->set_website("http://www.gcstar.org/");
+ $self->{vBox} = $self->{about}->get_children;
+ $self->{border} = $self->{vBox}->get_border_width;
+ if ($self->{about}->signal_query('style_set'))
+ {
+ $self->{about}->signal_connect('style_set' => sub {$self->changeStyle });
+ }
+ $self->changeStyle;
+ }
+ else
+ {
+ $self = $class->SUPER::new($parent->{lang}->{AboutTitle},
+ $parent,
+ [qw/modal destroy-with-parent/],
+ 'gtk-ok' => 'ok'
+ );
+ bless ($self, $class);
+ my $labelDesc = Gtk2::Label->new($parent->{lang}->{AboutDesc});
+ my $labelVersion = Gtk2::Label->new($parent->{lang}->{AboutVersion}.' '.$version);
+ #my $labelTeam = Gtk2::Label->new($parent->{lang}->{AboutTeam});
+
+ my $who = new Gtk2::Label($parent->{lang}->{AboutWho});
+
+ my $labelTranslation = Gtk2::Label->new($parent->{lang}->{AboutTranslation});
+ my $labelLicense = Gtk2::Label->new($parent->{lang}->{AboutLicense});
+ $labelLicense->set_justify('center');
+ my $button = Gtk2::Button->new_with_mnemonic('_http://www.gcstar.org/');
+ $button->child->set_padding(10,0);
+ $button->signal_connect('clicked', sub {
+ my ($widget, $parent) = @_;
+ (my $url = $widget->get_label) =~ s/^_//;
+ $parent->launch($url, 'url');
+ }, $parent);
+ my $labelDesign = Gtk2::Label->new($parent->{lang}->{AboutDesign});
+
+ $self->vbox->set_homogeneous(0);
+ if (-f $logoFile)
+ {
+ my $image = Gtk2::Image->new_from_file($logoFile);
+ $self->vbox->pack_start($image, 0, 0, 0);
+ }
+ $self->vbox->pack_start($labelDesc, 1, 1, 4);
+ $self->vbox->pack_start($labelVersion, 1, 1, 4);
+ $self->vbox->pack_start($labelLicense, 1, 1, 4);
+ $self->vbox->pack_start(Gtk2::HSeparator->new, 1, 1, 4);
+ my $hbox = new Gtk2::HBox(0,0);
+ $hbox->pack_start($button, 1, 0, 10);
+ $self->vbox->pack_start($hbox, 0, 0, 4);
+ my $hboxDesign = new Gtk2::HBox(0,0);
+ $self->vbox->pack_start($labelDesign, 1, 1, 4);
+ $self->vbox->pack_start($hboxDesign, 0, 0, 4);
+
+ my $teamButton = Gtk2::Button->new($parent->{lang}->{AboutTeam});
+ $teamButton->signal_connect('clicked' => sub {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'info',
+ 'ok',
+ $parent->{lang}->{AboutWho});
+ $dialog->run;
+ $dialog->destroy;
+ });
+ $self->action_area->pack_start($teamButton,0,0,0);
+ $self->action_area->reorder_child($teamButton,0);
+
+
+ #$self->vbox->set_size_request(400,-1);
+ $self->set_resizable(0);
+ $self->set_position('center-always');
+ }
+
+ return $self;
+ }
+}
+
+{
+ package GCImageDialog;
+ use base "Gtk2::Dialog";
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+ $self->set_position('center-always');
+ $self->{scrollArea}->signal_connect('size-allocate' => sub {
+ return if !$self->{scrollArea};
+ my ($width, $height) = $self->get_size;
+ return if ($width == $self->{width}) && ($height == $self->{height});
+ my $allocation = $self->{scrollArea}->allocation;
+ return if $allocation->height < 10;
+ $self->{image}->parent->set_size_request(-1, -1);
+ $self->set_position('center');
+ my $pixbuf = GCUtils::scaleMaxPixbuf($self->{originalPixbuf}, $allocation->width, $allocation->height);
+ $self->{image}->set_from_pixbuf($pixbuf);
+ ($self->{width}, $self->{height}) = ($width, $height);
+ }) if $self->{scrollArea};
+ my $code = $self->run;
+ $self->hide;
+ $self->{windowParent}->showMe;
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $file, $windowParent) = @_;
+ my $class = ref($proto) || $proto;
+ $windowParent ||= $parent;
+ my $self = $class->SUPER::new($parent->{lang}->{ImportViewPicture},
+ $windowParent,
+ [qw/modal destroy-with-parent/],
+ 'gtk-ok' => 'ok'
+ );
+ bless($self, $class);
+
+ $self->{parent} = $parent;
+ $self->{windowParent} = $windowParent;
+
+ if (-f $file)
+ {
+ $self->{image} = Gtk2::Image->new;
+ $self->{originalPixbuf} = Gtk2::Gdk::Pixbuf->new_from_file($file);
+ $self->{image}->set_from_pixbuf($self->{originalPixbuf});
+ $self->{image}->set_size_request(0,0);
+ $self->{scrollArea} = new Gtk2::ScrolledWindow;
+ $self->{scrollArea}->set_policy ('automatic', 'automatic');
+ $self->{scrollArea}->set_shadow_type('none');
+ $self->{scrollArea}->add_with_viewport($self->{image});
+ $self->vbox->pack_start($self->{scrollArea},1,1,0);
+ my ($screenWidth, $screenHeight) = ($self->get_screen->get_width, $self->get_screen->get_height);
+ my ($pixWidth, $pixHeight) = ($self->{originalPixbuf}->get_width, $self->{originalPixbuf}->get_height);
+
+ # Minimum amount of spacing we want to leave for panels, window decorations, borders, etc
+ my $heightMargin = 150;
+ my $widthMargin = 30;
+
+ my $ratio = $pixWidth / $pixHeight;
+
+ # Check if picture will fit into screen, or if we'll need to resize
+ if (($pixHeight > ($screenHeight - $heightMargin)) && ($pixWidth <= ($screenWidth - $widthMargin)))
+ {
+ # Image is higher than vertical space we have available, but not wider
+ $pixHeight = $screenHeight - $heightMargin;
+ $pixWidth = $pixHeight * $ratio;
+ }
+ elsif (($pixHeight <= ($screenHeight - $heightMargin)) && ($pixWidth > ($screenWidth - $widthMargin)))
+ {
+ # Image is wider than horizontal space we have available, but not taller
+ $pixWidth = $screenWidth - $widthMargin;
+ $pixHeight = $pixWidth / $ratio;
+ }
+ elsif (($pixHeight > ($screenHeight - $heightMargin)) && ($pixWidth > ($screenWidth - $widthMargin)))
+ {
+ # Image is both too high and too wide for space we have, so see which direction will be
+ # affected the most
+ if ($screenHeight - $heightMargin - $pixHeight < $screenWidth - $widthMargin - $pixWidth)
+ {
+ # Constrained by vertical height
+ $pixHeight = $screenHeight - $heightMargin;
+ $pixWidth = $pixHeight * $ratio;
+ }
+ else
+ {
+ # Constrained by horizontal width
+ $pixWidth = $screenWidth - $widthMargin;
+ $pixHeight = $pixWidth / $ratio;
+ }
+ }
+ $self->{image}->parent->set_size_request($pixWidth, $pixHeight);
+ }
+ else
+ {
+ my $label = new Gtk2::Label;
+ $label->set_markup('<b>'.$parent->{lang}->{PanelImageNoImage}.'</b>');
+ $self->vbox->pack_start($label,1,1,4 * $GCUtils::margin);
+ }
+
+ return $self;
+ }
+}
+
+{
+ package GCNumberEntryDialog;
+ use base "Gtk2::Dialog";
+
+ sub getUserValue
+ {
+ my $self = shift;
+ my $value = -1;
+ my $code = $self->run;
+ $value = $self->{value}->get_value if ($code eq 'ok');
+ $self->hide;
+ return $value;
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+
+ $self->{value}->set_value($value);
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $title, $min, $max, $step) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($title,
+ $parent,
+ [qw/modal destroy-with-parent/],
+ @GCDialogs::okCancelButtons
+ );
+
+ my $label = Gtk2::Label->new($parent->{lang}->{DialogEnterNumber});
+ $label->set_line_wrap(1);
+ $label->set_padding(5,0);
+ $self->{value} = new GCNumeric(($min + $max) / 2, $min, $max, $step);
+
+ my $hboxRating = new Gtk2::HBox(1,10);
+
+ $self->vbox->set_homogeneous(0);
+ $self->vbox->set_spacing(20);
+ $self->vbox->pack_start($label, 0, 0, 5);
+ $hboxRating->pack_start($self->{value}, 0, 0, 5);
+ $self->vbox->pack_start($hboxRating, 0, 0, 5);
+ $self->vbox->show_all;
+
+ bless ($self, $class);
+ return $self;
+ }
+}
+
+{
+ package GCDependenciesDialog;
+ use base "Gtk2::Dialog";
+
+ use GCUtils 'glob';
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+ my $code = $self->run;
+ $self->hide;
+ }
+
+ sub checkDependencies
+ {
+ my $self = shift;
+
+ my $pref = 'GC';
+
+ my @optionals = ();
+ my $optionalsModules = {};
+
+ my @files = glob $ENV{GCS_LIB_DIR}.'/*.pm';
+
+ for my $component('GCPlugins', 'GCExport', 'GCImport', 'GCExtract')
+ {
+ foreach (glob $ENV{GCS_LIB_DIR}."/$component/*")
+ {
+ if (-d $_)
+ {
+ push @files, glob $ENV{GCS_LIB_DIR}."/$component/$_/*.pm";
+ }
+ else
+ {
+ push @files, $_;
+ }
+ }
+ }
+ foreach my $file(@files)
+ {
+ open FILE, $file;
+ while (<FILE>)
+ {
+ if (
+ ((/eval.*?[\"\']use\s*(.*?)[\"\'];/) && ($1 !~ /base|vars|locale|integer|^lib|utf8|\$opt|\$module|strict|^$pref/))
+ ||
+ (/checkModule\([\"\'](.*?)[\"\']\)/)
+ )
+ #"
+ {
+ next if $1 eq 'Time::HiRes';
+ push (@optionals, $1);
+ push @{$optionalsModules->{$1}}, $file;
+ }
+
+ }
+ close FILE;
+ }
+
+ my %saw;
+ @saw{@optionals} = ();
+ @optionals = sort keys %saw;
+
+ $self->{tableDepend}->resize(1 + scalar(@optionals),2);
+
+ my @missings = ();
+ my @oks = ();
+ foreach my $opt(sort @optionals)
+ {
+ my $label1 = new Gtk2::Label($opt);
+ my $label2 = new Gtk2::Label;
+
+ $@ = '';
+ eval "use $opt";
+ if ($@)
+ {
+ my $value;
+ foreach my $module (@{$optionalsModules->{$opt}})
+ {
+ $module =~ s/.*?GC([^\/]*?)\.pm$/$1/;
+ $value .= $module.",\n";
+ }
+ $value =~ s/,\n$//;
+ $label2->set_markup("<span color='orange' weight='bold'>".$self->{parent}->{lang}->{InstallMissingFor}." $value</span>");
+ $label2->set_line_wrap(1);
+ $label2->set_justify('left');
+ push @missings, [$label1, $label2];
+ }
+ else
+ {
+ $label2->set_markup("<span color='green' weight='bold'>".$self->{parent}->{lang}->{InstallOK}."</span>");
+ push @oks, [$label1, $label2];
+ }
+
+ }
+
+ my $i = 0;
+ my $labelOpt = new Gtk2::Label;
+ $labelOpt->set_markup('<b>'.$self->{parent}->{lang}->{InstallOptional}.'</b>');
+ $self->{tableDepend}->attach($labelOpt, 0, 2, $i, $i+1, 'expand', 'fill', 0, $GCUtils::margin);
+ $i++;
+
+ foreach (@missings)
+ {
+ $self->{tableDepend}->attach($_->[0], 0, 1, $i, $i+1, 'fill', 'fill', 0, 0);
+ $self->{tableDepend}->attach($_->[1], 1, 2, $i, $i+1, 'fill', 'fill', 0, 0);
+
+ $i++;
+ }
+ foreach (@oks)
+ {
+ $self->{tableDepend}->attach($_->[0], 0, 1, $i, $i+1, 'fill', 'fill', 0, 0);
+ $self->{tableDepend}->attach($_->[1], 1, 2, $i, $i+1, 'fill', 'fill', 0, 0);
+
+ $i++;
+ }
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent->{lang}->{InstallDependencies},
+ $parent,
+ [qw/modal destroy-with-parent/],
+ 'gtk-ok' => 'ok'
+ );
+ bless($self, $class);
+
+ $self->{parent} = $parent;
+
+ $self->{tableDepend} = new Gtk2::Table(1, 2, 0);
+ $self->{tableDepend}->set_row_spacings(10);
+ $self->{tableDepend}->set_col_spacings(20);
+ $self->{tableDepend}->set_border_width(10);
+ $self->{scrollDepend} = new Gtk2::ScrolledWindow;
+ $self->{scrollDepend}->set_policy ('automatic', 'automatic');
+ $self->{scrollDepend}->add_with_viewport($self->{tableDepend});
+ $self->{scrollDepend}->set_size_request(300, 200);
+ $self->vbox->pack_start($self->{scrollDepend},1,1,10);
+
+ $self->checkDependencies;
+
+ return $self;
+ }
+}
+
+{
+ package GCDateSelectionDialog;
+ use base "GCModalDialog";
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+
+ my $response = $self->run;
+ $self->hide;
+ return ($response eq 'ok');
+ }
+
+ sub date
+ {
+ my $self = shift;
+ if (@_)
+ {
+ $_ = shift;
+ return if ! $_;
+ my ($day, $month, $year);
+ ($day, $month, $year) = split m|/|;
+ ($day, $month, $year) = (01, 01, $_) if ! m|/|;
+ $self->{calendar}->select_month($month - 1, $year);
+ $self->{calendar}->select_day($day);
+ }
+ else
+ {
+ my ($year, $month, $day) = $self->{calendar}->get_date;
+ $day = ($day < 10 ? '0' : '').$day;
+ $month++;
+ $month = ($month < 10 ? '0' : '').$month;
+ return join '/', $day, $month, $year;
+ }
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $title) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $title || $parent->{lang}->{PanelDateSelect});
+
+ $self->{calendar} = new Gtk2::Calendar;
+ $self->{calendar}->signal_connect('day-selected-double-click' => sub {
+ $self->response('ok');
+ });
+
+ $self->vbox->pack_start($self->{calendar}, 0, 0, 5);
+ $self->vbox->show_all;
+
+ $self->set_default_size(1,1);
+
+ bless ($self, $class);
+ return $self;
+ }
+}
+
+{
+ package GCPropertiesDialog;
+
+ use Glib::Object::Subclass
+ Gtk2::Dialog::
+ ;
+
+ @GCPropertiesDialog::ISA = ('GCModalDialog');
+
+ sub checkValues
+ {
+ my $self = shift;
+
+ return $self->{parent}->{lang}->{OptionsPicturesWorkingDirError}
+ if $self->{properties}->{images}->getValue =~ /.%WORKING_DIR%/;
+ return undef;
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show();
+ $self->show_all;
+ my $response;
+ while(1)
+ {
+ $response = $self->run;
+ last if $response ne 'ok';
+ my $errorMessage = $self->checkValues;
+ last if !$errorMessage;
+ my $dialog = Gtk2::MessageDialog->new_with_markup($self->{parent},
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $errorMessage);
+ $dialog->run;
+ $dialog->destroy;
+ }
+ $self->hide;
+ return ($response eq 'ok');
+ }
+
+ sub setProperties
+ {
+ my ($self, $properties, $file, $count) = @_;
+
+ foreach (keys %{$self->{properties}})
+ {
+ $self->{properties}->{$_}->setValue($properties->{$_});
+ }
+ $self->{info}->{file}->setValue($file);
+ $self->{info}->{items}->setValue($count);
+ $self->{info}->{size}->setValue(GCUtils::sizeToHuman((-s $file),
+ $self->{parent}->{lang}->{PropertiesFileSizeSymbols}));
+ }
+
+ sub getProperties
+ {
+ my $self = shift;
+
+ my %properties;
+ foreach (keys %{$self->{properties}})
+ {
+ $properties{$_} = $self->{properties}->{$_}->getValue;
+ }
+ return \%properties;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $title = Gtk2::Stock->lookup('gtk-properties')->{label};
+ $title =~ s/_//g;
+ my $self = $class->SUPER::new($parent,
+ $title);
+
+ $self->{parent} = $parent;
+
+ my $table = new Gtk2::Table(14,4,0);
+ $table->set_row_spacings($GCUtils::halfMargin);
+ $table->set_col_spacings($GCUtils::halfMargin);
+ $table->set_border_width($GCUtils::margin);
+
+ my $line = 0;
+
+ my $fileGroupLabel = new GCHeaderLabel($parent->{lang}->{PropertiesFile});
+ $table->attach($fileGroupLabel, 0, 4, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $line++;
+
+ my $fileLabel = new GCLabel($parent->{lang}->{PropertiesFilePath});
+ $self->{info}->{file} = new GCShortText;
+ $self->{info}->{file}->lock(1);
+ $table->attach($fileLabel, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{info}->{file}, 3, 4, $line, $line + 1, ['expand', 'fill'], 'fill', 0, 0);
+ $line++;
+
+ $self->{info}->{itemsLabel} = new GCLabel($parent->{lang}->{PropertiesItemsNumber});
+ $self->{info}->{items} = new GCShortText;
+ $self->{info}->{items}->lock(1);
+ $table->attach($self->{info}->{itemsLabel}, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{info}->{items}, 3, 4, $line, $line + 1, ['expand', 'fill'], 'fill', 0, 0);
+ $line++;
+
+ my $sizeLabel = new GCLabel($parent->{lang}->{PropertiesFileSize});
+ $self->{info}->{size} = new GCShortText;
+ $self->{info}->{size}->lock(1);
+ $table->attach($sizeLabel, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{info}->{size}, 3, 4, 3, 4, ['expand', 'fill'], 'fill', 0, 0);
+
+ $line += 3;
+
+ my $collectionGroupLabel = new GCHeaderLabel($parent->{lang}->{PropertiesCollection});
+ $table->attach($collectionGroupLabel, 0, 4, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $line++;
+
+ my $nameLabel = new GCLabel($parent->{lang}->{PropertiesName});
+ $self->{properties}->{name} = new GCShortText;
+ $table->attach($nameLabel, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{properties}->{name}, 3, 4, $line, $line + 1, ['expand', 'fill'], 'fill', 0, 0);
+ $line++;
+
+ my $langLabel = new GCLabel($parent->{lang}->{PropertiesLang});
+ $self->{properties}->{lang} = new GCHistoryText;
+ my @langValues;
+ push @langValues, "$_ (".$GCLang::langs{$_}->{LangName}.')'
+ foreach (keys %GCLang::langs);
+ @langValues = sort @langValues;
+ $self->{properties}->{lang}->setValues(\@langValues);
+ $table->attach($langLabel, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{properties}->{lang}, 3, 4, $line, $line + 1, ['expand', 'fill'], 'fill', 0, 0);
+ $line++;
+
+ my $ownerLabel = new GCLabel($parent->{lang}->{PropertiesOwner});
+ $self->{properties}->{owner} = new GCShortText;
+ $table->attach($ownerLabel, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{properties}->{owner}, 3, 4, $line, $line + 1, ['expand', 'fill'], 'fill', 0, 0);
+ $line++;
+
+ my $emailLabel = new GCLabel($parent->{lang}->{PropertiesEmail});
+ $self->{properties}->{email} = new GCShortText;
+ $table->attach($emailLabel, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{properties}->{email}, 3, 4, $line, $line + 1, ['expand', 'fill'], 'fill', 0, 0);
+ $line++;
+
+ my $descriptionLabel = new GCLabel($parent->{lang}->{PropertiesDescription});
+ $self->{properties}->{description} = new GCLongText;
+ $table->attach($descriptionLabel, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{properties}->{description}, 3, 4, $line, $line + 1, ['expand', 'fill'], ['expand', 'fill'], 0, 0);
+ $line++;
+
+ my $picturesDirLabel = new GCLabel($parent->{lang}->{OptionsImages});
+ $self->{properties}->{images} = new GCFile($self, $parent->{lang}->{FileChooserOpenDirectory}, 'select-folder');
+ $table->attach($picturesDirLabel, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{properties}->{images}, 3, 4, $line, $line + 1, ['expand', 'fill'], ['fill'], 0, 0);
+ $line++;
+
+ my $defaultImageLabel = new GCLabel($parent->{lang}->{PropertiesDefaultPicture});
+ $self->{properties}->{defaultImage} = new GCFile($self, $parent->{lang}->{FileChooserOpenFile}, 'open');
+ $table->attach($defaultImageLabel, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{properties}->{defaultImage}, 3, 4, $line, $line + 1, ['expand', 'fill'], ['fill'], 0, 0);
+
+ $self->vbox->pack_start($table, 1, 1, 5);
+ $self->vbox->show_all;
+
+ bless ($self, $class);
+ return $self;
+ }
+}
+
+{
+ package GCQueryReplaceDialog;
+ use base "GCModalDialog";
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show();
+ $self->show_all;
+ my $response = $self->run;
+ $self->{field} = $self->{fieldsOption}->getValue;
+ $self->{oldValue} = $self->{old}->getValue;
+ $self->{newValue} = $self->{new}->getValue;
+ $self->{caseSensitive} = $self->{useCase}->getValue;
+ $self->hide;
+ return ($response eq 'ok');
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+
+ $self->{model} = $model;
+ $self->{fieldsOption}->setModel($model);
+ }
+
+ sub updateFields
+ {
+ my $self = shift;
+
+ $self->{layoutTable}->remove($self->{old});
+ ($self->{old}, undef) = $self->{fieldsOption}->createEntryWidget($self, 'eq', $self->{old});
+ $self->{old}->signal_connect('activate' => sub {$self->response('ok')} )
+ if $self->{old}->isa('GCShortText');
+ $self->{layoutTable}->attach($self->{old}, 1, 2, 1, 2, 'fill', 'expand', 0, 0);
+ $self->{old}->show_all;
+
+ $self->{layoutTable}->remove($self->{new});
+ ($self->{new}, undef) = $self->{fieldsOption}->createEntryWidget($self, 'eq', $self->{new});
+ $self->{new}->signal_connect('activate' => sub {$self->response('ok')} )
+ if $self->{new}->isa('GCShortText');
+ $self->{layoutTable}->attach($self->{new}, 1, 2, 2, 3, 'fill', 'expand', 0, 0);
+ $self->{new}->show_all;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $title = Gtk2::Stock->lookup('gtk-find-and-replace')->{label};
+ $title =~ s/_//g;
+ my $self = $class->SUPER::new($parent,
+ $title,
+ $parent->{lang}->{QueryReplaceLaunch}
+ );
+
+ $self->{parent} = $parent;
+
+ # These ones are required for createWidget
+ $self->{lang} = $parent->{lang};
+ $self->{options} = $parent->{options};
+
+ $self->{layoutTable} = new Gtk2::Table(4,2,0);
+ $self->{layoutTable}->set_row_spacings($GCUtils::halfMargin);
+ $self->{layoutTable}->set_col_spacings($GCUtils::margin);
+ $self->{layoutTable}->set_border_width($GCUtils::margin);
+
+ my $fieldLabel = new Gtk2::Label($parent->{lang}->{QueryReplaceField});
+ $fieldLabel->set_alignment(0,0.5);
+ $self->{fieldsOption} = new GCFieldSelector(0, undef, 0);
+ $self->{fieldsOption}->signal_connect('changed' => sub {
+ $self->updateFields;
+ });
+ $self->{layoutTable}->attach($fieldLabel, 0, 1, 0, 1, 'fill', 'fill', 0, 0);
+ $self->{layoutTable}->attach($self->{fieldsOption}, 1, 2, 0, 1, 'fill', 'expand', 0, 0);
+
+ my $oldLabel = new Gtk2::Label($parent->{lang}->{QueryReplaceOld});
+ $oldLabel->set_alignment(0,0.5);
+
+ $self->{old} = new GCShortText;
+ $self->{layoutTable}->attach($oldLabel, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ $self->{layoutTable}->attach($self->{old}, 1, 2, 1, 2, 'fill', 'expand', 0, 0);
+
+ my $newLabel = new Gtk2::Label($parent->{lang}->{QueryReplaceNew});
+ $newLabel->set_alignment(0,0.5);
+ $self->{new} = new GCShortText;
+ $self->{layoutTable}->attach($newLabel, 0, 1, 2, 3, 'fill', 'fill', 0, 0);
+ $self->{layoutTable}->attach($self->{new}, 1, 2, 2, 3, 'fill', 'expand', 0, 0);
+
+ $self->{useCase} = new GCCheckBox($parent->{lang}->{AdvancedSearchUseCase});
+ $self->{layoutTable}->attach($self->{useCase}, 0, 2, 3, 4, 'fill', 'fill', 0, 0);
+
+ $self->vbox->pack_start($self->{layoutTable}, 1, 1, 5);
+ $self->vbox->show_all;
+
+ bless ($self, $class);
+ return $self;
+ }
+}
+
+{
+ #Class that is used to let user select
+ #item from a list and order them.
+ package GCDoubleListDialog;
+
+ use base 'GCModalDialog';
+ use GCGraphicComponents::GCDoubleLists;
+
+ sub hideExtra
+ {
+ my $self = shift;
+ }
+
+ sub clearList
+ {
+ my $self = shift;
+ $self->{doubleList}->clearList;
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->{doubleList}->setListData($self->getData);
+
+ $self->SUPER::show();
+ $self->show_all;
+ $self->hideExtra;
+
+ my $response = $self->run;
+
+ if ($response eq 'ok')
+ {
+ $self->saveList($self->{doubleList}->getUsedItems);
+ }
+ $self->hide;
+ return $response;
+ }
+
+ sub getDoubleList
+ {
+ my $self = shift;
+
+ return $self->{doubleList};
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $title, $withPixbuf, $unusedLabel, $usedLabel) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, $title);
+
+ bless ($self, $class);
+
+ $self->{options} = $parent->{options};
+
+ $self->{doubleList} = new GCDoubleListWidget($withPixbuf, $unusedLabel, $usedLabel);
+
+ $self->{marginBox} = new Gtk2::VBox;
+ $self->vbox->pack_start($self->{marginBox}, 0, 0, $GCUtils::halfMargin);
+ $self->vbox->pack_start($self->{doubleList}, 1, 1, 0);
+
+ # Without some default size, everything will be shrinked as there are some scrollers
+ $self->set_default_size(200,400);
+
+ return $self;
+ }
+}
+
+{
+ #Class that is used to let user select
+ #fields needed in export.
+ package GCFieldsSelectionDialog;
+
+ use base 'GCModalDialog';
+ use GCGraphicComponents::GCDoubleLists;
+
+ sub hideExtra
+ {
+ my $self = shift;
+ }
+
+ sub clearList
+ {
+ my $self = shift;
+ $self->{fieldsDoubleList}->clearList;
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->{fieldsDoubleList}->setListData($self->{fieldsDoubleList}->getData);
+
+ $self->SUPER::show();
+ $self->show_all;
+ $self->hideExtra;
+
+ my $response = $self->run;
+
+# if ($response eq 'ok')
+# {
+# $self->{parent}->{fields}
+# $self->saveList($self->{fieldsDoubleList}->getUsedItems);
+# }
+ $self->hide;
+ return $response eq 'ok';
+ }
+
+ sub getSelectedIds
+ {
+ my $self = shift;
+ return $self->{fieldsDoubleList}->getSelectedIds;
+ }
+
+ sub getDoubleList
+ {
+ my $self = shift;
+
+ return $self->{fieldsDoubleList};
+ }
+
+ sub saveList
+ {
+ my ($self, $list) = @_;
+
+ my @array;
+ foreach (@{$list})
+ {
+ push @array, $self->{fieldNameToId}->{$_};
+ }
+ $self->{parent}->{fields} = \@array;
+ }
+
+ sub addIgnoreField
+ {
+ my ($self, $ignoreField) = @_;
+ $self->{fieldsDoubleList}->addIgnoreField($ignoreField);
+ }
+
+ sub removeIgnoreField
+ {
+ my ($self) = @_;
+ $self->{fieldsDoubleList}->removeIgnoreField;
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $title, $preList, $isIdList, $ignoreField) = @_;
+
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, $title);
+
+ bless ($self, $class);
+
+ $self->{options} = $parent->{options};
+
+ $self->{fieldsDoubleList} = new GCFieldsSelectionWidget($parent->{parent}, $preList, $isIdList, $ignoreField);
+
+ $self->{marginBox} = new Gtk2::VBox;
+ $self->vbox->pack_start($self->{marginBox}, 0, 0, $GCUtils::halfMargin);
+ $self->vbox->pack_start($self->{fieldsDoubleList}, 1, 1, 0);
+
+ # Without some default size, everything will be shrinked as there are some scrollers
+ $self->set_default_size(200,400);
+
+ return $self;
+ }
+
+}
+
+
+{
+ package GCFileChooserDialog;
+ use GCGraphicComponents::GCBaseWidgets;
+ use File::Basename;
+ use File::Spec;
+ use Cwd 'realpath';
+
+ sub new
+ {
+ my ($proto, $title, $parent, $action, $withFilter, $autoAppend) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {};
+ $self->{action} = $action;
+ $self->{parent} = $parent;
+ $self->{ignoreFilter} = 1;
+ $self->{autoAppend} = 0;
+ my $dialog;
+ eval { $dialog = new Gtk2::FileChooserDialog($title, $parent, $action, @GCDialogs::okCancelButtons) };
+ if ($@)
+ {
+ $self->{dialog} = new Gtk2::FileSelection($title);
+ $self->{dialog}->main_vbox->show_all;
+ my @vboxChildren = $self->{dialog}->main_vbox->get_children;
+ my @buttonBoxChildren = $vboxChildren[0]->get_children;
+ if ($action eq 'select-folder')
+ {
+ $buttonBoxChildren[1]->hide;
+ $buttonBoxChildren[2]->hide;
+ $self->{dialog}->selection_entry->hide;
+ $self->{dialog}->file_list->parent->hide;
+ }
+ elsif ($action eq 'open')
+ {
+ $self->{dialog}->hide_fileop_buttons;
+ $self->{dialog}->selection_entry->set_editable(0);
+ }
+ $self->{type} = 'old';
+ }
+ else
+ {
+ $self->{dialog} = $dialog;
+ if ($action eq 'save')
+ {
+ $self->{requireOverwriteConfirmation} = 0;
+ eval { $dialog->set_do_overwrite_confirmation(1) };
+ $self->{requireOverwriteConfirmation} = 1 if $@;
+ }
+ $self->{type} = 'new';
+ if ($withFilter)
+ {
+ $self->{autoAppend} = $autoAppend;
+ my $filterAll;
+ $@ = '';
+ eval '$filterAll = new Gtk2::FileFilter';
+ if (!$@)
+ {
+ $self->{ignoreFilter} = 0;
+ $filterAll->set_name($self->{parent}->{lang}->{FileAllFiles});
+ $filterAll->add_pattern('*');
+ $self->{dialog}->add_filter($filterAll);
+ $self->{filters} = [];
+ }
+ }
+ $self->{dialog}->set_default_response ('ok');
+ }
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub setTitle
+ {
+ my ($self, $title) = @_;
+ $self->{dialog}->set_title($title);
+ }
+
+ sub transformFilename
+ {
+ my ($self, $file) = @_;
+
+ #$file = GCUtils::pathToUnix($file);
+ if ($self->{autoAppend})
+ {
+ my $tmpFilter = $self->{dialog}->get_filter;
+ if ($tmpFilter)
+ {
+ my $pattern = $self->{filtersPatterns}->{$tmpFilter->get_name};
+ if ($pattern)
+ {
+ $pattern =~ s/^.*?([^*]*)$/$1/;
+ $file .= $pattern if $file !~ /\./;
+ }
+ }
+ }
+ return $file;
+ }
+
+ sub get_filename
+ {
+ my $self = shift;
+ my $filename = $self->{dialog}->get_filename;
+ $filename .= (($^O =~ /win32/i) ? '\\' : '/') if ($self->{action} eq 'select-folder');
+ #$filename .= '/' if ($self->{action} eq 'select-folder');
+ return $self->transformFilename($filename);
+ }
+
+ sub set_filename
+ {
+ my ($self, $file) = @_;
+
+ $file ||= $ENV{HOME};
+ my $dir = '.';
+ if (! File::Spec->file_name_is_absolute( $file ))
+ {
+ $dir = dirname($self->{parent}->{options}->file)
+ if ($self->{parent}->{options})
+ && ($self->{parent}->{options}->file);
+ }
+ my $empty = 0;
+ $file = $ENV{HOME}.'/' if !$file;
+ $file = $dir.'/'.$file if (! File::Spec->file_name_is_absolute( $file ));
+ $file =~ s/\//\\/g if ($^O =~ /win32/i);
+ $file = Cwd::realpath($file)
+ if -e $file;
+ $empty = 1 if $file eq '';
+ eval {
+ $self->{dialog}->set_filename($file) if (!$empty && !(-d $file));
+ $self->{dialog}->set_current_folder($file.'/')
+ if (($self->{type} eq 'new') &&
+ (($empty) || (-d $file)));
+ };
+ if ($self->{preview})
+ {
+ $self->updatePreview($self) if ($self->{type} eq 'old');
+ $self->{preview}->setValue($file) if ($self->{type} eq 'new');
+ }
+ }
+
+ sub set_pattern_filter
+ {
+ my ($self, @filters) = @_;
+ return if $self->{ignoreFilter};
+ if ($self->{type} eq 'new')
+ {
+ $self->{dialog}->remove_filter($_) foreach(@{$self->{filters}});
+ $self->{filters} = [];
+ $self->{filtersPatterns} = {};
+ foreach my $filterPattern (@filters)
+ {
+ my $filter;
+ eval '$filter = new Gtk2::FileFilter';
+ return if $@;
+ $filter->set_name($filterPattern->[0]);
+ if (ref($filterPattern->[1]))
+ {
+ # Filter pattern is an array. Use a custom filter so file extensions are not case sensitive
+ $filter->add_custom('filename', sub {
+ my ($filename, undef, $extension) = fileparse(shift->{filename},qr{\.[^\.]*});
+ $extension =~ s/[^\.\w]//g;
+ $extension = lc($extension);
+ return (grep {$_ eq $extension} @{$filterPattern->[1]});
+ });
+
+ }
+ else
+ {
+ # Filter pattern is single valid. Use a custom filter so file extensions are not case sensitive
+ $filter->add_custom('filename', sub {
+ my ($filename, undef, $extension) = fileparse(shift->{filename},qr{\..*});
+ $extension =~ s/[^\.\w]//g;
+ $extension = lc($extension);
+ my $filterExt = $filterPattern->[1];
+ $filterExt =~ s/^[^\.]*//;
+ return ($extension eq $filterExt);
+ });
+ }
+ push @{$self->{filters}}, $filter;
+ $self->{dialog}->add_filter($filter);
+ $self->{filtersPatterns}->{$filterPattern->[0]} = $filterPattern->[1];
+ }
+ $self->{dialog}->set_filter($self->{filters}->[0]) if $self->{filters}->[0];
+ }
+ }
+
+ sub run
+ {
+ my $self = shift;
+ return $self->{dialog}->run if ($self->{action} ne 'save')
+ || (($self->{action} eq 'save')
+ && (!$self->{requireOverwriteConfirmation}));
+ my $response;
+ while (1)
+ {
+ $response = $self->{dialog}->run;
+ return $response if ($response ne 'ok');
+ my $filename = $self->get_filename;
+ if (-e $filename)
+ {
+ my $dialog = Gtk2::MessageDialog->new($self->{dialog},
+ [qw/modal destroy-with-parent/],
+ 'question',
+ 'yes-no',
+ $self->{parent}->{lang}->{FileChooserOverwrite});
+
+ $dialog->set_position('center-on-parent');
+ my $overwrite = $dialog->run;
+ $dialog->destroy;
+ return $response if ($overwrite eq 'yes');
+ }
+ else
+ {
+ return $response;
+ }
+ }
+ }
+
+ sub hide
+ {
+ my $self = shift;
+ return $self->{dialog}->hide;
+ }
+
+ sub setWithImagePreview
+ {
+ my ($self, $value) = @_;
+
+ if ($value)
+ {
+ $self->{preview} = new GCItemImage($self->{parent}->{options}, $self->{parent},1);
+ $self->{preview}->setImmediate;
+ if ($self->{type} eq 'new')
+ {
+ $self->{dialog}->signal_connect('update-preview' => \&updatePreview, $self);
+ $self->{dialog}->set_preview_widget($self->{preview});
+ $self->{dialog}->set_preview_widget_active(1);
+ }
+ else
+ {
+ $self->{dialog}->file_list->signal_connect('cursor-changed' => \&updatePreview, $self);
+ $self->{dialog}->file_list->parent->parent->parent->pack_start($self->{preview},0,0,5);
+ }
+ $self->{preview}->show;
+ }
+ else
+ {
+ if ($self->{preview})
+ {
+ $self->{dialog}->file_list->parent->parent->parent->remove($self->{preview}) if ($self->{type} eq 'old');
+ $self->{preview}->destroy;
+ $self->{preview} = undef;
+ }
+ }
+ }
+
+ sub updatePreview
+ {
+ my ($widget, $self, $other) = @_;
+ my $file;
+ if ($self->{type} eq 'new')
+ {
+ eval
+ {
+ $file = $self->{dialog}->get_preview_filename;
+ }
+ }
+ else
+ {
+ $file = $self->get_filename;
+ }
+ $self->{preview}->setValue($file) if $file;
+ }
+
+ sub destroy
+ {
+ my $self = shift;
+ $self->{dialog}->destroy;
+ }
+}
+
+{
+ package GCItemWindow;
+ use base 'GCModalDialog';
+ use GCGraphicComponents::GCBaseWidgets;
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show();
+ my $code = $self->run;
+ return $code;
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $title, @extraButtons) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, '', '', 1, @extraButtons);
+ bless ($self, $class);
+
+ $self->set_position('none');
+ my $options = new GCOptionLoader;
+ #$options->lockPanel(0);
+ $options->file($parent->{options}->file);
+ $self->{panel} = new GCFormPanel($parent, $options, $parent->{model}->getDefaultPanel);
+ $self->{panel}->createContent($parent->{model});
+
+ #Init combo boxes
+ foreach(@{$parent->{model}->{fieldsHistory}})
+ {
+ $self->{panel}->{$_}->setValues($parent->{panel}->getValues($_));
+ }
+
+ my $scrollPanelItem = new Gtk2::ScrolledWindow;
+ $scrollPanelItem->set_policy ('automatic', 'automatic');
+ $scrollPanelItem->set_shadow_type('none');
+ $scrollPanelItem->add_with_viewport($self->{panel});
+
+ $self->vbox->add($scrollPanelItem);
+
+ $self->vbox->show_all;
+ $self->{panel}->setShowOption($parent->getDialog('DisplayOptions')->{show}, 1);
+
+ #Adjust some settings
+ $self->{panel}->disableAutoUpdate;
+
+ $self->set_default_size($parent->{options}->itemWindowWidth,$parent->{options}->itemWindowHeight);
+ $self->setTitle($title);
+ return $self;
+ }
+
+ sub setTitle
+ {
+ my ($self, $title) = @_;
+ $self->set_title($title.' - GCstar');
+ }
+
+}
+
+{
+ package GCRandomItemWindow;
+ use base 'GCItemWindow';
+
+ sub new
+ {
+ my ($proto, $parent, $title) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, $title,
+ 'gtk-go-forward' => 'no');
+ bless ($self, $class);
+
+ $self->{panel}->deactivate;
+
+ $parent->{tooltips}->set_tip(($self->action_area->get_children)[1],
+ $parent->{lang}->{RandomOkTip});
+ $parent->{tooltips}->set_tip(($self->action_area->get_children)[0],
+ $parent->{lang}->{RandomNextTip});
+
+ $self->set_default_response('no');
+ return $self;
+ }
+}
+
+{
+ package GCDefaultValuesWindow;
+ use base 'GCItemWindow';
+
+ sub new
+ {
+ my ($proto, $parent, $title) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, $title);
+ bless ($self, $class);
+
+ my $label = new GCLabel('<span font-weight="bold">'.$parent->{lang}->{DefaultValuesTip}.'</span>');
+ $self->vbox->pack_start($label, 0, 0, $GCUtils::margin);
+ $self->vbox->reorder_child($label, 0);
+ $label->show_all;
+
+ return $self;
+ }
+}
+
+{
+ package GCCriticalErrorDialog;
+ use base 'Gtk2::MessageDialog';
+
+ sub new
+ {
+ my ($proto, $parent, $message) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $message);
+ bless ($self, $class);
+ $self->set_position('center-on-parent');
+ $self->{parent} = $parent;
+ $self->{message} = $message;
+
+ my $label = $parent->{lang}->{MenuBugReport};
+ $label =~ s/_//g;
+ my $bugReport = new Gtk2::Button($label);
+ $self->action_area->pack_start($bugReport,0,0,0);
+ $self->action_area->reorder_child($bugReport,0);
+ $bugReport->show_all;
+ $bugReport->signal_connect('clicked' => sub {
+ $self->reportBug;
+ });
+
+ return $self;
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->run;
+ $self->destroy;
+ }
+
+ sub reportBug
+ {
+ my $self = shift;
+ my $subject = $self->{parent}->{lang}->{BugReportSubject};
+ my $message = '
+'.$self->{parent}->{lang}->{BugReportVersion}.$self->{parent}->{lang}->{Separator}.$self->{parent}->{version}.'
+'.$self->{parent}->{lang}->{BugReportPlatform}.$self->{parent}->{lang}->{Separator}.$^O.'
+
+'.$self->{parent}->{lang}->{BugReportMessage}.$self->{parent}->{lang}->{Separator}.$self->{message}.'
+
+'.$self->{parent}->{lang}->{BugReportInformation}.$self->{parent}->{lang}->{Separator};
+ $self->{parent}->reportBug(undef, $subject, $message);
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCDisplay.pm b/lib/gcstar/GCDisplay.pm
new file mode 100644
index 0000000..41c9157
--- /dev/null
+++ b/lib/gcstar/GCDisplay.pm
@@ -0,0 +1,1146 @@
+package GCDisplay;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCUtils;
+
+{
+ package GCFilterSearch;
+
+ # Used to remove diacritics in test
+ use Unicode::Normalize 'NFKD';
+
+ sub compareExact
+ {
+ my ($field, $value) = @_;
+ return $field eq $value;
+ }
+
+ sub compareContain
+ {
+ my ($field, $value) = @_;
+ return $field =~ m/\Q$value\E/;
+ }
+
+ sub compareNotContain
+ {
+ my ($field, $value) = @_;
+ return $field !~ m/\Q$value\E/;
+ }
+
+ sub compareRegexp
+ {
+ my ($field, $value) = @_;
+ return $field =~ m/$value/;
+ }
+
+ sub compareLessStrings
+ {
+ my ($field, $value) = @_;
+ return $field lt $value;
+ }
+
+ sub compareLessNumbers
+ {
+ my ($field, $value) = @_;
+ return 0 if !defined($field);
+ return $field < $value;
+ }
+
+ sub compareLessOrEqualStrings
+ {
+ my ($field, $value) = @_;
+ return $field le $value;
+ }
+
+ sub compareLessOrEqualNumbers
+ {
+ my ($field, $value) = @_;
+ return 0 if !defined($field);
+ return $field <= $value;
+ }
+
+ sub compareGreaterStrings
+ {
+ my ($field, $value) = @_;
+ return $field gt $value;
+ }
+
+ sub compareGreaterNumbers
+ {
+ my ($field, $value) = @_;
+ return 0 if !defined($field);
+ return $field > $value;
+ }
+
+ sub compareGreaterOrEqualStrings
+ {
+ my ($field, $value) = @_;
+ return $field ge $value;
+ }
+
+ sub compareGreaterOrEqualNumbers
+ {
+ my ($field, $value) = @_;
+ return 0 if !defined($field);
+ return $field >= $value;
+ }
+
+ sub compareRangeStrings
+ {
+ my ($field, $value) = @_;
+ return 1 if $value eq ';';
+ my @values = split m/;/, $value;
+ return ($field ge $values[0]) && ($field le $values[1]);
+ }
+
+ sub compareRangeNumbers
+ {
+ my ($field, $value) = @_;
+ return 1 if $value eq ';';
+ return 0 if !defined($field);
+ my @values = split m/;/, $value;
+ return ($field >= $values[0]) && ($field <= $values[1]);
+ }
+
+ sub new
+ {
+ my ($proto, $info) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {};
+
+ bless ($self, $class);
+
+ $self->{info} = $info if $info;
+ $self->clear if !$info;
+ $self->setMode;
+ $self->setCase(0);
+ $self->setIgnoreDiacritics(0);
+ return $self;
+ }
+
+ sub clear
+ {
+ my $self = shift;
+
+ $self->{cleared} = 1;
+
+ $self->{info} = {};
+ $self->{currentSearch} = [];
+ }
+
+ sub getComparisonFunction
+ {
+ my ($self, $type) = @_;
+ my ($comparison, $numeric) = @$type;
+ $numeric = 1 if $numeric eq 'true';
+ $numeric = 0 if $numeric eq 'false';
+
+ if ($comparison eq 'eq')
+ {
+ return \&compareExact;
+ }
+ elsif ($comparison eq 'contain')
+ {
+ return \&compareContain;
+ }
+ elsif ($comparison eq 'notcontain')
+ {
+ return \&compareNotContain;
+ }
+ elsif ($comparison eq 'lt')
+ {
+ return \&compareLessStrings if (!$numeric);
+ return \&compareLessNumbers if ($numeric);
+ }
+ elsif ($comparison eq 'le')
+ {
+ return \&compareLessOrEqualStrings if (!$numeric);
+ return \&compareLessOrEqualNumbers if ($numeric);
+ }
+ elsif ($comparison eq 'gt')
+ {
+ return \&compareGreaterStrings if (!$numeric);
+ return \&compareGreaterNumbers if ($numeric);
+ }
+ elsif ($comparison eq 'ge')
+ {
+ return \&compareGreaterOrEqualStrings if (!$numeric);
+ return \&compareGreaterOrEqualNumbers if ($numeric);
+ }
+ elsif ($comparison eq 'range')
+ {
+ return \&compareRangeStrings if (!$numeric);
+ return \&compareRangeNumbers if ($numeric);
+ }
+ elsif ($comparison eq 'regexp')
+ {
+ return \&compareRegexp;
+ }
+ }
+
+ sub setFilter
+ {
+ my ($self, $filter, $value, $type, $model, $add) = @_;
+ if (!$filter)
+ {
+ $self->clear;
+ return;
+ }
+ if ($value eq '')
+ {
+ delete $self->{info}->{$filter};
+ }
+ else
+ {
+ $self->{cleared} = 0;
+ my $preprocess = $type->[2];
+ if (!$preprocess)
+ {
+ my $fieldType = $model->{fieldsInfo}->{$filter}->{type};
+ $preprocess = ($fieldType eq 'date') ? 'reverseDate'
+ : ($fieldType eq 'number') ? 'noNullNumber'
+ : ($fieldType eq 'single list') ? 'singleList'
+ : ($fieldType eq 'double list') ? 'doubleList'
+ : ($fieldType eq 'triple list') ? 'otherList'
+ : ($fieldType =~ /list$/o) ? 'singleList'
+ : '';
+ }
+ my $info = {
+ value => $value,
+ comp => $self->getComparisonFunction($type),
+ preprocess => $preprocess,
+ temporary => $add
+ };
+ if ($add)
+ {
+ push @{$self->{info}->{$filter}}, $info;
+ }
+ else
+ {
+ $self->{info}->{$filter} = [$info];
+ }
+ push @{$self->{currentSearch}}, {
+ field => $filter,
+ value => $value,
+ filter => $type
+ };
+ }
+ }
+
+ sub removeTemporaryFilters
+ {
+ my $self = shift;
+ foreach (keys %{$self->{info}})
+ {
+ foreach my $i(0 .. scalar @{$self->{info}->{$_}} - 1)
+ {
+ delete $self->{info}->{$_}->[$i] if $self->{info}->{$_}->[$i]->{temporary};
+ }
+ }
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+
+ $self->{model} = $model;
+ }
+
+ sub test
+ {
+ my ($self, $info) = @_;
+ return 1 if $self->{cleared};
+ my $testAnd = $self->{mode} eq 'and';
+
+ foreach my $field(keys %{$self->{info}})
+ {
+ my $value = '';
+ if ($field eq $GCFieldSelector::anyFieldValue)
+ {
+ # We concatenate all of the values here to perform the
+ # the test on all of the fields in one shot
+ foreach my $key(keys %$info)
+ {
+ if (ref($info->{$key}) eq 'ARRAY')
+ {
+ $value .= GCPreProcess::otherList($info->{$key});
+ }
+ else
+ {
+ $value .= $info->{$key};
+ }
+ }
+ }
+ else
+ {
+ $value = $info->{$field};
+ }
+ foreach my $filter(@{$self->{info}->{$field}})
+ {
+ next if !$filter;
+ if ($filter->{preprocess})
+ {
+ my $preProcess = 'GCPreProcess::'.$filter->{preprocess};
+ eval {
+ no strict qw/refs/;
+ $value = $preProcess->($value);
+ };
+ }
+ my $reference;
+
+ if ($self->{ignoreDiacritics})
+ {
+ # Transform diacritics into single characters
+ # e.g. é -> e; ç -> c
+ # First it normalizes the string to have 2 characters
+ # instead of only one. And then it removes the modifiers
+ ($reference = NFKD($filter->{value})) =~ s/\pm//g;
+ ($value = NFKD($value)) =~ s/\pm//g;
+ }
+ else
+ {
+ $reference = $filter->{value};
+ }
+ if (!$self->{case})
+ {
+ $reference = uc $reference;
+ $value = uc $value;
+ }
+
+ if ($testAnd)
+ {
+ return 0 if ! $filter->{comp}->($value, $reference);
+ }
+ else
+ {
+ return 1 if $filter->{comp}->($value, $reference);
+ }
+ }
+ }
+ return $testAnd;
+ }
+
+ sub setMode
+ {
+ my ($self, $mode) = @_;
+ $mode ||= 'and';
+ #*test = \&testAnd if $mode eq 'and';
+ #*test = \&testOr if $mode eq 'or';
+ $self->{mode} = $mode;
+ }
+
+ sub setCase
+ {
+ my ($self, $case) = @_;
+ $self->{case} = $case;
+ }
+
+ sub setIgnoreDiacritics
+ {
+ my ($self, $id) = @_;
+ $self->{ignoreDiacritics} = $id;
+ }
+
+ sub getCurrentSearch
+ {
+ my $self = shift;
+ return {mode => $self->{mode},
+ info => $self->{currentSearch},
+ case => $self->{case},
+ ignoreDiacritics => $self->{ignoreDiacritics}};
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+ return $self->{cleared};
+ }
+}
+
+use Gtk2;
+
+{
+ package GCSearchDialog;
+
+ use GCGraphicComponents::GCBaseWidgets;
+
+ use base 'GCModalDialog';
+
+ sub initValues
+ {
+ my $self = shift;
+
+ my $info = $self->{parent}->{filterSearch}->{info};
+
+ foreach (@{$self->{fields}})
+ {
+ if (exists $info->{$_})
+ {
+ $self->{$_}->setValue($info->{$_}->[0]->{value});
+ }
+ else
+ {
+ $self->{$_}->clear if $self->{$_};
+ }
+ if ($self->{fieldsInfo}->{$_}->{type} eq 'history text')
+ {
+ $self->{$_}->setValues($self->{parent}->{panel}->{$_}->getValues);
+ }
+ if (
+ (
+ ($self->{fieldsInfo}->{$_}->{type} eq 'single list')
+ ||
+ ($self->{fieldsInfo}->{$_}->{type} eq 'double list')
+ )
+ &&
+ (
+ $self->{parent}->{panel}->{$_}->{withHistory}
+ )
+ )
+ {
+ my @values;
+ foreach ($self->{parent}->{panel}->{$_}->getValues)
+ {
+ push @values, $_->[0];
+ }
+ $self->{$_}->setValues(@values);
+ }
+ }
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->initValues;
+ $self->SUPER::show();
+ $self->show_all;
+ $self->activateOkButton($self->{notEmpty});
+ $self->activateExtraButton($self->{notEmpty});
+ $self->{search} = undef;
+ my $ended = 0;
+ while (!$ended)
+ {
+ my $response = $self->run;
+ if ($response eq 'ok')
+ {
+ my %info;
+
+ foreach (@{$self->{fields}})
+ {
+ $info{$_} = $self->{$_}->getValue
+ if ! $self->{$_}->isEmpty;
+ }
+
+ $self->{parent}->{menubar}->initFilters(\%info);
+
+ $self->{search} = \%info;
+ }
+ if (($response eq 'ok') || ($response eq 'cancel') || ($response eq 'delete-event'))
+ {
+ $ended = 1
+ }
+ elsif ($response eq 'reject')
+ {
+ $self->clear;
+ }
+ }
+ $self->hide;
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ foreach (@{$self->{fields}})
+ {
+ $self->{$_}->clear;
+ }
+ }
+
+ sub search
+ {
+ my $self = shift;
+
+ return $self->{search};
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $specialOK, @extraButtons) = @_;
+ my $class = ref($proto) || $proto;
+ my $self;
+ if ($specialOK)
+ {
+ $self = $class->SUPER::new($parent,
+ $parent->{lang}->{SearchTitle},
+ $specialOK,
+ );
+ }
+ else
+ {
+ $self = $class->SUPER::new($parent,
+ $parent->{lang}->{SearchTitle},
+ 'gtk-find',
+ 0,
+ @extraButtons,
+ 'gtk-clear' => 'reject',
+ );
+ }
+ bless ($self, $class);
+ $self->set_position('center-on-parent');
+ $self->{parent} = $parent;
+
+ # These ones are required for createWidget
+ $self->{lang} = $parent->{lang};
+ $self->{options} = $parent->{options};
+ $self->{window} = $self;
+
+ $self->{comparisonConvertor} = new GCComparisonSelector($parent);
+ $self->{layoutTable} = new Gtk2::Table(1,3,0);
+ $self->{layoutTable}->set_row_spacings($GCUtils::halfMargin);
+ $self->{layoutTable}->set_col_spacings($GCUtils::margin);
+ $self->{layoutTable}->set_border_width($GCUtils::margin);
+
+ $self->vbox->pack_start($self->{layoutTable}, 1, 1, 0);
+ return $self;
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+ $self->{model} = $model;
+ foreach ($self->{layoutTable}->get_children)
+ {
+ $self->{layoutTable}->remove($_);
+ $_->destroy;
+ }
+
+ my $fieldsInfo = $model->{fieldsInfo};
+ $self->{fieldsInfo} = $fieldsInfo;
+ my @filtersGroup = @{$model->{filtersGroup}};
+ my @filtersTotal = @{$model->{filters}};
+
+ my $row = 0;
+ my $nbLines = @filtersTotal + (2 * @filtersGroup);
+ if ($nbLines <= 0)
+ {
+ $self->{notEmpty} = 0;
+ $self->{layoutTable}->resize(1, 1);
+ my $label = new GCLabel($self->{parent}->{lang}->{SearchNoField});
+ $self->{layoutTable}->attach($label, 0, 1, 0, 1, 'expand', 'expand', $GCUtils::margin, $GCUtils::margin);
+ return;
+ }
+ $self->{notEmpty} = 1;
+ $self->{layoutTable}->resize($nbLines, 3);
+
+ $self->{fields} = [];
+ foreach my $group(@filtersGroup)
+ {
+ $row++;
+ my @filters = @{$group->{filter}};
+ my $label = new GCHeaderLabel($model->getDisplayedText($group->{label}));
+ $self->{layoutTable}->attach($label, 0, 3, $row, $row + 1, 'fill', 'expand', 0, 0);
+ $row++;
+ my $withComparisonLabel;
+ foreach my $filter(@filters)
+ {
+ my $field = $filter->{field};
+ if ($field ne 'separator')
+ {
+ push @{$self->{fields}}, $field;
+ my $labelText = $fieldsInfo->{$field}->{displayed};
+ $labelText = $model->getDisplayedText($filter->{label}) if $filter->{label};
+ my $label = new GCLabel($labelText);
+ $self->{layoutTable}->attach($label, 0, 1, $row, $row + 1, 'fill', 'fill', 2 * $GCUtils::margin, 0);
+
+ ($self->{$field}, $withComparisonLabel) =
+ GCBaseWidgets::createWidget($self, $fieldsInfo->{$field},
+ $filter->{comparison});
+ $self->{$field}->signal_connect('activate' => sub {$self->response('ok')} )
+ if $self->{$field}->isa('GCShortText');
+ if ($withComparisonLabel
+ && ($filter->{comparison} ne 'eq'))
+ {
+ my $labelComparison = new GCLabel(
+ $self->{comparisonConvertor}->valueToDisplayed($filter->{comparison}),
+ 1
+ );
+ $self->{layoutTable}->attach($labelComparison, 1, 2, $row, $row + 1, 'fill', 'fill', 0, 0);
+ }
+ $self->{layoutTable}->attach($self->{$field}, 2, 3, $row, $row + 1, ['fill', 'expand'], 'expand', 0, 0);
+ $self->{$field}->grab_focus if $row == 2;
+ }
+ else
+ {
+ $self->{layoutTable}->attach(Gtk2::HSeparator->new, 0, 3, $row, $row + 1, 'fill', 'fill', 0, 0);
+ }
+ $row++;
+ }
+ }
+ $self->{layoutTable}->show_all;
+ }
+}
+
+{
+ package GCAdvancedSearchDialog;
+
+ use GCGraphicComponents::GCBaseWidgets;
+
+ use base 'GCSearchDialog';
+
+ sub addItem
+ {
+ my $self = shift;
+ $self->{layoutTable}->resize($self->{nbFields} + 1, 3);
+ my $field = new GCFieldSelector(0, $self->{model}, 0, 1);
+ $field->{number} = $self->{nbFields};
+ push @{$self->{fields}}, $field;
+ $self->{layoutTable}->attach($field, 0, 1, $self->{nbFields}, $self->{nbFields}+1,
+ ['expand', 'fill'], 'fill', 0, 0);
+ $field->show_all;
+
+ my $comp = new GCComparisonSelector($self->{parent});
+ $field->signal_connect('changed' => sub {
+ my ($fs, $cs) = @_;
+ $self->updateField($fs, $cs->getValue);
+ }, $comp);
+ $comp->signal_connect('changed' => sub {
+ my ($cs, $fs) = @_;
+ $self->updateField($fs, $cs->getValue);
+ }, $field);
+ push @{$self->{comps}}, $comp;
+ $self->{layoutTable}->attach($comp, 1, 2, $self->{nbFields}, $self->{nbFields}+1,
+ ['expand', 'fill'], 'fill', 0, 0);
+ $comp->show_all;
+
+ my $value = new GCShortText;
+ push @{$self->{values}}, $value;
+ $self->{layoutTable}->attach($value, 2, 3, $self->{nbFields}, $self->{nbFields}+1,
+ ['expand', 'fill'], 'fill', 0, 0);
+ $value->show_all;
+ $self->{remove}->set_sensitive(1);
+ $self->{nbFields}++;
+ }
+
+ sub removeItem
+ {
+ my $self = shift;
+ $self->{layoutTable}->remove(pop @{$self->{fields}});
+ $self->{layoutTable}->remove(pop @{$self->{comps}});
+ $self->{layoutTable}->remove(pop @{$self->{values}});
+ delete $self->{isNumeric}->[$self->{nbFields}];
+ $self->{layoutTable}->resize(--$self->{nbFields}, 3);
+ $self->{remove}->set_sensitive(0) if $self->{nbFields} < 2;
+ }
+
+ sub generateSearch
+ {
+ my $self = shift;
+ my @info;
+ my $i = 0;
+ foreach (@{$self->{fields}})
+ {
+ my $field = $_->getValue;
+ next if !$field;
+ my $numeric = 'false';
+ if ($self->{model}->{fieldsInfo}->{$field}->{type} eq 'number')
+ {
+ $numeric = 'true';
+ }
+ # We check we still have the same field in case it was changed
+ elsif ($self->{isNumeric}->[$i]->[0] eq $field)
+ {
+ $numeric = $self->{isNumeric}->[$i]->[1];
+ }
+ push @info, {
+ field => $field,
+ value => $self->{values}->[$i]->getValue,
+ filter => [$self->{comps}->[$i]->getValue,
+ $numeric,
+ undef]
+ }
+ if ! $self->{values}->[$i]->isEmpty;
+ $i++;
+ }
+ $self->{search} = \@info;
+ }
+
+ sub initSearch
+ {
+ my ($self, $filter) = @_;
+ if ($filter->{mode} eq 'and')
+ {
+ $self->{testAnd}->set_active(1);
+ }
+ elsif ($filter->{mode} eq 'or')
+ {
+ $self->{testOr}->set_active(1);
+ }
+ $self->{useCase}->set_active($filter->{case});
+ $self->{ignoreDiacritics}->set_active($filter->{ignoreDiacritics});
+ $self->removeItem while $self->{nbFields} > 1;
+ $self->{isNumeric} = [];
+ my $first = 1;
+ foreach my $line(@{$filter->{info}})
+ {
+ $self->addItem if !$first;
+ $first = 0;
+ $self->{fields}->[-1]->setValue($line->{field});
+ $self->{comps}->[-1]->setValue($line->{filter}->[0]);
+ $self->{values}->[-1]->setValue($line->{value});
+ # We also add the field name to be able to check it later
+ push @{$self->{isNumeric}}, [$line->{field}, $line->{filter}->[1]];
+ }
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->show_all;
+ # If saving the search is not possible, hides the corresponding button
+ if (!$self->{canSave})
+ {
+ ($self->action_area->get_children)[3]->hide;
+ }
+ $self->{search} = undef;
+ my $ended = 0;
+ while (!$ended)
+ {
+ my $response = $self->run;
+ if ($response eq 'ok')
+ {
+ if ($self->{userFilter})
+ {
+ $self->saveSearch;
+ }
+ else
+ {
+ $self->generateSearch;
+ }
+ }
+ else
+ {
+ $self->{search} = undef;
+ }
+ $ended = 1 if ($response eq 'ok') || ($response eq 'cancel') || ($response eq 'delete-event');
+ $self->clear if ($response eq 'reject');
+ $self->saveSearch if ($response eq 'accept');
+ }
+ $self->hide;
+ }
+
+ sub getMode
+ {
+ my $self = shift;
+ return ($self->{testAnd}->get_active ? 'and' : 'or');
+ }
+
+ sub getCase
+ {
+ my $self = shift;
+ return ($self->{useCase}->get_active ? 1 : 0);
+ }
+
+ sub getIgnoreDiacritics
+ {
+ my $self = shift;
+ return ($self->{ignoreDiacritics}->get_active ? 1 : 0);
+ }
+
+ sub saveSearch
+ {
+ my $self = shift;
+
+ my $response;
+ my $name;
+ if ($self->{userFilter} eq 'edit')
+ {
+ $response = 'ok';
+ $name = '';
+ }
+ else
+ {
+ my $dialog = new Gtk2::Dialog($self->{parent}->{lang}->{AdvancedSearchSaveTitle},
+ $self,
+ [qw/modal destroy-with-parent/],
+ @GCDialogs::okCancelButtons
+ );
+
+ my $hbox = Gtk2::HBox->new(0, $GCUtils::halfMargin);
+ my $label = Gtk2::Label->new($self->{parent}->{lang}->{AdvancedSearchSaveName});
+ $hbox->pack_start($label, 0, 0, 0);
+ my $entry = Gtk2::Entry->new;
+ $hbox->pack_start($entry, 1, 1, 0);
+ $hbox->show_all;
+ $dialog->vbox->pack_start($hbox, 1, 1, $GCUtils::margin);
+ $dialog->set_default_response('ok');
+ $entry->set_activates_default(1);
+ while (1)
+ {
+ $response = $dialog->run;
+ if ($response eq 'ok')
+ {
+ $name = $entry->get_text;
+ if ($self->{model}->existsUserFilter($name))
+ {
+ my $errorDialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{parent}->{lang}->{AdvancedSearchSaveOverwrite});
+ $dialog->set_position('center-on-parent');
+ $errorDialog->run;
+ $errorDialog->destroy;
+ next;
+ }
+ last;
+ }
+ last;
+ }
+ $dialog->destroy;
+ }
+
+ if ($response eq 'ok')
+ {
+ $self->generateSearch;
+ my $info = {
+ 'name' => $name,
+ 'mode' => $self->getMode,
+ 'case' => $self->getCase,
+ 'ignoreDiacritics' => $self->getIgnoreDiacritics,
+ 'info' => $self->{search}
+ };
+ $self->{parent}->addUserFilter($info);
+ }
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $userFilter) = @_;
+ my $class = ref($proto) || $proto;
+ my $self;
+ if ($userFilter)
+ {
+ $self = $class->SUPER::new($parent, 'gtk-save');
+ }
+ else
+ {
+ $self = $class->SUPER::new($parent, undef, 'gtk-save' => 'accept',);
+ }
+ bless ($self, $class);
+
+ $self->{parent} = $parent;
+ $self->{userFilter} = $userFilter;
+ $self->vbox->remove($self->{layoutTable});
+
+ my $allTable = new Gtk2::Table(11,3,0);
+ $allTable->set_row_spacings($GCUtils::halfMargin);
+ $allTable->set_col_spacings($GCUtils::margin);
+ $allTable->set_border_width($GCUtils::margin);
+
+ my $labelType = new GCHeaderLabel($parent->{lang}->{AdvancedSearchType});
+ $self->{testAnd} = new Gtk2::RadioButton(undef, $parent->{lang}->{AdvancedSearchTypeAnd});
+ $self->{testOr} = new Gtk2::RadioButton($self->{testAnd}->get_group, $parent->{lang}->{AdvancedSearchTypeOr});
+
+ my $prefStock = Gtk2::Stock->lookup('gtk-preferences');
+ (my $prefLabel = $prefStock->{label}) =~ s/_//;
+ my $labelPreferences = new GCHeaderLabel($prefLabel);
+ $self->{useCase} = new GCCheckBox($parent->{lang}->{AdvancedSearchUseCase});
+ $self->{ignoreDiacritics} = new GCCheckBox($parent->{lang}->{AdvancedSearchIgnoreDiacritics});
+
+ my $offset1 = 0;
+ $offset1 = 4;
+ $allTable->attach($labelType, 0, 3, $offset1 + 0, $offset1 + 1, 'fill', 'fill', 0, 0);
+ $allTable->attach($self->{testAnd}, 2, 3, $offset1 + 1, $offset1 + 2, 'fill', 'fill', 0, 0);
+ $allTable->attach($self->{testOr}, 2, 3, $offset1 + 2, $offset1 + 3, 'fill', 'fill', 0, 0);
+ $allTable->attach($labelPreferences, 0, 3, $offset1 + 4, $offset1 + 5, 'fill', 'fill', 0, 0);
+ $allTable->attach($self->{useCase}, 2, 3, $offset1 + 5, $offset1 + 6, 'fill', 'fill', 0, 0);
+ $allTable->attach($self->{ignoreDiacritics}, 2, 3, $offset1 + 6, $offset1 + 7, 'fill', 'fill', 0, 0);
+
+ my $labelCriteria = new GCHeaderLabel($parent->{lang}->{AdvancedSearchCriteria});
+ my $scrolled = new Gtk2::ScrolledWindow;
+ $scrolled->set_policy ('never', 'automatic');
+ $scrolled->set_border_width(0);
+ $scrolled->set_shadow_type('none');
+ $scrolled->add_with_viewport($self->{layoutTable});
+
+ my $offset2 = 8;
+ $offset2 = 0;
+ $allTable->attach($labelCriteria, 0, 3, $offset2 + 0, $offset2 + 1, 'fill', 'fill', 0, 0);
+ $allTable->attach($scrolled, 2, 3, $offset2 + 1, $offset2 + 2, ['expand', 'fill'], ['expand', 'fill'], 0, 0);
+
+ my $hboxAction = new Gtk2::HBox(0,0);
+ $self->{add} = Gtk2::Button->new_from_stock('gtk-add');
+ $self->{add}->signal_connect('clicked' => sub {
+ $self->addItem;
+ });
+ $hboxAction->pack_start($self->{add}, 0, 0, 0);
+ $self->{remove} = Gtk2::Button->new_from_stock('gtk-remove');
+ $self->{remove}->signal_connect('clicked' => sub {
+ $self->removeItem;
+ });
+ $hboxAction->pack_start($self->{remove}, 0, 0, $GCUtils::margin);
+# if (!$userFilter)
+# {
+# $self->{save} = Gtk2::Button->new_from_stock('gtk-save');
+# $self->{save}->signal_connect('clicked' => sub {
+# $self->saveSearch;
+# });
+# $hboxAction->pack_end($self->{save}, 0, 0, 0);
+# }
+ $allTable->attach($hboxAction, 2, 3, $offset2 + 2, $offset2 + 3, 'fill', 'fill', 0, 0);
+
+ $self->vbox->pack_start($allTable,1,1,0);
+
+ $self->set_size_request(-1, 400);
+ return $self;
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setModel($self->{model});
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+
+ $self->{model} = $model;
+ # Searches can only be saved for default collections or user collections with a name
+ # (i.e. when the model is not embedded within the collection).
+ $self->{canSave} = ($model->getName) ? 1 : 0;
+ $self->{nbFields} = 0;
+ $self->{fields} = [];
+ $self->{comps} = [];
+ $self->{values} = [];
+ foreach ($self->{layoutTable}->get_children)
+ {
+ $self->{layoutTable}->remove($_);
+ $_->destroy;
+ }
+ $self->addItem;
+ $self->{remove}->set_sensitive(0);
+ $self->{layoutTable}->show_all;
+ }
+
+ sub updateField
+ {
+ my ($self, $fs, $comparison) = @_;
+ my $idx = $fs->{number};
+ my $widget = $self->{values}->[$idx];
+ $self->{layoutTable}->remove($widget);
+
+ my $newWidget;
+ ($newWidget, undef) = $fs->createEntryWidget($self, $comparison, $widget);
+ $newWidget->signal_connect('activate' => sub {$self->response('ok')} )
+ if $newWidget->isa('GCShortText');
+
+ $self->{values}->[$idx] = $newWidget;
+ $self->{layoutTable}->attach($newWidget, 2, 3, $idx, $idx+1,
+ ['expand', 'fill'], 'fill', 0, 0);
+ $newWidget->show_all;
+ }
+}
+
+{
+ package GCUserFiltersDialog;
+
+ use GCGraphicComponents::GCBaseWidgets;
+ use Storable;
+ use base 'GCModalDialog';
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+ $self->{model} = $model;
+ $self->{filters} = Storable::dclone($model->getUserFilters);
+ $self->initList(1);
+ $self->{deletedFilters} = [];
+ }
+
+ sub initList
+ {
+ my ($self, $saved) = shift;
+ @{$self->{filtersList}->{data}} = ();
+ $self->{initializing} = 1;
+ $self->{filters} = $self->getUserFilters;
+ #my @sorted = sort {uc($a->{name}) cmp uc($b->{name})} @{$self->{filters}};
+ #$self->{filters} = \@sorted;
+ foreach(@{$self->{filters}})
+ {
+ push @{$self->{filtersList}->{data}}, $_->{name};
+ # All of them should be already saved
+ $_->{saved} = 1 if $saved;
+ }
+ $self->{initializing} = 0;
+ }
+
+ sub getUserFilters
+ {
+ my $self = shift;
+ my @sorted = sort {uc($a->{name}) cmp uc($b->{name})} @{$self->{filters}};
+ return \@sorted;
+ return $self->{filters};
+ }
+
+ sub getDeletedFilters
+ {
+ my $self = shift;
+ return $self->{deletedFilters};
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show();
+ $self->show_all;
+ my $response = $self->run;
+ $self->hide;
+ return ($response eq 'ok');
+ }
+
+ # Callbacked by advanced search dialog
+ sub addUserFilter
+ {
+ my ($self, $filter) = @_;
+ $filter->{saved} = 0;
+ if ($self->{mode} eq 'new')
+ {
+ push (@{$self->{filters}}, $filter);
+ push @{$self->{filtersList}->{data}}, $filter->{name};
+ }
+ else
+ {
+ my $selected = ($self->{filtersList}->get_selected_indices)[0];
+ $filter->{name} = $self->{filters}->[$selected]->{name};
+ $self->{filters}->[$selected] = $filter;
+ }
+ }
+
+ sub newFilter
+ {
+ my $self = shift;
+ $self->{mode} = 'new';
+ $self->{panel} = $self->{parent}->{panel};
+ my $dialog = new GCAdvancedSearchDialog($self, $self->{mode});
+ $dialog->setModel($self->{model});
+ $dialog->show;
+ # To avoid unwanted reference if the panel is changed
+ delete $self->{panel};
+ }
+
+ sub editFilter
+ {
+ my $self = shift;
+ $self->{mode} = 'edit';
+ my $selected = ($self->{filtersList}->get_selected_indices)[0];
+ $self->{panel} = $self->{parent}->{panel};
+ my $dialog = new GCAdvancedSearchDialog($self, $self->{mode});
+ $dialog->setModel($self->{model});
+ $dialog->initSearch($self->{filters}->[$selected]);
+ $dialog->show;
+ # To avoid unwanted reference if the panel is changed
+ delete $self->{panel};
+ }
+
+ sub deleteFilter
+ {
+ my $self = shift;
+ my $selected = ($self->{filtersList}->get_selected_indices)[0];
+ push @{$self->{deletedFilters}}, $self->{filters}->[$selected]->{name};
+ splice @{$self->{filters}}, $selected, 1;
+ splice (@{$self->{filtersList}->{data}}, $selected, 1);
+ $self->{filtersList}->select(0);
+ }
+
+ sub renameFilter
+ {
+ my $self = shift;
+ my $selected = ($self->{filtersList}->get_selected_indices)[0];
+ my $oldName = $self->{filters}->[$selected]->{name};
+ my $newName = $self->{filtersList}->{data}->[$selected]->[0];
+ return if $newName eq $oldName;
+ $self->{filters}->[$selected]->{name} = $newName;
+ $self->{filters}->[$selected]->{saved} = 0;
+ push @{$self->{deletedFilters}}, $oldName;
+ $self->initList(0);
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{MenuSavedSearchesEdit});
+ bless ($self, $class);
+ $self->set_position('center-on-parent');
+ $self->{parent} = $parent;
+ $self->{lang} = $parent->{lang};
+ my $hBox = new Gtk2::HBox(0,0);
+ $hBox->set_border_width($GCUtils::margin);
+ my $buttonBox = new Gtk2::VBox(0,0);
+
+ my $editButton = new Gtk2::Button->new_from_stock('gtk-edit');
+ $editButton->signal_connect('clicked' => sub {
+ $self->editFilter;
+ });
+ my $newButton = new Gtk2::Button->new_from_stock('gtk-new');
+ $newButton->signal_connect('clicked' => sub {
+ $self->newFilter;
+ });
+ my $deleteButton = new Gtk2::Button->new_from_stock('gtk-delete');
+ $deleteButton->signal_connect('clicked' => sub {
+ $self->deleteFilter;
+ });
+
+ $buttonBox->pack_start($newButton, 0, 0, $GCUtils::halfMargin);
+ $buttonBox->pack_start($deleteButton, 0, 0, $GCUtils::halfMargin);
+ $buttonBox->pack_start($editButton, 0, 0, $GCUtils::halfMargin);
+
+ $self->{filtersList} = new Gtk2::SimpleList($parent->{lang}->{MenuSavedSearches} => 'text');
+ $self->{filtersList}->set_column_editable(0, 1);
+ $self->{filtersList}->get_model->signal_connect("row-changed" => sub {
+ return if $self->{initializing};
+ $self->renameFilter;
+ });
+
+ my $scroller = new Gtk2::ScrolledWindow;
+ $scroller->set_policy ('automatic', 'automatic');
+ $scroller->set_shadow_type('etched-in');
+ $scroller->add($self->{filtersList});
+
+ $hBox->pack_start($scroller, 1, 1, $GCUtils::margin);
+ $hBox->pack_start($buttonBox, 0, 0, $GCUtils::margin);
+
+ $self->vbox->pack_start($hBox, 1, 1, 0);
+ $self->set_default_size(400, 400);
+ return $self;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCExport.pm b/lib/gcstar/GCExport.pm
new file mode 100644
index 0000000..b32c58e
--- /dev/null
+++ b/lib/gcstar/GCExport.pm
@@ -0,0 +1,118 @@
+package GCExport;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use File::Basename;
+use GCUtils 'glob';
+
+use base 'Exporter';
+our @EXPORT = qw(@exportersArray);
+
+our @exportersArray;
+
+sub loadExporters
+{
+ foreach (glob $ENV{GCS_LIB_DIR}.'/GCExport/*.pm')
+ {
+ my $export = basename($_, '.pm')."\n";
+ next if $export =~ /GCExportBase/;
+ eval "use GCExport::$export";
+ (my $exporter = $export) =~ s/^GCExport/GCExporter/;
+ my $obj;
+ eval "\$obj = new GCExport::$exporter";
+ die "Fatal error with exporter $export\n$@" if $@;
+ push @exportersArray, $obj if ! $obj->{errors};
+ }
+}
+
+use Gtk2;
+use GCExportImport;
+
+{
+ package GCExportDialog;
+
+ use Glib::Object::Subclass
+ Gtk2::Dialog::
+ ;
+
+ @GCExportDialog::ISA = ('GCExportImportDialog');
+
+ sub addOptions
+ {
+ my ($self, $options) = @_;
+ my $filter = ($self->{filter}->get_active) ? 1 : 0;
+ $options->{items} = $self->{parent}->{items}->getItemsListFiltered($filter);
+ $options->{collection} = $self->{parent}->{options}->file;
+ $options->{defaultImage} = $self->{parent}->{defaultImage};
+ $options->{sorter} = $self->{sorter}->getValue;
+ $options->{order} = $self->{order}->getValue;
+ }
+
+ sub setModel
+ {
+ my $self = shift;
+ $self->{fieldsDialog} = new GCFieldsSelectionDialog($self, $self->{parent}->{lang}->{ExportFieldsTitle});
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, $parent->{lang}->{ExportTitle}, 'export');
+ bless ($self, $class);
+
+ $self->{fieldsButtonLabel} = $parent->{lang}->{ExportFieldsTitle};
+ $self->{fieldsTip} = $parent->{lang}->{ExportFieldsTip};
+ $self->{filter} = new Gtk2::CheckButton($parent->{lang}->{ExportFilter});
+ $self->{sortLabel} = GCLabel->new($parent->{lang}->{ExportSortBy});
+ $self->{sorter} = new GCFieldSelector(0, undef, 0);
+ $self->{orderLabel} = GCLabel->new($parent->{lang}->{ExportOrder});
+ my $ascStock = Gtk2::Stock->lookup('gtk-sort-ascending');
+ (my $ascStockLabel = $ascStock->{label}) =~ s/_//;
+ my $descStock = Gtk2::Stock->lookup('gtk-sort-descending');
+ (my $descStockLabel = $descStock->{label}) =~ s/_//;
+ $self->{order} = new GCMenuList([
+ {value => 'asc', displayed => $ascStockLabel},
+ {value => 'desc', displayed => $descStockLabel},
+ ]);
+ $self->{dataTable}->resize(4, 2);
+ $self->{dataTable}->attach($self->{filter}, 0, 2, 0, 1, 'fill', 'fill', 0, 0);
+ $self->{dataTable}->attach($self->{sortLabel}, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ $self->{dataTable}->attach($self->{sorter}, 1, 2, 1, 2, 'fill', 'fill', 0, 0);
+ $self->{dataTable}->attach($self->{orderLabel}, 0, 1, 2, 3, 'fill', 'fill', 0, 0);
+ $self->{dataTable}->attach($self->{order}, 1, 2, 2, 3, 'fill', 'fill', 0, 0);
+ $self->{dataTable}->attach($self->{labelFile}, 0, 1, 3, 4, 'fill', 'fill', 0, 0);
+ $self->{dataTable}->attach($self->{file}, 1, 2, 3, 4, ['fill', 'expand'], 'fill', 0, 0);
+
+# $self->vbox->pack_start(new Gtk2::HSeparator, 0, 0, 5);
+# $self->vbox->pack_start($self->{filter},0,0,0);
+
+ return $self;
+ }
+
+}
+
+
+1;
diff --git a/lib/gcstar/GCExport/GCExportBase.pm b/lib/gcstar/GCExport/GCExportBase.pm
new file mode 100644
index 0000000..fb23ec2
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportBase.pm
@@ -0,0 +1,362 @@
+package GCExport::GCExportBase;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCExportImport;
+
+{
+ package GCExport::GCExportBaseClass;
+
+ use base 'GCExportImportBase';
+
+ use File::Basename;
+ use File::Copy;
+ use GCUtils 'glob';
+
+ #Methods to be overriden in specific classes
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getSuffix
+ {
+ return '';
+ }
+
+ sub getModels
+ {
+ return [];
+ }
+
+ sub needsUTF8
+ {
+ return 0;
+ }
+
+ sub getOptions
+ {
+ }
+
+ sub wantsDirectorySelection
+ {
+ return 0;
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub wantsImagesSelection
+ {
+ return 0;
+ }
+
+ sub wantsFileSelection
+ {
+ return 1;
+ }
+
+ sub getHeader
+ {
+ }
+
+ sub getItem
+ {
+ }
+
+ sub getFooter
+ {
+ }
+
+ sub postProcess
+ {
+ }
+
+ sub preProcess
+ {
+ }
+
+ sub getEndInfo
+ {
+ }
+
+ sub wantsOsSeparator
+ {
+ return 1;
+ }
+
+ sub wantsSort
+ {
+ return 0;
+ }
+
+ sub getNewPictureHeight
+ {
+ return 0;
+ }
+
+ #End of methods to be overriden
+
+ sub getUniqueImageFileName
+ {
+ my ($self, $suffix, $dir, $title) = @_;
+
+ return $self->{options}->{parent}->getUniqueImageFileName($suffix, $title, $dir);
+ }
+
+ sub duplicatePicture
+ {
+ my ($self, $orig, $field, $dir, $title, $newHeight) = @_;
+ $self->{saved}->{$field} = $orig;
+ my $newPic = $orig;
+ if ($orig && $self->{options}->{withPictures})
+ {
+ $newPic = GCUtils::getDisplayedImage($orig,
+ $self->{options}->{defaultImage},
+ $self->{original});
+ if ($newPic eq $self->{options}->{defaultImage})
+ {
+ $newPic = $self->{defaultImage};
+ }
+ else
+ {
+ $newPic =~ /.*?(\.[^.]*)$/;
+ my $suffix = $1;
+ my $dest = $self->getUniqueImageFileName($suffix,
+ $dir,
+ $title);
+ my $picHeight = $self->getNewPictureHeight;
+ if ($picHeight)
+ {
+ my $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($newPic);
+ my ($width, $height) = ($pixbuf->get_width, $pixbuf->get_height);
+ my $picWidth = $width * ($picHeight / $height);
+ $pixbuf = GCUtils::scaleMaxPixbuf($pixbuf, $picWidth, $picHeight, 1);
+ my $format;
+ if ($suffix =~ /png/i)
+ {
+ $format = 'png';
+ }
+ else
+ {
+ $dest =~ s/\.[^.]*$/\.jpg/;
+ $format = 'jpeg';
+ }
+ $pixbuf->save($dest, $format);
+ }
+ else
+ {
+ copy($newPic, $dest);
+ }
+ $newPic = basename($dir).'/'.basename($dest);
+ }
+ }
+ else
+ {
+ $newPic = basename($dir).'/'.basename($self->{options}->{defaultImage});
+ }
+ $newPic =~ s/\//\\/g if ($^O =~ /win32/i) && $self->wantsOsSeparator;
+ return $newPic;
+ }
+
+ sub restorePicture
+ {
+ my $self = shift;
+ return $self->{saved}->{image};
+ }
+
+ sub restoreInfo
+ {
+ my ($self, $info) = @_;
+
+ foreach (keys %{$self->{saved}})
+ {
+ $info->{$_} = $self->{saved}->{$_};
+ }
+ }
+
+ sub transformValue
+ {
+ my ($self, $value, $field) = @_;
+ if ($self->{options}->{fieldsInfo}->{$field}->{type} eq 'image')
+ {
+ if ($self->{copyPictures})
+ {
+ $value = $self->duplicatePicture($value, $field,
+ $self->{dirName},
+ $self->{currentItem}->{
+ $self->{model}->{commonFields}->{title}
+ });
+ }
+ return $value;
+ }
+ return $self->{options}->{originalList}->transformValue($value, $field);
+ }
+
+ sub getStockLabel
+ {
+ my ($self, $stock) = @_;
+ my $item = Gtk2::Stock->lookup($stock);
+ my $label = '';
+ ($label = $item->{label}) =~ s/_//
+ if $item;
+ return $label;
+ }
+
+ # If you need really specific processing, you can instead override the process method
+ sub process
+ {
+ my ($self, $options) = @_;
+
+ $self->{saved} = {};
+ $self->{currentItem} = undef;
+
+ $self->{options} = $options;
+
+ $options->{file} .= $self->getSuffix
+ if ($self->getSuffix)
+ && ($options->{file} !~ /\.\w*$/);
+ $self->{fileName} = $options->{file};
+ $self->{original} = $options->{collection};
+ $self->{origDir} = dirname($self->{original});
+ $options->{collectionDir} = $self->{origDir};
+
+ ($self->{dirName} = $self->{fileName}) =~ s/\.[^.]*?$//;
+ $self->{dirName} .= '_images';
+ if ( -e $self->{dirName})
+ {
+ my @images = glob $self->{dirName}.'/*';
+ unlink foreach (@images);
+ rmdir $self->{dirName};
+ unlink $self->{dirName} if ( -e $self->{dirName});
+ }
+ if ($self->{options}->{withPictures})
+ {
+ mkdir $self->{dirName};
+ #Get a copy of default picture
+ copy($self->{options}->{defaultImage},$self->{dirName});
+ $self->{defaultImage} = basename($self->{dirName}).'/'
+ .basename($self->{options}->{defaultImage});
+ }
+
+ if (! $self->preProcess)
+ {
+ return $self->getEndInfo;
+ }
+
+ my @tmpArray = @{$options->{items}};
+ if ($self->wantsSort)
+ {
+ my $sorter = $self->{options}->{sorter};
+ use locale;
+ if ($self->{model}->{fieldsInfo}->{$sorter}->{type} eq 'number')
+ {
+ @tmpArray = sort {
+ my $val1 = $a->{$sorter};
+ my $val2 = $b->{$sorter};
+ return $val1 <=> $val2;
+ } @tmpArray;
+ }
+ elsif ($self->{model}->{fieldsInfo}->{$sorter}->{type} eq 'date')
+ {
+ @tmpArray = sort {
+ my $val1 = GCPreProcess::reverseDate($a->{$sorter});
+ my $val2 = GCPreProcess::reverseDate($b->{$sorter});
+ return $val1 <=> $val2;
+ } @tmpArray;
+ }
+ else
+ {
+ @tmpArray = sort {
+ my $val1 = uc $self->{options}->{originalList}->transformValue($a->{$sorter}, $sorter);
+ my $val2 = uc $self->{options}->{originalList}->transformValue($b->{$sorter}, $sorter);
+ return $val1 cmp $val2;
+ } @tmpArray;
+ }
+ @tmpArray = reverse @tmpArray if $self->{options}->{order} eq 'desc';
+ }
+
+ $self->{sortedArray} = \@tmpArray;
+
+ my $header = $self->getHeader($#tmpArray + 1);
+ my $body = '';
+
+ my $item;
+ my $idx = 0;
+ my $copyPictures = 0;
+ my @copiedPicturesFields;
+ if ($self->{options}->{withPictures})
+ {
+ # If we don't specify fields, the pictures will be copied with transform value
+ # This one is used now
+ $copyPictures = 1
+ if $self->wantsFieldsSelection;
+ # This one will be used by transform value
+ $self->{copyPictures} = !$copyPictures;
+ foreach my $field(@{$self->{options}->{fields}})
+ {
+ push @copiedPicturesFields, $field
+ if $self->{options}->{fieldsInfo}->{$field}->{type} eq 'image';
+ }
+ }
+ foreach $item(@tmpArray)
+ {
+ $self->{currentItem} = $item;
+ if ($copyPictures)
+ {
+ foreach my $pic(@copiedPicturesFields)
+ {
+ $item->{$pic} = $self->duplicatePicture($item->{$pic}, $pic, $self->{dirName},
+ $item->{$self->{model}->{commonFields}->{title}});
+ }
+ }
+ $body .= $self->getItem($item, $idx);
+ $self->restoreInfo($item);
+ $idx++;
+ }
+ $self->{currentItem} = undef;
+ my $footer = $self->getFooter($#tmpArray + 1);
+
+ $self->postProcess(\$header, \$body);
+
+ open EXPORTFILE, ">".$options->{file};
+ binmode( EXPORTFILE, ':utf8') if $self->needsUTF8;
+ print EXPORTFILE "$header";
+ print EXPORTFILE "$body";
+ print EXPORTFILE "$footer";
+ close EXPORTFILE;
+
+ return $self->getEndInfo;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCExport/GCExportCSV.pm b/lib/gcstar/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..c70fe01
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportCSV.pm
@@ -0,0 +1,198 @@
+package GCExport::GCExportCSV;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ package GCExport::GCExporterCSV;
+
+ use base qw(GCExport::GCExportBaseClass);
+ use Encode;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getName
+ {
+ my $self = shift;
+
+ return "CSV";
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+
+ my $charsets = '';
+ my @charsetList = Encode->encodings(':all');
+ foreach (@charsetList)
+ {
+ $charsets .= $_.',';
+ }
+
+ return [
+ {
+ name => 'sep',
+ type => 'short text',
+ label => 'Separator',
+ default => ';'
+ },
+
+ {
+ name => 'rep',
+ type => 'short text',
+ label => 'Replacement',
+ default => ','
+ },
+
+ {
+ name => 'charset',
+ type => 'options',
+ label => 'Charset',
+ valuesList => $charsets,
+ default => 'utf8',
+ },
+
+ {
+ name => 'withHeader',
+ type => 'yesno',
+ label => 'Header',
+ default => '1'
+ },
+
+ ];
+
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 1;
+ }
+
+ sub wantsImagesSelection
+ {
+ return 1;
+ }
+
+ sub wantsSort
+ {
+ return 1;
+ }
+
+ sub needsUTF8
+ {
+ my $self = shift;
+ return $self->{options}->{charset} eq 'utf8';
+ }
+
+ sub preProcess
+ {
+ my $self = shift;
+ return 1;
+ }
+
+ sub transformValue
+ {
+ my ($self, $value, $field) = @_;
+
+ if ($field)
+ {
+ $value = $self->SUPER::transformValue($value, $field);
+ }
+ $value =~ s/,+$//;
+ $value =~ s /$self->{options}->{sep}/$self->{options}->{rep}/g;
+ $value =~ s/\n|\r//g;
+ $value =~ s/<br\/>/ /g;
+ $value = encode($self->{options}->{charset}, $value)
+ if $self->{options}->{charset} ne 'utf8';
+ return $value;
+ }
+
+ sub getHeader
+ {
+ my ($self, $number) = @_;
+ my $result = '';
+
+ if ($self->{options}->{withHeader})
+ {
+ foreach (@{$self->{options}->{fields}})
+ {
+ #my $column = $self->{options}->{lang}->{FieldsList}->{$_};
+ my $column = $self->{model}->{fieldsInfo}->{$_}->{displayed};
+ $result .= $self->transformValue($column).$self->{options}->{sep};
+ }
+ $result =~ s/$self->{options}->{sep}$//;
+ $result .= "\n";
+ }
+
+ return $result;
+ }
+
+ sub getItem
+ {
+ my ($self, $item, $number) = @_;
+ my $result;
+ foreach (@{$self->{options}->{fields}})
+ {
+ my $value = $item->{$_};
+ $result .= $self->transformValue($value, $_).$self->{options}->{sep};
+ }
+ $result =~ s/$self->{options}->{sep}$//;
+ $result .= "\n";
+
+ return $result;
+ }
+
+ sub getFooter
+ {
+ my $self = shift;
+ my $result;
+
+ return $result;
+ }
+
+ sub postProcess
+ {
+ my ($self, $header, $body) = @_;
+ }
+
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+
+ return $message;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCExport/GCExportExternal.pm b/lib/gcstar/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..d5c096c
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportExternal.pm
@@ -0,0 +1,182 @@
+package GCExport::GCExportExternal;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ package GCExport::GCExporterExternal;
+
+ use File::Copy;
+ use File::Basename;
+ use Cwd;
+ use XML::Simple;
+ use GCUtils 'glob';
+ use GCBackend::GCBackendXmlParser;
+ use base qw(GCExport::GCExportBaseClass);
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent);
+ bless ($self, $class);
+
+ $self->{useZip} = $self->checkOptionalModule('Archive::Zip');
+
+ return $self;
+ }
+
+ sub wantsOsSeparator
+ {
+ return 0;
+ }
+
+ sub transformPicturePath
+ {
+ my ($self, $path, $file, $item, $field) = @_;
+ return $self->duplicatePicture($path,
+ $field,
+ $self->{imageDir},
+ $item->{$self->{model}->{commonFields}->{title}});
+ }
+
+ sub process
+ {
+ my ($self, $options) = @_;
+ $self->{parsingError} = '';
+ $self->{options} = $options;
+ $self->{options}->{withPictures} = 1;
+ #$self->{fileName} = $options->{file};
+ my $ext = ($self->{options}->{zip} ? 'gcz' : 'gcs');
+ my $outFile = $options->{file};
+ $outFile .= ".$ext" if ($outFile !~ m/\.$ext$/);
+ #$self->{fileName} .= '.gcs' if ($self->{fileName} !~ m/\.gcs$/);
+ $self->{fileName} = $outFile;
+ $self->{fileName} =~ s/z$/s/;
+ my $listFile = $self->{fileName};
+ my $baseDir = dirname($listFile);
+ my $baseName = basename($listFile, '.gcs');
+ my $imagesSubDir = $baseName.'_pictures';
+ $self->{imageDir} = $baseDir.'/'.$imagesSubDir;
+ $self->{original} = $options->{collection};
+ #$self->{original} =~ s/\\/\//g if ($^O =~ /win32/i);
+ $self->{origDir} = dirname($self->{original});
+
+ eval {
+ chdir $baseDir;
+ die 'Directory not writable' if !-w '.';
+ mkdir $self->{imageDir};
+
+ $self->{currentDir} = getcwd;
+
+ my $backend = new GCBackend::GCBeXmlParser($self);
+ $backend->setParameters(file => $listFile,
+ version => $self->{options}->{parent}->{version},
+ wantRestore => 1,
+ standAlone => 1);
+
+ my $result = $backend->save($options->{items},
+ $options->{originalList}->getInformation,
+ undef);
+
+ if ($result->{error})
+ {
+ die $result->{error}->[1];
+ }
+ };
+
+ if ($@)
+ {
+ $self->{parsingError} = GCUtils::formatOpenSaveError(
+ $self->{options}->{parent}->{lang},
+ $self->{fileName},
+ ['SaveError', $@]
+ );
+ }
+
+ if ($self->{options}->{zip})
+ {
+ chdir $baseDir;
+ my $zip = Archive::Zip->new();
+ $zip->addFile(basename($self->{fileName}));
+ $zip->addDirectory(basename($self->{imageDir}));
+ my @images = glob $imagesSubDir.'/*';
+ $zip->addFile($_) foreach @images;
+ my $result = $zip->writeToFileNamed($outFile);
+ if ($result)
+ {
+ $self->{parsingError} = GCUtils::formatOpenSaveError(
+ $self->{options}->{parent}->{lang},
+ $outFile,
+ ['SaveError', $@]
+ );
+ }
+ else
+ {
+ # Cleanup to remove everything but the .gcz file
+ unlink $self->{fileName};
+ unlink foreach (@images);
+ rmdir $imagesSubDir;
+ }
+ }
+ chdir;
+ return $self->getEndInfo;
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ my @options;
+
+ if ($self->{useZip})
+ {
+ push @options, {
+ name => 'zip',
+ type => 'yesno',
+ label => 'ZipAll',
+ default => '0'
+ };
+ }
+
+ return \@options;
+ }
+
+# sub getName
+# {
+# my $self = shift;
+#
+# return "External";
+# }
+
+ sub getEndInfo
+ {
+ my $self = shift;
+ return ($self->{parsingError}, 'error')
+ if $self->{parsingError};
+
+ return '';
+ }
+}
diff --git a/lib/gcstar/GCExport/GCExportHTML.pm b/lib/gcstar/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..b083545
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportHTML.pm
@@ -0,0 +1,592 @@
+package GCExport::GCExportHTML;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ package GCExport::GCExporterHTML;
+
+
+ use File::Copy;
+ use File::Basename;
+ use XML::Simple;
+ use base qw(GCExport::GCExportBaseClass);
+ use GCUtils 'glob';
+
+ our $FieldsList = 'GCSfields';
+ our $GroupsList = 'GCSgroups';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ $self->{genericModels} = 0;
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getName
+ {
+ my $self = shift;
+
+ return "HTML";
+ }
+
+ sub getSuffix
+ {
+ my $self = shift;
+
+ return ".html";
+ }
+
+ sub needsUTF8
+ {
+ my $self = shift;
+
+ return 1;
+ }
+
+ sub getModels
+ {
+ my $self = shift;
+
+ return [];
+ }
+
+ sub setModelsDir
+ {
+ my $self = shift;
+ $self->{genericModelsDir} = $ENV{GCS_SHARE_DIR}.'/html_models/GCstar';
+ if ($self->{model})
+ {
+ $self->{modelsDir} = $ENV{GCS_SHARE_DIR}.'/html_models/'.$self->{model}->getName;
+ if ((! $self->{model}->getName) || (! -e $self->{modelsDir}))
+ {
+ $self->{modelsDir} = $self->{genericModelsDir};
+ $self->{genericModels} = 1;
+ }
+ }
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ $self->{modelsFiles} = '';
+
+ $self->setModelsDir;
+
+ my $defaultModel = '';
+ $self->{isGeneric} = {};
+ foreach (glob $self->{modelsDir}.'/*')
+ {
+ next if ($_ =~ /\/CVS$/) || ($_ =~ /\.png$/);
+ (my $mod = basename($_)) =~ s/_/ /g;
+ $self->{modelsFiles} .= $mod.',';
+ $defaultModel = $mod if !$defaultModel;
+ $self->{isGeneric}->{$mod} = $self->{genericModels};
+ }
+ $self->{genericAdded} = 0;
+ if (!$self->{genericModels})
+ {
+ # Previous one was specific, we also add the generic ones.
+ foreach (glob $self->{genericModelsDir}.'/*')
+ {
+ next if ($_ =~ /\/CVS$/) || ($_ =~ /\.png$/);
+ (my $mod = basename($_)) =~ s/_/ /g;
+
+ next if exists $self->{isGeneric}->{$mod};
+ $self->{modelsFiles} .= $mod.',';
+ $self->{isGeneric}->{$mod} = 1;
+ $self->{genericAdded} = 1;
+ }
+ }
+ $self->{modelsFiles} .= 'UseFile,';
+ return [
+ {
+ name => 'template',
+ type => 'options',
+ label => 'FileTemplate',
+ valuesList => $self->{modelsFiles},
+ default => $defaultModel,
+ changedCallback => sub {shift; $self->checkFileField(@_)},
+ buttonLabel => 'Preview',
+ buttonCallback => sub {shift; $self->preview(@_)}
+ },
+
+ {
+ name => 'modelFile',
+ type => 'file',
+ label => 'TemplateExternalFile',
+ default => '',
+ insensitive => 1,
+ },
+
+ {
+ name => 'title',
+ type => 'short text',
+ label => 'Title',
+ default => 'Items list',
+ },
+
+ {
+ name => 'imgHeight',
+ type => 'number',
+ label => 'HeightImg',
+ default => 160,
+ min => 50,
+ max => 500,
+ },
+
+ {
+ name => 'withJs',
+ type => 'yesno',
+ label => 'WithJS',
+ default => '1'
+ },
+
+ {
+ name => 'open',
+ type => 'yesno',
+ label => 'OpenFileInBrowser',
+ default => '0'
+ },
+
+ ]
+ }
+
+ sub getNewPictureHeight
+ {
+ my $self = shift;
+ return $self->{options}->{imgHeight};
+ }
+
+ sub checkFileField
+ {
+ my ($self, $data) = @_;
+ my ($parent, $list) = @{$data};
+ return if ! $parent->{options}->{modelFile};
+ my $model = $list->getValue ;
+ $parent->{options}->{modelFile}->set_sensitive($model eq 'UseFile');
+ $parent->{fieldsSelection}->set_sensitive($self->{isGeneric}->{$model})
+ if $parent->{fieldsSelection};
+ }
+
+ sub preview
+ {
+ my ($self, $data) = @_;
+ my ($parent, $list) = @{$data};
+ (my $template = $list->getValue) =~ s/ /_/g;
+ my $dialog = new Gtk2::Dialog($self->getLang->{Preview}.' - '.$list->getValue,
+ $parent,
+ [qw/modal destroy-with-parent/],
+ 'gtk-ok' => 'ok',
+ );
+
+ my $picFile;
+ if ($self->{isGeneric}->{$template})
+ {
+ $picFile = $self->{genericModelsDir}.'/'.$template.'.png';
+ }
+ else
+ {
+ $picFile = $self->{modelsDir}.'/'.$template.'.png';
+ }
+ if (-f $picFile)
+ {
+ my $image = Gtk2::Image->new_from_file($picFile);
+ $image->set_padding(10,10);
+ $dialog->vbox->pack_start($image,0,0,0);
+ }
+ else
+ {
+ my $label = new Gtk2::Label;
+ $label->set_markup('<b>'.$self->getLang->{NoPreview}.'</b>');
+ $dialog->vbox->pack_start($label,1,1,0);
+ $dialog->set_default_size(300,300);
+ }
+ $dialog->vbox->show_all;
+ $dialog->run;
+ $dialog->destroy;
+ $parent->showMe;
+ }
+
+ sub wantsFieldsSelection
+ {
+ my $self = shift;
+ return 1;
+ return $self->{genericAdded} || $self->{genericModels};
+ }
+
+ sub wantsImagesSelection
+ {
+ return 1;
+ }
+
+ sub wantsOsSeparator
+ {
+ return 0;
+ }
+
+ sub wantsSort
+ {
+ return 1;
+ }
+
+ sub transformData
+ {
+ my ($self, $item, $field, $asATable) = @_;
+
+ my $data = $item->{$field};
+ if ($asATable)
+ {
+ return '' if !$data;
+ my $result = '';
+ my $i = 1;
+ foreach (@{$data})
+ {
+ my $class = ($i % 2) ? 'even' : 'odd';
+ $result .= " <tr class=\"$class\">\n";
+ foreach my $item(@{$_})
+ {
+ $result .= " <td>$item</td>\n";
+ }
+ $result .= " </tr>\n";
+ $i++;
+ }
+ return $result;
+ }
+ else
+ {
+ my $value = $self->transformValue($data, $field);
+ $value =~ s|\n|<br />|g;
+ return $value;
+ }
+ }
+
+ sub getValues
+ {
+ my ($self, $values, $filter) = @_;
+ my $needFilter = (length($filter) > 2);
+ my @result;
+ if ($values eq $GroupsList)
+ {
+ # We generate the list of group for the selected fields
+ my %groups;
+ foreach (@{$self->{options}->{fields}})
+ {
+ my $group = $self->{options}->{fieldsInfo}->{$_}->{group};
+ $groups{$group} = 1;
+ }
+ foreach (@{$self->{model}->{groups}})
+ {
+ my $group = $_->{id};
+ push @result, $group if $groups{$group};
+ }
+ }
+ else
+ {
+ # We could have a group name or a list of fields types
+ my $type;
+ my $group;
+ foreach (@{$self->{options}->{fields}})
+ {
+ $type = $self->{options}->{fieldsInfo}->{$_}->{type};
+ $group = $self->{options}->{fieldsInfo}->{$_}->{group};
+ push @result, $_
+ if ($type ne 'triple list')
+ && (($group =~ /^$values$/i) || ($values eq $FieldsList))
+ && (!$needFilter || ($needFilter && ($filter =~ /$type/)));
+ }
+ }
+ return \@result;
+ }
+
+ sub preProcess
+ {
+ my $self = shift;
+
+ $self->{errors} = 0;
+ $self->setModelsDir;
+ my $template = $self->{options}->{template};
+ my $file;
+ my $model;
+ if ($template eq 'UseFile')
+ {
+ $file = $self->{options}->{modelFile};
+ if ( ! -e $file)
+ {
+ $self->{errors} = $self->getLang->{ModelNotFound};
+ return 0;
+ }
+ }
+ else
+ {
+ $template =~ s/ /_/;
+ if ($self->{isGeneric}->{$template})
+ {
+ $file = $self->{genericModelsDir}.'/'.$self->{options}->{template};
+ }
+ else
+ {
+ $file = $self->{modelsDir}.'/'.$self->{options}->{template};
+ }
+
+ $file =~ s/"//g;
+ #"
+ }
+ # The problem should only happen when using command line, so a die is enough.
+ open FILE, $file or die "\nModel $template doesn't exist for this kind of collection";
+ binmode(FILE, ':utf8' );
+ $model = do { local $/; <FILE> };
+ close FILE;
+
+ if ($model =~ /^<metamodel>/)
+ {
+ my $xs = XML::Simple->new;
+ my $meta = $xs->XMLin($model,
+ ForceArray => ['field']);
+ open FILE, $self->{genericModelsDir}.'/'.$meta->{model};
+ binmode(FILE, ':utf8' );
+ $model = do { local $/; <FILE> };
+ close FILE;
+ $self->{options}->{fields} = $meta->{fields}->{field};
+ }
+
+ if ($self->{options}->{withJs})
+ {
+ $model =~ s/(\[JAVASCRIPT\])|(\[\/JAVASCRIPT\])//gms;
+ $model =~ s/\[NOJAVASCRIPT\].*?\[\/NOJAVASCRIPT\]//gms;
+ }
+ else
+ {
+ $model =~ s/\[JAVASCRIPT\].*?\[\/JAVASCRIPT\]//gms;
+ $model =~ s/(\[NOJAVASCRIPT\])|(\[\/NOJAVASCRIPT\])//gms;
+ }
+
+ # If collection does not manage lendings, remove the LENDING blocks
+ $model =~ s|\[LENDING\](.*?)\[/LENDING\]| $self->{model}->{hasLending} ? $1 : '' |ems;
+
+ #Loops
+ while ($model =~ m/\[LOOP([0-9]+)?\s+values=([^\s]*?)\s+idx=([^\s]*?)(\s+filter=([^\s]*?))?\]\n?(.*?)\n\s*\[\/LOOP\1\]/gms)
+ {
+ my $loopNumber = $1;
+ my $values = $2;
+ my $index = $3;
+ my $filter = ','.$5.',';
+ my $motif = $6;
+ my $valuesArray = $self->getValues($values, $filter);
+ my $string;
+ foreach my $value(@$valuesArray)
+ {
+ (my $line = $motif) =~ s/$index/$value/gms;
+ # For generic models, we add an img tag for images
+ # and an a tag for links
+ if (exists $self->{options}->{fieldsInfo}->{$value})
+ {
+ # If this is an image
+ if ($self->{options}->{fieldsInfo}->{$value}->{type} eq 'image')
+ {
+ # We do it only if it is between 2 tags.
+ $line =~ s|>\$\$$value\$\$<|><img src="\$\$$value\$\$"/><|;
+ }
+ # If this is the item URL
+ elsif ($value eq $self->{model}->{commonFields}->{url})
+ {
+ # We do it only if it is between 2 tags.
+ $line =~ s|>\$\$$value\$\$<|><a href="\$\$$value\$\$"/>\$\$$self->{model}->{commonFields}->{title}\$\$</a><|;
+ }
+ }
+ $string .= $line;
+ }
+ $model =~ s/(\n?)\s*\[LOOP$loopNumber\s+values=$values\s+idx=$index(\s+filter=$filter)?\].*?\[\/LOOP$loopNumber\]/$1$string/gms;
+ }
+ $model =~ s/TITLE_FIELD/$self->{model}->{commonFields}->{title}/eg;
+ $model =~ s/COVER_FIELD/$self->{model}->{commonFields}->{cover}/eg;
+
+ $model =~ m{
+ \[HEADER\]\n?(.*?)\n?\[\/HEADER\].*?
+ \[ITEM\]\n?(.*?)\n?\[\/ITEM\].*?
+ \[FOOTER\]\n?(.*?)\n?\[\/FOOTER\].*?
+ \[POST\]\n?(.*?)\n?\[\/POST\]
+ }xms;
+ $self->{header} = $1;
+ $self->{item} = $2;
+ $self->{footer} = $3;
+ $self->{post} = $4;
+ return 1;
+ }
+
+ sub getHeader
+ {
+ my ($self, $total) = @_;
+
+ my $result = $self->{header};
+
+ $self->{total} = $total;
+ $result =~ s/\$\$PAGETITLE\$\$/$self->{options}->{title}/g;
+ $result =~ s/\$\$TOTALNUMBER\$\$/$total/g;
+ $result =~ s/\$\$ITEMS\$\$/$self->{model}->getDisplayedItems/eg;
+
+ #Search form
+ $result =~ s/\$\$FORM_INPUT\$\$/$self->getLang->{InputTitle}/eg;
+ $result =~ s/\$\$FORM_SEARCH1\$\$/$self->getLang->{SearchType1}/eg;
+ $result =~ s/\$\$FORM_SEARCH2\$\$/$self->getLang->{SearchType2}/eg;
+ $result =~ s/\$\$FORM_SEARCHBUTTON\$\$/$self->getLang->{SearchButton}/eg;
+ $result =~ s/\$\$FORM_SEARCHTITLE\$\$/$self->getLang->{SearchTitle}/eg;
+ $result =~ s/\$\$FORM_ALLBUTTON\$\$/$self->getLang->{AllButton}/eg;
+ $result =~ s/\$\$FORM_ALLTITLE\$\$/$self->getLang->{AllTitle}/eg;
+ $result =~ s/\$\$FORM_EXPAND\$\$/$self->getLang->{Expand}/eg;
+ $result =~ s/\$\$FORM_EXPANDTITLE\$\$/$self->getLang->{ExpandTitle}/eg;
+ $result =~ s/\$\$FORM_COLLAPSE\$\$/$self->getLang->{Collapse}/eg;
+ $result =~ s/\$\$FORM_COLLAPSETITLE\$\$/$self->getLang->{CollapseTitle}/eg;
+
+ #Labels
+ $result =~ s/\$\$([a-zA-Z0-9_]*)_LABEL\$\$/$self->{model}->getDisplayedLabel($1)/eg;
+
+ return $result."\n";
+ }
+
+ sub getFooter
+ {
+ my ($self, $item) = @_;
+
+ my $total = $self->{total};
+ my $result = $self->{footer};
+ $result =~ s/\$\$PAGETITLE\$\$/$self->{options}->{title}/g;
+ $result =~ s/\$\$TOTALNUMBER\$\$/$total/g;
+ $result =~ s/\$\$GENERATOR_NOTE\$\$/$self->getLang->{Note}/eg;
+ $result =~ s/\$\$BORROWED_ITEMS\$\$/$self->{options}->{lang}->{BorrowedTitle}/g;
+
+ return $result."\n";
+ }
+
+ sub getItem
+ {
+ my ($self, $item, $idx) = @_;
+ my $total = $self->{total};
+ my $result = $self->{item};
+
+ #Separator
+ $result =~ s/\$\$SEPARATOR\$\$/$self->{options}->{lang}->{Separator}/g;
+
+ #Labels that need a special process
+ $result =~ s/\$\$URL_LABEL\$\$/$self->{options}->{lang}->{PanelWeb}/g;
+
+ #Other labels
+ $result =~ s/\$\$([a-zA-Z0-9_]*)_LABEL\$\$/$self->{model}->getDisplayedLabel($1)/eg;
+
+ #Fields that need a special process
+ $result =~ s/\$\$HEIGHT_PIC\$\$/$self->{options}->{imgHeight}/g;
+ my $url = $item->{$self->{model}->{commonFields}->{url}} || '#';
+ $result =~ s/\$\$URL\$\$/$url/g;
+
+ #Borrower
+ my $borrowerField = $self->{model}->{commonFields}->{borrower}->{name};
+ my $tmpBorrower = $item->{$borrowerField};
+ my $borrowerFlag = 1;
+ my $borrowerYesNo = $self->getLang->{Borrowed};
+ my $borrowerOrEmpty = $tmpBorrower;
+ if (!$tmpBorrower || ($tmpBorrower eq 'none'))
+ {
+ $tmpBorrower = $self->{options}->{lang}->{PanelNobody};
+ $borrowerFlag = 0;
+ $borrowerYesNo = $self->getLang->{NotBorrowed};
+ $borrowerOrEmpty = '';
+ }
+ elsif ($tmpBorrower eq 'unknown')
+ {
+ $tmpBorrower = $self->{options}->{lang}->{PanelUnknown};
+ }
+ $result =~ s/\$\$borrower\$\$/$tmpBorrower/g;
+ $result =~ s/\$\$borrower_OREMPTY\$\$/$borrowerOrEmpty/g;
+ $result =~ s/\$\$borrower_FLAG\$\$/$borrowerFlag/g;
+ $result =~ s/\$\$borrower_YESNO\$\$/$borrowerYesNo/g;
+
+ $result =~ s/\$\$IDX\$\$/$idx/g;
+ $result =~ s/\$\$TOP\$\$/$self->getLang->{Top}/eg;
+ $result =~ s/\$\$BOTTOM\$\$/$self->getLang->{Bottom}/eg;
+ $result =~ s/\$\$TOTALNUMBER\$\$/$total/g;
+
+ # Stock labels
+ $result =~ s/\$\$(gtk-[^\$]*)\$\$/$self->getStockLabel($1)/eg;
+
+ #Multiple list displayed as a table
+ $result =~ s/\$\$([a-zA-Z0-9_]*)_TABLE\$\$/$self->transformData($item, $1, 1)/eg;
+
+ #Other fields
+ #$result =~ s/\$\$([A-Z_]*)\$\$/$item->{lc $1}/eg;
+ $result =~ s/\$\$([a-zA-Z0-9_]*)\$\$/$self->transformData($item, $1, 0)/eg;
+ return $result."\n";
+ }
+
+ sub postProcess
+ {
+ my ($self, $headerRef, $bodyRef) = @_;
+
+ #Variables to be used in POST section
+ my $header = $$headerRef;
+ my $body = $$bodyRef;
+ my @items = @{$self->{sortedArray}};
+
+ eval $self->{post};
+ print "Errors with HTML template in POST:\n $@\n" if $@;
+
+ $$headerRef = $header;
+ $$bodyRef = $body;
+ }
+
+ sub getEndInfo
+ {
+ my $self = shift;
+
+ if ($self->{errors})
+ {
+ return ($self->{errors}, 'error');
+ }
+
+ my $message = '';
+
+ if ($self->{options}->{open})
+ {
+ $self->{options}->{parent}->launch($self->{fileName}, 'url');
+ }
+ else
+ {
+ $message = $self->getLang->{InfoFile}.$self->{fileName};
+ $message .= '
+
+'.$self->getLang->{InfoDir}.$self->{dirName}
+ if $self->{options}->{withPictures};
+ }
+
+ return $message;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCExport/GCExportLatex.pm b/lib/gcstar/GCExport/GCExportLatex.pm
new file mode 100644
index 0000000..0592908
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportLatex.pm
@@ -0,0 +1,204 @@
+package GCExport::GCExportLatex;
+use utf8;
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ package GCExport::GCExporterLatex;
+
+ use base qw(GCExport::GCExportBaseClass);
+
+ sub new {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getName {
+ my $self = shift;
+ return "Latex";
+ }
+
+ sub getOptions {
+ my $self = shift;
+ return [
+ {
+ name => 'one',
+ type => 'yesno',
+ label => 'Export One Media',
+ default => '0',
+ },
+ {
+ name => 'disc',
+ type => 'number',
+ label => '# of Media',
+ default => '1',
+ min => '0',
+ max => '10000',
+ },
+ ];
+
+ }
+
+ sub wantsFieldsSelection {
+ return 0;
+ }
+
+ sub wantsImagesSelection {
+ return 0;
+ }
+
+ sub needsUTF8 {
+ return 1;
+ }
+
+ sub preProcess {
+ my $self = shift;
+ return 1;
+ }
+
+ sub transformValue {
+ my ($self, $value, $field) = @_;
+
+ if ($field) {
+ $value = $self->SUPER::transformValue($value, $field);
+ }
+ $value =~ s/,+$//;
+ $value =~ s/\n|\r//g;
+ $value =~ s/<br\/>/ /g;
+ $value =~ s/\^/\\^{}/g;
+ $value =~ s/\&/\\\&/g;
+ $value =~ s/\"/\'\'/g;
+ return $value;
+ }
+
+ sub getHeader {
+ my ($self, $number) = @_;
+ my $result = '';
+ $result = "\\documentclass[a4paper]{article}
+\\usepackage{ucs}
+\\usepackage[utf8]{inputenc}
+\\usepackage[russian]{babel}
+\\usepackage{geometry}
+\\geometry{a4paper,top=1cm,bottom=1cm,left=1cm,right=1cm}
+\\pagestyle{empty}
+\\linespread{0.6}
+\\sloppy
+
+\\newcommand{\\dvd}[2]{
+\\framebox[12cm]{
+\\begin{tabular}{p{0pt}\@{}p{11.9cm}}
+\\rule[-6cm]{0pt}{11.7cm}&\\begin{minipage}{11.7cm}
+{\\bf DVD #1}
+\\begin{itemize}
+\\setlength{\\parskip}{-3pt}
+#2
+\\end{itemize}\\vspace{-3pt}
+\\end{minipage}
+\\end{tabular}}}
+
+\\begin{document}
+\\footnotesize
+";
+ $result .= "\\dvd{$self->{options}->{disc}}{\n"
+ if $self->{options}->{one};
+ return $result;
+ }
+
+ sub getItem {
+ my ($self, $item, $number) = @_;
+ my $result;
+ return '' if ($self->{options}->{one} &&
+ $item->{number} ne $self->{options}->{disc});
+ $result .= '\item {\bf ' . $self->transformValue ($item->{title}, "title") . "}";
+ $result .= ' / ' . $self->transformValue ($item->{original}, 'original') if $item->{original};
+ $result .= " ($item->{date})" if $item->{date};
+ # one line for russian cartoons
+ if ($self->transformValue ($item->{genre}, 'genre') =~
+ m/Мультфильм/) {
+ $result .= ' м/ф';
+ } elsif ($item->{genre} || $item->{director} ||
+ $item->{audio} || $item->{time}) {
+ $result .= "\\\\\n\\begin{tabular}{ll}\n";
+ $result .= $self->getLocal('genre') . ': & ' .
+ $self->transformValue ($item->{genre}, 'genre') . '\\\\'
+ if $item->{genre};
+ $result .= $self->getLocal('director') . ": & $item->{director}\\\\"
+ if $item->{director};
+ my $audio = $self->transformValue ($item->{audio}, 'audio')
+ if $item->{audio};
+ $audio =~ s/\([\w\ ]+\)//g;
+ $audio =~ s/\([\w\ ]+\)//g;
+ $audio =~ s/\ ,/,/g;
+ $audio =~ s/\s+$//g;
+ $result .= $self->getLocal('audio') . ": & $audio" if length ($audio) > 0;
+ $result .= "; " . $self->transformValue ($item->{subt}, 'subt') .
+ ' (' . $self->getLocal('subt') . ')'
+ if $item->{subt};
+ $result .= '\\\\';
+ $result .= $self->getLocal('time') . ": & $item->{time} мин.\\\\" if $item->{time};
+ $result .= $self->getLocal('country') . ": & $item->{country}" if $item->{country};
+ $result .= "\n\\end{tabular}\n";
+ }
+ # don't include information about media # 0
+ if ((!$self->{options}->{one}) && $item->{number} != 0) {
+ $self->{expdata}->{$item->{number}} .= $result;
+ $self->{expdata}->{all} .= $self->{expdata}->{all} ? ',' . $item->{number} : $item->{number} if $self->{expdata}->{all} !~ m/$item->{number}/;
+ return '';
+ } elsif ($self->{options}->{one}) {
+ return $result;
+ }
+ return '';
+ }
+
+ sub getFooter {
+ my $self = shift;
+ my $result = '';
+ if ($self->{options}->{one}) {
+ $result = "\n}\n\\end{document}\n";
+ } else {
+ my @data = split (/,/, $self->{expdata}->{all});
+ foreach my $key (sort @data) {
+ $result .= "\n\n\\dvd{$key}{\n$self->{expdata}->{$key}}";
+ }
+ $result .= "\n\\end{document}\n";
+ }
+ return $result;
+ }
+
+ sub getLocal {
+ my ($self, $name) = @_;
+ # some abbreviations for russian language
+ if ($self->{options}->{lang}->{LangName} eq "Russian") {
+ return "Реж." if $name eq "director";
+ return "Звук" if $name eq "audio";
+ return "Время" if $name eq "time";
+ return "суб." if $name eq "subt";
+ return $self->{model}->getDisplayedLabel($name);
+ } else {
+ return $self->{model}->getDisplayedLabel($name);
+ }
+ }
+
+ sub getModels {
+ return ['GCfilms'];
+ }
+
+ sub postProcess {
+ my ($self, $header, $body) = @_;
+ }
+
+ sub getEndInfo {
+ my $self = shift;
+ my $message;
+
+ return $message;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCExport/GCExportPDB.pm b/lib/gcstar/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..af1e4db
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportPDB.pm
@@ -0,0 +1,295 @@
+package GCExport::GCExportPDB;
+
+###################################################
+#
+# Copyright 2009-2010 Andrew Ross
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ package GCExport::GCExporterPDB;
+
+ use base qw(GCExport::GCExportBaseClass);
+ use Encode;
+
+ my @record_lengths;
+
+ my $EPOCH_1904 = 2082844800; # Difference between Palm's
+ # epoch (Jan. 1, 1904) and
+ # Unix's epoch (Jan. 1, 1970),
+ # in seconds.
+
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+
+ return [
+ {
+ name => 'dbname',
+ type => 'short text',
+ label => 'DatabaseName',
+ default => 'gcstar'
+ },
+ ];
+
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 1;
+ }
+
+ sub wantsImagesSelection
+ {
+ return 0;
+ }
+
+ sub wantsSort
+ {
+ return 1;
+ }
+
+ sub needsUTF8
+ {
+ my $self = shift;
+ return 0;
+ }
+
+ sub getSuffix
+ {
+ my $self = shift;
+
+ return ".pdb";
+ }
+
+ sub preProcess
+ {
+ my $self = shift;
+ return 1;
+ }
+
+ sub transformValue
+ {
+ my ($self, $value, $field) = @_;
+
+ if ($field)
+ {
+ $value = $self->SUPER::transformValue($value, $field);
+ }
+ $value =~ s/,+$//;
+ $value =~ s/\n|\r//g;
+ $value =~ s/<br\/>/ /g;
+
+ return $value;
+ }
+
+ sub getHeader
+ {
+ my ($self, $number) = @_;
+ my $result = '';
+
+ # clear the record lengths array
+ @record_lengths = ();
+
+ # Add database title
+ my $name = $self->{options}->{'dbname'};
+ if (length($name) > 31)
+ {
+ $name = substr($name, 0, 31);
+ }
+ while (length($name) < 32)
+ {
+ $name .= "\x00"; # pack out with null's
+ }
+ $result .= $name;
+
+ # Add attribute flags (=0)
+ $result .= pack('n', 0);
+
+ # Add file version (=0)
+ $result .= pack('n', 0);
+
+ # Add dates for create time, modify time, backup time
+ # These dates are the number of seconds since 1st Jan 1904
+ my $now = time() + $EPOCH_1904;
+
+ $result .= pack('N', $now);
+ $result .= pack('N', $now);
+ $result .= pack('N', $now);
+
+ # Add the Modification Number (=0)
+ $result .= pack('N', 0);
+
+ # Add the offset to the Application Info
+ # offset calculated as:
+ # Title: 0x20
+ # flags + version + 3 x dates 0x10
+ # mod_number + app_offset 0x08
+ # sortID + type 0x08
+ # creator + seed 0x08
+ # recordListID + cnt + 2byte 0x08
+ # 8 bytes per record 8 * $number
+ $result .= pack('N', 0x50 + (8 * $number));
+
+ # Add null for the sortInfoID since we don't create a sortInfo
+ $result .= pack('N', 0);
+
+ # Add the type
+ $result .= "DB00";
+
+ # Add the creator
+ $result .= "DBOS";
+
+ # add the uniqueIDseed = 0
+ $result .= pack('N', 0);
+
+ # Add the nextRecordListID = 0 when on disk
+ $result .= pack('N', 0);
+
+ # add the record count
+ $result .= pack('n',$number);
+
+ # The record offset table goes here, but is added in postProcess()
+
+ # "Traditional" 2-byte gap to data
+ $result .= pack('n', 0);
+
+ # Start the AppInfoID section
+ $result .= pack('N', 2);
+
+
+ # CHUNK_FIELD_NAMES (0)
+ $result .= pack('n',0);
+ my $fieldstring = '';
+ foreach (@{$self->{options}->{fields}})
+ {
+ my $column = $self->{model}->{fieldsInfo}->{$_}->{displayed};
+ $fieldstring .= $self->transformValue($column)."\x00";
+ }
+ $result .= pack('n', length($fieldstring));
+ $result .= $fieldstring;
+
+ # CHUNK_FIELD_TYPES (1)
+ $result .= pack('n',1);
+ $fieldstring = '';
+ foreach (@{$self->{options}->{fields}})
+ {
+ $fieldstring .= pack('n',0);
+ }
+ $result .= pack('n', length($fieldstring));
+ $result .= $fieldstring;
+
+ # CHUNK_LISTVIEW_OPTIONS (65)
+ $result .= pack('n',65);
+ $result .= pack('n',4);
+ $result .= pack('n',0);
+ $result .= pack('n',0);
+
+ # CHUNK_LFIND_OPTIONS (128)
+ $result .= pack('n',128);
+ $result .= pack('n',2);
+ $result .= pack('n',0);
+
+ return $result;
+ }
+
+ sub getItem
+ {
+ my ($self, $item, $number) = @_;
+ my $result;
+
+ my @lengths = ();
+ my $fieldstr;
+ foreach (@{$self->{options}->{fields}})
+ {
+ my $value = $item->{$_};
+ my $str = $self->transformValue($value, $_)."\x00";
+ push (@lengths, length($str));
+ $fieldstr .= $str;
+ }
+
+ my $al = scalar(@lengths) * 2;
+ for(my $i=0;$i<=$#lengths;$i++)
+ {
+ $result .= pack('n', $al);
+ $al += $lengths[$i];
+ }
+ $result .= $fieldstr;
+ push (@record_lengths, length($fieldstr)+(2 * scalar(@lengths)));
+
+ return $result;
+ }
+
+ sub getFooter
+ {
+ my $self = shift;
+ my $result;
+
+ return $result;
+ }
+
+ sub postProcess
+ {
+ my ($self, $header, $body) = @_;
+
+ # add the index:
+ my $index = "";
+
+ my $numrecs = scalar(@record_lengths);
+ my $offset = length($$header) + (8*$numrecs);
+
+ for (my $i=0;$i<$numrecs;$i++)
+ {
+ $index .= pack('N', $offset);
+ $index .= pack('n', 0);
+ $index .= pack('n', $i);
+ $offset += $record_lengths[$i];
+ }
+
+ # Insert the index into the header
+ $$header = substr($$header, 0, 0x4e).$index.substr($$header,0x4e);
+ }
+
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+
+ return $message;
+ }
+
+
+}
+
+1;
diff --git a/lib/gcstar/GCExport/GCExportSQL.pm b/lib/gcstar/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..5164d3b
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportSQL.pm
@@ -0,0 +1,172 @@
+package GCExport::GCExportSQL;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ package GCExport::GCExporterSQL;
+ use base qw(GCExport::GCExportBaseClass);
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getSuffix
+ {
+ my $self = shift;
+
+ return "";
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+
+ return [
+ {
+ name => 'table',
+ type => 'short text',
+ label => 'TableName',
+ default => 'items'
+ },
+ {
+ name => 'withDrop',
+ type => 'yesno',
+ label => 'WithDrop',
+ default => '1'
+ },
+ {
+ name => 'withCreate',
+ type => 'yesno',
+ label => 'WithCreate',
+ default => '1'
+ },
+ ]
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 1;
+ }
+
+ sub wantsImagesSelection
+ {
+ return 1;
+ }
+
+ sub getName
+ {
+ my $self = shift;
+
+ return "SQL";
+ }
+
+ sub preProcess
+ {
+ my $self = shift;
+ return 1;
+ }
+
+ sub getHeader
+ {
+ my ($self, $number) = @_;
+
+ my $result = '';
+
+ if ($self->{options}->{withDrop})
+ {
+ $result .= 'DROP TABLE '.$self->{options}->{table}.";\n";
+ }
+ if ($self->{options}->{withCreate})
+ {
+ $result .= 'CREATE TABLE '.$self->{options}->{table}.' (';
+
+ foreach (@{$self->{options}->{fields}})
+ {
+ my $type = $self->{model}->{fieldsInfo}->{$_}->{type};
+ my $format = 'TEXT';
+ $format = 'NUMBER' if ($type eq 'number') || ($type eq 'yesno');
+ $result .= "$_ $format, ";
+ }
+ $result =~ s/, $//;
+ $result .= ");\n";
+ }
+
+ return $result;
+ }
+
+ sub getFooter
+ {
+ my $self = shift;
+
+ my $result = "COMMIT;\n";
+ return $result;
+ }
+
+ sub getItem
+ {
+ my ($self, $item, $number) = @_;
+ my $result;
+
+ $result = 'INSERT INTO '.$self->{options}->{table}.' (';
+ my $values = '';
+ foreach (@{$self->{options}->{fields}})
+ {
+ $result .= "$_, ";
+ my $value = $self->transformValue($item->{$_}, $_);
+ $value =~ s/'/''/g;
+ #'
+ $values .= "'".$value."', ";
+ }
+ $result =~ s/, $//;
+ $values =~ s/, $//;
+
+ $result .= ") VALUES ($values);\n";
+ return $result;
+ }
+
+ sub postProcess
+ {
+ my ($self, $value, $body) = @_;
+
+ }
+
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message = $self->getLang->{InfoFile}.$self->{fileName};
+ return $message;
+ }
+}
+
+1; \ No newline at end of file
diff --git a/lib/gcstar/GCExport/GCExportTarGz.pm b/lib/gcstar/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..b8994d0
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportTarGz.pm
@@ -0,0 +1,174 @@
+package GCExport::GCExportTarGz;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ package GCExport::GCExporterTarGz;
+
+ use File::Copy;
+ use File::Basename;
+ use Cwd;
+ use XML::Simple;
+ use GCUtils 'glob';
+ use GCBackend::GCBackendXmlParser;
+ use base qw(GCExport::GCExportBaseClass);
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent);
+ bless ($self, $class);
+
+ $self->checkModule('Compress::Zlib');
+ $self->checkModule('Archive::Tar');
+
+ return $self;
+ }
+
+ sub wantsOsSeparator
+ {
+ return 0;
+ }
+
+ sub transformPicturePath
+ {
+ my ($self, $path, $file, $item, $field) = @_;
+ return $self->duplicatePicture($path,
+ $field,
+ $self->{currentDir}.'/'.$self->{imageDir},
+ $item->{$self->{model}->{commonFields}->{title}});
+ }
+
+ sub process
+ {
+ my ($self, $options) = @_;
+ $self->{parsingError} = '';
+ $self->{options} = $options;
+ $self->{options}->{withPictures} = 1;
+ $self->{fileName} = $options->{file};
+ $self->{fileName} .= '.tar.gz' if ($self->{fileName} !~ m/\.tar\.gz$/);
+
+ my $listFile = 'collection.gcs';
+ my $baseDir = 'tmp_items_tar_gz';
+ my $imagesSubDir = 'images';
+ $self->{imageDir} = $baseDir.'/'.$imagesSubDir;
+ $self->{original} = $options->{collection};
+ #$self->{original} =~ s/\\/\//g if ($^O =~ /win32/i);
+ $self->{origDir} = dirname($self->{original});
+ (my $tarfile = $self->{fileName}) =~ s/\.gz$//;
+
+ eval {
+ chdir dirname($self->{fileName});
+ die 'Directory not writable' if !-w '.';
+ mkdir $baseDir;
+ mkdir $self->{imageDir};
+
+ $self->{currentDir} = getcwd;
+
+ my $backend = new GCBackend::GCBeXmlParser($self);
+ $backend->setParameters(file => $baseDir.'/'.$listFile,
+ version => $self->{options}->{parent}->{version},
+ wantRestore => 1,
+ standAlone => 1);
+
+ my $result = $backend->save($options->{items},
+ $options->{originalList}->getInformation,
+ undef);
+
+ if ($result->{error})
+ {
+ die $result->{error}->[1];
+ }
+
+ chdir $self->{currentDir};
+
+ my $tar = Archive::Tar->new();
+ chdir $baseDir;
+
+ $tar->add_files($listFile, $imagesSubDir);
+ my @images = glob $imagesSubDir.'/*';
+ $tar->add_files($_) foreach (@images);
+ $tar->write($tarfile);
+
+ my $gz = Compress::Zlib::gzopen($self->{fileName}, "wb");
+ $gz or die 'Cannot write';
+ open(TAR, $tarfile) or die "Cannot open $tarfile";
+ binmode(TAR);
+ my $buff;
+ while (read(TAR, $buff, 8 * 2**10))
+ {
+ $gz->gzwrite($buff);
+ }
+ $gz->gzclose;
+ close TAR;
+ unlink foreach (@images);
+ };
+
+ if ($@)
+ {
+ $self->{parsingError} = GCUtils::formatOpenSaveError(
+ $self->{options}->{parent}->{lang},
+ $self->{fileName},
+ ['SaveError', $@]
+ );
+ }
+
+ eval {
+ unlink $listFile;
+ rmdir $imagesSubDir;
+ chdir '..';
+ rmdir $baseDir;
+ $tarfile =~ s/\\/\//g if ($^O =~ /win32/i);
+ unlink $tarfile;
+ };
+ return $self->getEndInfo;
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ my @options;
+ return \@options;
+ }
+
+ sub getName
+ {
+ my $self = shift;
+
+ return ".tar.gz";
+ }
+
+ sub getEndInfo
+ {
+ my $self = shift;
+ return ($self->{parsingError}, 'error')
+ if $self->{parsingError};
+
+ return ($self->getLang->{Info}.$self->{fileName}, 'info');
+ }
+}
diff --git a/lib/gcstar/GCExport/GCExportTellico.pm b/lib/gcstar/GCExport/GCExportTellico.pm
new file mode 100644
index 0000000..2bac594
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportTellico.pm
@@ -0,0 +1,512 @@
+package GCExport::GCExportTellico;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ package GCExport::GCExporterTellico;
+
+ use base qw(GCExport::GCExportBaseClass);
+ use GCUtils;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->checkModule('MIME::Base64');
+ $self->checkModule('Digest::MD5');
+
+ #List of collections: http://www.periapsis.org/tellico/doc/collection-type-values.html
+ # [ entryTitle, type, extra fields ]
+ $self->{models} = {
+ GCbooks => ['Books', '2', ''],
+ GCfilms => ['Videos', '3', '<field flags="2" title="Rating" category="Personal" allowed="5;4;3;2;1" format="4" type="3" name="rating" />'],
+ GCmusics => ['Music', '4', ''],
+ GCcoins => ['Coin', '8', ''],
+ GCgames => ['Games', '11', '']
+ };
+
+ return $self;
+ }
+
+ sub getName
+ {
+ my $self = shift;
+
+ return "Tellico";
+ }
+
+ sub getModels
+ {
+ my $self = shift;
+
+ my @models = keys %{$self->{models}};
+ return \@models;
+ }
+
+ sub needsUTF8
+ {
+ my $self = shift;
+
+ return 1;
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+
+ return [];
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub preProcess
+ {
+ my $self = shift;
+
+ $self->{imagesInfos} = {};
+ return 1;
+ }
+
+ sub getHeader
+ {
+ my ($self, $number) = @_;
+ my $result;
+
+ my $model = $self->{model};
+ my $title = $model->getDescription;
+ my $info = $self->{models}->{$model->getName};
+
+ $result = '<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tellico PUBLIC "-//Robby Stephenson/DTD Tellico V9.0//EN" "http://periapsis.org/tellico/dtd/v9/tellico.dtd">
+<tellico xmlns="http://periapsis.org/tellico/" syntaxVersion="7" >
+ <collection title="'.$title.'" entryTitle="'.$info->[0].'" type="'.$info->[1].'" >
+ <fields>
+ <field name="_default" />
+ '.$info->[2].'
+ </fields>
+';
+
+ return $result;
+ }
+
+ sub transformData
+ {
+ my ($self, $data) = @_;
+
+ $data =~ s/&/&amp;/g;
+
+ return $data;
+ }
+
+ sub transformList
+ {
+ my ($self, $list, $tag) = @_;
+
+ my $result = '';
+ if (ref($list) eq 'ARRAY')
+ {
+ foreach (@{$list})
+ {
+ $result .= " <$tag>".$self->transformData($_->[0])
+ ."</$tag>\n";
+ }
+ }
+ else
+ {
+ foreach (split ',', $list)
+ {
+ s/;.*$//;
+ $result .= " <$tag>".$self->transformData($_)."</$tag>\n";
+ }
+ }
+ return $result;
+ }
+
+ sub encodeImage
+ {
+ my ($self, $file) = @_;
+ my $image = GCUtils::getDisplayedImage($file, $self->{options}->{defaultImage}, $self->{original});
+ (my $suffix = $image) =~ s/.*?\.([^.]*)$/$1/;
+ $suffix = 'jpeg' if $suffix eq 'jpg';
+ open PIC, "<$image" or return (undef,undef,undef);
+ my $data = do {local $/; <PIC>};
+ close PIC;
+ my $pictureId = Digest::MD5::md5_hex($data).'.'.$suffix;
+ my %infos;
+ $infos{id} = $pictureId;
+ $infos{format} = uc $suffix;
+ $infos{width} = 120;
+ $infos{height} = 160;
+ $infos{data} = MIME::Base64::encode_base64($data);
+ return \%infos;
+ }
+
+ sub getItem
+ {
+ my ($self, $item, $number) = @_;
+
+ my $methodName = 'get'.$self->{model}->getName.'Item';
+
+ return $self->$methodName($item);
+ }
+
+ sub getGCfilmsItem
+ {
+ my ($self, $movie, $number) = @_;
+ my $result;
+
+ #(my $synopsis = $movie->{synopsis}) =~ s/<br>/\n/gm;
+ #(my $comments = $movie->{comment}) =~ s/<br>/\n/gm;
+
+ use integer;
+ my $rating = $movie->{rating} / 2;
+ no integer;
+
+ my $age = $movie->{age};
+ my $certification;
+
+ if ($age == 1)
+ {
+ $certification = 'U (USA)';
+ }
+ elsif ($age == 2)
+ {
+ $certification = 'G (USA)';
+ }
+ elsif ($age <= 5)
+ {
+ $certification = 'PG (USA)';
+ }
+ elsif ($age <= 13)
+ {
+ $certification = 'PG-13 (USA)';
+ }
+ elsif ($age <= 17)
+ {
+ $certification = 'R (USA)';
+ }
+
+ my $imageInfos = $self->encodeImage($movie->{image});
+ $self->{imagesInfos}->{$imageInfos->{id}} = $imageInfos;
+
+ my $year = GCPreProcess::extractYear($movie->{date});
+
+ $result = ' <entry>
+ <title>'.$self->transformData($movie->{title}).'</title>
+ <medium>'.$self->transformData($movie->{format}).'</medium>
+ <year>'.$year.'</year>
+ <certification>'.$certification.'</certification>
+ <genres>
+';
+ $result .= $self->transformList($movie->{genre}, 'genre');
+ $result .= ' </genres>
+ <nationalitys>
+ <nationality>'.$self->transformData($movie->{country}).'</nationality>
+ </nationalitys>
+ <casts>
+';
+ foreach (split ',', $movie->{actors})
+ {
+ $result .= " <cast><column>".$self->transformData($_)."</column></cast>\n";
+ }
+ $result .= ' </casts>
+ <directors>
+ <director>'.$self->transformData($movie->{director}).'</director>
+ </directors>
+ <languages>
+';
+ $result .= $self->transformList($movie->{audio}, 'language');
+ $result .= ' </languages>
+ <running-time>'.$self->transformData($movie->{time}).'</running-time>
+ <plot>'.$self->transformData($movie->{synopsis}).'</plot>
+ <rating>'.$rating.'</rating>
+ <comments>'.$self->transformData($movie->{comments}).'</comments>
+';
+ if (($movie->{borrower}) && ($movie->{borrower} ne 'none'))
+ {
+ $result .= ' <loaned>true</loaned>
+';
+ }
+
+ $result .= ' <cover>'.$imageInfos->{id}.'</cover>
+';
+
+ $result .= ' </entry>
+';
+
+ return $result;
+ }
+
+ sub getGCgamesItem
+ {
+ my ($self, $item, $number) = @_;
+ my $result;
+
+ use integer;
+ my $rating = $item->{rating} / 2;
+ no integer;
+
+ my $imageInfos = $self->encodeImage($item->{boxpic});
+ $self->{imagesInfos}->{$imageInfos->{id}} = $imageInfos;
+
+ my $year = GCPreProcess::extractYear($item->{released});
+
+ $result = ' <entry>
+ <title>'.$self->transformData($item->{name}).'</title>
+ <platform>'.$self->transformData($item->{platform}).'</platform>
+ <description>'.$self->transformData($item->{description}).'</description>
+ <year>'.$year.'</year>
+ <pur_date>'.$self->transformData($item->{added}).'</pur_date>
+ <genres>
+';
+ $result .= $self->transformList($item->{genre}, 'genre');
+ $result .= ' </genres>
+ <publishers>
+ <publisher>'.$self->transformData($item->{editor}).'</publisher>
+ </publishers>
+ <rating>'.$rating.'</rating>
+';
+ if (($item->{borrower}) && ($item->{borrower} ne 'none'))
+ {
+ $result .= ' <loaned>true</loaned>
+';
+ }
+ if ($item->{completion} >= 100)
+ {
+ $result .= ' <completed>true</completed>
+';
+ }
+
+ $result .= ' <cover>'.$imageInfos->{id}.'</cover>
+';
+
+ $result .= ' </entry>
+';
+
+ return $result;
+ }
+
+ sub getGCbooksItem
+ {
+ my ($self, $item, $number) = @_;
+ my $result;
+
+ use integer;
+ my $rating = $item->{rating} / 2;
+ no integer;
+
+ my $imageInfos = $self->encodeImage($item->{cover});
+ $self->{imagesInfos}->{$imageInfos->{id}} = $imageInfos;
+
+ my $year = GCPreProcess::extractYear($item->{publication});
+
+ $result = ' <entry>
+ <title>'.$self->transformData($item->{title}).'</title>
+ <isbn>'.$self->transformData($item->{isbn}).'</isbn>
+ <series>'.$self->transformData($item->{serie}).'</series>
+ <edition>'.$self->transformData($item->{edition}).'</edition>
+ <binding>'.$self->transformData($item->{format}).'</binding>
+ <comments>'.$self->transformData($item->{description}).'</comments>
+ <pages>'.$self->transformData($item->{pages}).'</pages>
+ <pur_date>'.$self->transformData($item->{acquisition}).'</pur_date>
+ <pub_year>'.$year.'</pub_year>
+ <publisher>'.$self->transformData($item->{publisher}).'</publisher>
+ <authors>
+';
+ $result .= $self->transformList($item->{authors}, 'author');
+ $result .= ' </authors>
+ <languages>
+';
+ $result .= $self->transformList($item->{language}, 'language');
+ $result .= ' </languages>
+ <genres>
+';
+ $result .= $self->transformList($item->{genre}, 'genre');
+ $result .= ' </genres>
+ <rating>'.$rating.'</rating>
+';
+ if (($item->{borrower}) && ($item->{borrower} ne 'none'))
+ {
+ $result .= ' <loaned>true</loaned>
+';
+ }
+ if ($item->{read})
+ {
+ $result .= ' <read>true</read>
+';
+ }
+
+ $result .= ' <cover>'.$imageInfos->{id}.'</cover>
+';
+
+ $result .= ' </entry>
+';
+
+ return $result;
+ }
+
+ sub getGCmusicsItem
+ {
+ my ($self, $item, $number) = @_;
+ my $result;
+
+ use integer;
+ my $rating = $item->{rating} / 2;
+ no integer;
+
+ my $imageInfos = $self->encodeImage($item->{cover});
+ $self->{imagesInfos}->{$imageInfos->{id}} = $imageInfos;
+
+ my $year = GCPreProcess::extractYear($item->{release});
+
+ $result = ' <entry>
+ <title>'.$self->transformData($item->{title}).'</title>
+ <medium>'.$self->transformData($item->{format}).'</medium>
+ <year>'.$year.'</year>
+ <label>'.$self->transformData($item->{label}).'</label>
+ <comments>'.$self->transformData($item->{comment}).'</comments>
+ <artists>
+';
+ $result .= $self->transformList($item->{artist}, 'artist');
+ $result .= ' </artists>
+ <genres>
+';
+ $result .= $self->transformList($item->{genre}, 'genre');
+ $result .= ' </genres>
+ <rating>'.$rating.'</rating>
+ <tracks>';
+ foreach (@{$item->{tracks}})
+ {
+ $result .= '
+ <track>
+ <column>'.$self->transformData($_->[1]).'</column>
+ <column>'.$self->transformData($item->{artist}).'</column>
+ <column>'.$self->transformData($_->[2]).'</column>
+ </track>'
+ }
+ $result .= '
+ </tracks>
+';
+
+
+ if (($item->{borrower}) && ($item->{borrower} ne 'none'))
+ {
+ $result .= ' <loaned>true</loaned>
+';
+ }
+ $result .= ' <cover>'.$imageInfos->{id}.'</cover>
+';
+
+ $result .= ' </entry>
+';
+
+ return $result;
+ }
+
+ sub getGCcoinsItem
+ {
+ my ($self, $item, $number) = @_;
+ my $result;
+
+ my $frontInfos = $self->encodeImage($item->{front});
+ $self->{imagesInfos}->{$frontInfos->{id}} = $frontInfos;
+ my $backInfos = $self->encodeImage($item->{back});
+ $self->{imagesInfos}->{$backInfos->{id}} = $backInfos;
+
+ $result = ' <entry>
+ <title>'.$self->transformData($item->{name}).'</title>
+ <type>'.$self->transformData($item->{currency}).'</type>
+ <denomination>'.$self->transformData($item->{value}).'</denomination>
+ <year>'.$self->transformData($item->{year}).'</year>
+ <country>'.$self->transformData($item->{country}).'</country>
+ <set>'.(($item->{type} eq 'coin') ? 'true' : 'false').'</set>
+ <pur_date>'.$self->transformData($item->{added}).'</pur_date>
+ <pur_price>'.$self->transformData($item->{estimate}).'</pur_price>
+ <location>'.$self->transformData($item->{location}).'</location>
+ <comments>'.$self->transformData($item->{comments}).'</comments>
+ <obverse>'.$frontInfos->{id}.'</obverse>
+ <reverse>'.$backInfos->{id}.'</reverse>
+ </entry>
+';
+ return $result;
+ }
+
+ sub getFooter
+ {
+ my $self = shift;
+ my $result;
+
+ $result = ' <images>
+';
+ foreach (values %{$self->{imagesInfos}})
+ {
+ $result .= ' <image id="'.$_->{id}.'" format="'.$_->{format}.
+ '" width="'.$_->{width}.'" height="'.$_->{height}.'">'.
+ $_->{data}.'</image>';
+ }
+ $result .=' </images>
+ </collection>
+</tellico>
+';
+
+ return $result;
+ }
+
+ # postProcess
+ # Called after all processing. Use it if you need to perform extra stuff on the header.
+ # $header is a reference to the header string.
+ sub postProcess
+ {
+ my ($self, $header, $body) = @_;
+
+ # Your code here
+ # As header is a reference, it can be modified on place with $$header
+ }
+
+ # getEndInfo
+ # Used to display some information to user when export is ended.
+ # To localize your message, use $self->{options}->{lang}.
+ # Returns a string that will be displayed in a message box.
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+
+ # Your code here
+ # Don't do put anything in message if you don't want information to be displayed.
+
+ return $message;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCExport/GCExportXML.pm b/lib/gcstar/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..57236ee
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportXML.pm
@@ -0,0 +1,287 @@
+package GCExport::GCExportXML;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ package GCExport::GCExporterXML;
+ use base qw(GCExport::GCExportBaseClass);
+
+ use File::Basename;
+ use GCUtils 'glob';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub transformValue
+ {
+ my ($self, $value, $field) = @_;
+
+ $value = $self->SUPER::transformValue($value, $field);
+ $value =~ s/&(\W)/&amp;$1/g;
+ $value =~ s/"/&#34;/g;
+ #"
+ $value =~ s/'/&#39;/g;
+ #'
+ return $value;
+ }
+
+ sub getName
+ {
+ my $self = shift;
+
+ return "XML";
+ }
+
+ sub getSuffix
+ {
+ my $self = shift;
+
+ return "";
+ }
+
+ sub needsUTF8
+ {
+ my $self = shift;
+
+ return 1;
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+
+ $self->{modelsFiles} = '';
+
+ if ($self->{model}->getName)
+ {
+ $self->{modelsDir} = $ENV{GCS_SHARE_DIR}.'/xml_models/'.$self->{model}->getName;
+ foreach (glob $self->{modelsDir}.'/*')
+ {
+ next if $_ =~ /\/CVS$/;
+ (my $mod = basename($_)) =~ s/_/ /g;
+ $self->{modelsFiles} .= ','.$mod;
+ }
+ }
+
+ return [
+ {
+ name => 'models',
+ type => 'options',
+ label => 'Models',
+ default => 'UseModel',
+ valuesList => 'UseModel,UseFile'.$self->{modelsFiles}
+ },
+
+ {
+ name => 'templatefile',
+ type => 'file',
+ label => 'ModelFile',
+ default => ''
+ },
+
+ {
+ name => 'model',
+ type => 'long text',
+ label => 'ModelText',
+ default => '',
+ height => 100
+ },
+
+ ];
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub wantsImagesSelection
+ {
+ return 1;
+ }
+
+ sub preProcess
+ {
+ my $self = shift;
+
+ my $model;
+
+ if ($self->{options}->{models} eq 'UseModel')
+ {
+ $model = $self->{options}->{model};
+ }
+ else
+ {
+ my $file;
+ if ($self->{options}->{models} eq 'UseFile')
+ {
+ $file = $self->{options}->{templatefile};
+ }
+ else
+ {
+ (my $fileName = $self->{options}->{models}) =~ s/ /_/g;
+ $file = $self->{modelsDir}.'/'.$fileName;
+ $file =~ s/"//g;
+ #"
+ }
+ open FILE, $file;
+ #Read full file
+ $model = do { local $/; <FILE> };
+ close FILE;
+ }
+ $model =~ m{
+ \[HEADER\]\n?(.*?)\n?\[\/HEADER\].*?
+ \[ITEM\]\n?(.*?)\n?\[\/ITEM\].*?
+ \[FOOTER\]\n?(.*?)\n?\[\/FOOTER\]
+ }xms;
+ $self->{header} = $1;
+ $self->{item} = $2;
+ $self->{footer} = $3;
+ return 1;
+ }
+
+ sub getHeader
+ {
+ my ($self, $number) = @_;
+ my $result = $self->{header};
+
+ $result =~ s/\$\{file\}/$self->{options}->{collection}/g;
+ $result =~ s/\$\{number\}/$number/g;
+
+ return $result."\n";
+ }
+
+ sub getItem
+ {
+ my ($self, $item, $number) = @_;
+ my $result = $self->{item};
+
+ while ($result =~ m/\[LOOP\s+(.*?)\]\n?(.*?)\n\s*\[\/LOOP\]/gms)
+ {
+ my $values = $self->transformValue($item->{$1}, $1);
+ my $motif = $2;
+ my $string;
+ foreach my $value(split /,/, $values)
+ {
+ $value =~ s/^\s*//;
+ (my $line = $motif) =~ s/\$\$/$value/gms;
+ $string .= $line;
+ }
+ $result =~ s/(\n?)\s*\[LOOP\s+$1\].*?\[\/LOOP\]/$1$string/gms;
+ }
+
+ while ($result =~ m/\[SPLIT\s+value=(.*?)\s+sep=(.)\]\n?(.*?)\n\s*\[\/SPLIT\]/gms)
+ {
+ my $values = $1;
+ $values = $item->{$values} if exists $item->{$values};
+ $values = $self->transformValue($values, $1);
+ my $sep = ${2};
+ my $motif = ${3};
+ my $i = 0;
+ foreach my $value(split /$sep/, $values)
+ {
+ $value =~ s/^\s*//;
+ $motif =~ s/\$$i/$value/gms;
+ $i++;
+ }
+ do {$motif =~ s/\s*\$[0-9]+//mgs;};
+ $result =~ s/(\n?)\s*\[SPLIT\s+value=\Q$1\E\s+sep=($sep)\].*?\[\/SPLIT\]/$1$motif/gms;
+ }
+
+ foreach (keys %$item)
+ {
+ my $value = $self->transformValue($item->{$_}, $_);
+ $result =~ s/\$\{$_\}/$value/g;
+ }
+
+ if ($item->{time})
+ {
+ my $min = 0;
+ my $time = $item->{time};
+ $min = ($1 * 60) + $2 if ($time =~ /([0-9]*)h\.?\s+([0-9]*)m/)
+ || ($time =~ /([0-9]*):([0-9]*)/);
+ $min = $1 if !$min && ($time =~ /([0-9]*)/);
+ $result =~ s/\$\{length\}/$min/g;
+ }
+
+ if ($item->{date})
+ {
+ my $year = 0;
+ $item->{date} =~ /([0-9]{4})/;
+ $year = $1;
+ $result =~ s/\$\{year\}/$year/g;
+ }
+
+ $result =~ s/\$\{.*?\}//g;
+
+ return $result."\n";
+ }
+
+ sub getFooter
+ {
+ my $self = shift;
+ my $result = $self->{footer};
+
+ return $result."\n";
+ }
+
+ # postProcess
+ # Called after all processing. Use it if you need to perform extra stuff on the header.
+ # $header is a reference to the header string.
+ sub postProcess
+ {
+ my ($self, $header, $body) = @_;
+
+ # Your code here
+ # As header is a reference, it can be modified on place with $$header
+ }
+
+ # getEndInfo
+ # Used to display some information to user when export is ended.
+ # To localize your message, use $self->{options}->{lang}.
+ # Returns a string that will be displayed in a message box.
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+
+ # Your code here
+ # Don't do put anything in message if you don't want information to be displayed.
+
+ return $message;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCExportImport.pm b/lib/gcstar/GCExportImport.pm
new file mode 100644
index 0000000..b73cdd3
--- /dev/null
+++ b/lib/gcstar/GCExportImport.pm
@@ -0,0 +1,526 @@
+package GCExportImport;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+{
+ package GCExportImportBase;
+
+ sub setLangName
+ {
+ my ($self, $langName) = @_;
+
+ $self->{langName} = $langName;
+ }
+
+ sub getLang
+ {
+ my ($self) = @_;
+ if (! $self->{langContainer})
+ {
+ my $langFile = $self->{moduleName};
+ my %tmpLang;
+ eval "use GCLang::".$self->{langName}."::$langFile\n";
+ eval "%tmpLang = %GCLang::".$self->{langName}."::".$langFile."::lang";
+ $self->{langContainer} = \%tmpLang;
+ }
+ return $self->{langContainer};
+ }
+
+ sub getName
+ {
+ my $self = shift;
+
+ return $self->getLang->{Name};
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+ $self->{model} = $model;
+ }
+
+ sub checkModule
+ {
+ my ($self, $module, $version) = @_;
+
+ eval "use $module";
+ ($self->{errors} .= "$module\n", return 0) if $@;
+ return 1 if !defined $version;
+ no strict 'refs';
+ ($self->{errors} .= "$module\n", return 0)
+ if (${$module.'::VERSION'} < $version);
+ return 1;
+ }
+
+ sub checkOptionalModule
+ {
+ my ($self, $module, $version) = @_;
+ # Save errors
+ my $errors = $self->{errors};
+ my $code = $self->checkModule($module, $version);
+ # And restore them so it won't impact detecting if the module is broken
+ $self->{errors} = $errors;
+ return $code;
+ }
+
+ sub hideFileSelection
+ {
+ return 0;
+ }
+
+ sub new
+ {
+ my ($proto) = @_;
+ my $class = ref($proto) || $proto;
+
+ (my $moduleName = $class) =~ s/(GC..port)er/$1/;
+
+ my $self = {moduleName => $moduleName,
+ errors => ''};
+ bless($self, $class);
+ return $self;
+ }
+}
+
+use GCDialogs;
+
+{
+ package GCExportImportDialog;
+ use base 'GCModalDialog';
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+
+ $self->{optionsFrame}->hide if ! $self->{nbOptions};
+ if (($self->{type} eq 'export') && (! $self->{module}->wantsSort))
+ {
+ $self->{sorter}->hide;
+ $self->{sortLabel}->hide;
+ $self->{order}->hide;
+ $self->{orderLabel}->hide;
+ }
+
+ if ($self->{module}->hideFileSelection)
+ {
+ $self->{file}->hide;
+ $self->{labelFile}->hide;
+ }
+
+ $self->resize(1,1);
+ my $ok = 0;
+ while (!$ok)
+ {
+ my $response = $self->run;
+ if ($response eq 'ok')
+ {
+ if (($self->{module}->wantsFieldsSelection)
+ && (scalar @{$self->{fields}} == 0))
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{parent}->{lang}->{ImportExportFieldsEmpty});
+
+ $dialog->set_position('center-on-parent');
+ $dialog->run();
+ $dialog->destroy;
+ next;
+ }
+ my $file = $self->{file}->getValue;
+ if ($file || ! $self->{module}->wantsFileSelection)
+ {
+ my %options = $self->getOptions;
+ $self->addOptions(\%options);
+ $options{model} = $self->{parent}->{model};
+ $options{file} = $file;
+ $options{lang} = $self->{parent}->{lang};
+ $options{fields} = $self->{fields};
+ $options{fieldsInfo} = $self->{parent}->{model}->{fieldsInfo};
+ $options{originalList} = $self->{parent}->{items};
+ $options{parent} = $self->{parent};
+
+ my ($info, $type) = $self->{module}->process(\%options);
+ $type ||= 'info';
+ if ($info)
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ $type,
+ 'ok',
+ $info);
+
+ $dialog->set_position('center-on-parent');
+ $dialog->run();
+ $dialog->destroy ;
+ }
+ $self->{parent}->setNbItems;
+ }
+ else
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{parent}->{lang}->{ImportExportFileEmpty});
+
+ $dialog->set_position('center-on-parent');
+ $dialog->run();
+ $dialog->destroy;
+
+ next;
+ }
+ }
+ $ok = 1;
+ }
+ $self->hide;
+ }
+
+ sub setModule
+ {
+ my ($self, $module) = @_;
+ $self->set_title($self->{title}." [".$module->getName."]");
+ if ($module->wantsDirectorySelection)
+ {
+ $self->{labelFile}->set_label($self->{parent}->{lang}->{FileChooserDirectory});
+ $self->{file}->setTitle($self->{parent}->{lang}->{FileChooserOpenDirectory});
+ $self->{file}->setType('select-folder', 0);
+ }
+ else
+ {
+ $self->{labelFile}->set_label($self->{parent}->{lang}->{ImportExportFile});
+ $self->{file}->setTitle($self->{parent}->{lang}->{FileChooserOpenFile});
+ $self->{file}->setType($self->{fileType}, $self->{withFilter});
+ }
+ $self->{file}->setPatternFilter($module->getFilePatterns)
+ if ($self->{type} eq 'import');
+
+ $module->setModel($self->{parent}->{model});
+ # sorter will only be created for export modules.
+ # It's initialized with the title field
+ if ($self->{sorter})
+ {
+ $self->{sorter}->setModel($self->{parent}->{model});
+ $self->{sorter}->setValue($self->{parent}->{model}->{commonFields}->{title});
+ $self->{sorter}->setValue($module->{options}->{sorter})
+ if exists $module->{options};
+ }
+ if ($self->{order})
+ {
+ $self->{order}->setValue(0);
+ $self->{order}->setValue($module->{options}->{order})
+ if exists $module->{options};
+ }
+ foreach ($self->{optionsTable}->get_children)
+ {
+ $self->{optionsTable}->remove($_);
+ $_->destroy;
+ }
+ my @optionsList = @{$module->getOptions};
+ $self->{optionsTable}->resize($#optionsList + 1, 3)
+ if $#optionsList >= 0;
+
+ $self->{module} = $module;
+ my %options;
+ my $option;
+ my $row = 0;
+ my @widgetSignals;
+ foreach $option (@optionsList)
+ {
+ my $label = $module->getLang->{$option->{label}};
+ if (!$label)
+ {
+ if ($self->{parent}->{model})
+ {
+ $label = $self->{parent}->{model}->getDisplayedText($option->{label});
+ }
+ else
+ {
+ $label = $self->{parent}->{lang}->{$option->{label}};
+ }
+ }
+ my $widget;
+ my @vExpand = ('fill');
+ my $type = $option->{type};
+ my $value = ((exists $module->{options}) ? $module->{options}->{$option->{name}} : $option->{default});
+ if ($type eq 'yesno')
+ {
+ $widget = new GCCheckBox($label);
+ $self->{optionsTable}->attach($widget, 0, 2, $row, $row + 1, 'fill', 'fill', 0, 0);
+ if ($option->{changedCallback})
+ {
+ $widget->signal_connect('toggled' => $option->{changedCallback}, [$self,$widget]);
+ push @widgetSignals, [$widget, 'toggled'];
+ }
+ }
+ elsif ( ($type eq 'short text') ||
+ ($type eq 'long text') ||
+ ($type eq 'number') ||
+ ($type eq 'options') ||
+ ($type eq 'file') ||
+ ($type eq 'history text'))
+ {
+ my $labelWidget = GCLabel->new($label);
+ $self->{optionsTable}->attach($labelWidget, 0, 1, $row, $row + 1, 'fill', 'fill', 0, 0);
+
+ if ($type eq 'short text')
+ {
+ $widget = new GCShortText;
+ }
+ elsif ($type eq 'long text')
+ {
+ $widget = new GCLongText;
+ $widget->set_size_request(-1,$option->{height});
+ push @vExpand, 'expand';
+ }
+ elsif ($type eq 'number')
+ {
+ $widget = new GCNumeric($value, $option->{min}, $option->{max}, $option->{step});
+
+ }
+ elsif ($type eq 'file')
+ {
+ $widget = new GCFile($self, $label, 'open');
+ }
+ elsif ($type eq 'options')
+ {
+ $widget = new GCMenuList;
+ my @valuesList;
+ if (UNIVERSAL::isa( $option->{valuesList}, "HASH" ))
+ {
+ foreach $value(keys %{$option->{valuesList}})
+ {
+ my $item = {
+ value => $value,
+ displayed => $option->{valuesList}->{$value}
+ };
+ $item->{displayed} = $module->getLang->{$item->{displayed}}
+ if ($module->getLang->{$item->{displayed}});
+ push @valuesList, $item;
+ }
+ }
+ else
+ {
+ my @values;
+ @values=split m/,/,$option->{valuesList} if(scalar($option->{valuesList}));
+ @values=@{$option->{valuesList}} if (UNIVERSAL::isa( $option->{valuesList}, "ARRAY" ));
+ foreach $value(@values)
+ {
+ my $item = {
+ value => $value,
+ displayed => $value
+ };
+ $item->{displayed} = $module->getLang->{$item->{displayed}}
+ if ($module->getLang->{$item->{displayed}});
+ push @valuesList, $item;
+ }
+ }
+ $widget->setValues(\@valuesList);
+ if ($option->{changedCallback})
+ {
+ $widget->signal_connect('changed' => $option->{changedCallback}, [$self,$widget]);
+ push @widgetSignals, [$widget, 'changed'];
+ }
+ }
+ elsif ($type eq 'history text')
+ {
+ $widget = new GCHistoryText;
+ my @initValues = @{$option->{initValues}} if $option->{initValues};
+ $widget->setValues(\@initValues);
+ }
+ if ($option->{changedCallback})
+ {
+ $widget->signal_connect('changed' => $option->{changedCallback}, [$self,$widget]);
+ push @widgetSignals, [$widget, 'changed'];
+ }
+ if ($option->{buttonLabel})
+ {
+ my $button = Gtk2::Button->new($module->getLang->{$option->{buttonLabel}});
+ $button->signal_connect('clicked' => $option->{buttonCallback}, [$self,$widget]);
+ $self->{optionsTable}->attach($button, 2, 3, $row, $row + 1, 'fill', 'fill', 0, 0);
+ }
+ $self->{optionsTable}->attach($widget, 1, 2, $row, $row + 1, ['expand', 'fill'], \@vExpand, 0, 0);
+ }
+# elsif ($type eq 'colorSelection')
+# {
+# $widget = new Gtk2::HBox(0,0);
+# $widget->pack_start(new Gtk2::Label($label), 0,0,0);
+# my $entry = new Gtk2::Entry;
+# $entry->set_text($value);
+# $widget->pack_start($entry, 1,1,5);
+#
+# my $button = Gtk2::Button->new_from_stock('gtk-select-color');
+# $button->signal_connect('clicked' => sub {
+# my $dialog = new Gtk2::ColorSelectionDialog($label);
+# my $previous = Gtk2::Gdk::Color->parse($entry->get_text);
+# $dialog->colorsel->set_current_color($previous) if $previous;
+# my $response = $dialog->run;
+# if ($response eq 'ok')
+# {
+# my $color = $dialog->colorsel->get_current_color;
+# my $red = $color->red / 257;
+# my $blue = $color->blue / 257;
+# my $green = $color->green / 257;
+# my $colorString = sprintf ("#%X%X%X", $red, $blue, $green);
+# $entry->set_text($colorString);
+# }
+# $dialog->destroy;
+# });
+# $widget->pack_start($button, 0,0,0);
+# }
+ $widget->set_sensitive(0) if $option->{insensitive};
+ $widget->setValue($value);
+ $self->{parent}->{tooltips}->set_tip($widget,
+ $module->getLang->{$option->{tooltip}})
+ if $option->{tooltip};
+ $options{$option->{name}} = $widget;
+ $row++;
+ }
+
+ $options{withPictures} = new GCCheckBox($self->{parent}->{lang}->{ExportWithPictures});
+ if ($module->wantsImagesSelection)
+ {
+ $self->{optionsTable}->resize($row, 3);
+ my $value = ((exists $module->{options}) ? $module->{options}->{withPictures} : 1);
+ $options{withPictures}->set_active($value);
+ $self->{optionsTable}->attach($options{withPictures}, 0, 2, $row, $row + 1, 'fill', 'fill', 0, 0);
+ $row++;
+ $options{withPictures}->show;
+ }
+ else
+ {
+ $options{withPictures}->set_active(0);
+ }
+
+ if ($module->wantsFieldsSelection)
+ {
+ $self->{optionsTable}->resize($row, 3);
+ $self->{fieldsSelection} = new Gtk2::Button($self->{fieldsButtonLabel});
+ $self->{parent}->{tooltips}->set_tip($self->{fieldsSelection},
+ $self->{fieldsTip});
+ $self->{optionsTable}->attach($self->{fieldsSelection},
+ 0, 1, $row, $row + 1, 'fill', 'fill', 0, 0);
+ $self->{fieldsSelection}->signal_connect('clicked' => sub {
+ $self->{fields} = $self->{fieldsDialog}->getSelectedIds
+ if $self->{fieldsDialog}->show;
+ });
+ $row++;
+ }
+
+ $self->{nbOptions} = $row;
+ $self->{options} = \%options;
+ $self->{optionsFrame}->show_all;
+ foreach my $pair(@widgetSignals)
+ {
+ $pair->[0]->signal_emit($pair->[1])
+ }
+
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ my %result;
+
+ foreach (keys %{$self->{options}})
+ {
+ my $value;
+ my $widget = $self->{options}->{$_};
+ $result{$_} = $widget->getValue;
+ }
+
+ return %result;
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $title, $type) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $okLabel;
+ #$okLabel = $parent->{lang}->{'Menu'.ucfirst($type)};
+ $okLabel = ($type eq 'import') ? 'gtk-convert' : 'gtk-revert-to-saved';
+ $okLabel =~ s/_//g;
+
+ my $self = $class->SUPER::new($parent,
+ $title,
+ $okLabel
+ );
+
+ $self->{parent} = $parent;
+ $self->{title} = $title;
+ $self->{lang} = $parent->{lang};
+ $self->{fields} = [];
+ $self->{type} = $type;
+
+ $self->{optionsFrame} = new GCGroup($parent->{lang}->{OptionsTitle});
+ $self->{optionsTable} = new Gtk2::Table(0,3);
+ $self->{optionsTable}->set_border_width($GCUtils::halfMargin);
+ $self->{optionsTable}->set_col_spacings($GCUtils::margin);
+ $self->{optionsTable}->set_row_spacings($GCUtils::halfMargin);
+ $self->{optionsFrame}->addWidget($self->{optionsTable});
+
+ #$self->{fileVbox} = new Gtk2::VBox(0,0);
+
+ #my $sep = new Gtk2::HSeparator;
+ #my $hbox = new Gtk2::HBox(0,0);
+
+ $self->{dataFrame} = new GCGroup($parent->{lang}->{ImportExportData});
+ $self->{dataTable} = new Gtk2::Table(1,2);
+ $self->{dataTable}->set_border_width($GCUtils::halfMargin);
+ $self->{dataTable}->set_col_spacings($GCUtils::margin);
+ $self->{dataTable}->set_row_spacings($GCUtils::halfMargin);
+ $self->{dataFrame}->addWidget($self->{dataTable});
+
+ $self->{labelFile} = new GCLabel($parent->{lang}->{ImportExportFile});
+ #$hbox->pack_start($labelFile,0,0,5);
+
+ $self->{fileType} = ($type eq 'import') ? 'open' : 'save';
+ $self->{withFilter} = ($self->{type} eq 'import') ? 1 : 0;
+ $self->{file} = new GCFile($self,
+ $parent->{lang}->{FileChooserOpenFile},
+ $self->{fileType},
+ $self->{withFilter});
+
+ #$hbox->pack_start($self->{file},1,1,5);
+
+ #$self->{fileVbox}->pack_start($sep, 0, 0, 2);
+ #$self->{fileVbox}->pack_start($hbox, 0, 0, 10);
+
+ $self->vbox->set_homogeneous(0);
+ $self->vbox->pack_start($self->{optionsFrame},1,1,0);
+ $self->vbox->pack_start($self->{dataFrame},0,0,0);
+ #$self->vbox->pack_start($self->{fileVbox}, 0, 0, 0);
+
+ bless ($self, $class);
+ return $self;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCExtract.pm b/lib/gcstar/GCExtract.pm
new file mode 100644
index 0000000..fb0c251
--- /dev/null
+++ b/lib/gcstar/GCExtract.pm
@@ -0,0 +1,150 @@
+package GCExtract;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use Gtk2;
+
+{
+ package GCExtractDialog;
+
+ use base qw 'Gtk2::Dialog';
+
+ sub show
+ {
+ my $self = shift;
+ return if $self->{cancelled};
+ $self->show_all;
+ my $code = $self->run;
+ if ($code eq 'ok')
+ {
+ foreach (@{$self->{extractedArray}})
+ {
+ $self->{info}->{$_} = ''
+ if (! $self->{$_.'Cb'}->get_active);
+ $self->{panel}->$_($self->{info}->{$_}->{value})
+ if $self->{info}->{$_} && $self->{info}->{$_}->{value};
+ }
+ }
+ $self->hide;
+ }
+
+ sub setInfo
+ {
+ my ($self, $infoExtractor, $panel) = @_;
+ my $info = $infoExtractor->getInfo;
+ if (!defined $info)
+ {
+ $self->{cancelled} = 1;
+ return;
+ }
+ $self->{cancelled} = 0;
+ ($self->{info}, $self->{panel}) = ($info, $panel);
+ foreach (@{$self->{extractedArray}})
+ {
+ next if ! $self->{$_};
+ if ($info->{$_})
+ {
+ $self->{$_}->set_text($info->{$_}->{displayed});
+ $self->{$_}->set_selectable(1);
+ }
+ else
+ {
+ $self->{$_}->set_text('-');
+ $self->{$_}->set_selectable(0);
+ }
+ }
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $model, $infoExtractor) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent->{lang}->{ExtractTitle},
+ $parent,
+ [qw/modal destroy-with-parent/],
+ 'gtk-cancel' => 'cancel'
+ );
+ bless($self, $class);
+
+ $self->{extractedArray} = $infoExtractor->getFields;
+ #['length', 'size', 'type', 'audioEncoding'];
+
+ my $table = new Gtk2::Table(4,2);
+ $table->set_col_spacings(10);
+ $table->set_row_spacings(10);
+ $table->set_border_width(10);
+
+ my $i = 0;
+ foreach (@{$self->{extractedArray}})
+ {
+ (my $capsField = $_) =~ s/^(.)/\U$1\E/;
+ $self->{$_.'Cb'} = new Gtk2::CheckButton($model->getDisplayedLabel($_).$parent->{lang}->{Separator});
+ $self->{$_.'Cb'}->set_active(1);
+ $self->{$_} = new Gtk2::Label;
+ $table->attach($self->{$_.'Cb'}, 0, 1, $i, $i+1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{$_}, 1, 2, $i, $i+1, 'fill', 'fill', 0, 0);
+ $i++;
+ }
+
+ $self->vbox->pack_start($table,1,1,0);
+
+ $self->{importButton} = new Gtk2::Button($parent->{lang}->{ExtractImport});
+ $self->add_action_widget($self->{importButton}, 'ok');
+
+ $self->{parent} = $parent;
+ return $self;
+ }
+}
+
+use GCExportImport;
+
+{
+ package GCItemExtracter;
+ use base 'GCExportImportBase';
+
+ sub getInfo
+ {
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $fileName, $panel, $model) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $fileSize = -s $fileName;
+
+ my $self = {fileName => $fileName,
+ fileSize => $fileSize,
+ parent => $parent,
+ panel => $panel,
+ model => $model};
+
+ bless($self, $class);
+
+ return $self;
+ }
+}
+
+
+1;
diff --git a/lib/gcstar/GCExtract/GCExtractFilms.pm b/lib/gcstar/GCExtract/GCExtractFilms.pm
new file mode 100644
index 0000000..fbcd9f5
--- /dev/null
+++ b/lib/gcstar/GCExtract/GCExtractFilms.pm
@@ -0,0 +1,476 @@
+package GCExtract::GCExtractFilms;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCExtract;
+
+{
+ package GCExtract::GCfilmsExtracter;
+ use base 'GCItemExtracter';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(@_);
+ bless ($self, $class);
+
+ return $self;
+ }
+
+ sub readInt
+ {
+ my ($self, $size) = @_;
+ my $buf;
+
+ $size = 4 if !$size;
+
+ read $self->{file},$buf,$size;
+ return unpack "i",$buf;
+ }
+
+ sub getAviInfo
+ {
+ my $self = shift;
+
+ my $info = {};
+
+ my @audioCodecs;
+ $audioCodecs[0x0001] = 'PCM';
+ $audioCodecs[0x0002] = 'ADPCM';
+ $audioCodecs[0x0030] = 'Dolby AC2';
+ $audioCodecs[0x0050] = 'MPEG';
+ $audioCodecs[0x0055] = 'MP3';
+ $audioCodecs[0x0092] = 'Dolby AC3 SPDIF';
+ $audioCodecs[0x2000] = 'Dolby AC3';
+ $audioCodecs[0x2001] = 'Dolby DTS';
+ $audioCodecs[0x2002] = 'WAVE';
+ $audioCodecs[0x2003] = 'WAVE';
+ $audioCodecs[0x2004] = 'WAVE';
+ $audioCodecs[0x2005] = 'WAVE';
+ $audioCodecs[0x674F] = 'Ogg Vorbis',
+ $audioCodecs[0x6750] = 'Ogg Vorbis',
+ $audioCodecs[0x6751] = 'Ogg Vorbis',
+ $audioCodecs[0x676F] = 'Ogg Vorbis',
+ $audioCodecs[0x6770] = 'Ogg Vorbis',
+ $audioCodecs[0x6771] = 'Ogg Vorbis',
+
+ my $chunkName;
+ seek $self->{file},8,0;
+ read $self->{file},$chunkName,8;
+ return $info if ($chunkName ne 'AVI LIST');
+ seek $self->{file},4,1;
+ read $self->{file},$chunkName,8;
+
+ $self->readInt;
+ my $dwMicroSecPerFrame = $self->readInt;
+ my $dwMaxBytesPerSec = $self->readInt;
+ my $dwReserved1 = $self->readInt;
+ my $dwFlags = $self->readInt;
+ my $dwTotalFrames = $self->readInt;
+ my $dwInitialFrames = $self->readInt;
+ my $dwStreams = $self->readInt;
+ my $dwSuggestedBufferSize = $self->readInt;
+ $info->{width} = $self->readInt;
+ $info->{height} = $self->readInt;
+ my $dwScale = $self->readInt;
+ my $dwRate = $self->readInt;
+ my $dwStart = $self->readInt;
+ my $dwLength = $self->readInt;
+
+ $info->{length} = ($dwTotalFrames * $dwMicroSecPerFrame) / 60000000;
+ $info->{length} = GCUtils::round($info->{length});
+
+ my $buff;
+ my ($gotVids, $gotAuds) = (0,0);
+ while (! eof($self->{file}))
+ {
+ read $self->{file},$chunkName,4;
+ if ($chunkName eq 'strl')
+ {
+ seek $self->{file},8,1;
+ read $self->{file},$buff,4;
+ if ($buff eq 'vids')
+ {
+ read $self->{file},$info->{type},4;
+ $gotVids = 1;
+ }
+ elsif ($buff eq 'auds')
+ {
+ read $self->{file},$info->{audioEncoding},4;
+ $info->{audioEncoding} =~ s/^.*?\w*\W*?$/$1/g;
+ if (!$info->{audioEncoding})
+ {
+ read $self->{file},$chunkName,4 while ($chunkName ne 'strf');
+ seek $self->{file},4,1;
+ my $codec;
+ read $self->{file}, $codec, 2;
+ $codec = unpack "v",$codec;
+ $codec = $audioCodecs[$codec];
+ seek $self->{file}, 2, 1;
+ my $hz = $self->readInt;
+ $info->{audioEncoding} = $codec if $codec;
+ $info->{audioEncoding} .= " ($hz Hz)" if $hz;
+ }
+ $gotAuds = 1;
+ }
+ last if $gotVids && $gotAuds;
+ }
+ last if ($chunkName eq 'movi');
+ }
+
+ return {} if ($buff ne 'vids') && ($buff ne 'auds');
+
+ return $info;
+ }
+
+ sub getMovAtom
+ {
+ my ($self, $wanted, $subAtom) = @_;
+
+ my $copy = $subAtom;
+
+ my ($header, $type, $length);
+ my $atom = 0;
+
+ if ($subAtom)
+ {
+ while ($copy)
+ {
+ $header = substr($copy, 0, 8, '');
+ ($length, $type) = unpack("Na4", $header);
+ last if $type eq $wanted;
+ substr($copy, 0 , $length - 8, '');
+ }
+ if ($copy)
+ {
+ $atom = substr($copy, 0 , $length - 8, '');
+ }
+ }
+ else
+ {
+ while (!eof ($self->{file}))
+ {
+ read $self->{file}, $header, 8;
+ ($length, $type) = unpack("Na4", $header);
+ last if $type eq $wanted;
+ seek $self->{file},$length - 8, 1;
+ }
+ if ($self->{file})
+ {
+ read $self->{file}, $atom, $length - 8;
+ }
+ }
+
+ return $atom;
+ }
+
+ sub getMovInfo
+ {
+ #Inspired from Video::Info::Quicktime_PL
+
+ my $self = shift;
+
+ my $info = {};
+
+ seek $self->{file},0,0;
+
+ my $header;
+
+ my $atom = $self->getMovAtom('moov');
+
+
+ if ($atom)
+ {
+ while (length($atom) > 0)
+ {
+ my ($sublen) = unpack("Na4", substr( $atom, 0, 4, '') );
+ my ($subatom) = substr($atom, 0, $sublen-4, '');
+ my($type) = substr($subatom, 0, 4, '');
+
+ if ($type eq 'mvhd')
+ {
+ my $timeScale = unpack( "Na4", substr($subatom,12,4));
+ my $duration = unpack( "Na4", substr($subatom,16,4));
+ $info->{length} = GCUtils::round($duration / ($timeScale * 60));
+ }
+ elsif ($type eq 'trak')
+ {
+ my $tkhd = $self->getMovAtom('tkhd', $subatom);
+ my $mdia = $self->getMovAtom('mdia', $subatom);
+ next if !$mdia;
+ my $minf = $self->getMovAtom('minf', $mdia);
+ next if !$minf;
+ my $vmhd = $self->getMovAtom('vmhd', $minf);
+ my $smhd = $self->getMovAtom('smhd', $minf);
+ if ($vmhd || $smhd)
+ {
+ my $stbl = $self->getMovAtom('stbl', $minf);
+ my $stsd = $self->getMovAtom('stsd', $stbl);
+
+ if ($vmhd)
+ {
+ my $width = unpack("Na4", substr($tkhd,74,4));
+ my $height = unpack("Na4", substr($tkhd,78,4));
+ ($info->{width}, $info->{height}) = ($width, $height);
+ ($info->{type} = substr($stsd,12,8)) =~ s/\W(.*?)\W/$1/g;
+ }
+ else
+ {
+ ($info->{audioEncoding}= substr($stsd,12,8)) =~ s/\W(.*?)\W/$1/g;
+ }
+ }
+ }
+ }
+ }
+ return $info;
+ }
+
+ sub getMpgInfo
+ {
+ #Inspired from MPEG::Info
+
+ my $self = shift;
+
+ my @frameRates = (
+ 0,
+ 24000/1001,
+ 24,
+ 25,
+ 30000/1001,
+ 30,
+ 50,
+ 60000/1001,
+ 60,
+ );
+
+ my $info = {};
+ $info->{type} = 'MPEG';
+ $info->{audioEncoding} = 'MPEG';
+
+ my $magic;
+ my $numMagic = unpack("N",$self->{magic});
+ while (!eof($self->{file}) && $numMagic != 0x000001b3)
+ {
+ read $self->{file},$magic,4;
+ $numMagic = unpack("N",$magic);
+ seek $self->{file},-3, 1;
+ }
+ seek $self->{file},3, 1;
+ my $size;
+ read $self->{file},$size,3;
+
+ $info->{width} = ((unpack "n",substr($size,0,2)) >> 4);
+ $info->{height} = ((unpack "n",substr($size,1,2)) & 0x0fff);
+
+ my $fps;
+ read $self->{file},$fps,1;
+ $fps = $frameRates[ord($fps) & 0x0f];
+
+ my ($buff1, $buff2);
+ read $self->{file}, $buff1, 2;
+ $buff1 = unpack 'n', $buff1;
+ $buff1 <<= 2;
+ read $self->{file}, $buff2, 1;
+ $buff2 = unpack 'C', $buff2;
+ $buff2 >>=6;
+ my $bitRate = ( ( $buff1 | $buff2 ) * 400);
+
+ $info->{length} = GCUtils::round((($self->{fileSize} * 8 ) / $bitRate) / 60) if $bitRate;
+
+ return $info;
+ }
+
+ sub findOgmPage
+ {
+ #Inspired from Ogg::Vorbis::Header::PurePerl
+
+ my $self = shift;
+ my $char;
+ my $curStr = '';
+
+ my $i = 0;
+ while (read($self->{file}, $char, 1))
+ {
+ $curStr = $char . $curStr;
+ $curStr = substr($curStr, 0, 4);
+ if ($curStr eq 'SggO')
+ {
+ seek $self->{file}, 8, 1;
+ my $serial = $self->readInt(4);
+ return $serial;
+ }
+ }
+ return -1;
+ }
+
+ sub findLastOgmPage
+ {
+ my $self = shift;
+ my $buff;
+ my $curStr = '';
+
+ seek $self->{file}, -5, 2;
+
+ my $i = 0;
+ while (read($self->{file}, $buff, 4))
+ {
+ if ($buff eq 'OggS')
+ {
+ seek $self->{file}, 2, 1;
+ my $granulePos = $self->readInt;
+ return $granulePos;
+ }
+ seek $self->{file}, -5, 1;
+ }
+ return -1;
+ }
+
+ sub getOgmInfo
+ {
+ my $info = {};
+ my $self = shift;
+
+ my $buff;
+ my ($gotAudio, $gotVideo) = (0,0);
+ seek $self->{file}, 0, 0;
+ my $serial = 0;
+ my $videoSerial = -1;
+ my $fps;
+ my $iteration = 0;
+ while ($serial != -1)
+ {
+ $serial = $self->findOgmPage;
+
+ seek $self->{file}, 13, 1;
+ read $self->{file}, $buff, 8;
+ if ($buff =~ /^video/)
+ {
+ read $self->{file}, $info->{type}, 4;
+ my $size = $self->readInt;
+ my $timeUnit = $self->readInt(8);
+ my $spu = $self->readInt(8);
+ $fps = (10000000.0 * $spu) / $timeUnit;
+ my $defaultLen = $self->readInt;
+ my $bufferSize = $self->readInt;
+ my $bbp = $self->readInt;
+ $info->{width} = $self->readInt;
+ $info->{height} = $self->readInt;
+
+ $gotVideo = 1;
+ $videoSerial = $serial;
+ }
+ elsif ($buff =~ /vorbis/)
+ {
+ $info->{audioEncoding} = 'Vorbis';
+ seek $self->{file}, 3, 1;
+ my $hz = $self->readInt;
+ $info->{audioEncoding} .= " ($hz Hz)" if $hz;
+ $gotAudio = 1;
+ }
+ else
+ {
+ last if $iteration > 5;
+ }
+ last if $gotAudio && $gotVideo;
+ $iteration++;
+ }
+ if ($gotVideo)
+ {
+ my $biggestGranulePos = $self->findLastOgmPage;
+ $info->{length} = GCUtils::round(($biggestGranulePos / $fps) / 60);
+ }
+
+ return $info;
+ }
+
+ sub getInfo
+ {
+ my $self = shift;
+
+ open FILE, '<'.$self->{fileName};
+ binmode FILE;
+
+ my $info = {};
+
+ $self->{file} = \*FILE;
+ my $magic;
+ $self->{magic} = $magic;
+ read FILE,$magic,4;
+ my $numMagic = unpack("N",$magic);
+
+ if ($magic eq 'RIFF')
+ {
+ $info = $self->getAviInfo;
+ }
+ elsif ($magic eq 'OggS')
+ {
+ $info = $self->getOgmInfo;
+ }
+ elsif (($numMagic == 0x000001ba) || ($numMagic == 0x000001b3))
+ {
+ $info = $self->getMpgInfo;
+ }
+ else
+ {
+ my $magic2;
+ read FILE,$magic2,4;
+ if ($magic2 =~ /(moov|notp|wide|ftyp)/)
+ {
+ $info = $self->getMovInfo;
+ }
+ }
+
+ close FILE;
+ my $result;
+
+ $result->{time} = {displayed => $info->{length}, value => $info->{length}};
+ $result->{video} = {displayed => $info->{type}, value => $info->{type}};
+ my $currentAudio = $self->{panel}->audio;
+ if ($info->{audioEncoding})
+ {
+ $currentAudio->[0]->[1] = $info->{audioEncoding};
+ $result->{audio}->{value} = $currentAudio;
+ $result->{audio}->{displayed} = $info->{audioEncoding};
+ }
+ if ($info->{width} && $info->{height})
+ {
+ my $comment = $self->{panel}->comment;
+ $comment .= "\n" if $comment && ($comment !~ /\n$/m);
+ $result->{comment}->{displayed} =
+ $self->{model}->getDisplayedText('ExtractSize').$self->{parent}->{lang}->{Separator}.
+ $info->{width}.'*'.$info->{height};
+ $result->{comment}->{value} = $comment . $result->{comment}->{displayed};
+ }
+
+ return $result;
+ }
+
+ sub getFields
+ {
+ return ['time', 'video', 'audio', 'comment'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCExtract/GCExtractMusics.pm b/lib/gcstar/GCExtract/GCExtractMusics.pm
new file mode 100644
index 0000000..1a56b68
--- /dev/null
+++ b/lib/gcstar/GCExtract/GCExtractMusics.pm
@@ -0,0 +1,370 @@
+package GCExtract::GCExtractMusics;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCExtract;
+
+use GCDialogs;
+{
+ package GCExtractMusicsResultsDialog;
+ use base 'GCModalDialog';
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show();
+ $self->show_all;
+ my $response = $self->run;
+ my $idx = ($self->{results}->get_selected_indices)[0];
+ $self->hide;
+ return -1 if $response ne 'ok';
+ return $idx;
+ }
+
+ sub setData
+ {
+ my ($self, @cddbData) = @_;
+ my @listData;
+ foreach(@cddbData)
+ {
+ push @listData, [$_->{genre}, $_->title, $_->artist, $_->year];
+ }
+ @{$self->{results}->{data}} = @listData;
+ $self->{results}->select(0);
+ $self->{results}->columns_autosize;
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $model) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new($parent,
+ $model->getDisplayedText('ResultsDialog'));
+ $self->{parent} = $parent;
+
+ my $hbox = new Gtk2::HBox(0,0);
+
+ $self->{results} = new Gtk2::SimpleList(
+ $model->getDisplayedText('Genre') => 'text',
+ $model->getDisplayedText('Title') => 'text',
+ $model->getDisplayedText('Artist') => 'text',
+ $model->getDisplayedText('Release') => 'text',
+ );
+
+ $self->{results}->set_rules_hint(1);
+ $self->{results}->set_headers_clickable(1);
+ for my $i (0..3)
+ {
+ my $column = $self->{results}->get_column($i);
+ $column->set_resizable(1);
+ $column->set_sort_column_id($i);
+ }
+ $self->{results}->signal_connect(row_activated => sub {
+ $self->response('ok');
+ });
+
+ my $scrollPanelList = new Gtk2::ScrolledWindow;
+ $scrollPanelList->set_policy ('never', 'automatic');
+ $scrollPanelList->set_shadow_type('etched-in');
+ $scrollPanelList->set_border_width($GCUtils::margin);
+ $scrollPanelList->add($self->{results});
+
+ $self->vbox->pack_start($scrollPanelList,1,1,0);
+
+ $self->set_default_size(-1,300);
+ return $self;
+ }
+}
+
+{
+ package GCExtract::GCmusicsExtracter;
+ use base 'GCItemExtracter';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(@_);
+ bless ($self, $class);
+
+ $self->{hasMP3Info} = $self->checkModule('MP3::Info');
+ $self->{hasMP3Tag} = $self->checkModule('MP3::Tag');
+ $self->{hasOggVorbisHeader} = $self->checkModule('Ogg::Vorbis::Header::PurePerl');
+ $self->{hasNetFreeDB} = $self->checkModule('Net::FreeDB');
+ # Even if previous check fails, we want to use it for tracks feature
+ $self->{errors} = 0;
+
+ $self->{fields} = ['title', 'artist', 'release', 'genre', 'running', 'tracks'];
+ return $self;
+ }
+
+ sub resetTracks
+ {
+ my $self = shift;
+ $self->{tracks} = [];
+ $self->{totalTime} = 0;
+ $self->{currentTrack} = 0;
+ $self->{firstTrack} = '';
+ }
+
+ sub addTrack
+ {
+ my ($self, $title, $time, $number) = @_;
+ $self->{currentTrack}++;
+ $self->{totalTime} += $time;
+ $number = $self->{currentTrack} if !defined $number;
+ push @{$self->{tracks}},
+ [$number, $title, $self->secondsToString($time)];
+ }
+
+ sub getTracks
+ {
+ my $self = shift;
+ return $self->{tracks};
+ }
+
+ sub secondsToString
+ {
+ my ($self, $time) = @_;
+ return int($time / 60) .':'. sprintf '%02d', ($time %60);
+ }
+
+ sub getTotalTime
+ {
+ my $self = shift;
+ return $self->secondsToString($self->{totalTime});
+ }
+
+ sub getM3UInfo
+ {
+ my ($self) = @_;
+ my $file = $self->{file};
+ my $info = {};
+ while (<$file>)
+ {
+ chomp;
+ s/\r//;
+ if (/^#/)
+ {
+ next if ! /^#EXTINF:(.*)/;
+ my @values = split /,/, $1;
+ $self->addTrack($values[1], $values[0]);
+ }
+ else
+ {
+ $self->{firstTrack} = $_
+ if !$self->{firstTrack};
+ }
+ }
+ $info->{tracks} = $self->getTracks;
+ $info->{running} = $self->getTotalTime;
+ return $info;
+ }
+
+ sub getPLSInfo
+ {
+ my ($self) = @_;
+ my $file = $self->{file};
+ my $info = {};
+ my @tracks;
+ while (<$file>)
+ {
+ chomp;
+ s/\r//;
+ next if ! /(File|Title|Length)(\d+)=(.*)$/;
+ $tracks[$2]->{$1} = $3;
+ $tracks[$2]->{Number} = $2;
+ }
+ foreach (@tracks)
+ {
+ next if !$_->{Title};
+ $self->addTrack($_->{Title}, $_->{Length}, $_->{Number});
+ }
+
+ $info->{tracks} = $self->getTracks;
+ $info->{running} = $self->getTotalTime;
+ $self->{firstTrack} = $tracks[1]->{File};
+ return $info;
+ }
+
+ sub getFreeDB
+ {
+ my @genres = qw(blues classical country data folk jazz newage reggae rock soundtrack misc);
+ my ($self) = @_;
+ my $file = $self->{fileName};
+ my $info = {};
+ return $info if ! -e $file;
+ return $info if ! $self->{hasNetFreeDB};
+
+ my $freedb = Net::FreeDB->new;
+ my $discdata = $freedb->getdiscdata($file);
+ return if !$discdata;
+ my $cddb_file_object;
+ my @results;
+
+ foreach (@genres)
+ {
+ my $tmpCddb = $freedb->read($_, $discdata->{ID});
+ if ($tmpCddb)
+ {
+ $tmpCddb->{genre} = $tmpCddb->genre || $_;
+ push @results, $tmpCddb;
+ }
+ }
+
+ if ($#results == -1)
+ {
+ return;
+ }
+ elsif ($#results == 0)
+ {
+ $cddb_file_object = $results[0];
+ }
+ else
+ {
+ my $dialog = new GCExtractMusicsResultsDialog(
+ $self->{parent},
+ $self->{model}
+ );
+ $dialog->setData(@results);
+ my $selected = $dialog->show;
+ $dialog->destroy;
+ return if $selected == -1;
+ $cddb_file_object = $results[$selected];
+ }
+
+ foreach my $track ($cddb_file_object->tracks)
+ {
+ $self ->addTrack($track->title,$track->length,$track->number);
+ }
+
+ $info->{tracks} = $self->getTracks;
+ $info->{running} = $self->getTotalTime;
+ $info->{title} = $cddb_file_object->title;
+ $info->{artist} = $cddb_file_object->artist;
+ $info->{release} = $cddb_file_object->year;
+ $info->{genre} = $cddb_file_object->{genre};
+
+ return $info;
+ }
+
+ sub addFirstTrackInfo
+ {
+ my ($self, $info) = @_;
+
+ if ($^O =~ /win32/i)
+ {
+ $self->{firstTrack} =~ s|\\|/|g;
+ $self->{fileName} =~ /^(.{2})/;
+ my $drive = $1;
+ $self->{firstTrack} = $drive.$self->{firstTrack}
+ if $self->{firstTrack} =~ m|^/|;
+ }
+
+ if ($self->{firstTrack} =~ /mp3$/i)
+ {
+ if ($self->{hasMP3Info})
+ {
+ MP3::Info::use_mp3_utf8(1);
+ my $song = MP3::Info::get_mp3tag($self->{firstTrack});
+ $info->{title} = $song->{ALBUM};
+ $info->{artist} = $song->{ARTIST};
+ $info->{release} = $song->{YEAR};
+ $info->{genre} = $song->{GENRE};
+ }
+ elsif ($self->{hasMP3Tag})
+ {
+ my $song = MP3::Tag->new($self->{firstTrack});
+ (undef, undef, $info->{artist}, $info->{title}) = $song->autoinfo;
+ }
+ }
+ elsif ($self->{firstTrack} =~ /ogg$/i)
+ {
+ if ($self->{hasOggVorbisHeader})
+ {
+ my $song = Ogg::Vorbis::Header::PurePerl->new($self->{firstTrack});
+ $info->{title} = ($song->comment('album'))[0];
+ $info->{artist} .= $_.', ' foreach $song->comment('artist');
+ $info->{artist} =~ s/, $//;
+ ($info->{release} = ($song->comment('date'))[0]) =~ s|^(\d{4})-(\d{2})-(\d{2}).*$|$3/$2/$1|;
+ $info->{genre} .= $_.', ' foreach $song->comment('genre');
+ $info->{genre} =~ s/, $//;
+ }
+ }
+ }
+
+ sub getInfo
+ {
+ my $self = shift;
+ my $info = {};
+ $self->resetTracks;
+
+ if ((!$self->{fileName}) || ($self->{fileName} =~ /\/dev\//))
+ {
+ if (!$self->{fileName})
+ {
+ $self->{fileName} = $self->{parent}->{options}->cdDevice;
+ }
+ $info = $self->getFreeDB;
+ }
+ else
+ {
+
+ open FILE, '<'.$self->{fileName};
+ binmode FILE;
+
+ $self->{file} = \*FILE;
+ my $header = <FILE>;
+
+ $info = $self->getM3UInfo
+ if ($self->{fileName} =~ /m3u$/) || ($header =~ /^#EXTM3U/);
+ $info = $self->getPLSInfo
+ if ($self->{fileName} =~ /pls$/) || ($header =~ /^\[playlist\]/);
+ close FILE;
+ }
+
+ $self->addFirstTrackInfo($info);
+
+ return if !defined $info;
+ my $result;
+ my $firstTrackName = $info->{tracks}->[0]->[1];
+ $result->{tracks} = {displayed => $firstTrackName, value => $info->{tracks}};
+ foreach (@{$self->{fields}})
+ {
+ next if /^tracks$/;
+ $result->{$_} = {displayed => $info->{$_}, value => $info->{$_}};
+ }
+ return $result;
+ }
+
+ sub getFields
+ {
+ my $self = shift;
+ return $self->{fields};
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCGenres.pm b/lib/gcstar/GCGenres.pm
new file mode 100644
index 0000000..8f89e24
--- /dev/null
+++ b/lib/gcstar/GCGenres.pm
@@ -0,0 +1,404 @@
+package GCGenres;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use Gtk2;
+
+{
+ package GCGenresGroupsDialog;
+ use base "Gtk2::Dialog";
+ use utf8;
+
+ sub initValues
+ {
+ use locale;
+
+ my $self = shift;
+ my $keepPrevious = shift;
+
+ my %directory;
+
+ if ($keepPrevious)
+ {
+ foreach my $line(@{$self->{categories}->{data}})
+ {
+ $directory{$line->[0]} = $line->[1];
+ }
+ }
+ else
+ {
+ foreach (keys %{$self->{convertor}->{groups}})
+ {
+ $directory{$_} = join ',', @{$self->{convertor}->{groups}->{$_}};
+ }
+ }
+
+ @{$self->{categories}->{data}} = ();
+
+ my @keys = sort keys %directory;
+ @keys = reverse @keys if $self->{reverse};
+ foreach (@keys)
+ {
+ my @infos = [$_, $directory{$_}];
+ push @{$self->{categories}->{data}}, @infos;
+ }
+ $self->{categories}->select(0);
+
+ }
+
+ sub generateString
+ {
+ my $self = shift;
+ my $genresString;
+
+ foreach (@{$self->{categories}->{data}})
+ {
+ $genresString .= $_->[0];
+ $genresString .= '|'.$_->[1].';';
+ }
+ $genresString =~ s/.$//;
+ return $genresString;
+ }
+
+ sub saveValues
+ {
+ my $self = shift;
+
+ my $genresString = $self->generateString;
+
+ $self->{options}->genres($genresString);
+ $self->{convertor}->loadValues;
+ $self->{options}->save;
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->initValues;
+
+ $self->SUPER::show();
+ $self->show_all;
+
+ if ($self->run eq 'ok')
+ {
+ $self->saveValues;
+ }
+ $self->hide;
+ }
+
+ sub removeCurrent
+ {
+ my $self = shift;
+ my @idx = $self->{categories}->get_selected_indices;
+
+ splice @{$self->{categories}->{data}}, $idx[0], 1;
+
+ $self->{categories}->select((($idx[0] - 1) > 0) ? ($idx[0] - 1) : 0);
+ }
+
+ sub add
+ {
+ my $self = shift;
+
+ unshift @{$self->{categories}->{data}}, ['',''];
+ }
+
+ sub editCurrent
+ {
+ my $self = shift;
+
+ my @idxtmp = $self->{categories}->get_selected_indices;
+ my $idx = $idxtmp[0];
+ my $line = $self->{categories}->{data}->[$idx];
+
+ my $dialog = new Gtk2::Dialog($self->{parent}->{lang}->{GenresModify},
+ $self,
+ [qw/modal destroy-with-parent/],
+ @GCDialogs::okCancelButtons
+ );
+
+ my $table = new Gtk2::Table(3,2,0);
+
+ my $labelCategory = new Gtk2::Label($self->{parent}->{lang}->{GenresCategoryName});
+ $table->attach($labelCategory, 0, 1, 0, 1, 'fill', 'fill', 5, 5);
+ my $category = new Gtk2::Entry;
+ $category->set_text($line->[0]);
+ my $hbox1 = new Gtk2::HBox(0,0);
+ $hbox1->pack_start($category,1,1,0);
+ $table->attach($hbox1, 1, 2, 0, 1, 'fill', 'fill', 5, 5);
+
+ my $labelMembers = new Gtk2::Label($self->{parent}->{lang}->{GenresCategoryMembers});
+ $table->attach($labelMembers, 0, 1, 1, 2, 'fill', 'fill', 5, 5);
+ my $members = new Gtk2::Entry;
+ $members->set_text($line->[1]);
+ my $hbox2 = new Gtk2::HBox(0,0);
+ $hbox2->pack_start($members,1,1,0);
+ $table->attach($hbox2, 1, 2, 1, 2, 'fill', 'fill', 5, 5);
+
+ my $labelFoo = new Gtk2::Label('');
+ my $labelBar = new Gtk2::Label('');
+ $table->attach($labelFoo, 0, 1, 2, 3, 'fill', 'fill', 0, 0);
+ $table->attach($labelBar, 1, 2, 2, 3, 'expand', 'expand', 0, 0);
+
+ $dialog->set_default_size(500,1);
+
+ $dialog->vbox->pack_start($table,1,1,0);
+ $dialog->vbox->show_all;
+
+ if ($dialog->run eq 'ok')
+ {
+ splice @{$self->{categories}->{data}}, $idx, 1, [$category->get_text, $members->get_text];
+ }
+
+ $dialog->destroy;
+ }
+
+ sub load
+ {
+ my $self = shift;
+
+ my $response = $self->{loadDialog}->run;
+ if ($response eq 'ok')
+ {
+ my $fileName = $self->{loadDialog}->get_filename;
+ $self->{convertor}->loadValues(undef, $fileName);
+ $self->initValues;
+ }
+ $self->{loadDialog}->hide;
+ }
+
+ sub export
+ {
+ my $self = shift;
+
+ my $response = $self->{exportDialog}->run;
+ if ($response eq 'ok')
+ {
+ my $fileName = $self->{exportDialog}->get_filename;
+ $self->{convertor}->saveValues($self->generateString, $fileName);
+ $self->initValues;
+ }
+ $self->{exportDialog}->hide;
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ @{$self->{categories}->{data}} = ();
+ }
+
+ sub sort
+ {
+ my $self = shift;
+
+ $self->{reverse} = 1 - $self->{reverse};
+
+ $self->{categories}->get_column(0)->set_sort_indicator(1);
+ $self->{categories}->get_column(0)->set_sort_order($self->{reverse} ? 'descending' : 'ascending');
+ $self->initValues(1);
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent->{lang}->{GenresTitle},
+ $parent,
+ [qw/modal destroy-with-parent/],
+ @GCDialogs::okCancelButtons
+ );
+
+ bless ($self, $class);
+
+ $self->set_modal(1);
+ $self->set_position('center');
+ $self->set_default_size(600,400);
+
+ $self->{reverse} = 0;
+
+ $self->{parent} = $parent;
+ $self->{lang} = $parent->{lang};
+ $self->{options} = $parent->{options};
+
+ my $hbox = new Gtk2::HBox(0,0);
+
+ $self->{categories} = new Gtk2::SimpleList($parent->{lang}->{GenresCategoryName} => "text",
+ $parent->{lang}->{GenresCategoryMembers} => "text");
+ $self->{categories}->set_column_editable(0, 1);
+ $self->{categories}->set_column_editable(1, 1);
+ $self->{categories}->set_rules_hint(1);
+ $self->{categories}->get_column(0)->signal_connect('clicked' => sub {
+ $self->sort;
+ });
+ $self->{categories}->get_column(0)->set_sort_indicator(1);
+ $self->{categories}->get_column(0)->set_clickable(1);
+ for my $i (0..1)
+ {
+ $self->{categories}->get_column($i)->set_resizable(1);
+ }
+ $self->{order} = 1;
+ $self->{sort} = -1;
+
+ my $scrollPanelList = new Gtk2::ScrolledWindow;
+ $scrollPanelList->set_policy ('never', 'automatic');
+ $scrollPanelList->set_shadow_type('etched-in');
+ $scrollPanelList->add($self->{categories});
+
+ my $vboxButtons = new Gtk2::VBox(0,0);
+ my $addButton = Gtk2::Button->new_from_stock('gtk-add');
+ $addButton->signal_connect('clicked' => sub {
+ $self->add;
+ });
+ my $removeButton = Gtk2::Button->new_from_stock('gtk-remove');
+ $removeButton->signal_connect('clicked' => sub {
+ $self->removeCurrent;
+ });
+
+ my $clearButton = Gtk2::Button->new_from_stock('gtk-clear');
+ $clearButton->signal_connect('clicked' => sub {
+ $self->clear;
+ });
+
+ my $editButton = Gtk2::Button->new_from_stock('gtk-properties');
+ $editButton->signal_connect('clicked' => sub {
+ $self->editCurrent;
+ });
+ my $openButton = Gtk2::Button->new_from_stock('gtk-open');
+ $openButton->signal_connect('clicked' => sub {
+ $self->load;
+ });
+ my $exportButton = Gtk2::Button->new_from_stock('gtk-save-as');
+ $exportButton->signal_connect('clicked' => sub {
+ $self->export;
+ });
+
+ $vboxButtons->pack_start($addButton,0,0,5);
+ $vboxButtons->pack_start($removeButton,0,0,5);
+ $vboxButtons->pack_start($clearButton,0,0,5);
+ $vboxButtons->pack_start($editButton,0,0,5);
+ $vboxButtons->pack_start($openButton,0,0,5);
+ $vboxButtons->pack_start($exportButton,0,0,5);
+
+ $hbox->pack_start($scrollPanelList,1,1,10);
+ $hbox->pack_start($vboxButtons,0,0,10);
+
+ $self->vbox->pack_start($hbox,1,1,10);
+
+ $self->{convertor} = new GCGenresConvertor($self->{options});
+
+ $self->{loadDialog} = new GCFileChooserDialog($self->{lang}->{GenresLoad}, $self, 'open', 1);
+ $self->{loadDialog}->set_pattern_filter((['*.genres', '*.genres']));
+ $self->{loadDialog}->set_filename($ENV{GCS_SHARE_DIR}.'/genres/');
+
+ $self->{exportDialog} = new GCFileChooserDialog($self->{lang}->{GenresExport}, $self, 'save');
+
+ return $self;
+ }
+}
+
+{
+ package GCGenresConvertor;
+
+ sub new
+ {
+ my ($proto, $options) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {};
+ bless ($self, $class);
+
+ $self->{options} = $options;
+ $self->loadValues($options->genres);
+
+ return $self;
+ }
+
+ sub loadValues
+ {
+ my ($self, $values, $file) = @_;
+
+ $self->{groups} = {};
+ $self->{genres} = {};
+
+ my @groups;
+
+ if ($file)
+ {
+ open FG, "< $file" or return -1;
+ binmode( FG, ':utf8' );
+ foreach(<FG>)
+ {
+ chomp;
+ s/(.*?)\W*$/$1/;
+ push (@groups,$_);
+ }
+ close FG;
+ }
+ else
+ {
+ $values = $self->{options}->genres unless $values;
+ @groups = split /;/, $values;
+ }
+
+ foreach my $group(@groups)
+ {
+ my @details = split /\|/, $group;
+ my $groupName = $details[0];
+ my @groupList;
+ foreach my $genre(split /,/,$details[1])
+ {
+ push @groupList, $genre;
+ $self->{genres}->{uc $genre} = $groupName;
+ }
+ $self->{genres}->{uc $groupName} = $groupName;
+ $self->{groups}->{$groupName} = \@groupList;
+ }
+ }
+
+ sub saveValues
+ {
+ my ($self, $value, $file) = @_;
+
+ open FG, "> $file" or return -1;
+ my @values = split /;/, $value;
+
+ foreach (@values)
+ {
+ print FG "$_\n";
+ }
+ close FG;
+ }
+
+ sub convert
+ {
+ my ($self, $genre) = @_;
+
+ my $ucGenre = uc $genre;
+
+ return $genre if ! exists $self->{genres}->{$ucGenre};
+ return $self->{genres}->{$ucGenre};
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCGraphicComponents/GCBaseWidgets.pm b/lib/gcstar/GCGraphicComponents/GCBaseWidgets.pm
new file mode 100644
index 0000000..f2f9af4
--- /dev/null
+++ b/lib/gcstar/GCGraphicComponents/GCBaseWidgets.pm
@@ -0,0 +1,4023 @@
+package GCBaseWidgets;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+use utf8;
+use Gtk2;
+#use GCBorrowings;
+use Encode;
+
+
+use strict;
+
+our @videoExtensions = ('.aaf','.3gp','.asf','.avi','.flv','.m1v','.m2v','.m4v','.mkv','.mov',
+ '.mp4','.mpeg','.mpg','.mpe','.mxf','.nsv','.ogg','.ogv','.rm','.swf','.wmv',
+ '.iso');
+
+our @ebookExtensions = ('.txt','.htm','.html','.azw','.opf','.tr2','.tr3','.aeh','.fb2','.chm',
+ '.pdf','.ps','.djvu','.lit','.pdb','.dnl','.xeb','.ceb','.lbr','.prc',
+ '.mobi','.epub','.lrf','.lrx','.pdg','.doc','.odt','.cbr','.cbz','.djvu');
+
+our @audioExtensions = ('.m3u','.pls','.asx','.wax','.wvx','.b4s','.kpl','.ram','.smil','.iso',
+ '.cue','.bin','.mp3','.ogg','.oga','.flac');
+
+sub createWidget
+{
+ my ($parent, $info, $comparison) = @_;
+ my $widget;
+ my $withComparisonLabel = 1;
+
+ if ($info->{type} eq 'short text')
+ {
+ if ($comparison eq 'range')
+ {
+ $widget = new GCRange('text', $parent->{lang});
+ $widget->setWidth(16);
+ $withComparisonLabel = 0;
+ }
+ else
+ {
+ $widget = new GCShortText;
+ }
+ }
+ elsif ($info->{type} eq 'number')
+ {
+ #If we want to have values that are less to the specified one,
+ #we use max as default to be sure everything will be returned
+ #in that case.
+ my $default = $info->{min};
+ $default = $info->{max}
+ if $comparison =~ /^l/;
+ if (exists $info->{min})
+ {
+ if ($comparison eq 'range')
+ {
+ $widget = new GCRange('number',
+ $parent->{lang},
+ $info->{min},
+ $info->{max},
+ $info->{step});
+ $widget->setWidth(16);
+ $withComparisonLabel = 0;
+ }
+ else
+ {
+ $widget = new GCNumeric($default,
+ $info->{min},
+ $info->{max},
+ $info->{step});
+ }
+ }
+ else
+ {
+ if ($comparison eq 'range')
+ {
+ $widget = new GCRange('numeric text', $parent->{lang});
+ $widget->setWidth(16);
+ $withComparisonLabel = 0;
+ }
+ else
+ {
+ $widget = new GCCheckedText('0-9.');
+ }
+ }
+ }
+ elsif ($info->{type} eq 'checked text')
+ {
+ $widget = new GCCheckedText($info->{format});
+ }
+ elsif (($info->{type} eq 'history text')
+ || (($info->{type} =~ /list/)
+ && ($info->{history} ne 'false')))
+ {
+ $widget = new GCHistoryText;
+ }
+ elsif ($info->{type} eq 'options')
+ {
+ $widget = new GCMenuList;
+ $widget->setValues($parent->{model}->getValues($info->{values}), $info->{separator});
+ }
+ elsif ($info->{type} eq 'yesno')
+ {
+ $widget = new GCCheckBoxWithIgnore($parent);
+ $withComparisonLabel = 0;
+ }
+ elsif ($info->{type} eq 'date')
+ {
+ if ($comparison eq 'range')
+ {
+ $widget = new GCRange('date', $parent->{lang}, undef, undef, undef, $parent);
+ $widget->setWidth(16);
+ $withComparisonLabel = 0;
+ }
+ else
+ {
+ $widget = new GCDate($parent->{window}, $parent->{lang}, 1,
+ $parent->{options}->dateFormat);
+ }
+ }
+ else
+ {
+ $widget = new GCShortText;
+ }
+
+ return ($widget, $withComparisonLabel);
+}
+
+{
+ package GCGraphicComponent;
+
+ use base 'Exporter';
+ our @EXPORT = qw($somethingChanged);
+ our $somethingChanged = 0;
+
+ sub expand
+ {
+ }
+
+ sub lock
+ {
+ }
+
+ sub getMainParent
+ {
+ my $self = shift;
+ return if ! $self->{parent};
+ my $tmpWidget = $self;
+ $tmpWidget = $tmpWidget->{parent} while $tmpWidget && (! $tmpWidget->isa('GCFrame'));
+ $self->{mainParent} = $tmpWidget;
+ }
+
+ sub acceptMarkup
+ {
+ my $self = shift;
+ return 0;
+ }
+
+ sub cleanMarkup
+ {
+ my ($self, $text, $encodeSubset) = @_;
+ $text =~ s|<br ?/?>|\n|g;
+ if ($encodeSubset)
+ {
+ # Encode only the characters set_markup has issues with
+ $text =~ s|&|&amp;|g;
+ $text =~ s|<|&lt;|g;
+ $text =~ s|>|&gt;|g;
+ }
+ else
+ {
+ $text = GCUtils::encodeEntities($text)
+ }
+ return $text;
+ }
+
+ sub selectAll
+ {
+ }
+
+ sub getTagFromSpan
+ {
+ my ($self, $desc) = @_;
+ my @result = (); #('background' => $self->{background});
+ my @keyvalues = split / /, $desc;
+ foreach (@keyvalues)
+ {
+ /([^=]*)=(.*)/;
+ my $key = $1;
+ my $value = $2;
+ $value =~ s/('|")//g;
+ #"'
+ next if $key =~ /=/;
+ push @result, ($key, $value);
+ }
+ return @result;
+ }
+
+ sub valueToDisplayed
+ {
+ # 1st parameter is self
+ shift;
+ # Here we don't change the value;
+ return shift;
+ }
+
+ sub hasChanged
+ {
+ my $self = shift;
+
+ return $self->{hasChanged};
+ }
+
+ sub setChanged
+ {
+ my $self = shift;
+ $self->{hasChanged} = 1;
+ $somethingChanged = 1;
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ }
+
+ sub setHeight
+ {
+ my ($self, $height) = @_;
+ }
+
+ sub resetChanged
+ {
+ my $self = shift;
+ $self->{hasChanged} = 0;
+ }
+
+ sub activateStateTracking
+ {
+ # We do nothing by default
+ # Other widget should connect a signal handler or something similar
+ # when the content has been changed
+ }
+
+ sub getLinkedValue
+ {
+ }
+ sub setLinkedValue
+ {
+ }
+
+ sub setLinkedComponent
+ {
+ my ($self, $linked) = @_;
+ $self->{linkedComponent} = $linked;
+ }
+}
+
+{
+ package GCPseudoHistoryComponent;
+ #
+ # This is an abstract package handling a little history
+ #
+ sub initHistory
+ {
+ my ($self, $listType) = @_;
+ $self->{history} = {};
+
+ # listType contains the type of the original field:
+ # 0: No list
+ # >0: Multiple list (number of columns)
+ $self->{listType} = $listType;
+
+ $self->{history}->{0} = {'' => 1};
+ for(my $i = 1; $i < $listType; $i++)
+ {
+ $self->{history}->{$i} = {'' => 1};
+ }
+ $self->{listType} = $listType;
+ }
+
+ sub addHistory
+ {
+ my $self = shift;
+
+ my $value = shift;
+ my $i;
+ if (ref($value) eq 'ARRAY')
+ {
+ foreach (@$value)
+ {
+ $i = 0;
+ foreach my $item(@$_)
+ {
+ $self->{history}->{$i}->{$item} = 1;
+ $i++;
+ }
+ }
+ }
+ else
+ {
+ # The separator used was ; instead of ,
+ $value =~ s/;/,/g if $value !~ /,/;
+ my @values = split m/,/, $value;
+ foreach (@values)
+ {
+ my @items = split m/;/;
+ $i = 0;
+ foreach my $item(@items)
+ {
+ $self->{history}->{$i}->{$item} = 1;
+ $i++;
+ }
+ }
+ }
+ }
+
+ sub setDropDown
+ {
+ }
+
+ sub getValues
+ {
+ my $self = shift;
+ my @array;
+
+
+ if ($self->{listType} < 1)
+ {
+ @array = sort keys %{$self->{history}->{0}};
+ }
+ else
+ {
+ foreach (sort keys %{$self->{history}})
+ {
+ my @tmpArray = sort keys %{$self->{history}->{$_}};
+ push @array, \@tmpArray;
+ }
+ }
+ return \@array;
+ }
+
+ sub setValues
+ {
+ my ($self, $values) = @_;
+ if ($self->{listType} == 0)
+ {
+ $self->{history} = {};
+ $self->{history}->{0}->{$_} = 1 foreach (@$values);
+ }
+ else
+ {
+ $self->{history} = {};
+ for (my $i = 0; $i < $self->{listType}; $i++)
+ {
+ $self->{history}->{$i}->{$_} = 1 foreach (@{$values->[$i]});
+ }
+ }
+ }
+}
+
+{
+ package GCLinkedComponent;
+ @GCLinkedComponent::ISA = ('GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $linked) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = {linked => $linked};
+ bless ($self, $class);
+ $linked->setLinkedComponent($self);
+ return $self;
+ }
+
+ sub setValue
+ {
+ my $self = shift;
+ $self->setChanged;
+ return $self->{linked}->setLinkedValue(@_);
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ return $self->{linked}->getLinkedValue(@_);
+ }
+
+ sub resetChanged
+ {
+ my $self = shift;
+ $self->{hasChanged} = 0;
+ return $self->{linked}->resetChanged(@_);
+ }
+
+ sub hide
+ {
+ my $self = shift;
+ $self->{linked}->setLinkedActivated(0);
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->{linked}->setLinkedActivated(1);
+ }
+}
+
+{
+ package GCShortText;
+
+ use Glib::Object::Subclass
+ Gtk2::Entry::
+ ;
+
+ @GCShortText::ISA = ('Gtk2::Entry', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ return if $self->{readOnly};
+ $self->signal_connect('changed' => sub {;
+ $self->setChanged;
+ });
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->getValue eq '';
+ }
+
+ sub selectAll
+ {
+ my $self = shift;
+ $self->select_region(0, length($self->getValue));
+ $self->grab_focus;
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ return $self->get_text;
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+ $self->set_text($value);
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue('');
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ $self->set_width_chars($value);
+ }
+
+ sub setReadOnly
+ {
+ my $self = shift;
+ $self->set_editable(0);
+ $self->{readOnly} = 1;
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+ return if $self->{readOnly};
+ #$self->can_focus(!$locked);
+ $self->set_editable(!$locked);
+ }
+}
+
+our $hasSpellChecker;
+BEGIN {
+ eval 'use Gtk2::Spell';
+ if ($@)
+ {
+ $hasSpellChecker = 0;
+ }
+ else
+ {
+ $hasSpellChecker = 1;
+ }
+}
+{
+ package GCLongText;
+
+
+ use Glib::Object::Subclass
+ Gtk2::ScrolledWindow::
+ ;
+
+ @GCLongText::ISA = ('Gtk2::ScrolledWindow', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+
+ $self->{text} = new Gtk2::TextView;
+ $self->{text}->set_editable(1);
+ $self->{text}->set_wrap_mode('word');
+ $self->set_border_width(0);
+ $self->set_shadow_type('in');
+ $self->set_policy('automatic', 'automatic');
+ #$self->set_size_request(-1,80);
+
+ $self->add($self->{text});
+ $self->{spellChecker} = 0;
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->{text}->get_buffer->signal_connect('changed' => sub {;
+ $self->setChanged;
+ });
+ }
+
+ sub setSpellChecking
+ {
+ my ($self, $activate, $lang) = @_;
+ return if ! $GCGraphicComponents::hasSpellChecker;
+ if ($activate)
+ {
+ $lang ||= $ENV{LANG};
+ if ($self->{spellChecker})
+ {
+ return if $lang eq $self->{lang};
+ $self->setSpellChecking(0)
+ }
+ eval {
+ $self->{spellChecker} = Gtk2::Spell->new_attach($self->{text});
+ $self->{spellChecker}->set_language($lang);
+ $self->{lang} = $lang;
+ };
+ if ($@)
+ {
+ $self->setSpellChecking(0);
+ }
+ }
+ else
+ {
+ $self->{spellChecker}->detach if $self->{spellChecker};
+ $self->{spellChecker} = 0;
+ }
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->getValue eq '';
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ my $buffer = $self->{text}->get_buffer;
+ my $text = $buffer->get_text($buffer->get_start_iter,
+ $buffer->get_end_iter, 1);
+ #$text =~s/\n/<br\/>/g;
+ return $text;
+ }
+
+ sub setValue
+ {
+ my ($self, $text) = @_;
+ #$text =~s/<br\/>/\n/g;
+ $text = '' if !defined $text;
+ $self->{text}->get_buffer->set_text($text);
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue('');
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ $self->{text}->can_focus(!$locked);
+ }
+
+ sub setHeight
+ {
+ my ($self, $height) = @_;
+
+ # TODO Change height
+ }
+}
+
+{
+ package GCHistoryText;
+
+
+ use Glib::Object::Subclass
+ Gtk2::Combo::
+ ;
+
+ @GCHistoryText::ISA = ('Gtk2::Combo', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+ $self->{history} = {'' => 1};
+
+ # Settings for auto-completion
+ $self->{completionModel} = Gtk2::ListStore->new('Glib::String');
+ $self->{completion} = Gtk2::EntryCompletion->new;
+ $self->{completion}->set_model($self->{completionModel});
+ $self->{completion}->set_text_column(0);
+ $self->entry->set_completion($self->{completion});
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->entry->signal_connect('changed' => sub {;
+ $self->setChanged;
+ });
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->getValue eq '';
+ }
+
+ sub selectAll
+ {
+ my $self = shift;
+ $self->entry->select_region(0, -1);
+ $self->entry->grab_focus;
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ my @children = $self->get_children;
+ return $children[0]->get_text if $children[0];
+ }
+
+ sub setValue
+ {
+ my ($self, $text) = @_;
+ my @children = $self->get_children;
+ $children[0]->set_text($text);
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue('');
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ ($self->get_children)[0]->set_width_chars($value);
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ ($self->get_children)[0]->can_focus(!$locked);
+ ($self->get_children)[1]->set_sensitive(!$locked);
+ }
+
+ sub addHistory
+ {
+ my $self = shift;
+ my $value = (scalar @_) ? shift : $self->getValue;
+ my $noUpdate = shift;
+ $value =~ s/^\s*//;
+ if (!exists $self->{history}->{$value})
+ {
+ $self->{history}->{$value} = 1;
+ if (!$noUpdate)
+ {
+ $self->setDropDown(sort keys %{$self->{history}});
+ }
+ }
+ }
+
+ sub setDropDown
+ {
+ my $self = shift;
+ my @values = (scalar @_) ? @_ : sort keys %{$self->{history}};
+ my $previousValue = $self->getValue;
+
+ # Update history list
+ $self->set_popdown_strings(@values);
+
+ # Restore value as it is lost when updating list
+ $self->setValue($previousValue);
+
+ # Update auto-completion list
+ $self->{completionModel}->clear;
+ foreach (@values)
+ {
+ my $iter = $self->{completionModel}->append;
+ $self->{completionModel}->set($iter,
+ 0 => $_);
+ }
+ }
+
+ sub getValues
+ {
+ my $self = shift;
+ my @array = sort keys %{$self->{history}};
+ return \@array;
+ }
+
+ sub setValues
+ {
+ my ($self, $values) = @_;
+ $self->{history} = {};
+ $self->setDropDown(@$values);
+ $self->{history}->{$_} = 1 foreach (@$values);
+ }
+
+ sub setActivate
+ {
+ my $value
+ }
+
+ sub popup
+ {
+ my $self = shift;
+ ($self->get_children)[1]->grab_focus;
+ ($self->get_children)[1]->signal_emit('activate');
+ }
+}
+
+{
+ package GCNumeric;
+
+
+ use Glib::Object::Subclass
+ Gtk2::SpinButton::
+ ;
+
+ @GCNumeric::ISA = ('Gtk2::SpinButton', 'GCRatingWidget', 'GCGraphicComponent');
+
+ use GCWidgets;
+ use GCLang;
+
+ sub new
+ {
+ my ($proto, $default, $min, $max, $step, $format) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self;
+
+ if (($format eq 'text') || (!$format))
+ {
+ # Standard numeric field
+ $step = 1 if !$step;
+ my $pageStep = 10 * $step;
+
+ my $decimals = 0;
+ $decimals = length($1) if $step =~ /\.(.*)$/;
+
+ my $accel = 0;
+ my $values = ($max - $min) / $step;
+ $accel = 0.2 if $values > 100;
+ $accel = 0.5 if $values > 500;
+ $accel = 1.0 if $values > 2000;
+ $default = 0 if $default eq '';
+ my $adj = Gtk2::Adjustment->new($default, $min, $max, $step, $pageStep, 0) ;
+ $self = $class->SUPER::new($adj, $accel, $decimals);
+ $self->{default} = $default;
+ $self->{step} = $step;
+ $self->{pageStep} = $pageStep;
+ $self->{accel} = $accel;
+ $self->{format} = 'text';
+ $self->set_numeric(1);
+ }
+ elsif ($format eq 'graphical')
+ {
+ # Graphical rating widget
+ $default = 0 if $default eq '';
+ $max = 10 if $max eq '';
+
+ $self = GCRatingWidget->new (maxStars=>$max, rating=>$default, direction=>GCLang::languageDirection($ENV{LANG}));
+ $self->{format} = 'graphical';
+ }
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->signal_connect('changed' => sub {;
+ $self->setChanged;
+ });
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ if ($self->{format} eq 'text')
+ {
+ return $self->get_text eq '';
+ }
+ elsif ($self->{format} eq 'graphical')
+ {
+ return $self->get('rating') eq 0;
+ }
+ }
+
+ sub selectAll
+ {
+ my $self = shift;
+ if ($self->{format} eq 'text')
+ {
+ $self->select_region(0, length($self->getValue));
+ }
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ my $value;
+
+ if ($self->{format} eq 'text')
+ {
+ $value = $self->get_text;
+ $value =~ s/,/./;
+ }
+ elsif ($self->{format} eq 'graphical')
+ {
+ $value = $self->get('rating');
+ }
+
+ return $value;
+ }
+
+ sub setValue
+ {
+ my ($self, $text) = @_;
+
+ if ($self->{format} eq 'text')
+ {
+ $text = $self->{default} if $text eq '';
+ $self->set_value($text);
+ }
+ elsif ($self->{format} eq 'graphical')
+ {
+ $text = $self->{default} if $text eq '';
+ $self->set_rating($text);
+ }
+ }
+
+ sub clear
+ {
+ my $self = shift;
+
+ if ($self->{format} eq 'text')
+ {
+ $self->set_value($self->{default});
+ }
+ elsif ($self->{format} eq 'graphical')
+ {
+ $self->set_rating($self->{default});
+ }
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ $self->set_width_chars($value);
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ if ($self->{format} eq 'text')
+ {
+ $self->can_focus(!$locked);
+ my $step = ($locked ? 0 : $self->{step});
+ $self->set_increments($step, $self->{pageStep});
+ }
+ elsif ($self->{format} eq 'graphical')
+ {
+ $self->set(sensitive=>!$locked);
+ }
+ }
+}
+
+{
+ package GCCheckedText;
+
+ use Glib::Object::Subclass
+ Gtk2::Entry::
+ ;
+
+ @GCCheckedText::ISA = ('GCShortText');
+
+ sub new
+ {
+ my ($proto, $format) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+ my $forbidden = qr/[^$format]/;
+ $self->signal_connect('insert-text' => sub {
+ # Remove forbidden characters
+ $_[1] =~ s/$forbidden//g;
+ () # this callback must return either 2 or 0 items.
+ });
+
+ return $self;
+ }
+}
+
+{
+ package GCRange;
+
+ use Glib::Object::Subclass
+ Gtk2::HBox::
+ ;
+
+ @GCRange::ISA = ('Gtk2::HBox', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $type, $lang, $min, $max, $step, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+
+ if ($type eq 'text')
+ {
+ $self->{from} = new GCShortText;
+ $self->{to} = new GCShortText;
+ }
+ elsif ($type eq 'numeric text')
+ {
+ new GCCheckedText('0-9.');
+ $self->{to} = new GCCheckedText('0-9.');
+ }
+ elsif ($type eq 'date')
+ {
+ $self->{from} = new GCDate($parent->{window}, $lang, 1,
+ $parent->{options}->dateFormat);
+ $self->{to} = new GCDate($parent->{window}, $lang, 1,
+ $parent->{options}->dateFormat);
+ }
+ else
+ {
+ $self->{from} = new GCNumeric($min, $min, $max, $step);
+ $self->{to} = new GCNumeric($max, $min, $max, $step);
+ }
+ $self->pack_start(Gtk2::Label->new($lang->{PanelFrom}), 0, 0, 12);
+ $self->pack_start($self->{from}, 1, 1, 0);
+ $self->pack_start(Gtk2::Label->new($lang->{PanelTo}), 0, 0, 12);
+ $self->pack_start($self->{to}, 1, 1, 0);
+
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->{from}->activateStateTracking;
+ $self->{to}->activateStateTracking;
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->getValue eq '';
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ return $self->{from}->getValue.';'.$self->{to}->getValue;
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+ my @values = split m/;/, $value;
+ $self->{from}->setValue($values[0]);
+ $self->{to}->setValue($values[0]);
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ $self->{from}->setWidth($value / 2);
+ $self->{to}->setWidth($value / 2);
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ $self->{from}->lock(!$locked);
+ $self->{to}->lock(!$locked);
+ }
+
+ sub signal_connect
+ {
+ my $self = shift;
+ $self->{from}->signal_connect(@_);
+ $self->{to}->signal_connect(@_);
+ }
+
+ sub AUTOLOAD
+ {
+ my $self = shift;
+ my $name = our $AUTOLOAD;
+ return if $name =~ /::DESTROY$/;
+ $name =~ s/.*?::(.*)/$1/;
+ $self->{from}->$name(@_);
+ $self->{to}->$name(@_);
+ }
+}
+
+{
+ package GCDate;
+
+ use Glib::Object::Subclass
+ Gtk2::HBox::
+ ;
+
+ @GCDate::ISA = ('Gtk2::HBox', 'GCGraphicComponent');
+
+ sub selectValue
+ {
+ my $self = shift;
+ $self->{dialog} = new GCDateSelectionDialog($self->{mainParent})
+ if ! $self->{dialog};
+ $self->{dialog}->date($self->getRawValue);
+ if ($self->{dialog}->show)
+ {
+ $self->setValue($self->{dialog}->date);
+ }
+ $self->{parent}->showMe;
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $lang, $reverseDate, $format) = @_;
+ $format ||= '%d/%m/%Y';
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+
+ $self->{parent} = $parent;
+ $self->getMainParent;
+ $self->{reverseDate} = $reverseDate;
+ $self->{entry} = Gtk2::Entry->new; #_with_max_length(10);
+ $self->{entry}->set_width_chars(12);
+ $self->{button} = new Gtk2::Button($lang->{PanelDateSelect});
+ $self->{button}->signal_connect('clicked' => sub {
+ $self->selectValue;
+ });
+ $self->pack_start($self->{entry}, 1, 1, 0);
+ $self->pack_start($self->{button}, 0, 0, 0);
+
+ $self->{format} = $format;
+ #$self->{format} = '%d %B %Y';
+ return $self;
+ }
+
+ sub setFormat
+ {
+ my ($self, $format) = @_;
+ my $current = $self->getValue;
+ $self->{format} = $format;
+ $self->setValue($current);
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->{entry}->signal_connect('changed' => sub {;
+ $self->setChanged;
+ });
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->getValue eq '';
+ }
+
+ sub getCurrentDate
+ {
+ my $self = shift;
+
+ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+ return sprintf('%02d/%02d/%4d', $mday, $mon+1, 1900+$year);
+ }
+
+
+ sub getRawValue
+ {
+ my $self = shift;
+ my $value = $self->{entry}->get_text;
+ $value = GCUtils::strToTime($value, $self->{format})
+ if $self->{format} && $value;
+ return $value;
+
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ my $value = $self->getRawValue;
+ return GCPreProcess::reverseDate($value) if $self->{reverseDate};
+ return $value;
+ }
+
+ sub setValue
+ {
+ my ($self, $text) = @_;
+ $text = GCPreProcess::restoreDate($text) if $self->{reverseDate};
+ if ($text eq 'current')
+ {
+ $text = $self->getCurrentDate;
+ $self->setChanged;
+ }
+ $text = GCUtils::timeToStr($text, $self->{format}) if $self->{format};
+ $self->{entry}->set_text($text);
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue('');
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ $self->{entry}->set_width_chars($value);
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ $self->{entry}->can_focus(!$locked);
+ $self->{button}->set_sensitive(!$locked);
+ }
+}
+
+{
+ package GCFile;
+
+ use Glib::Object::Subclass
+ Gtk2::HBox::
+ ;
+
+ @GCFile::ISA = ('Gtk2::HBox', 'GCGraphicComponent', 'GCPseudoHistoryComponent');
+
+ use File::Basename;
+
+ sub selectValue
+ {
+ my $self = shift;
+
+ my $dialog = GCFileChooserDialog->new($self->{title},
+ $self->{mainParent},
+ $self->{type},
+ $self->{withFilter});
+ $dialog->set_filename($self->getValue);
+ $dialog->set_pattern_filter($self->{patterns})
+ if $self->{patterns};
+ my $response = $dialog->run;
+ if ($response eq 'ok')
+ {
+ $self->setValue($dialog->get_filename);
+ }
+ $dialog->hide;
+ $self->{parent}->showMe;
+ }
+
+ sub setPatternFilter
+ {
+ my ($self, $patterns) = @_;
+ $self->{patterns} = $patterns;
+ }
+
+ sub setType
+ {
+ my ($self, $type, $withFilter) = @_;
+
+ if (($type ne $self->{type}) || ($withFilter != $self->{withFilter}))
+ {
+ $self->{dialog}->destroy
+ if $self->{dialog};
+ $self->{dialog} = undef;
+ $self->{type} = $type;
+ $self->{withFilter} = $withFilter;
+ }
+ }
+
+ sub setTitle
+ {
+ my ($self, $title) = @_;
+ $self->{title} = $title;
+ if ($self->{dialog})
+ {
+ $self->{dialog}->setTitle($title);
+ }
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $title, $type, $withFilter, $defaultValue, $allowContextMenu, $fieldType) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+ $self->{parent} = $parent;
+ $self->getMainParent;
+
+ $title ||= $self->{parent}->{lang}->{PanelSelectFileTitle};
+ $self->{title} = $title;
+ $type ||= 'open';
+ $self->{type} = $type;
+ $withFilter = 0 if !$withFilter;
+ $self->{withFilter} = $withFilter;
+
+ $self->{entry} = Gtk2::Entry->new;
+
+ $self->{button} = new GCButton($self->{parent}->{lang}->{PanelSelectFileTitle});
+
+ # For video/ebook/audio files, set file pattern filters
+ if (($fieldType eq 'video') || ($fieldType eq 'ebook') || ($fieldType eq 'audio'))
+ {
+ $self->setPatternFilter([$self->{parent}->{lang}->{FileVideoFiles}, \@videoExtensions])
+ if ($fieldType eq 'video');
+ $self->setPatternFilter([$self->{parent}->{lang}->{FileEbookFiles}, \@ebookExtensions])
+ if ($fieldType eq 'ebook');
+ $self->setPatternFilter([$self->{parent}->{lang}->{FileAudioFiles}, \@audioExtensions])
+ if ($fieldType eq 'audio');
+ $self->{withFilter} = 1;
+ }
+
+ $self->{button}->signal_connect('clicked' => sub {
+ $self->selectValue;
+ });
+
+ if ($allowContextMenu)
+ {
+ my @subMenuFileChoose;
+ $subMenuFileChoose[0] = Gtk2::ImageMenuItem->new_with_mnemonic($parent->{lang}->{ContextChooseFile});
+ $subMenuFileChoose[0]->signal_connect("activate" , sub {$self->selectValue});
+ $subMenuFileChoose[1] = Gtk2::ImageMenuItem->new_with_mnemonic($parent->{lang}->{ContextChooseFolder});
+ $subMenuFileChoose[1]->signal_connect("activate" , sub {
+ $self->{type} = 'select-folder';
+ $self->{title} = $parent->{lang}->{ContextChooseFolder};
+ $self->selectValue;
+ });
+ $self->{button}->setContextMenu(\@subMenuFileChoose);
+ $self->{button}->enableContextMenu;
+ }
+
+ $self->pack_start($self->{entry}, 1, 1, 0);
+
+ if ($defaultValue)
+ {
+ $self->{defaultButton} = GCButton->newFromStock('gtk-undo', 0, $parent->{lang}->{PanelRestoreDefault});
+ $parent->{tooltips}->set_tip($self->{defaultButton},
+ $parent->{lang}->{PanelRestoreDefault}.$parent->{lang}->{Separator}.$defaultValue)
+ if $parent->{tooltips};
+ $self->pack_start($self->{defaultButton}, 0, 0, 0);
+ $self->{defaultButton}->signal_connect('clicked' => sub {
+ $self->setValue($defaultValue);
+ });
+ }
+
+ # Add the 'select file' button only if the field is not a url field
+ $self->pack_start($self->{button}, 0, 0, 0)
+ if ($fieldType ne 'url');
+
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->{entry}->signal_connect('changed' => sub {;
+ $self->setChanged;
+ });
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->getValue eq '';
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ return $self->{entry}->get_text;
+ }
+
+ sub setValue
+ {
+ my ($self, $text) = @_;
+ $self->{entry}->set_text($text);
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue('');
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ $self->{entry}->set_width_chars($value);
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ $self->{entry}->can_focus(!$locked);
+ $self->{button}->set_sensitive(!$locked);
+ }
+}
+
+{
+ package GCUrl;
+
+ use Glib::Object::Subclass
+ Gtk2::HBox::
+ ;
+
+ @GCUrl::ISA = ('GCFile');
+
+ sub selectValue
+ {
+ my $self = shift;
+ my $url = $self->getValue;
+ return if !$url;
+ $self->{opener}->launch($url, 'url');
+ }
+
+ sub new
+ {
+ my ($proto, $opener) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new(undef, '', 'url');
+ $self->{opener} = $opener;
+ bless ($self, $class);
+ return $self;
+ }
+}
+
+{
+ package GCButton;
+
+ use Glib::Object::Subclass
+ Gtk2::Button::
+ ;
+
+ @GCButton::ISA = ('Gtk2::Button', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $label) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new($label);
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub newFromStock
+ {
+ my ($proto, $stock, $nolabel, $label) = @_;
+ my $class = ref($proto) || $proto;
+
+ $nolabel = 0 if ($^O =~ /win32/i);
+
+ my $self = $class->SUPER::new_from_stock($stock);
+
+ if ($nolabel)
+ {
+ my $tmpWidget = $self;
+ $tmpWidget = $tmpWidget->child while ! $tmpWidget->isa('Gtk2::HBox');
+ ($tmpWidget->get_children)[1]->destroy;
+ }
+ elsif ($label)
+ {
+ my $tmpWidget = $self;
+ $tmpWidget = $tmpWidget->child while ! $tmpWidget->isa('Gtk2::HBox');
+ ($tmpWidget->get_children)[1]->set_label($label);
+ }
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return 0;
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+ $self->setChanged;
+ return $value;
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue('');
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ $self->set_sensitive(!$locked);
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ $self->set_size_request($value, -1);
+ }
+ sub setContextMenu
+ {
+ my ($self, $menu) = @_;
+ $self->{popupContextMenu}=new Gtk2::Menu if !$self->{popupContextMenu};
+ for my $i(0..$#{$self->{popupContextMenu}->{items}})
+ {
+ $self->{popupContextMenu}->remove($self->{popupContextMenu}->{items}->[$i]);
+ $self->{popupContextMenu}->{items}->[$i]->destroy;
+ }
+ delete $self->{popupContextMenu}->{items};
+ for my $i(0..$#$menu)
+ {
+ $self->{popupContextMenu}->{items}->[$i]=$menu->[$i];
+ $self->{popupContextMenu}->append($self->{popupContextMenu}->{items}->[$i]);
+ }
+ $self->{popupContextMenu}->show_all;
+ }
+ sub enableContextMenu
+ {
+ my ($self,$button) = @_;
+ #TODO enabled context for one button mouses
+ $button=3 if !$button;
+ $self->{contextMenuSignalHandler}=$self->signal_connect('button_press_event' => sub {
+ my ($widget, $event) = @_;
+ return 0 if $event->button ne $button;
+ $self->{popupContextMenu}->popup(undef, undef, undef, undef, $event->button, $event->time);
+ return 0;
+ }) if !$self->{contextMenuSignalHandler};
+ }
+ sub disableContextMenu
+ {
+ my $self = shift;
+ if($self->{contextMenuSignalHandler})
+ {
+ $self->signal_handler_disconnect($self->{contextMenuSignalHandler});
+ delete $self->{contextMenuSignalHandler};
+ }
+ }
+}
+
+{
+ package GCUrlButton;
+
+ use Glib::Object::Subclass
+ Gtk2::Button::
+ ;
+
+ @GCUrlButton::ISA = ('GCButton', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $label, $opener) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new($label);
+ $self->{opener}=$opener;
+ $self->{defaultLabel} = $label;
+ $self->{clicSignalHandler}=$self->signal_connect('clicked' => sub {
+ $self->{opener}->launch($self->{url}, 'url');
+ });
+
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+
+ return $self->{value};
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+
+ $self->setChanged;
+ my @urls=split ';',$value;
+ if(scalar(@urls)>1)
+ {
+ my (@menu,$i,$url);
+ foreach my $urlName(@urls)
+ {
+ $urlName =~ /^(.*?)##(.*)$/;
+ my $name=$2;
+ my $menuItem=Gtk2::MenuItem->new_with_label($name);
+ $menuItem->signal_connect("activate" ,sub {
+ $self->{opener}->launch($_[1], 'url')
+ },$1);
+ push @menu,$menuItem;
+ }
+ $self->{url} ='';
+ $self->setContextMenu(\@menu);
+ $self->enableContextMenu(1);
+ $self->lock(0);
+ #$self->signal_handler_block($self->{clicSignalHandler});
+ $self->setLabel($self->{defaultLabel});
+ }
+ else
+ {
+ if ($value =~ /^(.*?)##(.*)$/)
+ {
+ $self->{url} = $1;
+ $self->setLabel($2);
+ }
+ else
+ {
+ $self->{url} = $value;
+ $self->setLabel($self->{defaultLabel});
+ }
+ $self->lock(!$self->{url});
+ $self->disableContextMenu;
+ #$self->signal_handler_unblock($self->{clicHandler});
+ }
+ $self->{value} = $value;
+ }
+
+ sub setLabel
+ {
+ my ($self, $label) = @_;
+ $self->set_label($label);
+ }
+}
+
+{
+ package GCCheckBox;
+
+ use Glib::Object::Subclass
+ Gtk2::CheckButton::
+ ;
+
+ @GCCheckBox::ISA = ('Gtk2::CheckButton', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $label) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new($label);
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+
+ $self->signal_connect('toggled' => sub {
+ $self->setChanged;
+ });
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return 0;
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ return 1 if ($self->get_active);
+ return 0;
+ }
+
+ sub getValueAsText
+ {
+ my $self = shift;
+ return 'true' if ($self->get_active);
+ return 'false';
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+ $self->set_active($value);
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue(0);
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ $self->set_sensitive(!$locked);
+ }
+}
+
+{
+ package GCCheckBoxWithIgnore;
+
+ use Glib::Object::Subclass
+ Gtk2::HBox::
+ ;
+
+ @GCCheckBoxWithIgnore::ISA = ('Gtk2::HBox', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new(0,0);
+ bless ($self, $class);
+
+ $self->{check}->[0] = new Gtk2::RadioButton(undef,$parent->{lang}->{CheckUndef});
+ $self->{group} = $self->{check}->[0]->get_group;
+ $self->{check}->[1] = new Gtk2::RadioButton($self->{group},$parent->{lang}->{CheckNo});
+ $self->{check}->[2] = new Gtk2::RadioButton($self->{group},$parent->{lang}->{CheckYes});
+
+ $self->pack_start($self->{check}->[0], 0, 0, 10);
+ $self->pack_start($self->{check}->[1], 0, 0, 10);
+ $self->pack_start($self->{check}->[2], 0, 0, 10);
+
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+
+ foreach (@{$self->{check}})
+ {
+ $_->signal_connect('toggled' => sub {
+ $self->setChanged;
+ });
+ }
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->{check}->[0]->get_active;
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ my $i = 0;
+ foreach (@{$self->{check}})
+ {
+ last if $self->{check}->[$i]->get_active;
+ $i++;
+ }
+ $i--;
+ return $i;
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+ $self->{check}->[$value + 1]->set_active(1);
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue(-1);
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ $self->set_sensitive(!$locked);
+ }
+}
+
+{
+ package GCMultipleList;
+
+ use Glib::Object::Subclass
+ Gtk2::HBox::
+ ;
+
+ @GCMultipleList::ISA = ('Gtk2::HBox', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $parent, $number, $labels, $withHistory, $readonly, $useFiles,$types) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new(0,0);
+
+ $self->{number} = $number;
+ $self->{readonly} = $readonly;
+ $self->{withHistory} = $withHistory;
+
+ my $hboxActions = new Gtk2::HBox(0,0);
+
+ my @histories;
+ my @listColumns;
+ my $i;
+ for $i (0..($number - 1))
+ {
+ push @histories, {'' => 1};
+ push @listColumns, ($labels->[$i] => 'text');
+ next if $readonly;
+ if ($useFiles)
+ {
+ $self->{entries}->[$i] = GCFile->new($parent);
+ $self->{entries}->[$i]->{entry}->signal_connect('activate' => sub {
+ $self->addValues;
+ });
+ }
+ else
+ {
+ if($types && $types->[$i] eq 'date')
+ {
+ $self->{entries}->[$i] = GCDate->new($parent, $parent->{lang}, 1,$parent->{options}->dateFormat);
+ $self->{entries}->[$i]->{entry}->signal_connect('activate' => sub {
+ $self->addValues;
+ $self->{entries}->[0]->grab_focus;
+ });
+ $self->{withHistoryField}->[$i]=0;
+ }
+ elsif ($withHistory && (!$types || $types->[$i] eq 'history'))
+ {
+ $self->{entries}->[$i] = GCHistoryText->new;
+ $self->{entries}->[$i]->entry->signal_connect('activate' => sub {
+ my $widget = $self->{entries}->[$i];
+ if ($widget->getValue)
+ {
+ $self->addValues;
+ # FIXME. It seems this does nothing:
+ $self->{entries}->[0]->grab_focus;
+ }
+ $widget->entry->signal_stop_emission_by_name('activate');
+ });
+ $self->{withHistoryField}->[$i]=1;
+ }
+ else
+ {
+ $self->{entries}->[$i] = GCShortText->new;
+ $self->{entries}->[$i]->signal_connect('activate' => sub {
+ $self->addValues;
+ $self->{entries}->[0]->grab_focus;
+ });
+ $self->{withHistoryField}->[$i]=0 if $withHistory;
+ }
+ }
+ $self->{entries}->[$i]->setWidth(12);
+ $hboxActions->pack_start($self->{entries}->[$i], 1, 1, 6);
+ }
+
+ $self->{histories} = [\@histories];
+
+ $self->{box} = new Gtk2::VBox(0,0);
+
+ # If list belongs to an expander, set box size to a reasonable size
+ $self->{box}->{signalHandler} = $self->{box}->signal_connect('size-allocate' => sub {
+ if (($self->{realParent}) && ($self->{realParent}->isa('GCExpander')))
+ {
+ my $width = $self->allocation->width - ( 2 * $GCUtils::margin) ;
+ $self->{box}->set_size_request(($width >= -1) ? $width : -1 , -1);
+ return 0;
+ }
+ });
+
+ $self->{list} = new Gtk2::SimpleList(@listColumns);
+ for $i (0..($number - 1))
+ {
+ $self->{list}->set_column_editable($i, 1);
+ }
+ $self->{list}->unset_rows_drag_source;
+ $self->{list}->unset_rows_drag_dest;
+ $self->{list}->set_reorderable(1);
+ #($self->{list}->get_column(0)->get_cell_renderers)[0]->set('wrap-mode' => 'word');
+
+ for $i (0..($number - 1))
+ {
+ $self->{list}->get_column($i)->set_resizable(1);
+ }
+ my $scroll = new Gtk2::ScrolledWindow;
+ $scroll->set_policy ('automatic', 'automatic');
+ $scroll->set_shadow_type('etched-in');
+ $scroll->set_size_request(-1, 120);
+ $scroll->add($self->{list});
+ $self->{box}->pack_start($scroll, 1, 1, 2);
+ if (!$readonly)
+ {
+ $self->{addButton} = GCButton->newFromStock('gtk-add', 0);
+ $self->{addButton}->signal_connect('clicked' => sub {
+ $self->addValues;
+ });
+ $self->{removeButton} = GCButton->newFromStock('gtk-remove', 0);
+ $hboxActions->pack_start($self->{addButton}, 0, 0, 6);
+ $hboxActions->pack_start($self->{removeButton}, 0, 0, 6);
+ }
+ else
+ {
+ $self->{removeButton} = GCButton->newFromStock('gtk-remove', 0);
+ $self->{clearButton} = GCButton->newFromStock('gtk-clear', 0);
+ $self->{clearButton}->signal_connect('clicked' => sub {
+ $self->clear;
+ });
+ $hboxActions->pack_start($self->{removeButton}, 1, 0, 6);
+ $hboxActions->pack_start($self->{clearButton}, 1, 0, 6);
+ }
+ $self->{box}->pack_start($hboxActions, 0, 0, 6)
+ if $readonly < 2;
+
+ $self->{removeButton}->signal_connect('clicked' => sub {
+ my @idx = $self->{list}->get_selected_indices;
+ my $selected = $idx[0];
+ splice @{$self->{list}->{data}}, $selected, 1;
+ $selected-- if ($selected >= scalar(@{$self->{list}->{data}}));
+ $selected = 0 if $selected < 0 ;
+ $self->{list}->select($selected);
+ });
+
+ $self->{list}->signal_connect('key-press-event' => sub {
+ my ($widget, $event) = @_;
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+ if ((!$self->{readonly}) && ($key eq 'Delete'))
+ {
+ $self->{removeButton}->activate;
+ return 1;
+ }
+ # Let key be managed by Gtk2
+ return 0;
+ });
+
+
+ $self->pack_start($self->{box},1,$self->{readonly},0);
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->{list}->get_model->signal_connect('row-inserted' => sub {
+ $self->setChanged;
+ });
+ $self->{list}->get_model->signal_connect('row-deleted' => sub {
+ $self->setChanged;
+ });
+ $self->{list}->get_model->signal_connect('row-changed' => sub {
+ $self->setChanged;
+ });
+ }
+
+ sub expand
+ {
+ my $self = shift;
+ $self->set_child_packing($self->{box},1,1,0,'start');
+ }
+
+ sub addValues
+ {
+ my ($self, @values) = @_;
+ if (!$self->{readonly})
+ {
+ for my $i (0..($self->{number} - 1))
+ {
+ $values[$i] = $self->{entries}->[$i]->getValue if !$values[$i];
+ $self->{entries}->[$i]->addHistory($values[$i])
+ if $self->{withHistory} && $self->{withHistoryField}->[$i];
+ $self->{entries}->[$i]->clear;
+ }
+ }
+ # Check that at least one value is not empty
+ my $isEmpty = 1;
+ for my $val (@values)
+ {
+ if ($val)
+ {
+ $isEmpty = 0;
+ last;
+ }
+ }
+ if (!$isEmpty)
+ {
+ push @{$self->{list}->{data}}, \@values;
+ $self->{list}->select($#{$self->{list}->{data}});
+ my $path = $self->{list}->get_selection->get_selected_rows;
+ $self->{list}->scroll_to_cell($path) if $path;
+ }
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->getValue eq '';
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ my $formated = shift;
+
+ if ($formated)
+ {
+ return GCPreProcess::multipleList($self->{list}->{data}, $self->{number});
+ }
+ else
+ {
+ # As data in list is a tied array, we need to copy all the values
+ my @value;
+ foreach (@{$self->{list}->{data}})
+ {
+ push @value, [];
+ foreach my $col(@$_)
+ {
+ push @{$value[-1]}, $col;
+ }
+ }
+ return \@value;
+ }
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+
+ if (ref($value) eq 'ARRAY')
+ {
+ @{$self->{list}->{data}} = @{$value};
+ }
+ else
+ {
+ # The separator used was ; instead of ,
+ $value =~ s/;/,/g if $value !~ /,/;
+ @{$self->{list}->{data}} = ();
+ my @values = split m/,/, $value;
+ foreach my $entry (@values)
+ {
+ my @items = split m/;/, $entry;
+ s/^\s*// foreach(@items);
+ push @{$self->{list}->{data}}, \@items;
+ }
+ }
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue('');
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+ return if $self->{readonly};
+ $self->{addButton}->set_sensitive(!$locked);
+ $self->{removeButton}->set_sensitive(!$locked);
+ foreach (@{$self->{entries}})
+ {
+ $_->lock($locked);
+ }
+ }
+
+ sub addHistory
+ {
+ my $self = shift;
+ my $value = (scalar @_) ? shift : $self->getValue;
+ my $noUpdate = shift;
+
+ return if $self->{readonly};
+ my $i;
+ my $item;
+ if (ref($value) eq 'ARRAY')
+ {
+ foreach (@$value)
+ {
+ $i = 0;
+ foreach $item(@$_)
+ {
+ $self->{entries}->[$i]->addHistory($item, $noUpdate) if $self->{withHistoryField}->[$i];
+ $i++;
+ }
+ }
+ }
+ else
+ {
+ # The separator used was ; instead of ,
+ $value =~ s/;/,/g if $value !~ /,/;
+ my @values = split m/,/, $value;
+ foreach (@values)
+ {
+ my @items = split m/;/;
+ $i = 0;
+ foreach my $item(@items)
+ {
+ $self->{entries}->[$i]->addHistory($item, $noUpdate) if $self->{withHistoryField}->[$i];
+ $i++;
+ }
+ #push @{$self->{list}->{data}}, \@items;
+ }
+ }
+ }
+
+ sub setDropDown
+ {
+ my $self = shift;
+
+ my $i = 0;
+ foreach (@{$self->{entries}})
+ {
+ $_->setDropDown if $self->{withHistoryField}->[$i];
+ $i++;
+ }
+ }
+
+ sub getValues
+ {
+ my $self = shift;
+ return [] if $self->{readonly};
+ my @array;
+ my $i=0;
+ foreach (@{$self->{entries}})
+ {
+ my $val=[];
+ $val=$_->getValues if ($self->{withHistoryField}->[$i++]);
+ push @array, $val;
+ }
+ # = sort keys %{$self->{history}};
+ return \@array;
+ }
+
+ sub setValues
+ {
+ my ($self, $values) = @_;
+ return if $self->{readonly};
+ my $i = 0;
+ foreach (@$values)
+ {
+ $self->{entries}->[$i]->setValues($_) if ($self->{withHistoryField}->[$i]);
+ $i++;
+ }
+ }
+}
+
+
+{
+ package GCItemImage;
+
+ use Glib::Object::Subclass
+ Gtk2::Image::
+ ;
+
+ @GCItemImage::ISA = ('Gtk2::Image', 'GCGraphicComponent');
+
+ use File::Spec;
+ use File::Basename;
+
+ sub new
+ {
+ my ($proto, $options, $parent, $fixedSize, $width, $height) = @_;
+ my $class = ref($proto) || $proto;
+# my $self = Gtk2::Image->new_from_file($parent->{defaultImage});
+ my $self = Gtk2::Image->new;
+ $self->{options} = $options;
+ #$self->{defaultImage} = $defaultImage;
+ $self->{parent} = $parent;
+ $self->{displayedImage} = '';
+ $self->{fixedSize} = $fixedSize;
+ bless ($self, $class);
+ if ($width && $height)
+ {
+ $self->{width} = $width;
+ $self->{height} = $height;
+ }
+ else
+ {
+ $self->{width} = 120;
+ $self->{height} = 160;
+ }
+ $self->{immediate} = 0;
+ return $self;
+ }
+
+ sub setImmediate
+ {
+ my ($self) = @_;
+ $self->{immediate} = 1;
+ }
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->{trackState} = 1;
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->getValue eq '';
+ }
+
+ sub setValue
+ {
+ my ($self, $displayedImage, $placer) = @_;
+ $self->{displayedImage} = $displayedImage;
+ $self->setChanged if $self->{trackState};
+ if ($self->{immediate})
+ {
+ $self->setPicture;
+ }
+ else
+ {
+ Glib::Source->remove($self->{timer})
+ if $self->{timer};
+ $self->{timer} = Glib::Timeout->add(100, sub {
+ $self->setPicture;
+ $placer->placeImg if $placer;
+ return 0;
+ });
+ }
+ }
+
+ sub setPicture
+ {
+ my $self = shift;
+ $self->{timer} = 0;
+ my $displayedImage = GCUtils::getDisplayedImage($self->{displayedImage},
+ $self->{parent}->{defaultImage},
+ $self->{options}->file);
+ my $pixbuf;
+ eval
+ {
+ $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($displayedImage);
+ };
+ if ($@)
+ {
+ $displayedImage = $self->{parent}->{defaultImage};
+ $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($displayedImage);
+ }
+ $self->{realImage} = $displayedImage;
+ $pixbuf = GCUtils::scaleMaxPixbuf($pixbuf, $self->{width}, $self->{height});
+ $self->set_from_pixbuf($pixbuf);
+ $self->set_size_request($self->{width}, $self->{height}) if $self->{fixedSize};
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ return $self->{displayedImage};
+ }
+
+ sub getFile
+ {
+ my $self = shift;
+ return $self->{realImage};
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue('');
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ $self->{width} = $value;
+ }
+
+ sub setHeight
+ {
+ my ($self, $value) = @_;
+ $self->{height} = $value;
+ }
+
+ sub getSize
+ {
+ my $self = shift;
+ my $pixbuf = $self->get_pixbuf;
+ return ($pixbuf->get_width, $pixbuf->get_height);
+ }
+}
+
+
+our $hasGnome2VFS;
+BEGIN {
+ eval 'use Gnome2::VFS';
+ if ($@)
+ {
+ $hasGnome2VFS = 0;
+ }
+ else
+ {
+ $hasGnome2VFS = 1;
+ Gnome2::VFS->init();
+ }
+}
+
+{
+ package GCImageButton;
+
+ use Glib::Object::Subclass
+ Gtk2::Button::
+ ;
+
+ @GCImageButton::ISA = ('Gtk2::Button', 'GCGraphicComponent');
+
+ use File::Basename;
+ use Encode;
+
+ sub animateImg
+ {
+ my ($self, $from, $to) = @_;
+ my $pixbuf1 = Gtk2::Gdk::Pixbuf->new_from_file($from);
+ $pixbuf1 = GCUtils::scaleMaxPixbuf($pixbuf1, $self->{img}->{width}, $self->{img}->{height});
+ my $pixbuf2 = Gtk2::Gdk::Pixbuf->new_from_file($to);
+ $pixbuf2 = GCUtils::scaleMaxPixbuf($pixbuf2, $self->{img}->{width}, $self->{img}->{height});
+ my $height = $pixbuf2->get_height;
+ my $width = $pixbuf2->get_width;
+ foreach my $i(0..20)
+ {
+ Glib::Timeout->add(30*$i, sub {
+ my $pixbufA = $pixbuf1->copy;
+ my $pixbufB = $pixbuf2->copy;
+ $pixbufA->composite($pixbufB, 0, 0, int($width - (($i/20)*$width)), $height, 0, 0, 1, 1, 'nearest', 255);
+ $self->{img}->set_from_pixbuf($pixbufB);
+ });
+ }
+ }
+
+ sub setImg
+ {
+ my ($self, $value) = @_;
+ $self->{img}->setValue($value, $self);
+ }
+
+ sub placeImg
+ {
+ my ($self) = @_;
+ my ($picWidth, $picHeight) = $self->{img}->getSize;
+ my ($buttonWidth, $buttonHeight) = ($self->allocation->width, $self->allocation->height);
+ my $x = ($buttonWidth - $picWidth - $GCUtils::margin)/ 2;
+ my $y = ($buttonHeight -$picHeight - $GCUtils::margin)/ 2;
+
+ # Don't allow negative positions, can happen when button has not been allocated a width/height yet
+ $x = 0 if ($x < 0);
+ $y = 0 if ($y < 0);
+
+ $self->{layout}->move($self->{img}, $x, $y);
+ }
+
+ sub changeState
+ {
+ my $self = shift;
+ if ($self->{trackState})
+ {
+ if ($self->{flipped})
+ {
+ $self->{linkedComponent}->setChanged;
+ }
+ else
+ {
+ $self->setChanged;
+ }
+ }
+ }
+
+ sub clearImage
+ {
+ my $self = shift;
+
+ $self->changeState;
+ $self->{mainParent}->checkPictureToBeRemoved($self->{imageFile});
+ $self->setValueWithParent('');
+ }
+
+ sub changeImage
+ {
+ my ($self, $fileName) = @_;
+ return 0 if $self->{locked};
+ if (!$fileName)
+ {
+ my $imageDialog = GCFileChooserDialog->new($self->{parent}->{lang}->{PanelImageTitle}, $self->{mainParent}, 'open');
+ $imageDialog->setWithImagePreview(1);
+
+ my $currentFile = $self->{img}->getValue;
+ if ($currentFile)
+ {
+ $imageDialog->set_filename($currentFile);
+ }
+ else
+ {
+ $imageDialog->set_filename($self->{previousDirectory});
+ }
+ my $response = $imageDialog->run;
+ $fileName = $imageDialog->get_filename;
+ $imageDialog->destroy;
+
+ $self->{parent}->showMe;
+ if ($response eq 'ok')
+ {
+ $self->{previousDirectory} = dirname($fileName);
+ $self->setChanged if $self->{trackState};
+ }
+ else
+ {
+ return;
+ }
+ }
+
+ my $ref = ($self->{flipped} ? $self->{backPic} : $self->{imageFile});
+ if ($fileName ne $ref)
+ {
+ $self->{mainParent}->checkPictureToBeRemoved($ref);
+ $self->changeState;
+ }
+ my $image = $self->{mainParent}->transformPicturePath($fileName);
+ $self->setValueWithParent($image);
+ return;
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->getValue eq '';
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+ $self->setChanged if $self->{trackState};
+ $self->setActualValue($value);
+ }
+
+ sub setValueWithParent
+ {
+ my ($self, $value, $keepWatcher) = @_;
+
+ $self->setActualValue($value, $keepWatcher, $self->{flipped});
+ if ($self->{isCover} && !$self->{flipped})
+ {
+ $self->{mainParent}->{items}->updateSelectedItemInfoFromPanel(0, [$self->{name}]);
+ $self->{hasChanged} = 0 if $self->{parent} eq $self->{mainParent}->{panel} && !$keepWatcher;
+ }
+ }
+
+ sub setActualValue
+ {
+ my ($self, $value, $keepWatcher, $flipped) = @_;
+ Glib::Source->remove($self->{fileWatcher})
+ if $self->{fileWatcher} && !$keepWatcher;
+ if ($flipped)
+ {
+ $self->{backPic} = $value;
+ }
+ else
+ {
+ $self->{imageFile} = $value;
+ }
+ $self->setImg($value);
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ if ($self->{flipped})
+ {
+ return $self->{imageFile};
+ }
+ return $self->{img}->getValue;
+ }
+
+ sub setLinkedActivated
+ {
+ my ($self, $value) = @_;
+ $self->flipImage(1) if $self->{flipped};
+ $self->{flipActivated} = $value;
+ }
+
+ sub flipImage
+ {
+ my ($self, $noButton) = @_;
+ my $newLabel;
+ if ($self->{flipped})
+ {
+ $self->setImg($self->{imageFile});
+ $self->{frontFlipImage}->show if !$noButton;
+ $self->{backFlipImage}->hide;
+ #$self->animateImg($self->{backPic}, $self->{imageFile});
+ }
+ else
+ {
+ $self->setImg($self->{backPic});
+ $self->{backFlipImage}->show if !$noButton;
+ $self->{frontFlipImage}->hide;
+ #$self->animateImg($self->{imageFile}, $self->{backPic});
+ }
+ $self->{flipped} = !$self->{flipped};
+ }
+
+ sub setLinkedValue
+ {
+ my ($self, $linkedValue) = @_;
+ $self->setChanged if $self->{trackState};
+ $self->{backPic} = $linkedValue;
+ $self->setImg($linkedValue) if $self->{flipped};
+ }
+
+ sub getLinkedValue
+ {
+ my ($self, $linkedValue) = @_;
+ return $self->{backPic};
+ }
+
+ sub setLinkedComponent
+ {
+ my ($self, $linked) = @_;
+ $self->{linkedComponent} = $linked;
+
+ $self->{flipActivated} = 1;
+ $self->{frontFlipImage} = Gtk2::Image->new_from_file($ENV{GCS_SHARE_DIR}.'/overlays/flip.png');
+ $self->{frontFlipImage}->set_no_show_all(1);
+ $self->{backFlipImage} = Gtk2::Image->new_from_file($ENV{GCS_SHARE_DIR}.'/overlays/flip2.png');
+ $self->{backFlipImage}->set_no_show_all(1);
+ my $pixbuf = $self->{frontFlipImage}->get_pixbuf;
+ my ($picWidth, $picHeight) = ($pixbuf->get_width, $pixbuf->get_height);
+
+ $self->{addedFlipButton} = 0;
+ $self->signal_connect('enter' => sub {
+ return if ! $self->{flipActivated};
+ if (!$self->{addedFlipButton})
+ {
+ $self->{flipX} = $self->{width} - $picWidth - $GCUtils::margin;
+ $self->{flipY} = $self->{height} - $picHeight - $GCUtils::margin;
+ $self->{layout}->put($self->{frontFlipImage},
+ $self->{flipX},
+ $self->{flipY});
+ $self->{layout}->put($self->{backFlipImage},
+ $self->{flipX},
+ $self->{flipY});
+ $self->{addedFlipButton} = 1;
+ }
+ if ($self->{flipped})
+ {
+ $self->{backFlipImage}->show;
+ }
+ else
+ {
+ $self->{frontFlipImage}->show;
+ }
+ });
+ $self->signal_connect('leave' => sub {
+ $self->{frontFlipImage}->hide;
+ $self->{backFlipImage}->hide;
+ });
+ $self->signal_connect('button-release-event' => sub {
+ return 0 if ! $self->{flipActivated};
+ my ($button, $event) = @_;
+ my ($x, $y) = $event->get_coords;
+ if (($x > $self->{flipX}) && ($y > $self->{flipY}))
+ {
+ $self->flipImage;
+ $self->set_sensitive(0);
+ $self->released;
+ $self->set_sensitive(1);
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ });
+
+ $self->signal_connect('key-press-event' => sub {
+ return 0 if ! $self->{flipActivated};
+ my ($widget, $event) = @_;
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+
+ if (($key eq 'f') || ($key eq 'BackSpace'))
+ {
+ $self->flipImage;
+ return 1;
+ }
+ return 0;
+ });
+
+ $self->signal_connect('query_tooltip' => sub {
+ my ($window, $x, $y, $keyboard_mode, $tip) = @_;
+ return if $self->{settingTip};
+ $self->{settingTip} = 1;
+ if ($self->{flipActivated} && ($x > $self->{flipX}) && ($y > $self->{flipY}))
+ {
+ $self->{tooltips}->set_tip($self, $self->{flipped} ?
+ $self->{parent}->{lang}->{ContextImgFront} :
+ $self->{parent}->{lang}->{ContextImgBack});
+ }
+ else
+ {
+ $self->{tooltips}->set_tip($self, $self->{tip});
+ }
+ $self->{settingTip} = 0;
+ return 0;
+ });
+
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue('');
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $img, $isCover, $default) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+
+ $default = 'view' if !$default;
+
+ $self->{layout} = new Gtk2::Fixed;
+ $self->{layout}->put($img, 0, 0);
+ $self->add($self->{layout});
+
+ $self->{img} = $img;
+ $self->{default} = $default;
+ #$self->set_size_request(130,170);
+ $self->{width} = -1;
+ $self->{height} = -1;
+ $self->{imageFile} = $img->getValue;
+
+ # True if this is the cover used in image mode
+ $self->{isCover} = $isCover;
+
+ $self->{parent} = $parent;
+ $self->getMainParent;
+ $self->{tooltips} = $self->{mainParent}->{tooltips};
+
+ $self->{tip} = ($default eq 'open') ? $parent->{lang}->{PanelImageTipOpen} : $parent->{lang}->{PanelImageTipView};
+ $self->{tip} .= $parent->{lang}->{PanelImageTipMenu};
+ $self->{tooltips}->set_tip($self, $self->{tip});
+
+ $self->signal_connect('button_press_event' => sub {
+ my ($widget, $event) = @_;
+ return 0 if $event->button ne 3;
+ $self->createContextMenu();
+ $self->{imgContext}->popup(undef, undef, undef, undef, $event->button, $event->time);
+ return 0;
+ });
+
+ $self->signal_connect('clicked' => sub {
+ $self->changeImage if $self->{default} eq 'open';
+ $self->showImage if $self->{default} eq 'view';
+ return 1;
+ });
+
+ #Drag and drop a picture on a button
+ $self->drag_dest_set('all', ['copy','private','default','move','link','ask']);
+ my $target_list = Gtk2::TargetList->new();
+ my $atom1 = Gtk2::Gdk::Atom->new('text/uri-list');
+ my $atom2 = Gtk2::Gdk::Atom->new('text/plain');
+ $target_list->add($atom1, 0, 0);
+ $target_list->add($atom2, 0, 0);
+ if ($^O =~ /win32/i)
+ {
+ my $atom2 = Gtk2::Gdk::Atom->new('DROPFILES_DND');
+ $target_list->add($atom2, 0, 0);
+ }
+ $self->drag_dest_set_target_list($target_list);
+ $self->signal_connect(drag_data_received => sub {
+ my ($widget, $context, $widget_x, $widget_y, $data, $info,$time) = @_;
+ my @files = split /\n/, $data->data;
+ my $fileName = $files[0];
+ if ($fileName =~ /^http/)
+ {
+ $fileName = $self->{mainParent}->downloadPicture($fileName);
+ }
+ else
+ {
+ $fileName = Glib::filename_from_uri $fileName;
+ $fileName = decode('utf8', $fileName);
+ $fileName =~ s|^file://?(.*)\W*$|$1|;
+ $fileName =~ s|^/*|| if ($^O =~ /win32/i);
+ $fileName =~ s/.$//ms;
+ $fileName =~ s/%20/ /g;
+ }
+ $self->changeImage($fileName);
+ });
+
+ $self->{previousDirectory} = '';
+ $self->{flipped} = 0;
+ $self->{flipActivated} = 0;
+
+ return $self;
+ }
+
+ sub createContextMenu
+ {
+ my $self = shift;
+
+ my $parent;
+ $parent = $self->{parent};
+
+ $self->{imgContext} = new Gtk2::Menu;
+
+ if ($parent->{options}->tearoffMenus)
+ {
+ $self->{imgContext}->append(Gtk2::TearoffMenuItem->new());
+ }
+
+ $self->{itemOpen} = Gtk2::ImageMenuItem->new_with_mnemonic($parent->{lang}->{ContextChooseImage});
+ my $itemOpenImage = Gtk2::Image->new_from_stock('gtk-open', 'menu');
+ $self->{itemOpen}->set_image($itemOpenImage);
+ # This item will be deactivated if the component is locked
+ $self->{itemOpen}->set_sensitive(!$self->{locked});
+ $self->{itemOpen}->signal_connect("activate" , sub {
+ $self->changeImage;
+ });
+ $self->{imgContext}->append($self->{itemOpen});
+ $self->{itemShow} = Gtk2::ImageMenuItem->new_from_stock('gtk-zoom-100',undef);
+ $self->{itemShow}->signal_connect("activate" , sub {
+ $self->showImage;
+ });
+ # Disable for default image
+ $self->{itemShow}->set_sensitive(0) if $self->isDefaultImage();
+ $self->{imgContext}->append($self->{itemShow});
+
+ if ($self->{linkedComponent})
+ {
+ $self->{itemFlip} = Gtk2::MenuItem->new($self->{flipped} ?
+ $parent->{lang}->{ContextImgFront} :
+ $parent->{lang}->{ContextImgBack});
+ $self->{itemFlip}->signal_connect("activate" , sub {
+ $self->flipImage;
+ });
+ $self->{imgContext}->append($self->{itemFlip});
+ }
+
+ $self->{itemClear} = Gtk2::ImageMenuItem->new_from_stock('gtk-clear',undef);
+ # This item will be deactivated if the component is locked
+ $self->{itemClear}->set_sensitive(!$self->{locked});
+ $self->{itemClear}->signal_connect("activate" , sub {
+ $self->clearImage;
+ });
+ $self->{imgContext}->append($self->{itemClear});
+ # Disable for default image
+ $self->{itemClear}->set_sensitive(0) if $self->isDefaultImage();
+ $self->{imgContext}->show_all;
+
+ my $itemOpenWith = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{ContextOpenWith});
+ $self->{menuOpenWith} = Gtk2::Menu->new;
+
+ if ($hasGnome2VFS && ($parent->{options}->programs eq 'system' || $parent->{options}->imageEditor eq ''))
+ {
+ # Get applications for mime types corresponding with image
+
+ # Get all editors/viewers for jpeg file format
+ my $mimeTest = Gnome2::VFS::Mime::Type->new ("image/jpeg");
+ my @mimeList = $mimeTest->get_short_list_applications;
+
+ # Add applications to open with list
+ foreach (@mimeList)
+ {
+ my $launchApp = $_;
+ my $item = Gtk2::MenuItem->new_with_mnemonic($launchApp->get_name);
+ $item->signal_connect ('activate' => sub {
+ $self->openWith($launchApp);
+ });
+ $self->{menuOpenWith}->append($item);
+ }
+
+ #Gnome2::VFS -> shutdown();
+ }
+ elsif ($parent->{options}->programs eq 'system' || $parent->{options}->imageEditor eq '')
+ {
+ # Can't parse applications, so use system default app
+ my $item = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{ContextImageEditor});
+
+ my $command;
+ $command = ($^O =~ /win32/i) ? ''
+ : ($^O =~ /macos/i) ? '/usr/bin/open'
+ : $ENV{GCS_SHARE_DIR}.'/helpers/xdg-open';
+
+ # Not sure if this is correct, haven't tested with Windows:
+ if ($^O =~ /win32/i)
+ {
+ $command = '"'.$command.'"' if $command;
+ }
+
+ $item->signal_connect ('activate' => sub {
+ $self->openWithImageEditor($command);
+ });
+
+ $self->{menuOpenWith}->append($item);
+ }
+ else
+ {
+ # Use user defined app
+ my $item = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{ContextImageEditor});
+ $item->signal_connect ('activate' => sub {
+ $self->openWithImageEditor($parent->{options}->imageEditor);
+ });
+
+ $self->{menuOpenWith}->append($item);
+ }
+
+
+ $itemOpenWith->set_submenu($self->{menuOpenWith});
+
+ # Disable for default image
+ $itemOpenWith->set_sensitive(0) if $self->isDefaultImage();
+
+ $self->{imgContext}->append($itemOpenWith);
+ $self->{imgContext}->show_all;
+
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->{trackState} = 1;
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ $self->{locked} = $locked;
+ }
+
+ sub showImage
+ {
+ my $self = shift;
+ $self->{mainParent}->launch($self->{img}->getValue, 'image');
+ }
+
+ sub isDefaultImage
+ {
+ my ($self) = @_;
+
+ if ($self->{img}->getFile eq $self->{parent}->{defaultImage})
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+ sub openWith
+ {
+ my ($self, $app) = @_;
+ my $cmd;
+ my $escFileName;
+
+ # Ultra hacky workaround, because $app->{launch} segfaults. See http://bugzilla.gnome.org/show_bug.cgi?id=315049
+ # Probably should change to gvfs when perl modules are available
+
+ if ($app->{command} =~ m/(\w*)/)
+ {
+ $cmd = $1;
+ }
+
+ $escFileName = $self->{img}->getFile;
+ $escFileName =~ s/\ /%20/g;
+ $self->editPicture("$cmd file://$escFileName");
+ }
+
+ sub openWithImageEditor
+ {
+ my ($self, $editor) = @_;
+ my $file = $self->{img}->getFile;
+ $file =~ s|/|\\|g if ($^O =~ /win32/i);
+ $self->editPicture("$editor \"$file\"");
+ }
+
+ sub editPicture
+ {
+ my ($self, $commandLine) = @_;
+ my $file = $self->{img}->getFile;
+
+ my $flipped = $self->{flipped};
+ $self->{fileWatchDays} = -M $file;
+ $self->{fileWatcher} = Glib::Timeout->add(1000, sub {
+ my $currentDays = -M $file;
+ if ($currentDays < $self->{fileWatchDays})
+ {
+ $self->changeState;
+ # We remove it from the pixbuf cache in items view. Useful
+ # for detailed list to be sure it will be re-loaded
+ delete $self->{mainParent}->{itemsView}->{cache}->{$file}
+ if $self->{mainParent}->{itemsView}->{cache};
+ $self->setValueWithParent($self->{img}->getValue, 1, $flipped);
+ $self->{fileWatchDays} = $currentDays;
+ }
+ return 1;
+ });
+ $self->{mainParent}->launch($commandLine, 'program', 1);
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ $self->{width} = $value;
+ $self->set_size_request($value, $self->{height});
+ $self->{img}->setWidth($value - $GCUtils::margin);
+ }
+
+ sub setHeight
+ {
+ my ($self, $value) = @_;
+ $self->{height} = $value;
+ $self->set_size_request($self->{width}, $value);
+ $self->{img}->setHeight($value - $GCUtils::margin);
+ }
+
+}
+
+{
+ package GCMenuList;
+
+ use Glib::Object::Subclass
+ Gtk2::ComboBox::
+ ;
+
+ @GCMenuList::ISA = ('Gtk2::ComboBox', 'GCGraphicComponent');
+
+ our $separatorValue = 'GCSSeparator';
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return 1 if ! defined $self->get_active_iter;
+ return ($self->{listModel}->get($self->get_active_iter))[1] eq '';
+ my $idx = $self->get_history;
+ $idx-- if $idx >= $self->{separatorPosition};
+ $idx = 0 if $idx < 0;
+ return $self->{'values'}->[$idx]->{displayed} eq '';
+ }
+
+ sub valueToDisplayed
+ {
+ my ($self, $value) = @_;
+
+ foreach (@{$self->{'values'}})
+ {
+ return $_->{displayed} if $_->{value} eq $value
+ }
+ return '';
+ }
+
+ sub getValue
+ {
+ my ($self, $formatted) = @_;
+ my $iter = $self->get_active_iter;
+ my $value = '';
+ $value = ($self->{listModel}->get($iter))[0] if $iter;
+ $value = $self->valueToDisplayed($value) if $formatted;
+ return $value;
+ }
+
+ sub getDisplayedValue
+ {
+ my $self = shift;
+ my $iter = $self->get_active_iter;
+ return ($self->{listModel}->get($iter))[1] if $iter;
+ return '';
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+
+ $value = 0 if !$value;
+ my $i = 0;
+ if ($value)
+ {
+ foreach (@{$self->{values}})
+ {
+ last if $_->{value} eq $value;
+ $i++;
+ }
+ }
+ $i++ if $i >= $self->{separatorPosition};
+ $i-- if ($self->{default} == -1) && ($i >= $self->{count});
+ $self->set_active($i)
+ if ($i < scalar(@{$self->{values}}));
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->set_active(0);
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ $self->set_sensitive(!$locked);
+ }
+
+ sub getValues
+ {
+ my $self = shift;
+
+ my @values;
+ return $self->{values};
+ }
+
+ sub setValues
+ {
+ my ($self, $values, $separatorPosition, $preserveValue) = @_;
+ if ($self->{title})
+ {
+ $separatorPosition = 1;
+ unshift @$values, {value => -1, displayed => $self->{title}};
+ }
+ my $model = $self->{listModel};
+ my $previous = $self->getValue if $preserveValue;
+ $self->{values} = $values;
+ $self->{separatorPosition} = $separatorPosition || 9999;
+
+ $model->clear;
+ my $i = 0;
+ foreach (@$values)
+ {
+ if ($i == $self->{separatorPosition})
+ {
+ $model->set($model->append, 0 => $GCMenuList::separatorValue, 1 => '');
+ $i++;
+ }
+ $model->set($model->append,
+ 0 => $_->{value},
+ 1 => $_->{displayed});
+ $i++;
+ }
+
+ $self->{count} = $i;
+ $self->setValue($previous) if $preserveValue;
+ $self->set_active(0) if !$preserveValue;
+ }
+
+ sub setLastForDefault
+ {
+ my $self = shift;
+ $self->{default} = -1;
+ }
+
+ sub setTitle
+ {
+ my ($self, $title) = @_;
+ $self->{title} = $title;
+ }
+
+ sub new
+ {
+ my ($proto, $values, $separatorPosition) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+
+ $self->{listModel} = Gtk2::ListStore->new('Glib::String', 'Glib::String');
+ $self->set_model($self->{listModel});
+ my $renderer = Gtk2::CellRendererText->new;
+ $self->pack_start($renderer, 1);
+ $self->add_attribute($renderer, text => 1);
+ $self->set_row_separator_func(sub {
+ my ($model, $iter) = @_;
+ my @values = $model->get($iter, 0);
+ my $val = '';
+ $val = $values[0] if defined $values[0];
+ return $val eq $GCMenuList::separatorValue;
+ });
+
+ $self->setValues($values, $separatorPosition) if $values;
+ $self->{default} = 0;
+ $self->set_focus_on_click(1);
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->signal_connect('changed' => sub {
+ $self->setChanged;
+ });
+ }
+}
+
+{
+ package GCHeaderLabel;
+
+ use Glib::Object::Subclass
+ Gtk2::Label::
+ ;
+
+ @GCHeaderLabel::ISA = ('Gtk2::Label', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $label) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+
+ $self->setText($label);
+ $self->set_alignment(0,1);
+
+ return $self;
+ }
+
+ sub setText
+ {
+ my ($self, $label) = @_;
+ $self->set_markup('<b>'.$label.'</b>');
+ }
+}
+
+{
+ package GCLabel;
+
+ use Glib::Object::Subclass
+ Gtk2::Label::
+ ;
+
+ @GCLabel::ISA = ('Gtk2::Label', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $label, $disableMarkup) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+ $self->set_markup($label) unless $disableMarkup;
+ $self->set_label($label) if $disableMarkup;
+ $self->set_alignment(0,0.5);
+ return $self;
+ }
+}
+
+{
+ package GCColorLabel;
+
+ use Glib::Object::Subclass
+ Gtk2::EventBox::
+ ;
+
+ @GCColorLabel::ISA = ('Gtk2::EventBox', 'GCGraphicComponent', 'GCPseudoHistoryComponent');
+
+ sub new
+ {
+ my ($proto, $color, $listType) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+
+ bless ($self, $class);
+
+ $listType = 0 if !$listType;
+ $self->modify_bg('normal', $color);
+ $self->{label} = Gtk2::Label->new;
+ $self->{label}->show;
+ $self->{hboxFill} = new Gtk2::HBox(0,0);
+ $self->{hboxFill}->pack_start($self->{label},1,1,0);
+ $self->add($self->{hboxFill});
+ $self->set_alignment(0,0.5);
+ $self->initHistory($listType);
+
+ return $self;
+ }
+
+ sub acceptMarkup
+ {
+ my $self = shift;
+ return 1;
+ }
+
+ sub setMarkup
+ {
+ my ($self, $text) = @_;
+
+ $self->{label}->set_markup($text);
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+
+ (my $label = $self->{label}->get_label) =~ s/<.*?>(.*?)<\/.*?>/$1/g;
+ return $label;
+ }
+
+ sub setBgColor
+ {
+ my ($self, $color) = @_;
+ $self->modify_bg('normal', $color);
+ }
+
+ sub set_justify
+ {
+ my ($self, $value) = @_;
+ $self->{label}->set_justify($value);
+ $self->{label}->set_alignment(0.5,0) if $value eq 'center';
+ $self->{label}->set_alignment(1,0) if $value eq 'right';
+ }
+
+ sub AUTOLOAD
+ {
+ my $self = shift;
+ my $name = our $AUTOLOAD;
+ return if $name =~ /::DESTROY$/;
+ $name =~ s/.*?::(.*)/$1/;
+ $self->{label}->$name(@_);
+ }
+}
+
+{
+ package GCColorLink;
+
+ use Glib::Object::Subclass
+ Gtk2::EventBox::
+ ;
+
+ @GCColorLink::ISA = ('GCColorLabel');
+
+ sub new
+ {
+ my ($proto, $color, $opener) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($color);
+ bless ($self, $class);
+ $self->{opener} = $opener;
+ $self->signal_connect('button-release-event' => sub {
+ my $value = $self->getValue;
+ return if !$value;
+ $self->{opener}->launch($value, 'url');
+ });
+ $self->signal_connect('enter-notify-event' => sub {
+ $self->window->set_cursor(Gtk2::Gdk::Cursor->new('hand2'))
+ if $self->getValue;
+ });
+ #$self->window->set_cursor(Gtk2::Gdk::Cursor->new('watch'));
+ return $self;
+ }
+}
+
+{
+ package GCColorLongLabel;
+
+ use Glib::Object::Subclass
+ Gtk2::TextView::
+ ;
+
+ @GCColorLongLabel::ISA = ('Gtk2::TextView', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $color) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+
+ $self->set_editable(0);
+ $self->set_wrap_mode('word');
+ $self->{background} = $color;
+ $self->modify_base('normal', $color);
+ $self->modify_bg('normal', $color);
+ $self->set_border_width($GCUtils::halfMargin);
+
+ my $layout = $self->create_pango_layout('G');
+ my (undef, $rect) = $layout->get_pixel_extents;
+ $self->{em} = 1.5 * $rect->{height};
+
+
+ return $self;
+ }
+
+ sub acceptMarkup
+ {
+ my $self = shift;
+ return 1;
+ }
+
+ sub setMarkup
+ {
+ my ($self, $text) = @_;
+
+ #$text =~ s/&/&amp;/g;
+ if ($self->{resize})
+ {
+ $self->resize;
+ }
+ else
+ {
+ my $buffer = $self->get_buffer;
+ $self->get_buffer->set_text('');
+ $text =~ s|<span ([^>]*?)>([^<]*?)</span>|$2|;
+ if ($self->{spanTag})
+ {
+ $buffer->get('tag-table')->remove($self->{spanTag});
+ }
+ $self->{spanTag} = $buffer->create_tag('span', $self->getTagFromSpan($1));
+ $buffer->insert_with_tags_by_name ($buffer->get_start_iter, $text, 'span');
+ }
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+
+ (my $label = $self) =~ s/<.*?>(.*?)<\/.*?>/$1/g;
+ return $label;
+ }
+
+}
+
+{
+ package GCColorTable;
+
+ use Glib::Object::Subclass
+ Gtk2::Table::
+ ;
+
+ @GCColorTable::ISA = ('Gtk2::Table', 'GCGraphicComponent', 'GCPseudoHistoryComponent');
+
+ sub new
+ {
+ my ($proto, $columns, $labels, $headerStyle, $contentStyle, $topHeader) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(1, $columns);
+
+ bless ($self, $class);
+
+ $self->set_col_spacings(3);
+ $self->set_row_spacings(3);
+ $self->{number} = $columns;
+ $self->{style} = $contentStyle;
+ $self->{firstRow} = 0;
+ if ($topHeader)
+ {
+ $self->{firstRow}++;
+ my $top = new GCColorLabel($headerStyle->{bgColor});
+ $top->set_padding($GCUtils::halfMargin,$GCUtils::halfMargin);
+ $top->setMarkup('<span '.$headerStyle->{style}.'>'.$topHeader.'</span>');
+ $self->attach($top, 0, $columns, 0, 1, ['expand', 'fill'], 'fill', 0, 0);
+ }
+ my $i;
+ if ($columns > 1)
+ {
+ for $i(0..($columns - 1))
+ {
+ my $header = new GCColorLabel($headerStyle->{bgColor});
+ $header->set_padding($GCUtils::halfMargin,$GCUtils::halfMargin);
+ $header->setMarkup('<span '.$headerStyle->{style}.'>'.$labels->[$i].'</span>');
+ $self->attach($header, $i, $i + 1, $self->{firstRow}, $self->{firstRow} + 1, ['expand', 'fill'], 'fill', 0, 0);
+ }
+ $self->{firstRow}++;
+ }
+ $self->initHistory($columns);
+ return $self;
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+ $self->{value} = $value;
+
+ foreach (@{$self->{labels}})
+ {
+ $self->remove($_);
+ $_->destroy;
+ }
+
+ $self->{labels} = [];
+ my @lines;
+ if (ref($value) eq 'ARRAY')
+ {
+ @lines = @$value;
+ }
+ else
+ {
+ $value =~ s/^\s*//;
+ @lines = split m/,/, $value;
+ }
+ if ($#lines < 0)
+ {
+ $self->hide_all;
+ return;
+ }
+ my $i = $self->{firstRow};
+ $self->resize($#lines + 1 + $self->{firstRow}, $self->{number});
+ foreach (@lines)
+ {
+ my @cols;
+ if (ref($value) eq 'ARRAY')
+ {
+ @cols = @$_;
+ }
+ else
+ {
+ @cols = split m/;/, $_;
+ }
+ my $j = 0;
+ for my $col(@cols)
+ {
+ # TODO Optimize GCColorLongLabel. It offers a better display (no scrollbar)
+ # but it slows down the display.
+ my $label = new GCColorLabel($self->{style}->{bgColor});
+ $label->set_padding($GCUtils::halfMargin,$GCUtils::halfMargin);
+ #my $label = new GCColorLongLabel($self->{style}->{bgColor}, '2em');
+ $label->setMarkup('<span '.$self->{style}->{style}.'>'.$self->cleanMarkup($col, 1).'</span>');
+ $self->attach($label, $j, $j + 1, $i, $i + 1, ['expand', 'fill'], 'fill', 0, 0);
+ push @{$self->{labels}}, $label;
+ $j++;
+ }
+ $i++;
+ }
+ $self->show_all;
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ return $self->{value};
+ }
+
+ sub setBgColor
+ {
+ my ($self, $color) = @_;
+ return;
+ }
+
+ sub set_justify
+ {
+ my ($self, $value) = @_;
+ return;
+ }
+
+}
+
+{
+ package GCColorText;
+
+ use Glib::Object::Subclass
+ Gtk2::ScrolledWindow::
+ ;
+
+ @GCColorText::ISA = ('Gtk2::ScrolledWindow', 'GCGraphicComponent', 'GCPseudoHistoryComponent');
+
+ sub new
+ {
+ my ($proto, $color, $height, $listType) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+
+ $listType = 0 if !$listType;
+ $self->{text} = new Gtk2::TextView;
+ $self->{text}->set_editable(0);
+ $self->{text}->set_wrap_mode('word');
+ $self->{background} = $color;
+ $self->{text}->modify_base('normal', $color);
+ $self->{text}->modify_bg('normal', $color);
+ $self->{text}->set_border_width($GCUtils::halfMargin);
+ $self->set_border_width(0);
+ $self->set_shadow_type('none');
+ $self->set_policy('automatic', 'automatic');
+ $self->add($self->{text});
+ $self->initHistory($listType);
+
+ my $layout = $self->create_pango_layout('G');
+ my (undef, $rect) = $layout->get_pixel_extents;
+ $self->{em} = 1.5 * $rect->{height};
+
+ $self->setHeight($height) if $height;
+
+ return $self;
+ }
+
+ sub acceptMarkup
+ {
+ my $self = shift;
+ return 1;
+ }
+
+ sub setMarkup
+ {
+ my ($self, $text) = @_;
+
+ if ($self->{resize})
+ {
+ $self->resize;
+ }
+ else
+ {
+ my $buffer = $self->{text}->get_buffer;
+ $self->{text}->get_buffer->set_text('');
+ $text =~ s|<span ([^>]*?)>([^<]*?)</span>|$2|;
+ if ($self->{spanTag})
+ {
+ $buffer->get('tag-table')->remove($self->{spanTag});
+ }
+ $self->{spanTag} = $buffer->create_tag('span', $self->getTagFromSpan($1));
+ $buffer->insert_with_tags_by_name ($buffer->get_start_iter, $text, 'span');
+ }
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+
+ (my $label = $self->{text}) =~ s/<.*?>(.*?)<\/.*?>/$1/g;
+ return $label;
+ }
+
+ sub setHeight
+ {
+ my ($self, $height) = @_;
+ $height =~ s/^([0-9]+)em$/$1*$self->{em}/e;
+ $self->set_size_request(-1, $height);
+ }
+
+ sub AUTOLOAD
+ {
+ my $self = shift;
+ my $name = our $AUTOLOAD;
+ return if $name =~ /::DESTROY$/;
+ $name =~ s/.*?::(.*)/$1/;
+ $self->{text}->$name(@_);
+ }
+}
+
+{
+ package GCColorExpander;
+
+ use Glib::Object::Subclass
+ Gtk2::Expander::
+ ;
+
+ @GCColorExpander::ISA = ('GCExpander');
+
+ sub new
+ {
+ my ($proto, $label, $bgColor, $fgStyle) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($label);
+
+ bless ($self, $class);
+ $self->{label} = new GCColorLabel($bgColor);
+ $self->set_label_widget($self->{label});
+ $self->{fgStyle} = $fgStyle;
+
+ return $self;
+ }
+
+ sub setValue
+ {
+ my ($self, $label, $description) = @_;
+
+ $label = '<span '.$self->{fgStyle}.">$label</span>";
+
+ $self->{label}->set_markup($label);
+ if ($description)
+ {
+ $self->{description}->set_label($description);
+ $self->{description}->show;
+ }
+ else
+ {
+ $self->{description}->set_label('');
+ $self->{description}->hide;
+ }
+
+
+ }
+}
+
+{
+ package GCDialogHeader;
+
+ use Glib::Object::Subclass
+ Gtk2::HBox::
+ ;
+
+ @GCDialogHeader::ISA = ('Gtk2::HBox', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $text, $imageStock, $logosDir) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+
+ bless ($self, $class);
+
+ $self->{label} = new Gtk2::Label;
+ $self->{label}->set_markup("<span size='large' weight='bold'>$text</span>");
+ $self->{label}->set_alignment(0,0.5);
+
+ if (-f $logosDir.$imageStock.'.png')
+ {
+ $self->{image} = Gtk2::Image->new_from_file($logosDir.$imageStock.'.png');
+ $self->pack_start($self->{image},0,1,5);
+ }
+
+ $self->pack_start($self->{label},0,1,5);
+
+ return $self;
+ }
+}
+
+{
+ package GCImageBox;
+
+ use Glib::Object::Subclass
+ Gtk2::VBox::
+ ;
+
+ @GCImageBox::ISA = ('Gtk2::VBox', 'GCGraphicComponent');
+
+ sub new_from_file
+ {
+ my ($proto, $imageFile, $label) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+
+ my $image = Gtk2::Image->new_from_file($imageFile);
+ $self->init($image, $label);
+
+ return $self;
+ }
+ sub new_from_stock
+ {
+ my ($proto, $stockId, $label) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+
+ my $image = Gtk2::Image->new_from_stock($stockId, 'large-toolbar');
+ $self->init($image, $label);
+
+ return $self;
+ }
+
+ sub init
+ {
+ my ($self, $image, $label) = @_;
+
+ $self->{label} = new Gtk2::Label($label);
+
+ $self->pack_start($image, 0, 0, 0);
+ $self->pack_start($self->{label}, 0, 0, 0);
+
+ $self->show_all;
+ }
+}
+
+{
+ package GCGroup;
+
+ use Glib::Object::Subclass
+ Gtk2::Frame::
+ ;
+
+ @GCGroup::ISA = ('Gtk2::Frame', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $title) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+
+ bless ($self, $class);
+
+ $self->set_shadow_type('none');
+ $self->set_border_width($GCUtils::margin);
+ $self->{label} = new Gtk2::Label;
+ $self->{label}->set_padding(0,0);
+ #$label->set_border_width(0);
+ $self->setLabel($title);
+ $self->set_label_widget($self->{label});
+ $self->set_label_align(0,0);
+
+ $self->{marginBox} = new Gtk2::HBox(0,0);
+ $self->{marginBox}->set_border_width($GCUtils::halfMargin);
+ $self->add($self->{marginBox});
+
+ return $self;
+ }
+
+ sub setLabel
+ {
+ my ($self, $label) = @_;
+
+ $self->{label}->set_markup('<b>'.$label.'</b>');
+ }
+
+ sub addWidget
+ {
+ my ($self, $widget, $margin) = @_;
+ $margin = $GCUtils::halfMargin if !$margin;
+ $self->{marginBox}->pack_start($widget, 1, 1, $margin);
+ }
+
+ sub setPadding
+ {
+ my ($self, $value) = @_;
+
+ $self->{marginBox}->set_border_width($value);
+ }
+}
+
+{
+ package GCExpander;
+
+ use Glib::Object::Subclass
+ Gtk2::Expander::
+ ;
+
+ @GCExpander::ISA = ('Gtk2::Expander', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $label, $bold) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new($label);
+
+ bless ($self, $class);
+ $self->{hbox} = new Gtk2::HBox(0,0);
+ $self->{label} = new Gtk2::Label($label);
+ $self->{label}->set_alignment(0,0.5);
+ $self->{label}->set_markup("<b>$label</b>")
+ if $bold;
+ $self->{description} = new Gtk2::Label;
+ $self->{description}->set_alignment(0,0);
+ eval {$self->{description}->set_line_wrap_mode('word');};
+ $self->{hbox}->pack_start($self->{label}, 0, 0, 0);
+ $self->{hbox}->pack_start($self->{description}, 1, 1, 0);
+ $self->set_label_widget($self->{hbox});
+ $self->{signalHandler} = undef;
+ return $self;
+ }
+
+ sub setMode
+ {
+ my ($self, $mode) = @_;
+ if ($mode eq 'asis')
+ {
+ $self->{description}->set_ellipsize('none');
+ $self->{description}->set_line_wrap(0);
+ if ($self->{signalHandler})
+ {
+ $self->signal_handler_disconnect($self->{signalHandler});
+ $self->{signalHandler} = undef;
+ $self->{description}->set_size_request(-1, -1);
+ }
+ }
+ else
+ {
+ $self->{signalHandler} = $self->signal_connect('size-allocate' => sub {
+ my $width = $self->allocation->width
+ - $self->{label}->allocation->width
+ - ( 4 * $GCUtils::margin);
+ $self->{description}->set_size_request(($width >= -1) ? $width : -1 , -1);
+ return 0;
+ });
+ if ($mode eq 'wrap')
+ {
+ $self->{description}->set_ellipsize('none');
+ $self->{description}->set_line_wrap(1);
+ }
+ else
+ {
+ $self->{description}->set_ellipsize('end');
+ $self->{description}->set_line_wrap(0);
+ }
+ }
+ }
+
+ sub setValue
+ {
+ my ($self, $label, $description) = @_;
+
+ $self->{label}->set_label($label);
+ if ($description)
+ {
+ $self->{description}->set_label($description);
+ $self->{description}->show;
+ }
+ else
+ {
+ $self->{description}->set_label('');
+ $self->{description}->hide;
+ }
+ }
+}
+
+{
+ package GCFieldSelector;
+
+ use Glib::Object::Subclass
+ Gtk2::ComboBox::
+ ;
+
+ @GCFieldSelector::ISA = ('GCMenuList');
+ our $anyFieldValue = 'GCAnyField';
+
+ sub valueToDisplayed
+ {
+ my ($self, $value) = @_;
+ return '';
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+
+ $self->{listModel}->foreach(sub {
+ my ($model, $path, $iter) = @_;
+ if ($model->get_value($iter, 0) eq $value)
+ {
+ $self->set_active_iter($iter);
+ return 1;
+ }
+ return 0;
+ });
+ }
+
+ sub getValues
+ {
+ my $self = shift;
+ return [];
+ }
+
+ sub setValues
+ {
+ my ($self, $values, $separatorPosition, $preserveValue) = @_;
+ return;
+ }
+
+ sub new
+ {
+ my ($proto, $withImages, $model, $advancedFilter, $withAnyField, $withoutEmpty, $uniqueType) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = Gtk2::ComboBox->new;
+ bless($self, $class);
+ $self->{withImages} = $withImages;
+ $self->{advancedFilter} = $advancedFilter;
+ $self->{withAnyField} = $withAnyField;
+ $self->{withoutEmpty} = $withoutEmpty;
+ $self->{uniqueType} = $uniqueType;
+
+ $self->{listModel} = Gtk2::TreeStore->new('Glib::String', 'Glib::String');
+ $self->set_model($self->{listModel});
+ my $renderer = Gtk2::CellRendererText->new;
+ $self->pack_start($renderer, 1);
+ $self->add_attribute($renderer, text => 1);
+
+ $self->set_cell_data_func($renderer, sub {
+ my ($layout, $cell, $model, $iter) = @_;
+ my $sensitive = !$model->iter_has_child($iter);
+ $cell->set('sensitive', $sensitive);
+ });
+
+ $self->{default} = 0;
+ $self->set_focus_on_click(1);
+
+ $self->setModel($model) if $model;
+
+ return $self;
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+
+ $self->{listModel}->clear;
+ my $field;
+ my @fieldsInfo = @{$model->getDisplayedInfo};
+
+ if (! $self->{withoutEmpty})
+ {
+ $self->{listModel}->set($self->{listModel}->append(undef),
+ 0 => '',
+ 1 => '');
+ }
+ if ($self->{withAnyField})
+ {
+ $self->{listModel}->set($self->{listModel}->append(undef),
+ 0 => $anyFieldValue,
+ 1 => $model->getDisplayedText('AdvancedSearchAnyField'));
+ }
+
+ foreach my $group(@fieldsInfo)
+ {
+ my @fields;
+ foreach $field (@{$group->{items}})
+ {
+ my $id = $field->{id};
+ next if ($model->{fieldsInfo}->{$id}->{type} eq 'image') && (!$self->{withImages});
+ next if ($self->{advancedFilter}
+ && (
+ ($id eq $model->{commonFields}->{id})
+ || ($id eq $model->{commonFields}->{title})
+ || ($id eq $model->{commonFields}->{url})
+ )
+ );
+ next if ! $field->{label};
+ next if $self->{uniqueType} && ($self->{uniqueType} ne $model->{fieldsInfo}->{$id}->{type});
+ push @fields, $field;
+ }
+ if (scalar @fields)
+ {
+ my $groupIter = $self->{listModel}->append(undef);
+ $self->{listModel}->set($groupIter,
+ 0 => undef,
+ 1 => $group->{title});
+ foreach $field(sort {$a->{label} cmp $b->{label}} @fields)
+ {
+ my $fieldIter = $self->{listModel}->append($groupIter);
+ $self->{listModel}->set($fieldIter,
+ 0 => $field->{id},
+ 1 => $field->{label});
+ }
+ }
+ }
+ $self->{model} = $model;
+ }
+ sub activateStateTracking
+ {
+ my $self = shift;
+ }
+
+ # Create a widget suitable to enter a value according to current field type
+ # It will destroy the current widget if it exists
+ sub createEntryWidget
+ {
+ # $parent is the class that contains needed information
+ # $comparison is the kind of comparison. Mainly useful if it is 'range' to create 2 fields
+ # $currentWidget is the one we are replacing
+ my ($self, $parent, $comparison, $currentWidget) = @_;
+ my $value;
+ if ($currentWidget)
+ {
+ $value = $currentWidget->getValue;
+ $currentWidget->destroy;
+ }
+ my $widget;
+ my $field = $self->getValue;
+ my $info = $self->{model}->{fieldsInfo}->{$field};
+
+ # These ones are required for createWidget
+ $self->{lang} = $parent->{lang};
+ $self->{options} = $parent->{options};
+ $self->{window} = $parent;
+
+ ($widget, undef) = GCBaseWidgets::createWidget($self, $info, $comparison);
+
+ if ($info->{type} eq 'history text')
+ {
+ $widget->setValues($parent->{parent}->{panel}->getValues($field));
+ }
+ elsif ($info->{type} eq 'single list')
+ {
+ $widget->setValues($parent->{parent}->{panel}->getValues($field)->[0]);
+ }
+ $widget->setValue($value);
+
+ return $widget;
+ }
+}
+
+{
+ package GCComparisonSelector;
+
+ use Glib::Object::Subclass
+ Gtk2::ComboBox::
+ ;
+
+ @GCComparisonSelector::ISA = ('GCMenuList');
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+ bless($self, $class);
+ $self->setValues([
+ {value => 'contain', displayed => $parent->{lang}->{ModelFilterContain}},
+ {value => 'notcontain', displayed => $parent->{lang}->{ModelFilterDoesNotContain}},
+ {value => 'regexp', displayed => $parent->{lang}->{ModelFilterRegexp}},
+ {value => 'range', displayed => $parent->{lang}->{ModelFilterRange}},
+ {value => 'eq', displayed => '='},
+ {value => 'lt', displayed => '<'},
+ {value => 'le', displayed => '≤'},
+ {value => 'gt', displayed => '>'},
+ {value => 'ge', displayed => '≥'},
+ ]);
+ return $self;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCGraphicComponents/GCDoubleLists.pm b/lib/gcstar/GCGraphicComponents/GCDoubleLists.pm
new file mode 100644
index 0000000..c59cae1
--- /dev/null
+++ b/lib/gcstar/GCGraphicComponents/GCDoubleLists.pm
@@ -0,0 +1,564 @@
+package GCDoubleLists;
+
+###################################################
+#
+# Copyright 2005-2011 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+use utf8;
+use Gtk2;
+
+use GCUtils;
+
+{
+ #Class that is used to let user select
+ #item from a list and order them.
+ package GCDoubleListWidget;
+
+ use base 'Gtk2::HBox';
+
+ sub init
+ {
+ my $self = shift;
+ $self->setListData($self->{dataHandler}->getData) if !$self->{initialized};
+ $self->{initialized} = 1;
+ }
+
+ sub compareItems
+ {
+ my ($self, $item1, $item2) = @_;
+ if ($self->{withPixbuf} && (ref $item1 eq 'ARRAY'))
+ {
+ return $item1->[1] cmp $item2->[1];
+ }
+ else
+ {
+ return $item1 cmp $item2;
+ }
+ }
+
+ sub moveFromTo
+ {
+ my ($self, $from, $to) = @_;
+ my $fromId = ($self->{$from}->get_selected_indices)[0];
+ my $fromItem = $self->{$from.'Array'}->[$fromId];
+ my $fromString;
+ if ($self->{withPixbuf})
+ {
+ $fromString = $fromItem->[1];
+ }
+ else
+ {
+ $fromString = $fromItem;
+ }
+ return if !$fromString;
+ my $toId = ($self->{$to}->get_selected_indices)[0];
+ my $toTotal = scalar @{$self->{$to.'Array'}};
+ $toId = $toTotal if $toId eq '';
+ $toId++ if $toId < $toTotal;
+ $toId = 0 if ($toId < 0);
+
+ if (($to eq 'unused') || (!$self->{permanent}->{$fromString}))
+ {
+ splice(@{$self->{$from}->{data}}, $fromId, 1);
+ splice(@{$self->{$from.'Array'}}, $fromId, 1);
+ }
+ if (($to eq 'used') || (!$self->{permanent}->{$fromString}))
+ {
+ splice(@{$self->{$to}->{data}}, $toId, 0, $fromItem);
+ splice(@{$self->{$to.'Array'}}, $toId, 0, $fromItem);
+ }
+
+ if ($to eq 'unused')
+ {
+ my @tmpSortedArray = sort
+ {$self->compareItems($a, $b)}
+ @{$self->{unusedArray}};
+ $self->{unusedArray} = \@tmpSortedArray;
+ @{$self->{unused}->{data}} = ();
+ my $i = 0;
+ $toId = 0;
+ foreach (@tmpSortedArray)
+ {
+ $toId = $i if $_ eq $fromString;
+ my @item = ($self->{withPixbuf} ? $_ : [$_]);
+ push @{$self->{unused}->{data}}, @item;
+ $i++;
+ }
+ }
+ $self->{$to}->select($toId);
+ $self->{$from}->select($fromId);
+ $self->{$from}->grab_focus;
+ }
+
+ sub moveDownUp
+ {
+ my ($self, $dir) = @_;
+ my $currentId = ($self->{used}->get_selected_indices)[0];
+ my $newId = $currentId + $dir;
+ return if ($newId < 0) || ($newId >= scalar @{$self->{usedArray}});
+ ($self->{usedArray}->[$currentId], $self->{usedArray}->[$newId])
+ = ($self->{usedArray}->[$newId], $self->{usedArray}->[$currentId]);
+ @{$self->{used}->{data}} = ();
+ foreach (@{$self->{usedArray}})
+ {
+ if ($self->{withPixbuf})
+ {
+ push @{$self->{used}->{data}}, $_;
+ }
+ else
+ {
+ push @{$self->{used}->{data}}, [$_];
+ }
+ }
+ $self->{used}->select($newId);
+ }
+
+ sub setListData
+ {
+ my ($self, $new) = @_;
+ my $initial = $self->{dataHandler}->getInitData;
+ $self->{initialized} = 1;
+ my %tmpMap;
+ if ($self->{withPixbuf})
+ {
+ $tmpMap{$_->[1]} = $_ foreach (@$initial);
+ }
+ else
+ {
+ $tmpMap{$_} = 1 foreach (@$initial);
+ }
+ $self->{usedArray} = $new;
+ my $label;
+ foreach (@$new)
+ {
+ my $label = ($self->{withPixbuf} ? $_->[1] : $_);
+ delete $tmpMap{$label} if !$self->{permanent}->{$label};
+ }
+ my @tmpArray = sort {$self->compareItems($a, $b)} keys %tmpMap;
+ if ($self->{withPixbuf})
+ {
+ my @unusedArray = map {$tmpMap{$_}} @tmpArray;
+ $self->{unusedArray} = \@unusedArray;
+ }
+ else
+ {
+ $self->{unusedArray} = \@tmpArray;
+ }
+ @{$self->{unused}->{data}} = ();
+
+ push @{$self->{unused}->{data}}, $_ foreach (@{$self->{unusedArray}});
+ @{$self->{used}->{data}} = ();
+ push @{$self->{used}->{data}}, $_ foreach (@{$self->{usedArray}});
+ }
+
+ sub setListFromIds
+ {
+ my ($self, $new) = @_;
+ my $count = scalar(@$new) - 1;
+ for my $i (0..$count)
+ {
+ $new->[$i] = $self->{fieldIdToName}->{$new->[$i]};
+ }
+ $self->setListData($new);
+ }
+
+ sub clearList
+ {
+ my $self = shift;
+
+ $self->setListData(());
+ }
+ sub fillList
+ {
+ my $self = shift;
+ my @array = grep !$self->{permanent}->{$_},
+ sort {$self->compareItems($a, $b)} @{$self->{dataHandler}->getInitData};
+ $self->setListData(\@array);
+ }
+
+ sub addToPermanent
+ {
+ my ($self, $id) = @_;
+ $self->{permanent}->{$id} = 1;
+ }
+
+ sub removeFromPermanent
+ {
+ my ($self, $id) = @_;
+ delete $self->{permanent}->{$id};
+ }
+
+ sub getUsedItems
+ {
+ my $self = shift;
+ return $self->{usedArray};
+ }
+
+ sub addBottomButtons
+ {
+ my ($self, $unusedButton, $usedButton) = @_;
+ $self->{vboxUnused}->pack_start($unusedButton, 0, 0, 0);
+ $self->{vboxUsed}->pack_start($usedButton, 0, 0, 0);
+
+ }
+
+ sub addRightButtons
+ {
+ my ($self, $button1, $button2) = @_;
+ $self->{vboxRight}->pack_start($button1, 0, 0, $GCUtils::halfMargin);
+ $self->{vboxRight}->pack_start($button2, 0, 0, $GCUtils::halfMargin);
+
+ }
+
+ sub setDataHandler
+ {
+ my ($self, $dataHandler) = @_;
+ $self->{dataHandler} = $dataHandler;
+ }
+
+ sub new
+ {
+ my ($proto, $withPixbuf, $unusedLabel, $usedLabel) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(0,0);
+
+ bless ($self, $class);
+
+ $self->{initialized} = 0;
+ $self->{withPixbuf} = $withPixbuf;
+ $self->{unusedLabel} = $unusedLabel;
+ $self->{usedLabel} = $usedLabel;
+
+ if ($withPixbuf)
+ {
+ $self->{unused} = new Gtk2::SimpleList(
+ '' => 'pixbuf',
+ $self->{unusedLabel} => 'text'
+ );
+ $self->{used} = new Gtk2::SimpleList(
+ '' => 'pixbuf',
+ $self->{usedLabel} => 'text'
+ );
+ }
+ else
+ {
+ $self->{unused} = new Gtk2::SimpleList(
+ $self->{unusedLabel} => "text"
+ );
+ $self->{used} = new Gtk2::SimpleList(
+ $self->{usedLabel} => "text"
+ );
+ }
+ $self->{scrollPanelUnused} = new Gtk2::ScrolledWindow;
+ $self->{scrollPanelUnused}->set_policy ('never', 'automatic');
+ $self->{scrollPanelUnused}->set_shadow_type('etched-in');
+ $self->{scrollPanelUnused}->add($self->{unused});
+ $self->{vboxUnused} = new Gtk2::VBox(0,0);
+ $self->{vboxUnused}->pack_start($self->{scrollPanelUnused}, 1, 1, 0);
+
+ my $vboxChange = new Gtk2::VBox(1,1);
+ my $tmpVbox = new Gtk2::VBox(0,0);
+ my $toRight = new Gtk2::Button('->');
+ $toRight->remove($toRight->child);
+ $toRight->add(Gtk2::Image->new_from_stock('gtk-go-forward', 'button'));
+ $toRight->signal_connect('clicked' => sub {
+ $self->moveFromTo('unused', 'used');
+ });
+ my $toLeft = new Gtk2::Button('<-');
+ $toLeft->remove($toLeft->child);
+ $toLeft->add(Gtk2::Image->new_from_stock('gtk-go-back', 'button'));
+ $toLeft->signal_connect('clicked' => sub {
+ $self->moveFromTo('used', 'unused');
+ });
+ $tmpVbox->pack_start($toRight,0,0,$GCUtils::margin);
+ $tmpVbox->pack_start($toLeft,0,0,$GCUtils::margin);
+ $vboxChange->pack_start($tmpVbox,1,0,0);
+
+ $self->{scrollPanelUsed} = new Gtk2::ScrolledWindow;
+ $self->{scrollPanelUsed}->set_policy ('never', 'automatic');
+ $self->{scrollPanelUsed}->set_shadow_type('etched-in');
+ $self->{scrollPanelUsed}->add($self->{used});
+ $self->{vboxUsed} = new Gtk2::VBox(0,0);
+ $self->{vboxUsed}->pack_start($self->{scrollPanelUsed}, 1, 1, 0);
+
+ $self->{unused}->signal_connect ('row-activated' => sub {
+ $self->moveFromTo('unused', 'used');
+ });
+ $self->{used}->signal_connect ('row-activated' => sub {
+ $self->moveFromTo('used', 'unused');
+ });
+
+ $self->{vboxRight} = new Gtk2::VBox(0,0);
+ my $toUp = new Gtk2::Button('^');
+ $toUp->remove($toUp->child);
+ $toUp->add(Gtk2::Image->new_from_stock('gtk-go-up', 'button'));
+ $toUp->signal_connect('clicked' => sub {
+ $self->moveDownUp(-1);
+ });
+ my $toDown = new Gtk2::Button('_');
+ $toDown->remove($toDown->child);
+ $toDown->add(Gtk2::Image->new_from_stock('gtk-go-down', 'button'));
+ $toDown->signal_connect('clicked' => sub {
+ $self->moveDownUp(1);
+ });
+ $self->{vboxRight}->pack_start($toUp, 0, 0, $GCUtils::margin);
+ $self->{vboxRight}->pack_start($toDown, 0, 0, $GCUtils::margin);
+
+ $self->pack_start(new Gtk2::HBox,0,0,$GCUtils::margin);
+ $self->pack_start($self->{vboxUnused},1,1,$GCUtils::halfMargin);
+ $self->pack_start($vboxChange,0,0,$GCUtils::halfMargin);
+ $self->pack_start($self->{vboxUsed},1,1,$GCUtils::halfMargin);
+ $self->pack_start($self->{vboxRight},0,0,$GCUtils::halfMargin);
+ $self->pack_start(new Gtk2::HBox,0,0,$GCUtils::quarterMargin);
+
+ $self->{scrollPanelUnused}->set_size_request(150,-1);
+ $self->{scrollPanelUsed}->set_size_request(150,-1);
+
+ return $self;
+ }
+}
+
+{
+ package GCFieldsSelectionWidget;
+
+ use base 'GCDoubleListWidget';
+
+ sub getInitData
+ {
+ my $self = shift;
+ my @array;
+ @array = keys %{$self->{fieldNameToId}};
+ return \@array;
+ }
+
+ sub getData
+ {
+ my $self = shift;
+
+ my @array;
+ foreach (@{$self->{selectedFields}})
+ {
+ push @array, $self->{fieldIdToName}->{$_};
+ }
+
+ return \@array;
+ }
+
+ sub saveList
+ {
+ my ($self, $list) = @_;
+
+ my @array;
+ foreach (@{$list})
+ {
+ push @array, $self->{fieldNameToId}->{$_};
+ }
+ $self->{selectedFields} = \@array;
+ }
+
+ sub getSelectedIds
+ {
+ my $self = shift;
+ $self->saveList($self->getUsedItems);
+ return $self->{selectedFields};
+ }
+
+ sub loadFromFile
+ {
+ my $self = shift;
+ my $fileDialog = new GCFileChooserDialog($self->{parent}->{lang}->{FieldsListOpen}, $self, 'open', 1);
+ $fileDialog->set_filename($self->{filename});
+ my $response = $fileDialog->run;
+ if ($response eq 'ok')
+ {
+ $self->{filename} = $fileDialog->get_filename;
+ open FILE, '<'.$self->{filename};
+ my $model = <FILE>;
+ chop $model;
+ if ($model eq $self->{model}->getName)
+ {
+ $self->clearList;
+ my @data;
+ while (<FILE>)
+ {
+ chop;
+ push @data, $self->{fieldIdToName}->{$_};
+ }
+ $self->setListData(\@data);
+ }
+ else
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{parent}->{lang}->{FieldsListError});
+ $dialog->set_position('center-on-parent');
+ $dialog->run();
+ $dialog->destroy ;
+ }
+ close FILE;
+ }
+ $fileDialog->destroy;
+ }
+
+ sub saveToFile
+ {
+ my $self = shift;
+ my $fileDialog = new GCFileChooserDialog($self->{parent}->{lang}->{FieldsListSave}, $self, 'save', 1);
+ $fileDialog->set_filename($self->{filename});
+ my $response = $fileDialog->run;
+ if ($response eq 'ok')
+ {
+ $self->{filename} = $fileDialog->get_filename;
+ open FILE, '>'.$self->{filename};
+ print FILE $self->{model}->getName, "\n" if $self->{model};
+ foreach (@{$self->{usedArray}})
+ {
+ print FILE $self->{fieldNameToId}->{$_}, "\n";
+ }
+ close FILE;
+ }
+ $fileDialog->destroy;
+ }
+
+ sub compareItems
+ {
+ my ($self, $item1, $item2) = @_;
+ use locale;
+ my @values1 = split $self->{separator}, $item1;
+ my @values2 = split $self->{separator}, $item2;
+ if ($values1[0] eq $values2[0])
+ {
+ return $values1[1] cmp $values2[1];
+ }
+ else
+ {
+ return $self->{groupsOrder}->{$values1[0]} <=> $self->{groupsOrder}->{$values2[0]};
+ }
+ }
+
+ sub addIgnoreField
+ {
+ my ($self, $ignoreField) = @_;
+ $self->{ignoreString} = $self->{parent}->{lang}->{FieldsListIgnore};
+ $self->{fieldNameToId}->{$self->{ignoreString}} = $ignoreField;
+ $self->{fieldIdToName}->{$ignoreField} = $self->{ignoreString};
+ $self->addToPermanent($self->{ignoreString});
+ }
+
+ sub removeIgnoreField
+ {
+ my ($self) = @_;
+ $self->removeFromPermanent($self->{ignoreString});
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $preList, $isIdList, $ignoreField) = @_;
+
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(
+ 0,
+ $parent->{lang}->{ImportExportFieldsUnused},
+ $parent->{lang}->{ImportExportFieldsUsed}
+ );
+ bless $self, $class;
+
+ $self->{parent} = $parent;
+
+ $self->{ignoreField} = $ignoreField;
+ $self->{lang} = $parent->{lang};
+ $self->{tooltips} = Gtk2::Tooltips->new();
+
+ $self->setDataHandler($self);
+ my $fillButton = new Gtk2::Button($parent->{lang}->{ImportExportFieldsFill});
+ $fillButton->set_border_width($GCUtils::margin);
+ $fillButton->signal_connect('clicked' => sub {
+ $self->fillList;
+ });
+ my $clearButton = new Gtk2::Button($parent->{lang}->{ImportExportFieldsClear});
+ $clearButton->set_border_width($GCUtils::margin);
+ $clearButton->signal_connect('clicked' => sub {
+ $self->clearList;
+ });
+
+ $self->addBottomButtons($fillButton, $clearButton);
+
+ my $loadButton = new Gtk2::Button('open');
+ $self->{tooltips}->set_tip($loadButton,
+ $parent->{lang}->{FieldsListOpen});
+ $loadButton->remove($loadButton->child);
+ $loadButton->add(Gtk2::Image->new_from_stock('gtk-open', 'button'));
+ $loadButton->signal_connect('clicked' => sub {
+ $self->loadFromFile;
+ });
+ my $saveButton = new Gtk2::Button('save');
+ $self->{tooltips}->set_tip($saveButton,
+ $parent->{lang}->{FieldsListSave});
+ $saveButton->remove($saveButton->child);
+ $saveButton->add(Gtk2::Image->new_from_stock('gtk-save', 'button'));
+ $saveButton->signal_connect('clicked' => sub {
+ $self->saveToFile;
+ });
+
+ $self->addRightButtons($loadButton, $saveButton);
+
+ $self->{fieldNameToId} = {};
+ $self->{groupsOrder} = {};
+
+ my $model = $self->{parent}->{model};
+ if ($model)
+ {
+ my $groups = $model->getGroups;
+ $self->{separator} = $model->getDisplayedText('Separator');
+ while (my ($key, $value) = each %{$model->{fieldsInfo}})
+ {
+ next if !$value->{displayed};
+ my $displayed = $groups->{$value->{group}}->{displayed}
+ . $self->{separator}
+ . $value->{displayed};
+ $self->{fieldNameToId}->{$displayed} = $key;
+ $self->{fieldIdToName}->{$key} = $displayed;
+ }
+ my $order = 0;
+ foreach (@{$model->{groups}})
+ {
+ $self->{groupsOrder}->{$groups->{$_->{id}}->{displayed}} = $order++;
+ }
+ $self->{model} = $model;
+ }
+
+ if ($preList)
+ {
+ $self->setListData($preList) if !$isIdList;
+ $self->setListFromIds($preList) if $isIdList;
+ }
+ else
+ {
+ $self->fillList
+ }
+ $self->saveList(\@{$self->{usedArray}});
+
+ return $self;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport.pm b/lib/gcstar/GCImport.pm
new file mode 100644
index 0000000..2ff40d3
--- /dev/null
+++ b/lib/gcstar/GCImport.pm
@@ -0,0 +1,139 @@
+package GCImport;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use File::Basename;
+use GCUtils 'glob';
+
+use base 'Exporter';
+our @EXPORT = qw(@importersArray);
+
+our @importersArray;
+
+sub loadImporters
+{
+ foreach (glob $ENV{GCS_LIB_DIR}.'/GCImport/*.pm')
+ {
+ my $import = basename($_, '.pm')."\n";
+ next if $import =~ /GCImportBase/;
+ eval "use GCImport::$import";
+ (my $importer = $import) =~ s/^GCImport/GCImporter/;
+ my $obj;
+ eval "\$obj = new GCImport::$importer";
+ die "Fatal error with importer $import\n$@" if $@;
+ push @importersArray, $obj if ! $obj->{errors};
+ }
+}
+
+use Gtk2;
+use GCExportImport;
+
+
+{
+ package GCImportDialog;
+ use Glib::Object::Subclass
+ Gtk2::Dialog::
+ ;
+
+ @GCImportDialog::ISA = ('GCExportImportDialog');
+
+ sub addOptions
+ {
+ my ($self, $options) = @_;
+ $options->{newList} = ($self->{newList}->get_active) ? 1 : 0;
+ $options->{parent} = $self->{parent};
+ }
+
+ sub setModule
+ {
+ my ($self, $module) = @_;
+
+ $self->SUPER::setModule($module);
+ $self->{currentList}->set_sensitive(scalar @{$module->getModels} == 0);
+ $self->{newList}->set_active(1);
+ if ($self->{parent}->{model})
+ {
+ foreach (@{$module->getModels})
+ {
+ if ($self->{parent}->{model}->getName eq $_)
+ {
+ $self->{currentList}->set_sensitive(1);
+ last;
+ }
+ }
+ }
+ if ($self->{fieldsDialog})
+ {
+ if ($module->wantsIgnoreField)
+ {
+ $self->{fieldsDialog}->addIgnoreField($self->{parent}->{ignoreString});
+ }
+ else
+ {
+ $self->{fieldsDialog}->removeIgnoreField;
+ }
+ }
+ }
+
+ sub setModel
+ {
+ my $self = shift;
+ $self->{fieldsDialog} = new GCFieldsSelectionDialog($self,
+ $self->{parent}->{lang}->{ImportFieldsTitle});
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, $parent->{lang}->{ImportListTitle}, 'import');
+ bless ($self, $class);
+
+ my $vboxInsert = new Gtk2::VBox(0,0);
+ $vboxInsert->set_border_width(0);
+
+ $self->{newList} = new Gtk2::RadioButton(undef, $parent->{lang}->{ImportNewList});
+ $self->{currentList} = new Gtk2::RadioButton($self->{newList}->get_group, $parent->{lang}->{ImportCurrentList});
+
+# $vboxInsert->pack_start($self->{newList},1,1,0);
+# $vboxInsert->pack_start($self->{currentList},1,1,0);
+#
+# $self->vbox->pack_start(new Gtk2::HSeparator, 1, 1, 5);
+# $self->vbox->pack_start($vboxInsert,0,0,0);
+
+ $self->{dataTable}->resize(4, 2);
+ $self->{dataTable}->attach($self->{newList}, 0, 2, 0, 1, 'fill', 'fill', 0, 0);
+ $self->{dataTable}->attach($self->{currentList}, 0, 2, 1, 2, 'fill', 'fill', 0, 0);
+ $self->{dataTable}->attach($self->{labelFile}, 0, 1, 3, 4, 'fill', 'fill', 0, 0);
+ $self->{dataTable}->attach($self->{file}, 1, 2, 3, 4, ['fill', 'expand'], 'fill', 0, 0);
+
+ $self->{fieldsButtonLabel} = $parent->{lang}->{ImportFieldsTitle};
+ $self->{fieldsTip} = $parent->{lang}->{ImportFieldsTip};
+
+ return $self;
+ }
+
+}
+
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportAMC.pm b/lib/gcstar/GCImport/GCImportAMC.pm
new file mode 100644
index 0000000..c5d38c9
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportAMC.pm
@@ -0,0 +1,234 @@
+package GCImport::GCImportAMC;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterAMC;
+ use base qw(GCImport::GCImportBaseClass);
+
+ use File::Basename;
+ use File::Copy;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ $self->{fileId} = " AMC_X.Y Ant Movie Catalog 3.5.x www.buypin.com www.antp.be ";
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getName
+ {
+ return "Ant Movie Catalog (.amc)";
+ }
+
+ sub getFilePatterns
+ {
+ return (['Ant Movie Catalog (.amc)', '*.amc']);
+ }
+
+ #Return supported models name
+ sub getModels
+ {
+ return ['GCfilms'];
+ }
+
+ #Return current model name
+ sub getModelName
+ {
+ return 'GCfilms';
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ my @options;
+ return \@options;
+ }
+
+ # Ignored for the moment
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+ sub getEndInfo
+ {
+ return "";
+ }
+
+ sub readBool
+ {
+ my $self = shift;
+
+ my $value;
+ read $self->{file}, $value, 1;
+ return unpack('C',$value);
+ }
+
+ sub readInt
+ {
+ my $self = shift;
+
+ my $value;
+ read $self->{file}, $value, 4;
+ $value = unpack('L',$value);
+ return undef if $value == 4294967295;
+ return $value;
+ }
+
+ sub readString
+ {
+ my $self = shift;
+ my $binary = shift;
+
+ my $length = $self->readInt;
+ my $string;
+
+ return '' if $length == 0;
+ read $self->{file}, $string, $length;
+
+ #$string =~ s/\n/<br\/>/gm if !$binary;
+ $string =~ s/\|/,/gm if !$binary;
+
+ return $string;
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+ my @result;
+
+ open ITEMS, $file;
+ binmode ITEMS;
+ $self->{file} = \*ITEMS;
+
+ my $identifier;
+ read ITEMS, $identifier, length($self->{fileId});
+ ($self->{AMCVersion} = $identifier) =~ s/.*?AMC_(\d+)\.(\d+).*/$1.$2/;
+ my @versions = split m/\./, $self->{AMCVersion};
+ $self->{AMCMajorVersion} = $versions[0];
+ $self->{AMCMinorVersion} = $versions[1];
+
+ $self->readString; # name
+ $self->readString; # mail
+ if (($self->{AMCMinorVersion} <= 3) && ($self->{AMCMinorVersion} < 5))
+ {
+ $self->readString; # icq
+ }
+ $self->readString; # site
+ $self->readString; # description
+
+ my $baseDir = dirname($file);
+
+ my $i = 0;
+
+ while (! eof ITEMS)
+ {
+ $result[$i]->{identifier} = $self->readInt; #Id
+ $self->readInt; #Add date
+ $result[$i]->{rating} = $self->readInt;
+
+ if (($self->{AMCMinorVersion} >= 3) && ($self->{AMCMinorVersion} >= 5))
+ {
+ use integer;
+ $result[$i]->{rating} /= 10;
+ }
+
+ $result[$i]->{date} = $self->readInt;
+ $result[$i]->{time} = $self->readInt;
+ my $ vb = $self->readInt; #Video bitrate
+ my $ab = $self->readInt; #Audio bitrate
+ $result[$i]->{number} = $self->readInt;
+
+ $self->readBool; #Checked
+
+ $result[$i]->{place} = $self->readString; #Media label
+ $result[$i]->{format} = $self->readString;
+ $self->readString; #Source
+ $result[$i]->{borrower} = $self->readString;
+ $result[$i]->{borrower} = 'none' if ! $result[$i]->{borrower};
+ $result[$i]->{original} = $self->readString;
+ $result[$i]->{title} = $self->readString;
+ $result[$i]->{title} = $result[$i]->{original} if !$result[$i]->{title};
+
+ $result[$i]->{director} = $self->readString;
+ $self->readString; #Producer
+ $result[$i]->{country} = $self->readString;
+ $result[$i]->{genre} = [[$self->readString]];
+ $result[$i]->{actors} = $self->readString;
+ $result[$i]->{webPage} = $self->readString;
+ $result[$i]->{synopsis} = $self->readString;
+ $result[$i]->{comment} = $self->readString;
+ $result[$i]->{video} = $self->readString;
+ my $encodings = $self->readString; #Audio format
+ my $res = $self->readString; #Resolution
+ $self->readString; #Framerate
+ $result[$i]->{audio} = $self->readString;
+ if ($result[$i]->{audio})
+ {
+ my @encodings = split /,/,$encodings;
+ $result[$i]->{audio} =~ s/(^|,)([^;]*?)(,|$)/$1$2;$_$3/ foreach (@encodings);
+ $result[$i]->{audio} =~ s/, +/,/g;
+ $result[$i]->{audio} =~ s/; +/;/g;
+ }
+ $result[$i]->{subt} = [[$self->readString]];
+ $self->readString; #File size
+ $result[$i]->{image} = $self->readString;
+
+ my $picture = $self->readString(1);
+
+ if ($result[$i]->{image} =~ /^\..{3}/)
+ {
+ my $pictureName = $self->{options}->{parent}->getUniqueImageFileName($result[$i]->{image},
+ $result[$i]->{title});
+ open PIC, "> $pictureName";
+ binmode PIC;
+ print PIC $picture;
+ close PIC;
+ $result[$i]->{image} = $self->{options}->{parent}->transformPicturePath($pictureName);
+ }
+ else
+ {
+ if (! File::Spec->file_name_is_absolute($result[$i]->{image}))
+ {
+ $result[$i]->{image} = $baseDir . $result[$i]->{image};
+ }
+ #copy $result[$i]->{image}, $pictureName;
+ }
+
+ $i++;
+ }
+
+ close ITEMS;
+
+ return \@result;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..6233ed7
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,205 @@
+package GCImport::GCImportAlexandria;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterAlexandria;
+
+ use base qw(GCImport::GCImportBaseClass);
+ use File::Copy;
+ use Encode;
+ use GCUtils 'glob';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ $self->{errors} = '';
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return "Alexandria";
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ return [
+ {
+ name => 'where',
+ type => 'options',
+ label => 'Where',
+ default => 'Default',
+ valuesList => 'Default,Specified'
+ }
+ ];
+ }
+
+ sub getFilePatterns
+ {
+ my $self = shift;
+
+ return ();
+ }
+
+ #Return supported models name
+ sub getModels
+ {
+ return ['GCbooks'];
+ }
+
+ sub getModelName
+ {
+ my $self = shift;
+
+ return 'GCbooks';
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub wantsFileSelection
+ {
+ return 0;
+ }
+
+ sub wantsDirectorySelection
+ {
+ return 1;
+ }
+
+ sub getEndInfo
+ {
+ my $self = shift;
+
+ return '';
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $directory) = @_;
+
+ my @result = ();
+
+ my @files;
+ $directory = $ENV{HOME}.'/.alexandria'
+ if $self->{options}->{where} eq 'Default';
+
+ foreach (glob "$directory/*")
+ {
+ if (-d $_)
+ {
+ my @array = glob "$_/*";
+ foreach my $file(glob "$_/*")
+ {
+ push @files, $file if $file =~ /yaml$/;
+ }
+ }
+ push @files, $_ if /yaml$/;
+ }
+
+ foreach (@files)
+ {
+ push @result, $self->getBook($_);
+ }
+
+ return \@result;
+ }
+
+ sub transformValue
+ {
+ my ($self, $value) = @_;
+
+ $value =~ s/^"(.*)"$/$1/;
+ $value =~ s/\\x([0-9a-fA-F]{2})/pack("H2",$1)/ge;
+ $value = decode('UTF-8', $value);
+
+ return $value;
+ }
+
+ sub getBook
+ {
+ my ($self, $file) = @_;
+
+ my %book;
+ open BOOK, "<$file";
+ binmode(BOOK, ':utf8');
+ # 1st line contain ruby information
+ my $line = <BOOK>;
+ my $current = '';
+ my $value = '';
+ foreach (<BOOK>)
+ {
+ next if /^#/;
+ if (/^([a-z_]*): (.*)$/)
+ {
+ $current = $1;
+ next if $current eq 'saved_ident';
+ # Tag conversion
+ $current = 'lendDate' if $current eq 'loaned_since';
+ $current = 'borrower' if $current eq 'loaned_to';
+ $book{$current} = $self->transformValue($2);
+ }
+ elsif (/^\s*- (.*)$/)
+ {
+ $book{$current} ||= [];
+ push @{$book{$current}}, [$self->transformValue($1)];
+ }
+ }
+ close BOOK;
+ #Some adjustments
+ $book{rating} *= 2;
+ $book{lendDate} =~ s|^([0-9]{4})-([0-9]{2})-([0-9]{2}).*$|$3/$2/$1|;
+ if ($book{loaned} eq 'false')
+ {
+ $book{borrower} = 'none';
+ $book{lendDate} = '';
+ }
+ delete $book{loaned};
+ #cover
+ $file =~ s/yaml$/cover/;
+ if (-e $file)
+ {
+ my $pic = $self->{options}->{parent}->getUniqueImageFileName('jpg', $book{title});
+ copy $file, $pic;
+ $book{cover} = $pic;
+ }
+ return \%book;
+ }
+
+}
+
+
+
+
+1; \ No newline at end of file
diff --git a/lib/gcstar/GCImport/GCImportBase.pm b/lib/gcstar/GCImport/GCImportBase.pm
new file mode 100644
index 0000000..026be19
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportBase.pm
@@ -0,0 +1,217 @@
+package GCImport::GCImportBase;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCExportImport;
+
+{
+ package GCImport::GCImportBaseClass;
+
+ use base 'GCExportImportBase';
+ use File::Basename;
+ use File::Copy;
+
+ #Methods to be overriden in specific classes
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+
+ $self->{parsingError} = '';
+ $self->{modelAlreadySet} = 0;
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getFilePatterns
+ {
+ return (['*.*', '*.*']);
+ }
+
+ sub getSuffix
+ {
+ my $self = shift;
+ return '' if ! ($self->getFilePatterns)[0];
+ (my $pattern = ($self->getFilePatterns)[0]->[1]) =~ s/.*?([[:alnum:]]+)/$1/;
+ return $pattern;
+ }
+
+ #Return supported models name
+ sub getModels
+ {
+ return [];
+ }
+
+ #Return current model name
+ sub getModelName
+ {
+ return 'GCfilms';
+ }
+
+ sub getOptions
+ {
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub wantsIgnoreField
+ {
+ return 0;
+ }
+
+ sub wantsImagesSelection
+ {
+ return 0;
+ }
+
+ sub wantsFileSelection
+ {
+ return 1;
+ }
+
+ sub wantsDirectorySelection
+ {
+ return 0;
+ }
+
+ # Returns true if the module should be hidden from
+ # the menu when a collection of an incompatible kind is open.
+ sub shouldBeHidden
+ {
+ return 0;
+ }
+
+ sub generateId
+ {
+ return 1;
+ }
+
+ sub getEndInfo
+ {
+ }
+
+ sub getItemsArray
+ {
+ }
+
+ #End of methods to be overriden
+
+ # If you need really specific processing, you can instead override the process method
+
+ sub process
+ {
+ my ($self, $options) = @_;
+ $self->{options} = $options;
+
+ $options->{parent}->{items}->updateSelectedItemInfoFromPanel;
+ my $alreadySaved = 0;
+ if ($options->{newList})
+ {
+ return if !$options->{parent}->checkAndSave;
+ $alreadySaved = 1;
+ $options->{parent}->setFile('');
+ }
+ $self->{options}->{parent}->setWaitCursor($self->{options}->{lang}->{ImportListTitle}.' ('.$options->{file}.')');
+ my @tmpArray = @{$self->getItemsArray($options->{file})};
+
+ if ($self->{parsingError})
+ {
+ $self->{options}->{parent}->restoreCursor;
+ return $self->getEndInfo;
+ }
+
+ my $realModel = $self->getModelName;
+
+ # Here we really know the model so we force a new list if needed
+ if (($options->{newList})
+ || ($options->{parent}->{model}->getName ne $realModel))
+ {
+ $options->{parent}->newList($realModel, $self->{modelAlreadySet}, $alreadySaved);
+ }
+
+ my $generateId = $self->generateId;
+ foreach (@tmpArray)
+ {
+ $options->{parent}->{items}->addItem($_, !$generateId, 1);
+ }
+ $options->{parent}->{items}->unselect;
+ $self->{options}->{parent}->restoreCursor;
+
+ $options->{parent}->checkPanelVisibility;
+ $options->{parent}->selectFirst;
+ $options->{parent}->markAsUpdated;
+ $options->{parent}->viewAllItems;
+ return $self->getEndInfo;
+ }
+
+ # This method could only be use if $self->{model} has been initialized
+ sub copyPictures
+ {
+ my ($self, $itemsArray, $file) = @_;
+ return if !$self->{model};
+ foreach my $item(@$itemsArray)
+ {
+ my $title = $item->{$self->{model}->{commonFields}->{title}};
+ foreach my $field(@{$self->{model}->{fieldsImage}})
+ {
+ (my $suffix = $item->{$field}) =~ s/.*?(\.[^.]*)$/$1/;
+ my $imageFile = $self->{options}->{parent}->getUniqueImageFileName($suffix, $title);
+ copy(GCUtils::getDisplayedImage($item->{$field}, '', $file),
+ $imageFile)
+ if $item->{$field};
+ $item->{$field} = $imageFile;
+ }
+ }
+ }
+
+ # 3 methods below are created to implement interface
+ # from GCFrame plugins could need to simulate if using
+ # some backends
+ sub preloadModel
+ {
+ my ($self, $model) = @_;
+ # Preload the model into the factory cache
+ $self->{modelsFactory}->getModel($model);
+ }
+
+ sub setCurrentModel
+ {
+ my ($self, $model) = @_;
+ $self->{model} = $self->{modelsFactory}->getModel($model);
+ }
+
+ sub setCurrentModelFromInline
+ {
+ my ($self, $container) = @_;
+ $self->{model} = GCModelLoader->newFromInline($self, $container);
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportCSV.pm b/lib/gcstar/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..efb3e5d
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportCSV.pm
@@ -0,0 +1,313 @@
+package GCImport::GCImportCSV;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterCSV;
+
+ use base qw(GCImport::GCImportBaseClass);
+ use Encode;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 1;
+ }
+
+ sub wantsIgnoreField
+ {
+ return 1;
+ }
+
+ sub wantsFileSelection
+ {
+ return 1;
+ }
+
+ sub getName
+ {
+ my $self = shift;
+
+ return "CSV";
+ }
+
+ sub getFilePatterns
+ {
+ return (['CSV (*.csv)', '*.csv']);
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+
+ my $charsets = '';
+ my @charsetList = Encode->encodings(':all');
+ foreach (@charsetList)
+ {
+ $charsets .= $_.',';
+ }
+
+ my $pluginsList = $self->{model}->{parent}->{lang}->{PluginDisabled}.',';
+ foreach (@{$self->{model}->getPluginsNames})
+ {
+ my $plugin = $GCPlugins::pluginsMap{$self->{model}->getName}->{$_};
+ $pluginsList .= $plugin->getName . ',';
+ }
+
+ my $searchFieldsList;
+ foreach (@{$self->{model}->getSearchFields})
+ {
+ $searchFieldsList->{$_} = $self->{model}->getDisplayedText($self->{model}->{fieldsInfo}->{$_}->{label});
+ }
+
+ return [
+ {
+ name => 'sep',
+ type => 'short text',
+ label => 'Separator',
+ default => ';'
+ },
+
+ {
+ name => 'charset',
+ type => 'options',
+ label => 'Charset',
+ valuesList => $charsets,
+ default => 'utf8',
+ },
+
+ {
+ name => 'withHeader',
+ type => 'yesno',
+ label => 'Header',
+ default => '1'
+ },
+
+ {
+ name => 'plugin',
+ type => 'options',
+ label => 'Plugin',
+ valuesList => $pluginsList
+ },
+
+ {
+ name => 'searchfield',
+ type => 'options',
+ label => 'SearchField',
+ valuesList => $searchFieldsList,
+ default => $self->{model}->{commonFields}->{title}
+ },
+
+ {
+ name => 'first',
+ type => 'yesno',
+ label => 'UseFirst',
+ default => '1'
+ },
+
+ ];
+ }
+
+ sub getModelName
+ {
+ my $self = shift;
+ return $self->{model}->getName;
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+ my @result;
+
+ # First we try to get the correct plugin
+ my $plugin;
+ my $titleField;
+ my $pluginEnabled;
+ $pluginEnabled = 1 if $self->{options}->{plugin}
+ && ($self->{options}->{plugin} ne $self->{options}->{lang}->{PluginDisabled});
+ if ($pluginEnabled)
+ {
+ $plugin = $GCPlugins::pluginsMap{$self->{model}->getName}->{$self->{options}->{plugin}};
+ $titleField = $self->{options}->{searchfield};
+
+ # Force values of search field if it's incompatible with current plugin
+ my $compatible = 1;
+ $compatible = grep /^$titleField$/, @{$plugin->getSearchFieldsArray}
+ if $titleField;
+ if (!$compatible)
+ {
+ # If it is not, we use the 1st compatible one
+ $titleField = $plugin->getSearchFieldsArray->[0];
+ }
+
+ }
+
+ open ITEMS, $file;
+ binmode(ITEMS, ':utf8')
+ if $self->{options}->{charset} eq 'utf8';;
+
+ my $sep = $self->{options}->{sep};
+ my $ignoreFirstLine = $self->{options}->{withHeader};
+
+ my $resultsDialog;
+ if ((!$self->{options}->{first}) && ($pluginEnabled))
+ {
+ $resultsDialog = $self->{options}->{parent}->getDialog('Results');
+ $resultsDialog->setModel($self->{model}, $self->{model}->{fieldsInfo});
+ $resultsDialog->setMultipleSelection(0);
+ }
+
+ my $i = 0;
+
+ while (<ITEMS>)
+ {
+ if ($ignoreFirstLine)
+ {
+ $ignoreFirstLine = 0;
+ next;
+ }
+
+ chomp;
+ # Special characters are escaped
+ my @values = split m/\Q$sep\E/;
+
+ $result[$i] = {} if (!$pluginEnabled);
+
+ my $j = 0;
+ my $searchTitle = '';
+ foreach (@{$self->{options}->{fields}})
+ {
+ $values[$j] = decode($self->{options}->{charset}, $values[$j])
+ if $self->{options}->{charset} ne 'utf8';
+ $result[$i]->{$_} = $values[$j] if (!$pluginEnabled);
+ $searchTitle = $values[$j] if (($_ eq $titleField) && ($pluginEnabled));
+ $j++;
+ }
+
+ if (($pluginEnabled) && ($searchTitle ne ''))
+ {
+ $plugin->{title} = $searchTitle;
+ $plugin->{type} = 'load';
+ $plugin->{urlField} = $self->{model}->{commonFields}->{url};
+ $plugin->{searchField} = $titleField;
+
+ #Initialize what will be pushed in the array
+ my $info = {$titleField => $searchTitle};
+
+ $self->{options}->{parent}->setWaitCursor($self->{options}->{lang}->{StatusSearch}.' ('.$_.')');
+ $plugin->load;
+
+ my $itemNumber = $plugin->getItemsNumber;
+
+ if ($itemNumber != 0)
+ {
+ $plugin->{type} = 'info';
+ if (($itemNumber == 1) || ($self->{options}->{first}))
+ {
+ $plugin->{wantedIdx} = 0;
+ }
+ else
+ {
+ my $withNext = 0;
+ my @items = $plugin->getItems;
+ $resultsDialog->setWithNext(0);
+ $resultsDialog->setSearchPlugin($plugin);
+ $resultsDialog->setList($_, @items);
+ $resultsDialog->show;
+ if ($resultsDialog->{validated})
+ {
+ $plugin->{wantedIdx} = $resultsDialog->getItemsIndexes->[0];
+ }
+ }
+ $info = $plugin->getItemInfo;
+ my $title = $info->{$titleField};
+ $self->{options}->{parent}->{defaultPictureSuffix} = $plugin->getDefaultPictureSuffix;
+ foreach my $field(@{$self->{model}->{managedImages}})
+ {
+ $info->{$field} = '' if $info->{$field} eq 'empty';
+ next if !$info->{$field};
+ ($info->{$field}) = $self->{options}->{parent}->downloadPicture($info->{$field}, $title);
+ }
+ $info->{comment} = $self->getLang->{CommentAuto}
+ . "\n"
+ . $self->getLang->{CommentSite}
+ . $plugin->getName()
+ . "\n"
+ . $self->getLang->{CommentTitle}
+ . $_
+ . "\n";
+
+ # Add the default value
+ my $defaultInfo = $self->{model}->getDefaultValues;
+ foreach my $field(keys %$defaultInfo)
+ {
+ next if exists $info->{$field};
+ $info->{$field} = $defaultInfo->{$field};
+ }
+ my $j = 0;
+ foreach (@{$self->{options}->{fields}})
+ {
+ $values[$j] = decode($self->{options}->{charset}, $values[$j])
+ if $self->{options}->{charset} ne 'utf8';
+ $info->{$_} = $values[$j];
+ $j++;
+ }
+ }
+
+ push @result, $info;
+ $self->{options}->{parent}->restoreCursor;
+ }
+
+ $i++;
+ }
+ close ITEMS;
+
+
+ return \@result;
+ }
+
+
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+
+ return $message;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportDVDProfiler.pm b/lib/gcstar/GCImport/GCImportDVDProfiler.pm
new file mode 100644
index 0000000..6f47d7b
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportDVDProfiler.pm
@@ -0,0 +1,192 @@
+package GCImport::GCImportDVDProfiler;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterDVDProfiler;
+
+ use base qw(GCImport::GCImportBaseClass);
+
+ use XML::Simple;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return "DVDProfiler (.xml)";
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ my @options;
+ return \@options;
+ }
+
+ sub getFilePatterns
+ {
+ return (['DVDProfiler (.xml)', '*.xml']);
+ }
+
+ #Return supported models name
+ sub getModels
+ {
+ return ['GCfilms'];
+ }
+
+ # Ignored for the moment
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+ sub getEndInfo
+ {
+ return "";
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+ my $xml;
+ my $data;
+ # creer un objet
+ $xml = XML::Simple->new; # sans keyAttr les dvd seront dans une liste ou chaque dvd sera identifie par l'emplacement qu'il a dans cette liste
+ $data = $xml->XMLin ("$file");
+
+
+ my @result;
+ my $film;
+
+ foreach $film(@{$data->{DVD}}){
+ my $item;
+
+ $item->{title} = $film->{Title};
+ $item->{date} = $film->{ProductionYear};
+ $item->{time} = $film->{RunningTime}.' mn';
+ $item->{synopsis} = $film->{Overview};
+ ####### DIRECTOR #########
+ my $director;
+
+ if (ref ($film->{Credits}->{Credit}) eq "ARRAY") {
+ foreach $director(@{$film->{Credits}->{Credit}}){
+ if (($director->{CreditType}) eq 'Direction') {
+ $item->{director} .= $director->{FirstName}.' '.$director->{LastName}.', ';
+
+ }
+ }
+ }
+ else {
+ if (($film->{Credits}->{Credit}->{CreditType}) eq 'Direction') {
+ $item->{director} .= $film->{Credits}->{Credit}->{FirstName}.' '.$film->{Credits}->{Credit}->{LastName};
+ }
+ }
+ ###### END DIRECTOR ######
+
+ ####### ACTORS #########
+ my $actor;
+ if (ref ($film->{Actors}->{Actor}) eq "ARRAY") {
+ foreach $actor(@{$film->{Actors}->{Actor}}){
+ $item->{actors} .= $actor->{FirstName}.' '.$actor->{LastName}.' '.'('.$actor->{Role}.')'.', ';
+
+ }
+ }
+ else {
+ $item->{actors} .= $film->{Actors}->{Actor}->{'FirstName'}.' '.$film->{Actors}->{Actor}->{LastName}.' '.'('.$film->{Actors}->{Actor}->{Role}.')';
+ }
+ ###### END ACTORS ######
+
+ ####### AUDIO #########
+ my $audio;
+ if (ref ($film->{Audio}->{AudioFormat}) eq "ARRAY"){
+ foreach $audio(@{$film->{Audio}->{AudioFormat}}){
+ $item->{audio} .= $audio->{AudioLanguage}.', ';
+
+ }
+ }
+ else {
+ $item->{audio} .= $film->{Audio}->{AudioFormat}->{'AudioLanguage'};
+ }
+ ###### END AUDIO ######
+ ####### SUBT #########
+ my $subt;
+ if (ref ($film->{Subtitles}->{Subtitle}) eq "ARRAY"){
+ foreach $subt(@{$film->{Subtitles}->{Subtitle}}){
+ $item->{subt} .= $subt.', ';
+
+ }
+ }
+ else {
+ $item->{subt} = $film->{Subtitles}->{Subtitle};
+ }
+ ####### END SUBT #########
+ ####### TYPE #########
+ my $type;
+ if (ref ($film->{Genres}->{Genre}) eq "ARRAY"){
+ foreach $type(@{$film->{Genres}->{Genre}}){
+ $item->{type} .= $type.',';
+
+ }
+ }
+ else {
+ $item->{type} = $film->{Genres}->{Genre};
+ }
+ ####### END TYPE #########
+
+ #$item->{original} = $film->{Title};
+ #$item->{subt} = $film->{Subtitles}->{Subtitle};
+ #$item->{borrower} = $film->{Title};
+ #$item->{lendDate} = $film->{Title};
+ #$item->{history} = $film->{Title};
+ #$item->{seen} = $film->{Title};# non par defaut ?
+ #$item->{comment} = $film->{Title};
+ #$item->{image} = $film->{Title};
+ #$item->{country} = $film->{Title};
+ #$item->{number} = $film->{CollectionNumber};
+ #$item->{rating} = $film->{Title};# note par defaut
+ #$item->{format} = $film->{Title};#DVD par d�faut ?
+ #$item->{webPage} = $film->{Title};
+ #$item->{place} = $film->{Title};
+ $item->{director} =~ s/, $//;
+ $item->{actors} =~ s/, $//;
+ $item->{audio} =~ s/, $//;
+ $item->{subt} =~ s/, $//;
+ $item->{type} =~ s/, $//;
+ push @result, $item;
+ }
+ return \@result;
+
+ }
+}
+
+1; \ No newline at end of file
diff --git a/lib/gcstar/GCImport/GCImportFolder.pm b/lib/gcstar/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..10d9fd1
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportFolder.pm
@@ -0,0 +1,510 @@
+package GCImport::GCImportFolder;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterFolder;
+
+ use File::Find;
+ use File::Basename;
+ use base qw(GCImport::GCImportBaseClass);
+
+ use GCPlugins;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub wantsFileSelection
+ {
+ return 1;
+ }
+
+ sub wantsDirectorySelection
+ {
+ return 1;
+ }
+
+ sub shouldBeHidden
+ {
+ return 1;
+ }
+
+ sub getFilePatterns
+ {
+ return ();
+ }
+
+ #Return supported models name
+ sub getModels
+ {
+ return ['GCfilms', 'GCMusics'];
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+
+ my $pluginsList;
+ foreach (@{$self->{model}->getPluginsNames})
+ {
+ my $plugin = $GCPlugins::pluginsMap{$self->{model}->getName}->{$_};
+ push @$pluginsList,$plugin->getName;
+ }
+
+
+ return [
+ {
+ name => 'plugin',
+ type => 'options',
+ label => 'Plugin',
+ valuesList => $pluginsList
+ },
+ {
+ name => 'multipleResult',
+ type => 'options',
+ label => 'MultipleResult',
+ tooltip => 'MultipleResultTooltip',
+ valuesList => 'Ask,AskEnd,AddWithoutInfo,DontAdd,TakeFirst',
+ default => 'Ask',
+ },
+ {
+ name => 'noResult',
+ type => 'options',
+ label => 'NoResult',
+ tooltip => 'NoResultTooltip',
+ valuesList => 'AddWithoutInfo,DontAdd', # TODO AskNewName AskNewPlugin at End
+ default => 'AddEmpty',
+ },
+ {
+ name => 'recursive',
+ type => 'yesno',
+ label => 'Recursive',
+ default => '1'
+ },
+
+ {
+ name => 'suffixes',
+ type => 'short text',
+ label => 'Suffixes',
+ tooltip => 'SuffixesTooltip',
+ default => '',
+ },
+
+ {
+ name => 'remove',
+ type => 'short text',
+ label => 'Remove',
+ tooltip => 'RemoveTooltip',
+ default => '',
+ },
+ {
+ name => 'removeWholeWord',
+ type => 'yesno',
+ label => 'RemoveWholeWord',
+ tooltip => 'RemoveTooltipWholeWord',
+ default => '1',
+ },
+ {
+ name => 'removeRegularExpr',
+ type => 'yesno',
+ label => 'RemoveRegularExpr',
+ tooltip => 'RemoveTooltipRegularExpr',
+ changedCallback => sub {
+ my ($self,$widget) =@_;
+ $widget->[0]->{options}->{removeWholeWord}->lock($self->getValue);
+ },
+ default => '0',
+ },
+ {
+ name => 'skipFileAlreadyInCollection',
+ type => 'options',
+ label => 'SkipFileAlreadyInCollection',
+ tooltip => 'SkipFileAlreadyInCollectionTooltip',
+ valuesList => 'SkipFileNo,SkipFileFullPath,SkipFileFileName,SkipFileFileNameAndUpdate',
+ default => 'SkipFileNo',
+ },
+ {
+ name => 'infoFromFileNameRegExp',
+ type => 'history text',
+ label => 'InfoFromFileNameRegExp',
+ tooltip => 'InfoFromFileNameRegExpTooltip',
+ initValues => ['',
+ '^$A\s*([[\(]part $x( of $y)?[)\]])?\s*([[\(]$Y[)\]])?\s*$',
+ '^$N\s+[^\w ]\s+S$SE$E\s+[^\w ]\s+$T\s+([[(]part $x( of $y)?[)\]])?\s*$',
+ ],
+ default => '',
+ },
+ ];
+
+
+ }
+
+ sub getModelName
+ {
+ my $self = shift;
+ return $self->{model}->getName;
+ }
+
+ # Required by extracter to make this class acts as a panel
+ sub AUTOLOAD
+ {
+ return [];
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $directory) = @_;
+ my @result;
+ my @filesList;
+
+ #First we try to get the correct plugin
+ my $plugin = $GCPlugins::pluginsMap{$self->{model}->getName}->{$self->{options}->{plugin}};
+ $plugin->{bigPics} = $self->{options}->{parent}->{options}->bigPics;
+ my $titleField = $self->{model}->{commonFields}->{title};
+ my $fileField = $self->{model}->{commonFields}->{play};
+
+ # Required by extracter
+ $self->{lang} = $self->{options}->{lang};
+
+ (my $suffixes = $self->{options}->{suffixes}) =~ s/[,; ]/\|/g;
+ $suffixes =~ s/\*\.//g;
+ # Create list of files
+ if ($self->{options}->{recursive})
+ {
+ find(sub {
+ return if -d $File::Find::name;
+ return if ! /$suffixes$/;
+ my $name=Encode::decode_utf8($File::Find::name);
+ push @filesList, $name;
+ }, $directory);
+ }
+ else
+ {
+ foreach (glob "$directory/*")
+ {
+ next if -d $_;
+ next if ! /$suffixes$/;
+ push @filesList, $_;
+ }
+ }
+ my $resultsDialog;
+ # initialize choose good result dialog if needed
+ if (($self->{options}->{multipleResult} ne 'Ask') || ($self->{options}->{multipleResult} ne 'AskEnd'))
+ {
+ $resultsDialog = $self->{options}->{parent}->getDialog('Results');
+ $resultsDialog->setModel($self->{model}, $self->{model}->{fieldsInfo});
+ $resultsDialog->setMultipleSelection(0);
+ }
+ #Initialize stuff to retrieve info from name with regexp
+ my $infoFromName;
+ if ($self->{options}->{infoFromFileNameRegExp} ne '')
+ {
+ my %knownParam=($titleField=>'T',alphabTitle=>'A',year=>'Y',season=>'S',episode=>'E',alphabSeries=>'N',number=>'x',totNumber=>'y');
+ my $orderStr= $self->{options}->{infoFromFileNameRegExp};
+ $orderStr=~ s/(?<!\$).//g;
+ # Search the order of $A $T ... in the user regexp
+ my %places;
+ foreach my $key (keys %knownParam) {
+ my $i=1+index $orderStr,$knownParam{$key};
+ $places{$i} = $key;
+ }
+ my $myRegExp=$self->{options}->{infoFromFileNameRegExp};
+ # avoid capturing something else than $T,$A ... make already present () not capturing
+ $myRegExp =~ s/(?<!\\)\(/(?:/g;
+ my $articles='(?:'.join('|',@{$self->{model}->{parent}->{articles}}).')\'?\b';
+ our $myRegExpArt=qr/^(.*?)(?:, ?($articles))?$/i;
+
+ $myRegExp =~ s/\$A/(.*?(?:, ?$articles)?)/g;
+ $myRegExp =~ s/\$N/(.*?(?:, ?$articles)?)/g;
+ $myRegExp =~ s/\$T/(.*?)/;
+ $myRegExp =~ s/\$Y/(\\d{2}|\\d{4}?)/;
+ $myRegExp =~ s/\$x/(\\d{1,2})/;
+ $myRegExp =~ s/\$y/(\\d{1,2})/;
+ $myRegExp =~ s/\$E/(\\d{1,4}?)/;
+ $myRegExp =~ s/\$S/(\\d{1,2}?)/;
+ sub deAlpha{
+ my $s;
+ $_[0] =~ $myRegExpArt;
+ $s=$1;
+ my $a=$2.' ' if $2 && (substr($2,-1) ne '\'');
+ $s=$a.$s if $a;
+ return $s;
+ }
+ # Check if regexp is good
+ my $pattern = shift;
+ my $test = eval { $myRegExp=qr/$myRegExp/i };
+ #print $myRegExp;
+ #
+ if ($@)
+ {
+ $myRegExp= qr/./ ;print $@;
+ }
+ my $i=2;
+ $infoFromName=sub {
+ my $n=$_[0] ;
+ $n=~ $myRegExp;
+ my %info; # TODO Can be more readable in Perl 5.10 by using named capturing
+ $info{$places{1}}=$1 if $1;$info{$places{2}}=$2 if $2;$info{$places{3}}=$3 if $3;$info{$places{4}}=$4 if $4;$info{$places{5}}=$5 if $5;
+ $info{$places{6}}=$6 if $6;$info{$places{7}}=$7 if $7;$info{$places{8}}=$8 if $8;$info{$places{9}}=$9 if $9;$info{$places{10}}=$10 if $10;
+ $info{$places{11}}=$11 if $11;$info{$places{12}}=$12 if $12;$info{$places{13}}=$13 if $13;$info{$places{14}}=$14 if $14;$info{$places{15}}=$15 if $15;
+ $info{$places{16}}=$16 if $16;$info{$places{17}}=$17 if $17;$info{$places{18}}=$18 if $18;$info{$places{19}}=$19 if $19;$info{$places{20}}=$20 if $20;
+
+ $info{$titleField}=deAlpha($info{alphabTitle}) if($info{alphabTitle});
+ $info{series}=deAlpha($info{alphabSeries}) if($info{alphabSeries});
+ return \%info;
+ }
+ }
+ # initialize regexp word to remove
+ my $removed =$self->{options}->{remove};
+ if(!$self->{options}->{removeRegularExpr})
+ {
+ $removed =~ s/[,; ]/\|/g;
+ if($self->{options}->{removeWholeWord})
+ {
+ $removed=~s/\|/\\b\|\\b/g ;
+ $removed='\b'.$removed.'\b';
+ }
+ }
+ # if we want to ignore files already in the list
+ # we initialize a hash with filenames to be fast !
+ my %fileNameKnown;
+ if($self->{options}->{skipFileAlreadyInCollection} ne 'SkipFileNo')
+ {
+ if($self->{options}->{skipFileAlreadyInCollection} eq 'SkipFileFullPath')
+ {
+ foreach my $originalFilm(@{$self->{options}->{originalList}->{itemArray}})
+ {
+ $fileNameKnown{$originalFilm->{$fileField}}=$originalFilm;
+ }
+ }
+ else
+ {
+ foreach my $originalFilm(@{$self->{options}->{originalList}->{itemArray}})
+ {
+ $fileNameKnown{basename($originalFilm->{$fileField})}=$originalFilm;
+ }
+ }
+ }
+ my $hasFileWaiting=0;my $inWaitingQueue=0;
+ # Main loop on files entries
+ file: foreach my $file(@filesList)
+ {
+ if($file eq 'WaitingList')
+ {
+ $inWaitingQueue=1;
+ next file;
+ }
+ # Skip file already in the collection
+ next file if(($self->{options}->{skipFileAlreadyInCollection} eq 'SkipFileFullPath') && (exists $fileNameKnown{$file}));
+ next file if(($self->{options}->{skipFileAlreadyInCollection} eq 'SkipFileFileName') && (exists $fileNameKnown{basename($file)}));
+ if(($self->{options}->{skipFileAlreadyInCollection} eq 'SkipFileFileNameAndUpdate') && (exists $fileNameKnown{basename($file)}))
+ {
+ # if filename already in collection, and collection full path invalid : correct it
+ if (!(-e $fileNameKnown{basename($file)}->{$fileField}))
+ {
+ print "Path updated : ",$fileNameKnown{basename($file)}->{$fileField},"\n";
+ print " --> ",$file,"\n";
+ $fileNameKnown{basename($file)}->{$fileField}=$file;
+ }
+ next file;
+ }
+
+ # Get info from the file (avi, mp3, ...)
+ my $extracter = $self->{model}->getExtracter($self, $file, $self, $self->{model});
+ my $extracted = $extracter->getInfo;
+ # Add info from file
+ my $infoFromFile={$fileField => $file};
+ foreach my $field(keys %$extracted)
+ {
+ $infoFromFile->{$field} = $extracted->{$field}->{value};
+ }
+
+ # Test if subtitle is present
+ if ($self->{model}->getName eq 'GCfilms')
+ {
+ my @subtitlesExt=qw(sub srt);
+ my @subtitlesFiles;
+ my $startFileName=$file;
+ $startFileName=~s/\.[^.]*$//;
+ for my $ext(@subtitlesExt)
+ {
+ my $fileSubsName=$startFileName.'.'.$ext;
+ if(-e $fileSubsName)
+ {
+ #TODO Try to guess the language see cpan
+ my $lang=["Yes"];
+ push @subtitlesFiles,$lang;
+ }
+ }
+ $infoFromFile->{subt}=\@subtitlesFiles if (@subtitlesFiles);
+ }
+ my $infoFromFileName;
+ my $name = basename($file);
+ # Filter the name
+ # Remove suffix
+ $name =~ s/\.[^.]*$//;
+ # Try to apply regexp on filename
+ if ($self->{options}->{infoFromFileNameRegExp} ne '')
+ {
+ $infoFromFileName=&$infoFromName($name);
+ $name = $infoFromFileName->{$titleField} if ($infoFromFileName->{$titleField} ne '');
+ #TODO: Use this known info to search with plugin
+ }
+ # Remove everything between () {} []
+ $name =~ s/[\(\[\{].*?[\)\]\}]/ /g;
+ # Remove special characters
+ $name =~ s/[-\._,#@"']/ /g;
+ #'"
+ # Remove info from extracter for movies
+ if ($self->{model}->getName eq 'GCfilms')
+ {
+ my $info = $extracted->{video}->{value}.'|'.$extracted->{audio}->{value}->[0]->[1];
+ $info =~ s/ (.*?)//g;
+ $name =~ s/$info//g;
+ }
+ $name =~ s/$removed//gi;
+
+ # $name contains the title to search
+ $plugin->{title} = $name;
+ $plugin->{type} = 'load';
+ $plugin->{urlField} = $self->{model}->{commonFields}->{url};
+ $plugin->{searchField} = $titleField;
+
+ #Initialize what will be pushed in the array
+ my $infoPlugin = {$titleField => $name};
+
+ $self->{options}->{parent}->setWaitCursor($self->{options}->{lang}->{StatusSearch}.' ('.$name.')');
+ $plugin->load;
+
+ my $itemNumber = $plugin->getItemsNumber;
+
+ if ($itemNumber == 0)
+ {
+ goto endPluginGetItemInfo if (($self->{options}->{noResult} eq 'AddEmpty'));
+ next file if (($self->{options}->{noResult} eq 'DontAdd'));
+ }
+ else
+ {
+ $plugin->{type} = 'info';
+ if (($itemNumber == 1) || ($self->{options}->{multipleResult} eq 'TakeFirst'))
+ {
+ $plugin->{wantedIdx} = 0;
+ }
+ elsif($self->{options}->{multipleResult} eq 'AddWithoutInfo' )
+ {
+ goto endPluginGetItemInfo;
+ }
+ elsif($self->{options}->{multipleResult} eq 'DontAdd' )
+ {
+ next file;
+ }
+ elsif($self->{options}->{multipleResult} eq 'AskEnd' && !$inWaitingQueue)
+ {
+ # re push the filename at the end of the list, to be proceded
+ push @filesList,'WaitingList' if !$hasFileWaiting;
+ push @filesList,$file;
+ $hasFileWaiting=1;
+ next file;
+ }
+ else
+ {
+ # Ask the user to choose
+ my $withNext = 0;
+ my @items = $plugin->getItems;
+ $resultsDialog->setWithNext(0);
+ $resultsDialog->setSearchPlugin($plugin);
+ $resultsDialog->setList($name, @items);
+ $resultsDialog->show;
+ if ($resultsDialog->{validated})
+ {
+ $plugin->{wantedIdx} = $resultsDialog->getItemsIndexes->[0];
+ }
+ }
+ $infoPlugin = $plugin->getItemInfo;
+ my $title = $infoPlugin->{$titleField};
+ $self->{options}->{parent}->{defaultPictureSuffix} = $plugin->getDefaultPictureSuffix;
+ foreach my $field(@{$self->{model}->{managedImages}})
+ {
+ $infoPlugin->{$field} = '' if $infoPlugin->{$field} eq 'empty';
+ next if !$infoPlugin->{$field};
+ ($infoPlugin->{$field}) = $self->{options}->{parent}->downloadPicture($infoPlugin->{$field}, $title);
+ }
+ $infoPlugin->{plugin} =$plugin->getName();
+ $infoPlugin->{comment} = $self->getLang->{CommentAuto}
+ . "\n"
+ . $self->getLang->{CommentSite}
+ . $plugin->getName()
+ . "\n"
+ . $self->getLang->{CommentTitle}
+ . $name
+ . "\n"
+ . $extracted->{comment}->{displayed};
+ }
+ endPluginGetItemInfo:
+
+ # Add the default value
+ my $defaultInfo = $self->{model}->getDefaultValues;
+
+ my $info;
+ # TODO : ask the user for order, or even for order on each fields
+ my @order=($defaultInfo,$infoFromFile,$infoFromFileName,$infoPlugin);
+ for my $infoSource(@order)
+ {
+ foreach my $field(keys %$infoSource)
+ {
+ $info->{$field} =$infoSource->{$field} if $infoSource->{$field};
+ }
+ }
+ push @result, $info;
+ $self->{options}->{parent}->restoreCursor;
+ }
+ return \@result;
+ }
+
+
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+
+ return $message;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportGCfilms.pm b/lib/gcstar/GCImport/GCImportGCfilms.pm
new file mode 100644
index 0000000..285e17d
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportGCfilms.pm
@@ -0,0 +1,190 @@
+package GCImport::GCImportGCfilms;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterGCfilms;
+ use base qw(GCImport::GCImportBaseClass);
+ use File::Basename;
+ use File::Copy;
+ use GCUtils;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+ $self->{errors} = '';
+
+ #The fields as they were in GCfilms 6.1
+ # If name has changed in GCstar, the comment contains the original one
+ $self->{fields} = [
+ 'id',
+ 'title',
+ 'date',
+ 'time',
+ 'director',
+ 'country', # nat
+ 'genre', # type
+ 'image',
+ 'actors',
+ 'original', # orig
+ 'synopsis',
+ 'webPage', # url
+ 'seen',
+ 'format',
+ 'number',
+ 'place',
+ 'rating',
+ 'comment',
+ 'audio',
+ 'subt',
+ 'borrower',
+ 'lendDate',
+ 'borrowings', # history
+ 'age',
+ 'video',
+ 'serie', # collection
+ 'rank',
+ 'trailer',
+ ];
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return "GCfilms (.gcf)";
+ }
+
+ sub getFilePatterns
+ {
+ return (['GCfilms (.gcf)', '*.gcf']);
+ }
+
+ #Return supported models name
+ sub getModels
+ {
+ return ['GCfilms'];
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ return [
+ {
+ name => 'generate',
+ type => 'yesno',
+ label => 'ImportGenerateId',
+ default => '1'
+ },
+ ];
+ }
+
+ # Ignored for the moment
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+ sub generateId
+ {
+ my $self = shift;
+ return $self->{options}->{generate};
+ }
+ sub getEndInfo
+ {
+ return "";
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+ my @result;
+
+ open MOVIES, "<$file";
+ my $gotFirstLine = 0;
+ my $i = 0;
+ while (<MOVIES>)
+ {
+ chomp;
+ my @values = split m/\|/;
+
+ if (!$gotFirstLine)
+ {
+ $gotFirstLine = 1;
+ if ($values[0] eq 'GCfilms')
+ {
+ binmode( MOVIES, ':utf8' ) if $values[2] eq 'UTF8';
+ next;
+ }
+ }
+ my $idx = 0;
+ for my $field (@{$self->{fields}})
+ {
+ my $value = $values[$idx];
+ if ($field eq 'image')
+ {
+ my $origPath = GCUtils::getDisplayedImage($value, '', $file);
+ my $origFile = basename($origPath);
+ $origFile = $origPath = '' if ! -f $origPath;
+ # We copy the image only if it was a generated one and if we use the default path
+ if ($origFile =~ /^gcfilms_/)
+ {
+ # We don't change the filename as gcstar has a different pattern for automatic files
+ my $destPath = $self->{options}->{parent}->getImagesDir;
+ copy($origPath, $destPath) if $origPath ne $destPath;
+ $result[$i]->{image} = $destPath.$origFile;
+ }
+ else
+ {
+ # We use the full path
+ $result[$i]->{image} = $origPath;
+ }
+ }
+ else
+ {
+ $value =~ s|:|;|gm if $field eq 'borrowings';
+ $value =~ s|<br>|\n|gm;
+ $value =~ s|<.*?>||gm;
+ if (!$value)
+ {
+ $value = 0 if $field eq 'age';
+ $value = 'none' if $field eq 'borrower';
+ }
+ $result[$i]->{$field} = $value;
+ }
+ $idx++;
+ }
+ $i++;
+ }
+ return \@result;
+
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportGCstar.pm b/lib/gcstar/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..1bff9c2
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportGCstar.pm
@@ -0,0 +1,106 @@
+package GCImport::GCImportGCstar;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterGCstar;
+ use base qw(GCImport::GCImportBaseClass);
+
+ use GCBackend::GCBackendXmlParser;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getName
+ {
+ return "GCstar (.gcs)";
+ }
+
+ sub getFilePatterns
+ {
+ return (['GCstar (.gcs)', '*.gcs']);
+ }
+
+ sub getModelName
+ {
+ my $self = shift;
+ return $self->{model}->getName;
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ return [
+ {
+ name => 'copyPics',
+ type => 'yesno',
+ label => 'CopyPictures',
+ default => '1'
+ }];
+ }
+
+ # Ignored for the moment
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+ sub getEndInfo
+ {
+ return "";
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+
+ my $parent = $self->{options}->{parent};
+ $self->{modelsFactory} = $parent->{modelsFactory};
+ $self->{modelAlreadySet} = 0;
+
+ my $copyPics = 1;
+ $copyPics = $self->{options}->{copyPics}
+ if exists $self->{options}->{copyPics};
+
+ my $backend = new GCBackend::GCBeXmlParser($self);
+ $backend->setParameters(file => $file);
+ my $loaded = $backend->load(0);
+ my $itemsArray = $loaded->{data};
+ if ($copyPics)
+ {
+ $self->copyPictures($itemsArray, $file);
+ }
+ return $itemsArray;
+
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportList.pm b/lib/gcstar/GCImport/GCImportList.pm
new file mode 100644
index 0000000..a2b2ec2
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportList.pm
@@ -0,0 +1,202 @@
+package GCImport::GCImportList;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterList;
+
+ use base qw(GCImport::GCImportBaseClass);
+
+ use GCPlugins;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub wantsFileSelection
+ {
+ return 1;
+ }
+
+ sub getFilePatterns
+ {
+ return ();
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+
+ my $pluginsList = '';
+ foreach (@{$self->{model}->getPluginsNames})
+ {
+ my $plugin = $GCPlugins::pluginsMap{$self->{model}->getName}->{$_};
+ $pluginsList .= $plugin->getName . ',';
+ }
+
+
+ return [
+ {
+ name => 'plugin',
+ type => 'options',
+ label => 'Plugin',
+ valuesList => $pluginsList
+ },
+
+ {
+ name => 'first',
+ type => 'yesno',
+ label => 'UseFirst',
+ default => '1'
+ },
+ ];
+
+
+ }
+
+ sub getModelName
+ {
+ my $self = shift;
+ return $self->{model}->getName;
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+ my @result;
+
+ #First we try to get the correct plugin
+ my $plugin = $GCPlugins::pluginsMap{$self->{model}->getName}->{$self->{options}->{plugin}};
+ $plugin->{bigPics} = $self->{options}->{parent}->{options}->bigPics;
+
+ my $titleField = $self->{model}->{commonFields}->{title};
+
+ open ITEMS, $file;
+ binmode(ITEMS, ':utf8');
+
+ my $i = 0;
+
+ my $resultsDialog;
+ if (!$self->{options}->{first})
+ {
+ $resultsDialog = $self->{options}->{parent}->getDialog('Results');
+ $resultsDialog->setModel($self->{model}, $self->{model}->{fieldsInfo});
+ $resultsDialog->setMultipleSelection(0);
+ }
+ while (<ITEMS>)
+ {
+ chomp;
+ next if ! $_;
+ # $_ contains the title to search
+ $plugin->{title} = $_;
+ $plugin->{type} = 'load';
+ $plugin->{urlField} = $self->{model}->{commonFields}->{url};
+ $plugin->{searchField} = $titleField;
+ #Initialize what will be pushed in the array
+ my $info = {$titleField => $_};
+
+ $self->{options}->{parent}->setWaitCursor($self->{options}->{lang}->{StatusSearch}.' ('.$_.')');
+ $plugin->load;
+
+ my $itemNumber = $plugin->getItemsNumber;
+
+ if ($itemNumber != 0)
+ {
+ $plugin->{type} = 'info';
+ if (($itemNumber == 1) || ($self->{options}->{first}))
+ {
+ $plugin->{wantedIdx} = 0;
+ }
+ else
+ {
+ my $withNext = 0;
+ my @items = $plugin->getItems;
+ $resultsDialog->setWithNext(0);
+ $resultsDialog->setSearchPlugin($plugin);
+ $resultsDialog->setList($_, @items);
+ $resultsDialog->show;
+ if ($resultsDialog->{validated})
+ {
+ $plugin->{wantedIdx} = $resultsDialog->getItemsIndexes->[0];
+ }
+ }
+ $info = $plugin->getItemInfo;
+ my $title = $info->{$titleField};
+ $self->{options}->{parent}->{defaultPictureSuffix} = $plugin->getDefaultPictureSuffix;
+ foreach my $field(@{$self->{model}->{managedImages}})
+ {
+ $info->{$field} = '' if $info->{$field} eq 'empty';
+ next if !$info->{$field};
+ ($info->{$field}) = $self->{options}->{parent}->downloadPicture($info->{$field}, $title);
+ }
+ $info->{comment} = $self->getLang->{CommentAuto}
+ . "\n"
+ . $self->getLang->{CommentSite}
+ . $plugin->getName()
+ . "\n"
+ . $self->getLang->{CommentTitle}
+ . $_
+ . "\n";
+
+ # Add the default value
+ my $defaultInfo = $self->{model}->getDefaultValues;
+ foreach my $field(keys %$defaultInfo)
+ {
+ next if exists $info->{$field};
+ $info->{$field} = $defaultInfo->{$field};
+ }
+ }
+
+ push @result, $info;
+ $self->{options}->{parent}->restoreCursor;
+ }
+ close ITEMS;
+ return \@result;
+ }
+
+
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+
+ return $message;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportMyMovies.pm b/lib/gcstar/GCImport/GCImportMyMovies.pm
new file mode 100644
index 0000000..a51b1c4
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportMyMovies.pm
@@ -0,0 +1,211 @@
+package GCImport::GCImportMyMovies;
+
+#################################################################################
+#
+# Created by Rob Maas rob@progob.nl | http://www.robmaas.eu (2008)
+#
+#
+# This file is strongly based op the already existing DVDProfiler
+# import class. It is also my first perl script :-)
+#
+# Since MyMovies has some different fields then GCStar, there are some work
+# arounds to get as much of the original data.
+#
+# If the field ExtraFeatures is filled, it will appear in the General tab in
+# the synopsis.
+#
+# The rating system will be calculated back to the Dutch rating system.
+#
+# If data was imported from IMDB, the webpage button will link to the specific
+# movie site on IMDB.
+#
+# Cause GCstar hasn´t (yet?) a real EAN field, the EAN code is placed on the
+# details tab under comments.
+#
+# Special thanks goes to Tian who helped me with some array trouble :-P and
+# for creating this software.
+#
+#################################################################################
+
+use strict;
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterMyMovies;
+
+ use base qw(GCImport::GCImportBaseClass);
+
+ use XML::Simple;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return "MyMovies (.xml)";
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ my @options;
+ return \@options;
+ }
+
+ sub getFilePatterns
+ {
+ return (['MyMovies (.xml)', '*.xml']);
+ }
+
+ #Return supported models name
+ sub getModels
+ {
+ return ['GCfilms'];
+ }
+
+ # Ignored for the moment
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+ sub getEndInfo
+ {
+ return "";
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+ my $xml;
+ my $data;
+ # Creates an object / Skip empty ellements
+ $xml = new XML::Simple(suppressempty => 1);
+ $data = $xml->XMLin ("$file");
+
+ my @result;
+ my $film;
+
+ # For each "Title" in the XML file
+ foreach $film(@{$data->{Title}}){
+ my $item;
+
+ #General fields
+ $item->{title} = $film->{LocalTitle};
+ $item->{original} = $film->{OriginalTitle};
+ $item->{date} = $film->{ProductionYear};
+ $item->{time} = $film->{RunningTime}.' min';
+ $item->{synopsis} = $film->{Description};
+
+ #Extra's on the disc
+ if ($film->{ExtraFeatures}->{content}){
+ $item->{synopsis} .= "\n\nEXTRA\n";
+ $item->{synopsis} .= $film->{ExtraFeatures}->{content};
+ }
+
+ #Based on the Dutch ratings!
+
+ $item->{age} =
+ ($film->{ParentalRating}->{Value} == 1) ? 1
+ : ($film->{ParentalRating}->{Value} == 2) ? 2
+ : ($film->{ParentalRating}->{Value} == 3) ? 5
+ : ($film->{ParentalRating}->{Value} == 4) ? 12
+ : 16;
+
+ if ($film->{DataProvider} eq 'IMDB.com'){
+ $item->{webPage} = 'http://www.imdb.com/title/'.$film->{DataProviderId};
+ }
+ $item->{country} = $film->{Country};
+
+ ###### GENRE #########
+ my $type;
+ if (ref ($film->{Genres}->{Genre}) eq "ARRAY"){
+ foreach $type(@{$film->{Genres}->{Genre}}){
+ $item->{genre} .= $type.',';
+ }
+ }
+ else{
+ $item->{genre} = $film->{Genres}->{Genre};
+ }
+ ###### END GENRE #########
+ ####### DIRECTOR AND ACTORS #########
+ my $actor;
+ if (ref ($film->{Persons}->{Person}) eq "ARRAY") {
+ foreach $actor(@{$film->{Persons}->{Person}}){
+ if ($actor->{Type} eq 'Director'){
+ $item->{director} = $actor->{Name};
+ }
+ else{
+ $item->{actors}.= $actor->{Name}.' ('.$actor->{Role}.'), ';
+ }
+ }
+ }
+ else{
+ $item->{actors}.= $film->{Persons}->{Person}->{Name}.' ('.$film->{Persons}->{Person}->{Role}.')';
+ }
+ ###### END DIRECTOR AND ACTORS ######
+
+ ##DETAIL
+ $item->{format} = $film->{Type};
+ $item->{video} = $film->{VideoStandard};
+ $item->{added} = $film->{Added};
+ $item->{identifier} = $film->{CollectionNumber};
+
+ #Temporately cause a real barcode field is missing
+ if (length($film->{Barcode}) gt 0){
+ $item->{comment} = 'EAN: '.$film->{Barcode};
+ }
+
+ ###### AUDIO #########
+ my $audio;
+ my @audioTracks;
+ if (ref ($film->{AudioTracks}->{AudioTrack}) eq "ARRAY"){
+ foreach $audio(@{$film->{AudioTracks}->{AudioTrack}}){
+ push @audioTracks, [$audio->{Language}, $audio->{Type}.' '.$audio->{Channels}];
+ }
+ $item->{audio} = \@audioTracks;
+ }
+ else{
+ $item->{audio} = [[$audio->{Language}, $audio->{Type}]];
+ }
+ ###### END AUDIO #########
+ ###### SUBTITLES #########
+ my $subt;
+ if (ref ($film->{Subtitles}->{Subtitle}) eq "ARRAY"){
+ foreach $subt(@{$film->{Subtitles}->{Subtitle}}){
+ $item->{subt} .= $subt->{Language}.',';
+ }
+ }
+ else{
+ $item->{subt} = $subt->{Language};
+ }
+ ###### END SUBTITLES #########
+
+ #$item->{borrower} = $film->{Title};
+ #$item->{lendDate} = $film->{Title};
+ #$item->{history} = $film->{Title};
+ #$item->{seen} = $film->{Title};# non par defaut ?
+ #$item->{image} = $film->{Title};
+ #$item->{number} = $film->{CollectionNumber};
+ #$item->{rating} = $film->{Title};# note par defaut
+ #$item->{place} = $film->{Title};
+
+ $item->{director} =~ s/, $//;
+ $item->{actors} =~ s/, $//;
+ $item->{audio} =~ s/, $//;
+ $item->{subt} =~ s/, $//;
+ $item->{genre} =~ s/, $//;
+ push @result, $item;
+ }
+ return \@result;
+
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportScanner.pm b/lib/gcstar/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..92c5bba
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportScanner.pm
@@ -0,0 +1,394 @@
+package GCImport::GCImportList;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCImport::GCImportBase;
+
+{
+ package GCScannerDialog;
+ use base 'GCModalDialog';
+ use XML::Simple;
+
+ sub new
+ {
+ my ($proto, $parent, $lang, $model, $serverSocket) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $lang->{Waiting});
+ bless($self, $class);
+
+ $self->{lang} = $lang;
+ $self->{model} = $model;
+ $self->{accepted} = 0;
+ if ($serverSocket)
+ {
+ $self->{network} = 1;
+ $self->{serverSocket} = $serverSocket;
+ }
+ my $table = new Gtk2::Table(2, 2);
+ $table->set_row_spacings($GCUtils::halfMargin);
+ $table->set_col_spacings($GCUtils::margin);
+ $table->set_border_width($GCUtils::margin);
+ $self->{previousLabel} = new GCLabel('');
+ $self->{promptLabel} = new GCLabel($lang->{ScanPrompt});
+ $table->attach($self->{previousLabel}, 0, 1, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{promptLabel}, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ my $eanLabel = new GCLabel($lang->{EAN});
+ $self->{ean} = new GCShortText;
+ $self->{ean}->signal_connect('activate' => sub {$self->response('ok')} );
+ if (!$self->{network})
+ {
+ $table->attach($eanLabel, 0, 1, 2, 3, 'fill', 'fill', 0, 0);
+ $table->attach($self->{ean}, 1, 2, 2, 3, ['fill', 'expand'], 'fill', 0, 0);
+ }
+ $self->vbox->pack_start($table, 1, 1, 0);
+ $table->show_all;
+ $self->setCancelLabel($lang->{Terminate});
+ $self->action_area->remove(($self->action_area->get_children)[$self->{okPosition}]);
+ return $self;
+ }
+
+ sub setPrevious
+ {
+ my ($self, $previous) = @_;
+ if (!$self->{first})
+ {
+ $self->{first} = 1;
+ return;
+ }
+ my $label;
+ if ($previous)
+ {
+ ($label = $self->{lang}->{Previous}) =~ s|%s|<b>$previous</b>|;
+ }
+ else
+ {
+ my $previous = $self->{previousCode};
+ ($label = $self->{lang}->{NothingFound}) =~ s|%s|<b>$previous</b>|;
+ }
+ $self->{previousLabel}->set_markup($label);
+ $self->{promptLabel}->set_label($self->{lang}->{ScanOtherPrompt});
+ }
+
+ sub readSocket
+ {
+ my ($self) = @_;
+ Glib::Source->remove($self->{socketWatch});
+ my $socket = $self->{socket};
+ my $line = <$socket>;
+ $self->response('cancel') if !$line;
+ my $xs = XML::Simple->new;
+ my $scan = $xs->XMLin($line);
+ my $code = $scan->{scan}->{content};
+ $code = $self->eanToIsbn($code)
+ if $self->{model} eq 'GCbooks';
+ $self->{ean}->setValue($code);
+ $self->{previousCode} = $code;
+ $self->response('ok');
+ }
+
+ sub waitForCode
+ {
+ my $self = shift;
+ $self->{socketWatch} = Glib::IO->add_watch($self->{socket}->fileno,
+ 'in',
+ sub {
+ $self->readSocket;
+ });
+ }
+
+ sub eanToIsbn
+ {
+ my ($self, $code) = @_;
+ return $code if $code !~ /978(\d{9})/;
+ my $sub = $1;
+ my $multiplier = 1;
+ my $checkSum = 0;
+ foreach (split(//, $sub))
+ {
+ $checkSum += $_ * $multiplier++;
+ }
+ $checkSum %= 11;
+ $checkSum = 'X' if $checkSum == 10;
+ return $sub.$checkSum;
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+ $self->showMe;
+ if ($self->{network})
+ {
+ if (!$self->{accepted})
+ {
+ $self->{serverWatch} = Glib::IO->add_watch($self->{serverSocket}->fileno,
+ 'in',
+ sub {
+ $self->{socket} = $self->{serverSocket}->accept;
+ $self->{accepted} = 1;
+ $self->waitForCode;
+ });
+ }
+ else
+ {
+ $self->waitForCode;
+ }
+ }
+ else
+ {
+ $self->{ean}->setValue('');
+ $self->{ean}->grab_focus;
+ }
+ my $code = $self->run;
+ $self->hide;
+ return $self->{ean}->getValue if $code eq 'ok';
+ $self->{socket}->close;
+ return undef;
+ }
+}
+
+{
+ package GCImport::GCImporterScanner;
+
+ use base qw(GCImport::GCImportBaseClass);
+
+ use IO::Socket;
+ use GCPlugins;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub wantsFileSelection
+ {
+ return 0;
+ }
+
+ sub hideFileSelection
+ {
+ return 1;
+ }
+
+ sub getFilePatterns
+ {
+ return ();
+ }
+
+ sub checkPortField
+ {
+ my ($self, $data) = @_;
+ my ($parent, $list) = @{$data};
+ my $model = $list->getValue ;
+ $parent->{options}->{port}->set_sensitive($model eq 'Network');
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+
+ my $pluginsList = '';
+ foreach (@{$self->{model}->getPluginsNames})
+ {
+ my $plugin = $GCPlugins::pluginsMap{$self->{model}->getName}->{$_};
+ $pluginsList .= $plugin->getName . ','
+ if $plugin->getEanField;
+ }
+
+
+ return [
+ {
+ name => 'type',
+ type => 'options',
+ label => 'Type',
+ valuesList => 'Local,Network',
+ default => 'Local',
+ changedCallback => sub {shift; $self->checkPortField(@_)},
+ },
+
+ {
+ name => 'port',
+ type => 'number',
+ label => 'Port',
+ default => 50007,
+ min => 1024,
+ max => 65536,
+ },
+
+ {
+ name => 'plugin',
+ type => 'options',
+ label => 'Plugin',
+ valuesList => $pluginsList
+ },
+
+ {
+ name => 'first',
+ type => 'yesno',
+ label => 'UseFirst',
+ default => '1'
+ },
+ ];
+ }
+
+ sub getModelName
+ {
+ my $self = shift;
+ return $self->{model}->getName;
+ }
+
+ sub getBarCode
+ {
+ my ($self, $previous) = @_;
+ #my $dialog = new
+ $self->{dialog}->setPrevious($previous);
+ return $self->{dialog}->show;
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+ my @result;
+
+ #First we try to get the correct plugin
+ my $plugin = $GCPlugins::pluginsMap{$self->{model}->getName}->{$self->{options}->{plugin}};
+ $plugin->{bigPics} = $self->{options}->{parent}->{options}->bigPics;
+
+ my $titleField = $self->{model}->{commonFields}->{title};
+ my $searchField = $plugin->getEanField;
+
+ my $i = 0;
+
+ my $resultsDialog;
+ if (!$self->{options}->{first})
+ {
+ $resultsDialog = $self->{options}->{parent}->getDialog('Results');
+ $resultsDialog->setModel($self->{model}, $self->{model}->{fieldsInfo});
+ $resultsDialog->setMultipleSelection(0);
+ }
+ my $search;
+
+ my $socket;
+ if ($self->{options}->{type} eq 'Network')
+ {
+ $socket = new IO::Socket::INET(
+ LocalPort => $self->{options}->{port},
+ Proto => 'tcp',
+ Listen => 1,
+ Reuse => 1
+ );
+ }
+
+ $self->{dialog} = new GCScannerDialog($self->{options}->{parent},
+ $self->getLang,
+ $self->{model}->getName,
+ $socket);
+ my $previous = '';
+ while ($search = $self->getBarCode($previous))
+ {
+ chomp $search;
+ next if ! $search;
+ # $_ contains the title to search
+ $plugin->{title} = $search;
+ $plugin->{type} = 'load';
+ $plugin->{urlField} = $self->{model}->{commonFields}->{url};
+ $plugin->{searchField} = $searchField;
+ #Initialize what will be pushed in the array
+ my $info = {$searchField => $search};
+
+ $self->{options}->{parent}->setWaitCursor($self->{options}->{lang}->{StatusSearch}.' ('.$search.')');
+ $plugin->load;
+
+ my $itemNumber = $plugin->getItemsNumber;
+
+ if ($itemNumber != 0)
+ {
+ $plugin->{type} = 'info';
+ if (($itemNumber == 1) || ($self->{options}->{first}))
+ {
+ $plugin->{wantedIdx} = 0;
+ }
+ else
+ {
+ my $withNext = 0;
+ my @items = $plugin->getItems;
+ $resultsDialog->setWithNext(0);
+ $resultsDialog->setSearchPlugin($plugin);
+ $resultsDialog->setList($search);
+ $resultsDialog->show;
+ if ($resultsDialog->{validated})
+ {
+ $plugin->{wantedIdx} = $resultsDialog->getItemsIndexes->[0];
+ }
+ }
+ $info = $plugin->getItemInfo;
+ my $title = $info->{$titleField};
+ $self->{options}->{parent}->{defaultPictureSuffix} = $plugin->getDefaultPictureSuffix;
+ foreach my $field(@{$self->{model}->{managedImages}})
+ {
+ $info->{$field} = '' if $info->{$field} eq 'empty';
+ next if !$info->{$field};
+ ($info->{$field}) = $self->{options}->{parent}->downloadPicture($info->{$field}, $title);
+ }
+
+ # Add the default value
+ my $defaultInfo = $self->{model}->getDefaultValues;
+ foreach my $field(keys %$defaultInfo)
+ {
+ next if exists $info->{$field};
+ $info->{$field} = $defaultInfo->{$field};
+ }
+ }
+ $previous = $info->{$titleField};
+ push @result, $info;
+ $self->{options}->{parent}->restoreCursor;
+ }
+ $socket->close if $socket;
+ return \@result;
+ }
+
+
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+ return $message;
+ }
+}
+
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportTarGz.pm b/lib/gcstar/GCImport/GCImportTarGz.pm
new file mode 100644
index 0000000..b995b82
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportTarGz.pm
@@ -0,0 +1,152 @@
+package GCImport::GCImportTarGz;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterTarGz;
+
+ use base qw(GCImport::GCImportBaseClass);
+
+ use GCBackend::GCBackendXmlParser;
+
+ use File::Spec;
+ use File::Temp qw/ tempfile tempdir /;
+ use Cwd;
+ use File::Copy;
+
+ #use GCData;
+
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->checkModule('Compress::Zlib');
+ $self->checkModule('Archive::Tar');
+ $self->checkModule('File::Path');
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return ".tar.gz";
+ }
+
+ sub getFilePatterns
+ {
+ return (['Tar gzip (.tar.gz)', '*.tar.gz']);
+ }
+
+ sub getModelName
+ {
+ my $self = shift;
+
+ return $self->{model}->getName;
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ my @options;
+ return \@options;
+ }
+
+ # Ignored for the moment
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+ sub getEndInfo
+ {
+ my $self = shift;
+ return ($self->{parsingError}, 'error');
+ }
+
+ sub addFieldsToDefaultModel
+ {
+ my ($self, $inlineModel) = @_;
+ my $model = GCModelLoader->newFromInline($self, {inlineModel => $inlineModel, defaultModifier => 1});
+ $self->{model}->addFields($model);
+ $self->{options}->{parent}->setCurrentModel($self->{model});
+ $self->{modelAlreadySet} = 1;
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+
+ my ($tarFh, $tarFilename) = tempfile();
+ my $gz = Compress::Zlib::gzopen($file, "rb");
+ my $buffer;
+ print $tarFh $buffer while $gz->gzread($buffer) > 0 ;
+ close $tarFh;
+ $gz->gzclose;
+
+ my $tmpDir = tempdir();
+ my $oldCwd = getcwd;
+ chdir $tmpDir;
+ my $tar = Archive::Tar->new($tarFilename);
+ $tar->extract;
+ my $listFile = './collection.gcs';
+
+ my $parent = $self->{options}->{parent};
+ $self->{modelsFactory} = $parent->{modelsFactory};
+ $self->{modelAlreadySet} = 0;
+
+ my $backend = new GCBackend::GCBeXmlParser($self);
+ $backend->setParameters(file => $listFile);
+ my $loaded = $backend->load(0);
+ my $itemsArray = [];
+ if ($loaded->{error})
+ {
+ $self->{parsingError} = GCUtils::formatOpenSaveError(
+ $parent->{lang},
+ $file,
+ $loaded->{error}
+ );
+ }
+ else
+ {
+ $itemsArray = $loaded->{data};
+
+ #Copying pictures
+ $self->copyPictures($itemsArray, $file);
+ }
+
+ #Cleaning
+ chdir $oldCwd;
+ File::Path::rmtree($tmpDir);
+ unlink $tarFilename;
+
+ return $itemsArray;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportTellico.pm b/lib/gcstar/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..033b474
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportTellico.pm
@@ -0,0 +1,496 @@
+package GCImport::GCImportTellico;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterTellico;
+
+ use base qw(GCImport::GCImportBaseClass);
+ use File::Spec;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->checkModule('Archive::Zip');
+ $self->checkModule('MIME::Base64');
+
+ # Associate a Tellico type to a GCstar model
+ $self->{models} = {
+ 2 => 'GCbooks',
+ 3 => 'GCfilms',
+ 4 => 'GCmusics',
+ 8 => 'GCcoins',
+ 11 => 'GCgames'
+ };
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return "Tellico (.tc)";
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ my @options;
+ return \@options;
+ }
+
+ sub getFilePatterns
+ {
+ my $self = shift;
+
+ return (['Tellico Format (.tc)', '*.tc'], ['Tellico XML (.xml)', '*.xml']);
+ }
+
+ #Return supported models name
+ sub getModels
+ {
+ my $self = shift;
+ my @models = values %{$self->{models}};
+ return \@models;
+ }
+
+ sub getModelName
+ {
+ my $self = shift;
+
+ return $self->{extractedModel};
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub getEndInfo
+ {
+ my $self = shift;
+
+ return $self->{parsingError};
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+
+ my @result = ();
+
+ my $xml;
+
+ # File type is based on suffix
+ # T is for Tellico (zipped file)
+ # X is for XML
+ $self->{type} = ($file =~ m/tc$/) ? 'T' : 'X';
+ #Then we test to be sure
+ eval
+ {
+ $self->{zip} = Archive::Zip->new($file);
+ };
+ #First we uncompress file
+ if (($self->{type} eq 'T') && ($self->{zip}))
+ {
+ $xml = $self->{zip}->contents('tellico.xml');
+ }
+ else
+ {
+ $self->{type} = 'X';
+ open XML, $file;
+ $xml = do {local $/; <XML>};
+ close XML;
+ }
+
+ #Then we parse XML data
+ my $xs = XML::Simple->new;
+ my $tellico = $xs->XMLin($xml,
+ SuppressEmpty => '',
+ ForceArray => 1);
+ my $collection = $tellico->{collection}->[0];
+
+ $self->{extractedModel} = $self->{models}->{$collection->{type}};
+ #We check we know this model
+ if (! $self->{extractedModel})
+ {
+ $self->{parsingError} = $self->getLang->{NotSupported};
+ return \@result;
+ }
+
+ my %tmpMap;
+ # If there are no ids, we have an array in $collection
+ if (ref ($collection->{entry}) eq 'ARRAY')
+ {
+ my $i = 0;
+ #Then we prepare a map
+ foreach (@{$collection->{entry}})
+ {
+ $tmpMap{$i} = $_;
+ $i++;
+ }
+ }
+ else
+ {
+ %tmpMap = %{$collection->{entry}};
+ }
+ #Loop on entries
+ my $i = 0;
+
+ my $methodName = 'get'.$self->{extractedModel}.'Item';
+
+ while (my ($id, $entry) = each (%tmpMap))
+ {
+ $result[$i] = $self->$methodName($entry, $collection);
+ $i++;
+ }
+ return \@result;
+
+ }
+
+ sub getGCfilmsItem
+ {
+ my ($self, $entry, $collection) = @_;
+
+ my %result;
+
+ $result{title} = $entry->{title}->[0];
+ $result{format} = $entry->{medium}->[0];
+ $result{date} = $entry->{year}->[0];
+ my $certification = $entry->{certification}->[0];
+ if ($certification eq 'U (USA)')
+ {
+ $result{age} = 1;
+ }
+ elsif ($certification eq 'G (USA)')
+ {
+ $result{age} = 2;
+ }
+ elsif ($certification eq 'PG (USA)')
+ {
+ $result{age} = 5;
+ }
+ elsif ($certification eq 'PG-13 (USA)')
+ {
+ $result{age} = 13;
+ }
+ elsif ($certification eq 'R (USA)')
+ {
+ $result{age} = 17;
+ }
+ $result{genre} = [];
+ if ($entry->{genres}->[0])
+ {
+ for my $genre(@{$entry->{genres}->[0]->{genre}})
+ {
+ push @{$result{genre}}, [$genre];
+ }
+ }
+ if ($entry->{nationalitys}->[0])
+ {
+ for my $country(@{$entry->{nationalitys}->[0]->{nationality}})
+ {
+ $result{country} .= $country.', ';
+ }
+ }
+ $result{country} =~ s/, $//;
+
+ $result{video} = $entry->{format}->[0];
+ if ($entry->{casts}->[0])
+ {
+ for my $cast(@{$entry->{casts}->[0]->{cast}})
+ {
+ $result{actors} .= $cast->{column}->[0];
+ $result{actors} .= ' ('.$cast->{column}->[1].')' if $cast->{column}->[1];
+ $result{actors} .= ', ';
+ }
+ }
+ $result{actors} =~ s/, $//;
+
+ if ($entry->{directors}->[0])
+ {
+ for my $director(@{$entry->{directors}->[0]->{director}})
+ {
+ $result{director} .= $director.', ';
+ }
+ }
+ $result{director} =~ s/, $//;
+
+ $result{audio} = [];
+ if ($entry->{languages}->[0])
+ {
+ for my $language(@{$entry->{languages}->[0]->{language}})
+ {
+ push @{$result{audio}}, [$language];
+ }
+ }
+ $result{subt} = [];
+ if ($entry->{subtitles}->[0])
+ {
+ for my $subtitle(@{$entry->{subtitles}->[0]->{subtitle}})
+ {
+ push @{$result{subt}}, [$subtitle];
+ }
+ }
+ $result{time} = $entry->{'running-time'}->[0];
+ $result{synopsis} = $entry->{plot}->[0];
+ $result{synopsis} =~ s{(<|&lt;)br/>}{\n}g;
+
+ $result{rating} = $self->convertRating($entry->{rating}->[0]);
+ #$result{borrower} = 'none' if (! $entry->{loaned});
+ $result{borrower} = 'Unknown' if ($entry->{loaned}->[0] eq 'true');
+ $result{comment} = $entry->{comments}->[0];
+
+ #Picture management
+ $result{image} = $self->getPicture($collection, $entry->{cover}->[0], $result{title});
+
+ return \%result;
+ }
+
+ sub getGCgamesItem
+ {
+ my ($self, $entry, $collection) = @_;
+
+ my %result;
+
+ $result{name} = $entry->{title}->[0];
+ $result{platform} = $entry->{platform}->[0];
+ $result{released} = $entry->{year}->[0];
+ $result{genre} = [];
+ if ($entry->{genres}->[0])
+ {
+ for my $genre(@{$entry->{genres}->[0]->{genre}})
+ {
+ push @{$result{genre}}, [$genre];
+ }
+ }
+ if ($entry->{publishers}->[0])
+ {
+ for my $editor(@{$entry->{publishers}->[0]->{publisher}})
+ {
+ $result{editor} .= $editor.', ';
+ }
+ $result{editor} =~ s/, $//;
+ }
+ if ($entry->{developers}->[0])
+ {
+ for my $developer(@{$entry->{developers}->[0]->{developer}})
+ {
+ $result{developer} .= $developer.', ';
+ }
+ $result{developer} =~ s/, $//;
+ }
+ $result{description} = $entry->{description}->[0];
+ $result{rating} = $self->convertRating($entry->{rating}->[0]);
+ $result{completion} = 100 if $entry->{completed}->[0] eq 'true';
+ $result{borrower} = 'Unknown' if ($entry->{loaned}->[0] eq 'true');
+ $result{boxpic} = $self->getPicture($collection, $entry->{cover}->[0], $result{name});
+ return \%result;
+ }
+
+ sub getGCbooksItem
+ {
+ my ($self, $entry, $collection) = @_;
+
+ my %result;
+
+ $result{title} = $entry->{title}->[0];
+ $result{isbn} = $entry->{isbn}->[0];
+ $result{authors} = [];
+ if ($entry->{authors}->[0])
+ {
+ for my $author(@{$entry->{authors}->[0]->{author}})
+ {
+ push @{$result{authors}}, [$author];
+ }
+ }
+ $result{publisher} = $entry->{publisher}->[0];
+ $result{publication} = $entry->{pub_year}->[0];
+ if ($entry->{languages}->[0])
+ {
+ for my $language(@{$entry->{languages}->[0]->{language}})
+ {
+ $result{language} .= $language.', ';
+ }
+ $result{language} =~ s/, $//;
+ }
+ $result{serie} = $entry->{series}->[0];
+ $result{rank} = $entry->{series_num}->[0];
+ $result{edition} = $entry->{edition}->[0];
+ $result{format} = $entry->{binding}->[0];
+ $result{description} = $entry->{comments}->[0];
+ $result{pages} = $entry->{pages}->[0];
+ $result{read} = 1 if ($entry->{read}->[0] eq 'true');
+ $result{acquisition} = $entry->{pur_date}->[0];
+ $result{genre} = [];
+ if ($entry->{genres}->[0])
+ {
+ for my $genre(@{$entry->{genres}->[0]->{genre}})
+ {
+ push @{$result{genre}}, [$genre];
+ }
+ }
+ $result{rating} = $self->convertRating($entry->{rating}->[0]);
+ $result{borrower} = 'Unknown' if ($entry->{loaned}->[0] eq 'true');
+ $result{cover} = $self->getPicture($collection, $entry->{cover}->[0], $result{title});
+ return \%result;
+ }
+
+ sub getGCmusicsItem
+ {
+ my ($self, $entry, $collection) = @_;
+
+ my %result;
+
+ $result{title} = $entry->{title}->[0];
+ $result{format} = $entry->{medium}->[0];
+ if ($entry->{artists}->[0])
+ {
+ for my $artist(@{$entry->{artists}->[0]->{artist}})
+ {
+ $result{artist} .= $artist.', ';
+ }
+ $result{artist} =~ s/, $//;
+ }
+ if ($entry->{labels}->[0])
+ {
+ for my $label(@{$entry->{labels}->[0]->{label}})
+ {
+ $result{label} .= $label.', ';
+ }
+ $result{label} =~ s/, $//;
+ }
+ $result{release} = $entry->{year}->[0];
+ $result{genre} = [];
+ if ($entry->{genres}->[0])
+ {
+ for my $genre(@{$entry->{genres}->[0]->{genre}})
+ {
+ push @{$result{genre}}, [$genre];
+ }
+ }
+ if ($entry->{tracks}->[0])
+ {
+ my $trackNum = 1;
+ for my $track(@{$entry->{tracks}->[0]->{track}})
+ {
+ push @{$result{tracks}}, [$trackNum,
+ $track->{column}->[0],
+ $track->{column}->[2]];
+ $trackNum++;
+ }
+ }
+ $result{comment} = $entry->{comments}->[0];
+ $result{rating} = $self->convertRating($entry->{rating}->[0]);
+ $result{borrower} = 'Unknown' if ($entry->{loaned}->[0] eq 'true');
+ $result{cover} = $self->getPicture($collection, $entry->{cover}->[0], $result{title});
+ return \%result;
+ }
+
+ sub getGCcoinsItem
+ {
+ my ($self, $entry, $collection) = @_;
+
+ my $i = 0;
+ my %result;
+
+ #$result{name} = $entry->{title}->[0];
+
+ $result{currency} = $entry->{type}->[0];
+ $result{value} = $entry->{denomination}->[0];
+ $result{year} = $entry->{years}->[0]->{year}->[0];
+ $result{country} = $entry->{country}->[0];
+ $result{type} = ($entry->{set}->[0] eq 'true') ? 'coin' : 'banknote';
+ # TODO: Import grade
+ $result{added} = $entry->{pur_date}->[0];
+ $result{estimate} = $entry->{pur_price}->[0];
+ $result{location} = $entry->{location}->[0];
+
+ $result{comments} = $entry->{comments}->[0];
+
+ $result{name} = $result{currency}.' '.$result{value}.' ('.$result{year}.')';
+
+ $result{picture} = $self->getPicture($collection, $entry->{obverse}->[0], $result{name});
+ $result{front} = $self->getPicture($collection, $entry->{obverse}->[0], $result{name}.'_front');
+ $result{back} = $self->getPicture($collection, $entry->{reverse}->[0], $result{name}.'_back');
+ return \%result;
+ }
+
+ sub getPicture
+ {
+ my ($self, $collection, $imageId, $title) = @_;
+
+ my $result = undef;
+ if ($imageId && (ref($imageId) ne 'HASH'))
+ {
+ (my $suffix = $imageId) =~ s/.*?(\.[^.]*)$/$1/;
+ my $fileName = $self->{options}->{parent}->getUniqueImageFileName($suffix, $title);
+ if ((exists $collection->{images}->[0]->{image}->{$imageId}) &&
+ (exists $collection->{images}->[0]->{image}->{$imageId}->{content}))
+ {
+ # Picture is embedded
+ my $data = MIME::Base64::decode_base64($collection->{images}->[0]->{image}->{$imageId}->{content});
+ open PIC, ">$fileName";
+ print PIC $data;
+ close PIC;
+ }
+ else
+ {
+ if ($self->{type} eq 'T')
+ {
+ # Only zipped file may have external pictures
+ my $picName = 'images/'.$imageId;
+ $self->{zip}->extractMember($picName, $fileName);
+ }
+ else
+ {
+ $fileName = '';
+ }
+ }
+ $result = $self->{options}->{parent}->transformPicturePath($fileName);
+ }
+ return $result;
+ }
+
+ sub convertRating
+ {
+ my ($self, $rating) = @_;
+ return 10 if $rating =~ /^5/;
+ return 7 if $rating =~ /^4/;
+ return 3 if $rating =~ /^2/;
+ return 0 if $rating =~ /^1/;
+ return 5; #if ($rating =~ /^3/) || ($rating == undef);
+ }
+
+}
+
+
+
+
+1;
diff --git a/lib/gcstar/GCItemsLists/GCImageListComponents.pm b/lib/gcstar/GCItemsLists/GCImageListComponents.pm
new file mode 100644
index 0000000..aa2bf2b
--- /dev/null
+++ b/lib/gcstar/GCItemsLists/GCImageListComponents.pm
@@ -0,0 +1,848 @@
+package GCImageListComponents;
+
+###################################################
+#
+# Copyright 2005-2011 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+{
+ package GCImageListItem;
+
+ use GCUtils;
+ use GCStyle;
+ use base "Gtk2::EventBox";
+ use File::Temp qw/ tempfile /;
+
+ @GCImageListItem::ISA = ('Gtk2::EventBox');
+
+ sub new
+ {
+ my ($proto, $container, $info) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+
+ # Some information that we'll need later
+ $self->{info} = $info;
+ $self->{container} = $container;
+ $self->{style} = $container->{style};
+ $self->{tooltips} = $container->{tooltips};
+ $self->{file} = $container->{parent}->{options}->file;
+ $self->{collectionDir} = $container->{collectionDir};
+ $self->{model} = $container->{parent}->{model};
+ $self->{imageCache} = $container->{imageCache};
+ $self->{dataManager} = $container->{parent}->{items};
+
+ $self->can_focus(1);
+ my $image = new Gtk2::Image;
+ $self->add($image);
+ $self->refreshInfo($info);
+ $self->set_size_request($container->{style}->{vboxWidth}, $container->{style}->{vboxHeight});
+ $self->show_all;
+
+ return $self;
+ }
+
+ sub setInfo
+ {
+ my ($self, $info) = @_;
+
+ $self->{info} = $info;
+ }
+
+ sub refreshInfo
+ {
+ my ($self, $info, $cacheRefresh) = @_;
+
+ $self->setInfo($info);
+
+ $self->refreshPopup;
+
+ delete $self->{zoomedPixbufCache};
+
+ {
+ my $pixbuf = $self->createPixbuf($info, $cacheRefresh);
+ if (! $self->{style}->{withImage})
+ {
+ $self->modify_bg('normal', $self->{style}->{inactiveBg});
+ }
+ $self->{previousPixbuf} = $pixbuf->copy;
+ $self->child->set_from_pixbuf($pixbuf);
+ }
+ if ($self->{selected})
+ {
+ $self->{selected} = 0;
+ $self->highlight;
+ $self->{selected} = 1;
+ }
+ }
+
+ sub refreshPopup
+ {
+ my $self = shift;
+ # Old versions of Gtk2 don't support set_tooltip_markup
+ eval {
+ $self->set_tooltip_markup($self->{dataManager}->getSummary($self->{info}->{idx}));
+ };
+ if ($@)
+ {
+ print "$@\n";
+ # So we do it the old way for them
+ $self->{tooltips}->set_tip($self, $self->{info}->{title}, '');
+ }
+ }
+
+ sub savePicture
+ {
+ my $self = shift;
+ $self->{previousPixbuf} = $self->child->get_pixbuf->copy
+ if $self->child;
+ }
+
+ sub restorePicture
+ {
+ my $self = shift;
+ $self->child->set_from_pixbuf($self->{previousPixbuf})
+ if $self->{previousPixbuf} && $self->child;
+ }
+
+ sub startZoomAnimation
+ {
+ my $self = shift;
+ $self->{currentZoom} = 1.01;
+ my $pixbuf = $self->createPixbuf($self->{info}, 0, 1.01);
+ $self->child->set_from_pixbuf($pixbuf);
+ $self->{zoomTimeout} = Glib::Timeout->add(20 , sub {
+ my $widget = shift;
+ $widget->{currentZoom} += 0.02;
+ if ($widget->{currentZoom} > 1.06)
+ {
+ $widget->{zoomTimeout} = undef;
+ return 0;
+ }
+ my $pixbuf = $widget->createPixbuf($self->{info}, 0, $widget->{currentZoom});
+ $widget->child->set_from_pixbuf($pixbuf)
+ if $widget->child;
+ return 1;
+ }, $self);
+ }
+
+ sub stopZoomAnimation
+ {
+ my $self = shift;
+ Glib::Source->remove($self->{zoomTimeout})
+ if $self->{zoomTimeout};
+ }
+
+ # This method sets all the event callbacks
+ sub prepareHandlers
+ {
+ my ($self, $idx, $info) = @_;
+ $self->{idx} = $idx;
+ $self->{info} = $info;
+
+ $self->signal_handler_disconnect($self->{mouseHandler})
+ if $self->{mouseHandler};
+ $self->{mouseHandler} = $self->signal_connect('button_press_event' => sub {
+ my ($widget, $event) = @_;
+
+ if (($event->type ne '2button-press') && !(($event->button eq 3) && ($widget->{selected})))
+ {
+ my $state = $event->get_state;
+ my $keepPrevious = 0;
+ if ($state =~ /control-mask/)
+ {
+ $widget->{container}->select($widget->{idx}, 0, 1);
+ }
+ elsif ($state =~ /shift-mask/)
+ {
+ $widget->{container}->restorePrevious;
+ $widget->{container}->selectMany($widget->{idx});
+ }
+ else
+ {
+ $widget->{container}->select($widget->{idx});
+ }
+ $widget->{container}->setPreviousSelectedDisplayed($widget->{idx});
+
+ #$self->{parent}->display($widget->{idx}) unless $event->type eq '2button-press';
+ $widget->{container}->displayDetails(0, keys %{$widget->{container}->{selectedIndexes}});
+ }
+
+ $widget->{container}->displayDetails(1, $widget->{idx}) if $event->type eq '2button-press';
+ $widget->{container}->showPopupMenu($event->button, $event->time) if ($event->button eq 3);
+ $widget->grab_focus;
+ });
+
+ if ($self->{style}->{withAnimation})
+ {
+ $self->signal_handler_disconnect($self->{enterHandler})
+ if $self->{enterHandler};
+ $self->{enterHandler} = $self->signal_connect('enter_notify_event' => sub {
+ my ($widget, $event) = @_;
+ if (!$widget->{selected})
+ {
+ $widget->startZoomAnimation;
+ }
+ });
+
+ $self->signal_handler_disconnect($self->{leaveHandler})
+ if $self->{leaveHandler};
+ $self->{leaveHandler} = $self->signal_connect('leave_notify_event' => sub {
+ my ($widget, $event) = @_;
+ if (!$widget->{selected})
+ {
+ $widget->stopZoomAnimation;
+ $widget->restorePicture;
+ }
+ });
+ }
+
+
+ $self->signal_handler_disconnect($self->{keyHandler})
+ if $self->{keyHandler};
+
+ $self->{keyHandler} = $self->signal_connect('key-press-event' => sub {
+ my ($widget, $event) = @_;
+ my $displayed = $self->{container}->convertIdxToDisplayed($widget->{idx});
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+ if ($key eq 'Delete')
+ {
+ $widget->{container}->{parent}->deleteCurrentItem;
+ return 1;
+ }
+ if (($key eq 'Return') || ($key eq 'space'))
+ {
+ $widget->{container}->displayDetails(1, $widget->{idx});
+ return 1;
+ }
+ my $unicode = Gtk2::Gdk->keyval_to_unicode($event->keyval);
+ if ($unicode)
+ {
+ $self->{container}->showSearch(pack('U',$unicode));
+ }
+ else
+ {
+ my $columns = $widget->{container}->getColumnsNumber;
+
+ ($key eq 'Right') ? $displayed++ :
+ ($key eq 'Left') ? $displayed-- :
+ ($key eq 'Down') ? $displayed += $columns :
+ ($key eq 'Up') ? $displayed -= $columns :
+ ($key eq 'Page_Down') ? $displayed += ($widget->{style}->{pageCount} * $columns):
+ ($key eq 'Page_Up') ? $displayed -= ($widget->{style}->{pageCount} * $columns):
+ ($key eq 'Home') ? $displayed = 0 :
+ ($key eq 'End') ? $displayed = $widget->{container}->getNbItems - 1 :
+ return 1;
+
+ return 1 if ($displayed < 0) || ($displayed >= $widget->{container}->getNbItems);
+ my $column = $displayed % $columns;
+ my $valueIdx = $widget->{container}->convertDisplayedToIdx($displayed);
+# my $keepPrevious = 0;
+ my $state = $event->get_state;
+ if ($state =~ /control-mask/)
+ {
+ $widget->{container}->select($valueIdx, 0, 1);
+ $widget->{container}->unsetPreviousSelectedDisplayed;
+ }
+ elsif ($state =~ /shift-mask/)
+ {
+ $widget->{container}->setPreviousSelectedDisplayed($widget->{idx});
+ $widget->{container}->restorePrevious;
+ $widget->{container}->selectMany($valueIdx);
+ }
+ else
+ {
+ $widget->{container}->select($valueIdx);
+ $widget->{container}->unsetPreviousSelectedDisplayed;
+ }
+ $widget->{container}->displayDetails(0, $valueIdx);
+ $widget->{container}->grab_focus;
+ $widget->{container}->showCurrent unless (($key eq 'Left') && ($column != ($columns - 1)))
+ || (($key eq 'Right') && ($column != 0));
+ }
+ return 1;
+
+ });
+
+ }
+
+ sub highlight
+ {
+ my ($self, $keepPrevious) = @_;
+ return if $self->{selected};
+ $self->{selected} = 1;
+ if (! $self->{style}->{withImage})
+ {
+ $self->modify_bg('normal', $self->{style}->{activeBg});
+ }
+# $self->savePicture
+# unless $keepPrevious;
+
+ my $pixbuf = $self->createPixbuf($self->{info}, 0, 1.1);
+
+ $pixbuf->saturate_and_pixelate($pixbuf, 1.5, 0);
+ $pixbuf = $pixbuf->composite_color_simple ($pixbuf->get_width, $pixbuf->get_height, 'nearest',220, 128, $self->{style}->{activeBgValue}, $self->{style}->{activeBgValue});
+ $self->child->set_from_pixbuf($pixbuf);
+ }
+
+ sub unhighlight
+ {
+ my ($self) = @_;
+
+ $self->modify_bg('normal', $self->{style}->{inactiveBg})
+ if (! $self->{style}->{withImage});
+ $self->restorePicture;
+ $self->{selected} = 0;
+ }
+
+ sub createPixbuf
+ {
+ my ($self, $info, $cacheRefresh, $zoom) = @_;
+
+ my $displayedImage = $info->{picture};
+ my $pixbuf = undef;
+
+ my $borrower = $info->{borrower};
+ my $favourite = $info->{favourite};
+
+ # Item has a picture assigned
+ if ($cacheRefresh)
+ {
+ $self->{imageCache}->forceCacheUpdateForNextUse;
+ }
+
+ if ($zoom)
+ {
+ if (! exists $self->{zoomedPixbufCache}->{$zoom})
+ {
+ $self->{zoomedPixbufCache}->{$zoom} = $self->{imageCache}->getPixbuf($info, $zoom);
+ }
+ $pixbuf = $self->{zoomedPixbufCache}->{$zoom};
+ }
+ else
+ {
+ $pixbuf = $self->{imageCache}->getPixbuf($info, $zoom);
+ }
+
+ my $width;
+ my $height;
+ my $boxWidth = $self->{style}->{imgWidth};
+ my $boxHeight = $self->{style}->{imgHeight};
+
+ my $overlay;
+ my $imgWidth;
+ my $imgHeight;
+ my $targetOverlayHeight;
+ my $targetOverlayWidth;
+ my $pixbufTempHeight;
+ my $pixbufTempWidth;
+ my $alpha = 1;
+ if ($self->{style}->{useOverlays})
+ {
+ # Need to call this to get the overlay padding
+ ($imgWidth, $imgHeight, $overlay) = $self->{imageCache}->getDestinationImgSize($pixbuf->get_width,
+ $pixbuf->get_height);
+ }
+ $width = $pixbuf->get_width;
+ $height = $pixbuf->get_height;
+
+ # Do the composition
+
+ if ($self->{style}->{useOverlays})
+ {
+ if ($self->{style}->{withImage})
+ {
+ # Using background, so center accordingly
+ my $offsetX = (($self->{style}->{offsetX} / 2) * $self->{style}->{factor}) + (($boxWidth - ($width + $overlay->{paddingLeft} + $overlay->{paddingRight})) / 2);
+ my $offsetY = 15 * $self->{style}->{factor} + ($boxHeight - ($height + $overlay->{paddingTop} + $overlay->{paddingBottom}));
+
+ # Make an empty pixbuf to work within
+ my $tempPixbuf =Gtk2::Gdk::Pixbuf->new('rgb', 1, 8,
+ $self->{style}->{backgroundPixbuf}->get_width,
+ $self->{style}->{backgroundPixbuf}->get_height);
+ $tempPixbuf->fill(0x00000000);
+
+ # Place cover in pixbuf
+ $pixbuf->composite($tempPixbuf,
+ $offsetX + $overlay->{paddingLeft}, $offsetY + $overlay->{paddingTop},
+ $width , $height,
+ $offsetX + $overlay->{paddingLeft}, $offsetY + $overlay->{paddingTop},
+ 1, 1,
+ 'nearest', 255);
+ $pixbuf = $tempPixbuf;
+
+ # Composite overlay picture
+ $self->{style}->{overlayPixbuf}->composite($pixbuf,
+ $offsetX, $offsetY,
+ $width + $overlay->{paddingLeft} + $overlay->{paddingRight},
+ $height + $overlay->{paddingTop} + $overlay->{paddingBottom},
+ $offsetX, $offsetY,
+ ($width + $overlay->{paddingLeft} + $overlay->{paddingRight}) / $self->{style}->{overlayPixbuf}->get_width,
+ ($height + $overlay->{paddingTop} + $overlay->{paddingBottom}) / $self->{style}->{overlayPixbuf}->get_height,
+ 'nearest', 255);
+
+ # Overlay borrower image if required
+ if ($borrower && ($borrower ne 'none'))
+ {
+ # De-saturate borrowed items
+ $pixbuf->saturate_and_pixelate($pixbuf, .1, 0);
+ $self->{style}->{lendPixbuf}->composite($pixbuf,
+ $pixbuf->get_width - $self->{style}->{lendPixbuf}->get_width - $offsetX,
+ $offsetY + $height + $overlay->{paddingTop} + $overlay->{paddingBottom} - $self->{style}->{lendPixbuf}->get_height,
+ $self->{style}->{lendPixbuf}->get_width, $self->{style}->{lendPixbuf}->get_height,
+ $pixbuf->get_width - $self->{style}->{lendPixbuf}->get_width - $offsetX,
+ $offsetY + $height + $overlay->{paddingTop} + $overlay->{paddingBottom} - $self->{style}->{lendPixbuf}->get_height,
+ 1, 1,
+ 'nearest', 255);
+ }
+
+ # Overlay favourite image if required
+ if ($favourite)
+ {
+ $self->{style}->{favPixbuf}->composite($pixbuf,
+ $pixbuf->get_width - $self->{style}->{favPixbuf}->get_width - $offsetX,
+ $offsetY,
+ $self->{style}->{favPixbuf}->get_width, $self->{style}->{favPixbuf}->get_height,
+ $pixbuf->get_width - $self->{style}->{favPixbuf}->get_width - $offsetX,
+ $offsetY,
+ 1, 1,
+ 'nearest', 255);
+ }
+
+ # Create and apply reflection if required
+ if ($self->{style}->{withReflect})
+ {
+ my $reflect;
+ $reflect = $pixbuf->flip(0);
+ $reflect->composite(
+ $pixbuf,
+ 0, 2 * ($offsetY + $height + $overlay->{paddingTop} + $overlay->{paddingBottom}) - $pixbuf->get_height,
+ $pixbuf->get_width,
+ 2 * ($pixbuf->get_height - $height - $offsetY - $overlay->{paddingTop} - $overlay->{paddingBottom}) - (10 * $self->{style}->{factor}),
+ 0, 2 * ($offsetY + $height + $overlay->{paddingTop} + $overlay->{paddingBottom}) - $pixbuf->get_height,
+ 1, 1,
+ 'nearest', 100
+ );
+
+ # Apply foreground fading
+ $self->{style}->{foregroundPixbuf}->composite(
+ $pixbuf,
+ 0, 0,
+ $pixbuf->get_width, $pixbuf->get_height,
+ 0, 0,
+ 1, 1,
+ 'nearest', 255
+ );
+ }
+
+ # Heft created pixbuf onto background
+ my $bgPixbuf = $self->{style}->{backgroundPixbuf}->copy;
+ $pixbuf->composite($bgPixbuf,
+ 0,0,
+ $pixbuf->get_width , $pixbuf->get_height,
+ 0,0,
+ 1, 1,
+ 'nearest', 255);
+ $pixbuf = $bgPixbuf;
+
+ }
+ else
+ {
+ # Not using background, so we need to make an empty pixbuf which is right size for overlay first
+ my $tempPixbuf =Gtk2::Gdk::Pixbuf->new('rgb', 1, 8,
+ $width + $overlay->{paddingLeft} + $overlay->{paddingRight},
+ $height + $overlay->{paddingTop} + $overlay->{paddingBottom});
+ $tempPixbuf->fill(0x00000000);
+
+ # Now, place list image inside empty pixbuf
+ $pixbuf->composite($tempPixbuf,
+ $overlay->{paddingLeft}, $overlay->{paddingTop},
+ $width , $height,
+ $overlay->{paddingLeft}, $overlay->{paddingTop},
+ 1, 1,
+ 'nearest', 255 * $alpha);
+ $pixbuf = $tempPixbuf;
+
+ # Place overlay on top of pixbuf
+ $self->{style}->{overlayPixbuf}->composite($pixbuf,
+ 0, 0,
+ $width + $overlay->{paddingLeft} + $overlay->{paddingRight},
+ $height + $overlay->{paddingTop} + $overlay->{paddingBottom},
+ 0, 0,
+ ($width + $overlay->{paddingLeft} + $overlay->{paddingRight}) / $self->{style}->{overlayPixbuf}->get_width,
+ ($height + $overlay->{paddingTop} + $overlay->{paddingBottom}) / $self->{style}->{overlayPixbuf}->get_height,
+ 'nearest', 255 * $alpha);
+
+ # Overlay borrower image if required
+ if ($borrower && ($borrower ne 'none'))
+ {
+ # De-saturate borrowed items
+ $pixbuf->saturate_and_pixelate($pixbuf, .1, 0);
+
+ $self->{style}->{lendPixbuf}->composite($pixbuf,
+ $pixbuf->get_width - $self->{style}->{lendPixbuf}->get_width,
+ $pixbuf->get_height - $self->{style}->{lendPixbuf}->get_height,
+ $self->{style}->{lendPixbuf}->get_width, $self->{style}->{lendPixbuf}->get_height,
+ $pixbuf->get_width - $self->{style}->{lendPixbuf}->get_width,
+ $pixbuf->get_height - $self->{style}->{lendPixbuf}->get_height,
+ 1, 1,
+ 'nearest', 255);
+ }
+
+ # Overlay favourite image if required
+ if ($favourite)
+ {
+ $self->{style}->{favPixbuf}->composite($pixbuf,
+ $pixbuf->get_width - $self->{style}->{favPixbuf}->get_width,
+ 0,
+ $self->{style}->{favPixbuf}->get_width, $self->{style}->{favPixbuf}->get_height,
+ $pixbuf->get_width - $self->{style}->{favPixbuf}->get_width,
+ 0,
+ 1, 1,
+ 'nearest', 255);
+ }
+
+ }
+ }
+ else
+ {
+ # No overlays, nice and simple
+
+ # Overlay borrower image if required
+ if ($borrower && ($borrower ne 'none'))
+ {
+ # De-saturate borrowed items
+ $pixbuf->saturate_and_pixelate($pixbuf, .1, 0);
+ $self->{style}->{lendPixbuf}->composite($pixbuf,
+ $width - $self->{style}->{lendPixbuf}->get_width - $self->{style}->{factor},
+ $height - $self->{style}->{lendPixbuf}->get_height - $self->{style}->{factor},
+ $self->{style}->{lendPixbuf}->get_width, $self->{style}->{lendPixbuf}->get_height,
+ $width - $self->{style}->{lendPixbuf}->get_width - $self->{style}->{factor},
+ $height - $self->{style}->{lendPixbuf}->get_height - $self->{style}->{factor},
+ 1, 1,
+ 'nearest', 255);
+ }
+
+ # Overlay favourite image if required
+ if ($favourite)
+ {
+ $self->{style}->{favPixbuf}->composite($pixbuf,
+ $width - $self->{style}->{favPixbuf}->get_width - $self->{style}->{factor},
+ $self->{style}->{factor},
+ $self->{style}->{favPixbuf}->get_width, $self->{style}->{favPixbuf}->get_height,
+ $width - $self->{style}->{favPixbuf}->get_width - $self->{style}->{factor},
+ $self->{style}->{factor},
+ 1, 1,
+ 'nearest', 255);
+ }
+
+ my $reflect;
+ $reflect = $pixbuf->flip(0)
+ if $self->{style}->{withReflect};
+
+ my $offsetX = (($self->{style}->{offsetX} / 2) * $self->{style}->{factor}) + (($boxWidth - $width) / 2);
+ my $offsetY = 15 * $self->{style}->{factor} + ($boxHeight - $height);
+ if ($self->{style}->{withImage})
+ {
+ my $bgPixbuf = $self->{style}->{backgroundPixbuf}->copy;
+ $pixbuf->composite($bgPixbuf,
+ $offsetX, $offsetY,
+ $width, $height,
+ $offsetX, $offsetY,
+ 1, 1,
+ 'nearest', 255);
+ $pixbuf = $bgPixbuf;
+ }
+
+ if ($self->{style}->{withReflect})
+ {
+ $reflect->composite(
+ $pixbuf,
+ $offsetX, $height + $offsetY,
+ $width, $pixbuf->get_height - $height - $offsetY - (10 * $self->{style}->{factor}),
+ $offsetX, $height + $offsetY,
+ 1, 1,
+ 'nearest', 100
+ );
+
+ # Apply foreground fading
+ $self->{style}->{foregroundPixbuf}->composite(
+ $pixbuf,
+ 0, 0,
+ $pixbuf->get_width, $pixbuf->get_height,
+ 0, 0,
+ 1, 1,
+ 'nearest', 255
+ );
+ }
+ }
+ return $pixbuf;
+ }
+
+
+
+}
+
+{
+ package GCImageCache;
+
+ use File::Path;
+ use File::Copy;
+ use List::Util qw/min/;
+
+ sub new
+ {
+ my ($proto, $imagesDir, $imageSize, $style, $defaultImage) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {
+ imagesDir => $imagesDir,
+ imageSize => $imageSize,
+ style => $style,
+ cacheDir => $imagesDir.'/.cache/',
+ oldCacheDir => $imagesDir,
+ defaultImage => $defaultImage,
+ forceUpdate => 0,
+ };
+ # Make sure destination directory exists
+ if ( ! -d $self->{cacheDir})
+ {
+ mkpath $self->{cacheDir};
+ }
+ bless ($self, $class);
+
+ $self->clearOldCache;
+
+ return $self;
+ }
+
+ # This method removes images cached by previous versions
+ sub clearOldCache
+ {
+ my $self = shift;
+ my $trashDir = $self->{imagesDir}.'.trash';
+ mkpath $trashDir;
+ foreach (glob $self->{oldCacheDir}.'/*')
+ {
+ if (/\.cache\.[0-4](\.|$)/)
+ {
+ move $_, $trashDir;
+ }
+ }
+ }
+
+ sub forceCacheUpdateForNextUse
+ {
+ my ($self) = @_;
+ $self->{forceUpdate} = 1;
+ }
+
+ sub getPixbuf
+ {
+ my ($self, $info, $zoom) = @_;
+ my $fileName;
+ my $pixbuf = undef;
+ if (!$zoom)
+ {
+ $fileName = $self->getCachedFileName($info);
+ if ($self->{forceUpdate} || (! -e $fileName))
+ {
+ $self->createImageCache($info);
+ }
+ $self->{forceUpdate} = 0;
+ eval {
+ $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($fileName);
+ };
+ }
+ else
+ {
+ # When a zoom is requested, we have to generate the picture
+ $fileName = $self->getCachedFileName($info);
+ # Get picture size from cached file to avoid re-computing everything
+ my ($picFormat, $picWidth, $picHeight) = Gtk2::Gdk::Pixbuf->get_file_info($fileName);
+ # Then open the original file
+ my $origFileName = $info->{picture};
+ if (! -f $origFileName)
+ {
+ $origFileName = $self->{defaultImage};
+ }
+ if (!$self->{style}->{useOverlays})
+ {
+ $zoom -= 0.01;
+ }
+
+ eval {
+ $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($origFileName);
+ my $newWidth = int($picWidth * $zoom);
+ my $newHeight = int($picHeight * $zoom);
+ $pixbuf = GCUtils::scaleMaxPixbuf($pixbuf, $newWidth, $newHeight, 1, 0);
+ };
+ }
+
+ return $pixbuf;
+ }
+
+ sub getCachedFileName
+ {
+ my ($self, $info, $size) = @_;
+
+ my $gcsautoid = $info->{autoid};
+ my $title = $info->{title};
+
+ $title =~ s/[^a-zA-Z0-9]*//g;
+ my $cacheFilename = $self->{cacheDir};
+ if ($info->{picture})
+ {
+ $cacheFilename .= $gcsautoid
+ ."."
+ .$title;
+ }
+ else
+ {
+ $cacheFilename .= 'GCSDefaultImage';
+ }
+ $cacheFilename .= (defined $size ? $size : $self->{imageSize});
+ $cacheFilename .= ".overlay"
+ if $self->{style}->{useOverlays};
+
+ return $cacheFilename;
+ }
+
+ # Resizes artwork to required sizes and saves copies of the images, for fast loading
+ sub createImageCache
+ {
+ my ($self, $info) = @_;
+
+ my $srcImage = $info->{picture};
+ if (! -f $srcImage)
+ {
+ $srcImage = $self->{defaultImage};
+ $info->{picture} = "";
+ }
+
+ # Load in the original source image
+ my $origPixbuf = Gtk2::Gdk::Pixbuf->new_from_file($srcImage);
+
+ my $gcsautoid = $info->{autoid};
+ my $title = $info->{title};
+ $title =~ s/[^a-zA-Z0-9]*//g;
+ # Get original picture format
+ my ($picFormat, $picWidth, $picHeight) = Gtk2::Gdk::Pixbuf->get_file_info($srcImage);
+
+ # Loop through possible sizes
+ for (my $size = 0; $size < 5; $size++) {
+ my $imgWidth;
+ my $imgHeight;
+ my $overlay;
+
+ my $cacheFilename = $self->getCachedFileName($info, $size);
+
+ # Get size for cached image
+ ($imgWidth, $imgHeight, $overlay) = $self->getDestinationImgSize($picWidth,
+ $picHeight,
+ $size);
+
+ # Scale pixbuf and save
+ my $scaledPixbuf = GCUtils::scaleMaxPixbuf($origPixbuf, $imgWidth, $imgHeight, 0, 0);
+ if ($picFormat->{name} eq 'jpeg')
+ {
+ $scaledPixbuf->save ($cacheFilename, 'jpeg', quality => '99');
+ }
+ else
+ {
+ $scaledPixbuf->save ($cacheFilename, 'png');
+ }
+ }
+ }
+
+ # Calculates height and width of list image
+ sub getDestinationImgSize
+ {
+ my ($self, $origWidth, $origHeight, $size) = @_;
+
+ $size = $self->{imageSize}
+ if (!defined $size);
+
+ my $imgWidth;
+ my $imgHeight;
+ my $overlay;
+
+ # No overlays
+ $imgWidth = $self->{style}->{imgWidth} / $self->{style}->{factor};
+ $imgHeight = $self->{style}->{imgHeight} / $self->{style}->{factor};
+
+ if ($self->{style}->{useOverlays})
+ {
+ # Overlays
+
+ # Calculate size of list image with proportional size of overlay padding added
+ my $pixbufTempHeight = (($self->{style}->{overlayPaddingTop} + $self->{style}->{overlayPaddingBottom})/$self->{style}->{overlayPixbuf}->get_height + 1) * $origHeight;
+ my $pixbufTempWidth = (($self->{style}->{overlayPaddingLeft} + $self->{style}->{overlayPaddingRight})/$self->{style}->{overlayPixbuf}->get_width + 1) * $origWidth;
+
+ # Find out target size of overlay, keeping the same ratio as the size calculated above (ie, list image + relative padding)
+ my $ratio = $pixbufTempHeight / $pixbufTempWidth;
+ my $targetOverlayHeight;
+ my $targetOverlayWidth;
+ if (($pixbufTempWidth > $imgWidth) || ($pixbufTempHeight > $imgHeight))
+ {
+ if (($pixbufTempWidth * $imgHeight/$pixbufTempHeight) < $imgHeight )
+ {
+ $targetOverlayHeight = $imgHeight;
+ $targetOverlayWidth = int($imgHeight / $ratio);
+ }
+ else
+ {
+ $targetOverlayHeight = int( $imgWidth * $ratio);
+ $targetOverlayWidth = $imgWidth;
+ }
+ }
+ else
+ {
+ # Special case when image is small enough and doesn't need to be resized
+ $targetOverlayHeight = $pixbufTempHeight;
+ $targetOverlayWidth = $pixbufTempWidth;
+ }
+
+ # Calculate final offset amounts for target size of overlay
+ $overlay->{paddingLeft} = int($self->{style}->{overlayPaddingLeft} * $targetOverlayWidth / $self->{style}->{overlayPixbuf}->get_width);
+ $overlay->{paddingRight} = int($self->{style}->{overlayPaddingRight} * $targetOverlayWidth / $self->{style}->{overlayPixbuf}->get_width);
+ $overlay->{paddingTop} = int($self->{style}->{overlayPaddingTop} * $targetOverlayHeight / $self->{style}->{overlayPixbuf}->get_height);
+ $overlay->{paddingBottom} = int($self->{style}->{overlayPaddingBottom} * $targetOverlayHeight / $self->{style}->{overlayPixbuf}->get_height);
+
+ $imgWidth = $imgWidth - $overlay->{paddingLeft} - $overlay->{paddingRight};
+ $imgHeight = $imgHeight - $overlay->{paddingTop} - $overlay->{paddingBottom};
+ }
+
+ my $factor = ($size == 0) ? 0.5
+ : ($size == 1) ? 0.8
+ : ($size == 3) ? 1.5
+ : ($size == 4) ? 2
+ : 1;
+ $imgWidth *= $factor;
+ $imgHeight *= $factor;
+
+ return ($imgWidth, $imgHeight, $overlay);
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCItemsLists/GCImageLists.pm b/lib/gcstar/GCItemsLists/GCImageLists.pm
new file mode 100644
index 0000000..2250bcb
--- /dev/null
+++ b/lib/gcstar/GCItemsLists/GCImageLists.pm
@@ -0,0 +1,2028 @@
+package GCImageLists;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use locale;
+
+# Number of ms to wait before enhancing the next picture
+my $timeOutBetweenEnhancements = 50;
+
+{
+ package GCBaseImageList;
+
+ use File::Basename;
+ use GCItemsLists::GCImageListComponents;
+ use GCUtils;
+ use GCStyle;
+ use base "Gtk2::VBox";
+ use File::Temp qw/ tempfile /;
+
+ sub new
+ {
+ my ($proto, $container, $columns) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(0,0);
+ bless ($self, $class);
+
+ my $parent = $container->{parent};
+
+ $self->{preferences} = $parent->{model}->{preferences};
+ $self->{imagesDir} = $parent->getImagesDir();
+ $self->{coverField} = $parent->{model}->{commonFields}->{cover};
+ $self->{titleField} = $parent->{model}->{commonFields}->{title};
+ $self->{idField} = $parent->{model}->{commonFields}->{id};
+ $self->{borrowerField} = $parent->{model}->{commonFields}->{borrower}->{name};
+ # Sort field
+ $self->{sortField} = $self->{preferences}->secondarySort
+ || $self->{titleField};
+ $self->{fileIdx} = "";
+ $self->{selectedIndexes} = {};
+ $self->{previousSelectedDisplayed} = 0;
+ $self->{displayedToItemsArray} = {};
+ $self->{container} = $container;
+ $self->{scroll} = $container->{scroll};
+ $self->{searchEntry} = $container->{searchEntry};
+
+
+ $self->{preferences}->sortOrder(1)
+ if ! $self->{preferences}->exists('sortOrder');
+
+ $self->{parent} = $container->{parent};
+
+ $self->{tooltips} = Gtk2::Tooltips->new();
+
+ $self->{columns} = $columns;
+ $self->{dynamicSize} = ($columns == 0);
+ $self->clearCache;
+
+
+ $self->set_border_width(0);
+
+ $self->signal_connect('button_press_event' => sub {
+ my ($widget, $event) = @_;
+ if ($event->button eq 3)
+ {
+ $self->{parent}->{context}->popup(undef, undef, undef, undef, $event->button, $event->time)
+ }
+ });
+
+ $self->can_focus(1);
+
+ $self->{imageCache} = new GCImageCache($self->{imagesDir},
+ $self->{preferences}->listImgSize,
+ $container->{style},
+ $self->{parent}->{defaultImage});
+
+ return $self;
+ }
+
+ sub couldExpandAll
+ {
+ my $self = shift;
+
+ return 0;
+ }
+
+ sub getCurrentIdx
+ {
+ my $self = shift;
+ return $self->{displayedToIdx}->{$self->{current}};
+ }
+
+ sub getCurrentItems
+ {
+ my $self = shift;
+ my @indexes = keys %{$self->{selectedIndexes}};
+ return \@indexes;
+ }
+
+ sub isSelected
+ {
+ my ($self, $idx) = @_;
+ foreach (keys %{$self->{selectedIndexes}})
+ {
+ return 1 if $_ == $idx;
+ }
+ return 0;
+ }
+
+ sub DESTROY
+ {
+ my $self = shift;
+
+ #unlink $self->{style}->{tmpBgPixmap};
+ $self->SUPER::DESTROY;
+ }
+
+ sub isUsingDate
+ {
+ my ($self) = @_;
+ return 0;
+ }
+
+ sub setSortOrder
+ {
+ my ($self, $order) = @_;
+ $order = 0 if !defined $order;
+ $self->{currentOrder} = ($order == -1) ? (1 - $self->{currentOrder})
+ : $self->{preferences}->sortOrder;
+
+ if ($self->{itemsArray})
+ {
+ if ($order == -1)
+ {
+ @{$self->{itemsArray}} = reverse @{$self->{itemsArray}};
+ }
+ else
+ {
+ sub compare
+ {
+ return (
+ GCUtils::gccmpe($a->{sortValue}, $b->{sortValue})
+ );
+ }
+ if ($self->{currentOrder} == 1)
+ {
+ @{$self->{itemsArray}} = sort compare @{$self->{itemsArray}};
+ }
+ else
+ {
+ @{$self->{itemsArray}} = reverse sort compare @{$self->{itemsArray}};
+ }
+ }
+ }
+ $self->refresh if ! $self->{initializing};
+ $self->{initializing} = 0;
+ }
+
+ sub setFilter
+ {
+ my ($self, $filter, $items, $refresh, $splash) = @_;
+ $self->{displayedNumber} = 0;
+ $self->{filter} = $filter;
+ $self->{displayedToItemsArray} = {};
+ my $current = $self->{current};
+ $self->restorePrevious;
+ my $i = 0;
+ foreach (@{$self->{itemsArray}})
+ {
+ $_->{displayed} = $filter->test($items->[$_->{idx}]);
+ if ($_->{displayed})
+ {
+ $self->{displayedToItemsArray}->{$self->{displayedNumber}} = $i;
+ $self->{displayedNumber}++;
+ }
+ $self->{container}->setDisplayed($_->{idx}, $_->{displayed});
+ $i++;
+ }
+ my $newIdx = $self->getFirstVisibleIdx($current);
+ my $conversionNeeded = 0;
+ $conversionNeeded = 1 if ! exists $self->{boxes}->[$current];
+
+ if ($refresh)
+ {
+ $self->refresh(1, $splash);
+ $self->show_all;
+ }
+
+ $self->{initializing} = 0;
+ return $self->displayedToItemsArrayIdx($newIdx)
+ if $conversionNeeded;
+ return $newIdx;
+ }
+
+ sub getFirstVisibleIdx
+ {
+ my ($self, $displayed) = @_;
+ return $displayed if ! exists $self->{boxes}->[$displayed];
+ my $currentIdx = $self->{boxes}->[$displayed]->{info}->{idx};
+ my $info = $self->{boxes}->[$displayed]->{info};
+
+ return $currentIdx if (! exists $self->{boxes}->[$displayed])
+ || ($self->{boxes}->[$displayed]->{info}->{displayed});
+ my $previous = -1;
+ my $after = 0;
+ foreach my $item(@{$self->{itemsArray}})
+ {
+ $after = 1 if $item->{idx} == $currentIdx;
+ if ($after)
+ {
+ return $item->{idx} if $item->{displayed};
+ }
+ else
+ {
+ $previous = $item->{idx} if $item->{displayed};
+ }
+ }
+ return $previous;
+ }
+
+ sub refresh
+ {
+ my ($self, $forceClear, $splash) = @_;
+ return if $self->{columns} == 0;
+
+ # Store current item index
+ my $currentIdx = $self->{displayedToIdx}->{$self->{current}};
+ $self->{boxes} = [];
+ $self->{displayedToIdx} = {};
+ $self->{idxToDisplayed} = {};
+
+ $self->clearView if (! $self->{initializing}) || $forceClear;
+ $self->{number} = 0;
+ my $idx = 0;
+ $self->{collectionDir} = dirname($self->{parent}->{options}->file);
+ foreach (@{$self->{itemsArray}})
+ {
+ $splash->setProgressForItemsSort($idx++) if $splash;
+ next if ! $_->{displayed};
+ $self->addDisplayedItem($_);
+ }
+ delete $self->{collectionDir};
+ # Determine new current displayed
+ $self->{current} = $self->{idxToDisplayed}->{$currentIdx};
+ if ($self->{toBeSelectedLater})
+ {
+ $self->{parent}->display($self->select(-1));
+ $self->{toBeSelectedLater} = 0;
+ }
+ #$self->show_all;
+ }
+
+ sub getNbItems
+ {
+ my $self = shift;
+ return $self->{displayedNumber};
+ }
+
+ sub clearCache
+ {
+ my $self = shift;
+
+ if ($self->{cache})
+ {
+ foreach (@{$self->{cache}})
+ {
+ $_->{imageBox}->destroy
+ if $_->{imageBox};
+ }
+ }
+ $self->{cache} = [];
+ }
+
+ sub reset
+ {
+ my $self = shift;
+ #Restore current picture if modified
+ $self->restorePrevious;
+
+ $self->{itemsArray} = [];
+ $self->{boxes} = [];
+ $self->{number} = 0;
+ $self->{count} = 0;
+ $self->{displayedNumber} = 0;
+ $self->{current} = 0;
+ $self->{previous} = 0;
+ $self->clearView;
+ }
+
+ sub clearView
+ {
+ my $self = shift;
+
+ # TODO : This will be different with many lists
+ #my $parent = $self->parent;
+ #$self->parent->remove($self)
+ # if $parent;
+
+ my @children = $self->get_children;
+ foreach (@children)
+ {
+ my @children2 = $_->get_children;
+ foreach my $child(@children2)
+ {
+ $_->remove($child);
+ }
+ $self->remove($_);
+ $_->destroy;
+ }
+ $self->{rowContainers} = [];
+ $self->{enhanceInformation} = [];
+
+ # TODO : This will be different with many lists
+ #$self->{scroll}->add_with_viewport($self)
+ # if $parent;
+
+ $self->{initializing} = 1;
+ }
+
+ sub done
+ {
+ my ($self, $splash, $refresh) = @_;
+ if ($refresh)
+ {
+ $self->refresh(0, $splash);
+ }
+ $self->{initializing} = 0;
+ }
+
+ sub setColumnsNumber
+ {
+ my ($self, $columns, $refresh) = @_;
+ $self->{columns} = $columns;
+ my $init = $self->{initializing};
+ $self->{initializing} = 1;
+ $self->refresh($refresh) if $refresh;
+ $self->show_all;
+ $self->{initializing} = $init;
+ }
+
+ sub getColumnsNumber
+ {
+ my $self = shift;
+ return $self->{columns};
+ }
+
+ sub createImageBox
+ {
+ my ($self, $info) = @_;
+
+ my $imageBox = new GCImageListItem($self, $info);
+ return $imageBox;
+ }
+
+ sub getFromCache
+ {
+ my ($self, $info) = @_;
+ if (! $self->{cache}->[$info->{idx}])
+ {
+ my $item = {};
+ $item->{imageBox} = $self->createImageBox($info);
+ $self->{cache}->[$info->{idx}] = $item;
+ }
+ return $self->{cache}->[$info->{idx}];
+ }
+
+ sub findPlace
+ {
+ my ($self, $item, $sortvalue) = @_;
+ my $refSortValue = $sortvalue || $item->{sortValue};
+ $refSortValue = uc($refSortValue);
+
+ # First search where it should be inserted
+ my $place = 0;
+ my $itemsIdx = 0;
+ if ($self->{currentOrder} == 1)
+ {
+ foreach my $followingItem(@{$self->{itemsArray}})
+ {
+ my $testSortValue = uc($followingItem->{sortValue});
+ my $cmp = GCUtils::gccmpe($testSortValue, $refSortValue);
+ $itemsIdx++ if ! ($cmp > 0);
+
+ next if !$followingItem->{displayed};
+ last if ($cmp > 0);
+ $place++;
+ }
+ }
+ else
+ {
+ foreach my $followingItem(@{$self->{itemsArray}})
+ {
+ my $testSortValue = uc($followingItem->{sortValue});
+ my $cmp = GCUtils::gccmpe($refSortValue, $testSortValue);
+ $itemsIdx++ if ! ($cmp > 0);
+ next if !$followingItem->{displayed};
+ last if ($cmp > 0);
+ $place++;
+ }
+ }
+ return ($place, $itemsIdx) if wantarray;
+ return $place;
+ }
+
+ sub createItemInfo
+ {
+ my ($self, $idx, $info) = @_;
+ my $displayedImage = GCUtils::getDisplayedImage($info->{$self->{coverField}},
+ undef,
+ $self->{parent}->{options}->file,
+ $self->{collectionDir});
+ my $item = {
+ idx => $idx,
+ title => $self->{parent}->transformTitle($info->{$self->{titleField}}),
+ picture => $displayedImage,
+ borrower => $info->{$self->{borrowerField}},
+ sortValue => $self->{sortField} eq $self->{titleField}
+ ? $self->{parent}->transformTitle($info->{$self->{titleField}})
+ : $info->{$self->{sortField}},
+ favourite => $info->{favourite},
+ displayed => 1,
+ autoid => $info->{$self->{idField}}
+ };
+ return $item;
+ }
+
+ sub addItem
+ {
+ my ($self, $info, $immediate, $idx, $keepConversionTables) = @_;
+
+ my $item = $self->createItemInfo($idx, $info);
+
+ if ($immediate)
+ {
+ # When the flag is set, that means we modified an item and that it had
+ # to be added to that group. In this case, we don't want to de-select
+ # the current one.
+ if (!$keepConversionTables)
+ {
+ $self->restorePrevious;
+ # To force the selection
+ $self->{current} = -1;
+ }
+ # First search where it should be inserted
+ my ($place, $itemsArrayIdx) = $self->findPlace($item);
+ # Prepare the conversions displayed <-> index
+ if (!$keepConversionTables)
+ {
+ $self->{displayedToIdx}->{$place} = $idx;
+ $self->{idxToDisplayed}->{$idx} = $place;
+ }
+ # Then we insert it at correct position
+ $self->addDisplayedItem($item, $place);
+ splice @{$self->{itemsArray}}, $itemsArrayIdx, 0, $item;
+ }
+ else
+ {
+ # Here we know it will be sorted after
+ push @{$self->{itemsArray}}, $item;
+ }
+
+ $self->{count}++;
+ $self->{displayedNumber}++;
+ $self->{header}->show_all if $self->{header} && $self->{displayedNumber} > 0;
+ }
+
+ # Params:
+ # $info: Information already formated for this class
+ # $place: Optional value to indicate where it should be inserted
+ sub addDisplayedItem
+ {
+ # info is an iternal info generated
+ my ($self, $info, $place) = @_;
+ return if ! $self->{columns};
+ my $item = $self->getFromCache($info);
+ my $imageBox = $item->{imageBox};
+ my $i = $info->{idx};
+ if (!defined $place)
+ {
+ $self->{displayedToIdx}->{$self->{number}} = $i;
+ $self->{idxToDisplayed}->{$i} = $self->{number};
+ }
+ $imageBox->prepareHandlers($i, $info);
+
+ if (($self->{number} % $self->{columns}) == 0)
+ {
+ #New row begin
+ $self->{currentRow} = new Gtk2::HBox(0,0);
+ push @{$self->{rowContainers}}, $self->{currentRow};
+ $self->pack_start($self->{currentRow},0,0,0);
+ $self->{currentRow}->show_all if ! $self->{initializing};
+ }
+
+ if (defined($place))
+ {
+ # Get the row and col where it should be inserted
+ my $itemLine = int $place / $self->{columns};
+ my $itemCol = $place % $self->{columns};
+ # Insert it at correct place
+ $self->{rowContainers}->[$itemLine]->pack_start($imageBox,0,0,0);
+ $self->{rowContainers}->[$itemLine]->reorder_child($imageBox, $itemCol);
+ $imageBox->show_all;
+ $self->shiftItems($place, 1, 0, scalar @{$self->{boxes}});
+ splice @{$self->{boxes}}, $place, 0, $imageBox;
+ $self->initConversionTables;
+ }
+ else
+ {
+ $self->{currentRow}->pack_start($imageBox,0,0,0);
+ $self->{idxToDisplayed}->{$i} = $self->{number};
+ push @{$self->{boxes}}, $imageBox;
+ }
+
+ $self->{number}++;
+ }
+
+ sub grab_focus
+ {
+ my $self = shift;
+ $self->SUPER::grab_focus;
+ $self->{boxes}->[$self->{current}]->grab_focus;
+ }
+
+ sub displayedToItemsArrayIdx
+ {
+ my ($self, $displayed) = @_;
+ return 0 if ! exists $self->{boxes}->[$displayed];
+ # If we have nothing, that means we have no filter. So displayed and idx are the same
+ return $displayed if ! exists $self->{displayedToItemsArray}->{$displayed};
+ return $self->{displayedToItemsArray}->{$displayed};
+ }
+
+ sub shiftItems
+ {
+ my ($self, $place, $direction, $justFromView, $maxPlace) = @_;
+ my $idx = $self->{displayedToIdx}->{$place};
+ my $itemLine = int $place / $self->{columns};
+ my $itemCol = $place % $self->{columns};
+ # Did we already remove or add the item ?
+ my $alreadyChanged = ($direction < 0) || (defined $maxPlace);
+ # Useful to always have the same comparison a few lines below
+ # Should be >= for $direction == 1
+ # This difference is because we didn't added it yet while it has
+ # already been removed in the other direction
+ #$itemCol-- if ! (defined $maxPlace);
+ $itemCol++ if ($direction < 0);
+ # Same here
+ $idx-- if $alreadyChanged;
+ my $newDisplayed = 0;
+ my $currentLine = 0;
+ my $currentCol;
+ my $shifting = 0;
+ # Limit indicates which value for column should make use take action
+ # For backward, it's the 1st one. For forward, the last one
+ my $limit = 0;
+ $limit = ($self->{columns} - 1) if $direction > 0;
+ foreach my $item(@{$self->{itemsArray}})
+ {
+ if (!$item->{displayed})
+ {
+ $item->{idx} += $direction if ((!defined $maxPlace) && ($item->{idx} > $idx));
+ next;
+ }
+ $currentLine = int $newDisplayed / $self->{columns};
+ $currentCol = $newDisplayed % $self->{columns};
+ $shifting = $direction if (!$shifting)
+ && (
+ ($currentLine > $itemLine)
+ || (($currentLine == $itemLine)
+ && ($currentCol >= $itemCol))
+ );
+ $shifting = 0 if (defined $maxPlace) && ($newDisplayed > $maxPlace);
+ # When using maxPlace, we are only moving in view
+ if ((!defined $maxPlace) && ($item->{idx} > $idx))
+ {
+ $item->{idx} += $direction;
+ $self->{cache}->[$item->{idx}]->{imageBox}->{idx} = $item->{idx}
+ if ($item->{idx} > 0) && $self->{cache}->[$item->{idx}];
+ }
+ if ($shifting)
+ {
+ # Is this the first/last one in the line?
+ if ($currentCol == $limit)
+ {
+ $self->{rowContainers}->[$currentLine]->remove(
+ $self->{cache}->[$item->{idx}]->{imageBox}
+ );
+ $self->{rowContainers}->[$currentLine + $direction]->pack_start(
+ $self->{cache}->[$item->{idx}]->{imageBox},
+ 0,0,0
+ );
+ # We can't directly insert on the beginning.
+ # So we need a little adjustement here
+ if ($direction > 0)
+ {
+ $self->{rowContainers}->[$currentLine + $direction]->reorder_child(
+ $self->{cache}->[$item->{idx}]->{imageBox},
+ 0
+ );
+ }
+ }
+ }
+ $newDisplayed++;
+ }
+ }
+
+ sub shiftIndexes
+ {
+ my ($self, $indexes) = @_;
+ my $nbIndexes = scalar @$indexes;
+ my $nbLower;
+ my $currentIdx;
+ my @cache;
+ foreach my $box(@{$self->{boxes}})
+ {
+ # Find how many are lowers in our indexes
+ # We suppose they are sorted
+ $nbLower = 0;
+ $currentIdx = $box->{info}->{idx};
+ foreach (@$indexes)
+ {
+ last if $_ > $currentIdx;
+ $nbLower++;
+ }
+ $box->{info}->{idx} -= $nbLower;
+ $cache[$box->{info}->{idx}] = $self->{cache}->[$box->{info}->{idx} + $nbLower];
+ }
+ $self->{cache} = \@cache;
+ }
+
+ sub initConversionTables
+ {
+ my $self = shift;
+ my $displayed = 0;
+ $self->{displayedToIdx} = {};
+ $self->{idxToDisplayed} = {};
+ foreach (@{$self->{boxes}})
+ {
+ $self->{displayedToIdx}->{$displayed} = $_->{info}->{idx};
+ $self->{idxToDisplayed}->{$_->{info}->{idx}} = $displayed;
+ $_->{idx} = $_->{info}->{idx};
+ $displayed++;
+ }
+ }
+
+ sub convertIdxToDisplayed
+ {
+ my ($self, $idx) = @_;
+ return $self->{idxToDisplayed}->{$idx};
+ }
+
+ sub convertDisplayedToIdx
+ {
+ my ($self, $displayed) = @_;
+ return $self->{displayedToIdx}->{$displayed};
+ }
+
+ sub removeItem
+ {
+ my ($self, $idx, $justFromView) = @_;
+ $self->{count}--;
+ $self->{displayedNumber}--;
+ # Fix to remove header only when items are grouped
+ $self->{header}->hide if $self->{container}->{groupItems} && $self->{displayedNumber} <= 0;
+ my $displayed = $self->{idxToDisplayed}->{$idx};
+ my $itemLine = int $displayed / $self->{columns};
+ #my $itemCol = $displayed % $self->{columns};
+ $self->{rowContainers}->[$itemLine]->remove(
+ $self->{cache}->[$idx]->{imageBox}
+ );
+
+ # Remove event box from cache
+ my $itemsArrayIdx = $self->displayedToItemsArrayIdx($displayed);
+
+ $self->{cache}->[$idx]->{imageBox}->destroy;
+ $self->{cache}->[$idx]->{imageBox} = 0;
+
+ splice @{$self->{cache}}, $idx, 1 if !$justFromView;
+ splice @{$self->{boxes}}, $self->{idxToDisplayed}->{$idx}, 1;
+
+ if ($justFromView)
+ {
+ $self->shiftItems($displayed, -1, 0, scalar @{$self->{boxes}});
+ }
+ else
+ {
+ $self->shiftItems($displayed, -1);
+ }
+ $self->initConversionTables;
+
+ splice @{$self->{itemsArray}}, $itemsArrayIdx, 1;
+ my $next = $self->{displayedToIdx}->{$displayed};
+ if ($displayed >= (scalar(@{$self->{boxes}})))
+ {
+ $next = $self->{displayedToIdx}->{--$displayed}
+ }
+ $self->{current} = $displayed;
+
+ my $last = scalar @{$self->{itemsArray}};
+ delete $self->{displayedToIdx}->{$last};
+ # To be sure we still have consistent data, we re-initialize the other hash by swapping keys and values.
+ $self->{idxToDisplayed} = {};
+ my ($k,$v);
+ $self->{idxToDisplayed}->{$v} = $k while (($k,$v) = each %{$self->{displayedToIdx}});
+
+ # Fix to remove items from "displayed" list on delete
+ my $numDisplayed = scalar(keys %{$self->{container}->{displayed}});
+ delete $self->{container}->{displayed}->{$numDisplayed-1};
+
+ $self->{number}--;
+ return $next;
+ }
+
+ sub removeCurrentItems
+ {
+ my ($self) = @_;
+ my @indexes = sort {$a <=> $b} keys %{$self->{selectedIndexes}};
+ my $nbRemoved = 0;
+ $self->restorePrevious;
+ my $next;
+ foreach my $idx(@indexes)
+ {
+ $next = $self->removeItem($idx - $nbRemoved);
+ $nbRemoved++;
+ }
+ $self->{selectedIndexes} = {};
+ $self->select($next, 1);
+
+ return $next;
+ }
+
+ sub restoreItem
+ {
+ my ($self, $idx) = @_;
+
+ my $previous = $self->{idxToDisplayed}->{$idx};
+ next if ($previous == -1) || (!defined $previous) || (!$self->{boxes}->[$previous]);
+
+ $self->{boxes}->[$previous]->unhighlight;
+ delete $self->{selectedIndexes}->{$idx};
+ }
+
+ sub restorePrevious
+ {
+ my ($self, $fromContainer) = @_;
+ foreach my $idx(keys %{$self->{selectedIndexes}})
+ {
+ $self->restoreItem($idx);
+ }
+ $self->{container}->clearSelected($self) if !$fromContainer;
+ }
+
+ sub selectAll
+ {
+ my $self = shift;
+
+ $self->restorePrevious;
+ $self->select($self->{displayedToIdx}->{0}, 1, 0);
+ foreach my $displayed(1..scalar(@{$self->{boxes}}) - 1)
+ {
+ $self->select($self->{displayedToIdx}->{$displayed}, 0, 1);
+ }
+ $self->{parent}->display(keys %{$self->{selectedIndexes}});
+ }
+
+ sub selectMany
+ {
+ my ($self, $lastSelected) = @_;
+
+ my ($min, $max);
+ if ($self->{previousSelectedDisplayed} > $self->{idxToDisplayed}->{$lastSelected})
+ {
+ $min = $self->{idxToDisplayed}->{$lastSelected};
+ $max = $self->{previousSelectedDisplayed};
+ }
+ else
+ {
+ $min = $self->{previousSelectedDisplayed};
+ $max = $self->{idxToDisplayed}->{$lastSelected};
+ }
+ foreach my $displayed($min..$max)
+ {
+ $self->select($self->{displayedToIdx}->{$displayed}, 0, 1);
+ }
+
+ }
+
+ sub select
+ {
+ my ($self, $idx, $init, $keepPrevious) = @_;
+ $self->{container}->setCurrentList($self);
+ $idx = $self->{displayedToIdx}->{0} if $idx == -1;
+ my $displayed = $self->{idxToDisplayed}->{$idx};
+ if (! $self->{columns})
+ {
+ $self->{toBeSelectedLater} = 1;
+ return $idx;
+ }
+ my @boxes = @{$self->{boxes}};
+
+ return $idx if ! scalar(@boxes);
+ my $alreadySelected = 0;
+ $alreadySelected = $boxes[$displayed]->{selected}
+ if exists $boxes[$displayed];
+ my $nbSelected = scalar keys %{$self->{selectedIndexes}};
+
+ return $idx if $alreadySelected && ($nbSelected < 2) && (!$init);
+ if ($keepPrevious)
+ {
+ if (($alreadySelected) && ($nbSelected > 1))
+ {
+
+ $self->restoreItem($idx);
+ # Special case where user has deselect items, so now only one item is left selected
+ # and menus need to be updated to reflect that
+ $self->updateMenus(1)
+ if $nbSelected <= 2;
+
+ return $idx;
+ }
+ $self->{selectedIndexes}->{$idx} = 1;
+ }
+ else
+ {
+ $self->restorePrevious;
+ $self->{selectedIndexes} = {$idx => 1};
+ }
+
+ $self->{current} = $displayed;
+
+ $boxes[$displayed]->highlight
+ if exists $boxes[$displayed];
+
+ $self->grab_focus;
+ $self->{container}->setCurrentList($self)
+ if $self->{container};
+
+ # Update menu items to reflect number of items selected
+ $self->updateMenus(scalar keys %{$self->{selectedIndexes}});
+ return $idx;
+ }
+
+ sub displayDetails
+ {
+ my ($self, $createWindow, @idx) = @_;
+ if ($createWindow)
+ {
+ $self->{parent}->displayInWindow($idx[0]);
+ }
+ else
+ {
+ $self->{parent}->display(@idx);
+ }
+ }
+
+ sub showPopupMenu
+ {
+ my ($self, $button, $time) = @_;
+
+ $self->{parent}->{context}->popup(undef, undef, undef, undef, $button, $time);
+ }
+
+ sub setPreviousSelectedDisplayed
+ {
+ my ($self, $idx) = @_;
+ $self->{previousSelectedDisplayed} = $self->{idxToDisplayed}->{$idx}
+ if !exists $self->{previousSelectedDisplayed};
+ }
+
+ sub unsetPreviousSelectedDisplayed
+ {
+ my ($self, $idx) = @_;
+ delete $self->{previousSelectedDisplayed};
+ }
+
+ sub updateMenus
+ {
+ # Update menu items to reflect number of items selected
+ my ($self, $nbSelected) = @_;
+ foreach (
+ # Menu labels
+ [$self->{parent}->{menubar}, 'duplicateItem', 'MenuDuplicate'],
+ [$self->{parent}->{menubar}, 'deleteCurrentItem', 'MenuEditDeleteCurrent'],
+ # Context menu labels
+ [$self->{parent}, 'contextNewWindow', 'MenuNewWindow'],
+ [$self->{parent}, 'contextDuplicateItem', 'MenuDuplicate'],
+ [$self->{parent}, 'contextItemDelete', 'MenuEditDeleteCurrent'],
+ )
+ {
+ $self->{parent}->{menubar}->updateItem(
+ $_->[0]->{$_->[1]},
+ $_->[2].(($nbSelected > 1) ? 'Plural' : ''));
+ }
+ }
+
+ sub setHeader
+ {
+ my ($self, $header) = @_;
+ $self->{header} = $header;
+ }
+
+ sub showCurrent
+ {
+ my $self = shift;
+ return if ! $self->{columns};
+ if ($self->{initializing})
+ {
+ Glib::Timeout->add(100 ,\&showCurrent, $self);
+ return;
+ }
+
+ my $adj = $self->{scroll}->get_vadjustment;
+ my $totalRows = int $self->{number} / $self->{columns};
+ my $row = (int $self->{current} / $self->{columns});
+
+ my $ypos = 0;
+ if ($self->{header})
+ {
+ $ypos = $self->{header}->allocation->y;
+ # We scroll also the size of the header.
+ # But we don't do that for the 1st row to have it displayed then.
+ $ypos += $self->{header}->allocation->height
+ if $row;
+ }
+ # Add the items before
+ $ypos += (($row - 1) * $self->{style}->{vboxHeight});
+
+ $adj->set_value($ypos);
+ return 0;
+ }
+
+ sub changeItem
+ {
+ my ($self, $idx, $previous, $new, $withSelect) = @_;
+ return $self->changeCurrent($previous, $new, $idx, 0);
+ }
+
+ sub changeCurrent
+ {
+ my ($self, $previous, $new, $idx, $wantSelect) = @_;
+ my $forceSelect = 0;
+ #To ease comparison, do some modifications.
+ #empty borrower is equivalent to 'none'.
+ $previous->{$self->{borrowerField}} = 'none' if $previous->{$self->{borrowerField}} eq '';
+ $new->{$self->{borrowerField}} = 'none' if $new->{$self->{borrowerField}} eq '';
+ my $previousDisplayed = $self->{idxToDisplayed}->{$idx};
+ my $newDisplayed = $previousDisplayed;
+ if ($new->{$self->{sortField}} ne $previous->{$self->{sortField}})
+ {
+ # Adjust title
+ my $newTitle = $self->{parent}->transformTitle($new->{$self->{titleField}});
+ my $newSort = $self->{sortField} eq $self->{titleField} ? $newTitle : $new->{$self->{sortField}};
+
+ $self->{boxes}->[$previousDisplayed]->{info}->{title} = $newTitle;
+ $self->{tooltips}->set_tip($self->{boxes}->[$previousDisplayed], $newTitle, '');
+ my $newItemsArrayIdx;
+ ($newDisplayed, $newItemsArrayIdx) = $self->findPlace(undef, $newSort);
+ # We adjust the index as we'll remove an item
+ $newDisplayed-- if $newDisplayed > $previousDisplayed;
+ if ($previousDisplayed != $newDisplayed)
+ {
+ #$self->restorePrevious;
+ my $itemPreviousLine = int $previousDisplayed / $self->{columns};
+ my $itemNewLine = int $newDisplayed / $self->{columns};
+ my $itemNewCol = $newDisplayed % $self->{columns};
+ my ($direction, $origin, $limit);
+ if ($previousDisplayed > $newDisplayed)
+ {
+ $direction = 1;
+ $origin = $newDisplayed;
+ $limit = $previousDisplayed - 1;
+ }
+ else
+ {
+ $direction = -1;
+ $origin = $previousDisplayed;
+ $limit = $newDisplayed;
+ $itemNewCol++ if ($itemNewLine > $itemPreviousLine) && ($itemNewCol != 0)
+ }
+ my $box = $self->{cache}->[$idx]->{imageBox};
+ my $previousItemsArrayIdx = $self->displayedToItemsArrayIdx($previousDisplayed);
+ $self->{rowContainers}->[$itemPreviousLine]->remove($box);
+ splice @{$self->{boxes}}, $previousDisplayed, 1;
+ $self->{rowContainers}->[$itemNewLine]->pack_start($box,0,0,0);
+ $self->{rowContainers}->[$itemNewLine]->reorder_child($box, $itemNewCol);
+
+ $self->shiftItems($origin, $direction, 0, $limit);
+ my $item = splice @{$self->{itemsArray}}, $previousItemsArrayIdx, 1;
+ $newItemsArrayIdx-- if $previousItemsArrayIdx < $newItemsArrayIdx;
+ splice @{$self->{itemsArray}}, $newItemsArrayIdx, 0, $item;
+ splice @{$self->{boxes}}, $newDisplayed, 0, $box;
+ $self->initConversionTables;
+ }
+ }
+
+ my @boxes = @{$self->{boxes}};
+ my $item = $self->createItemInfo($idx, $new);
+ if (($previous->{$self->{coverField}} ne $new->{$self->{coverField}})
+ || ($previous->{$self->{borrowerField}} ne $new->{$self->{borrowerField}})
+ || ($previous->{favourite} ne $new->{favourite}))
+ {
+ $boxes[$newDisplayed]->refreshInfo($item, 1);
+ $forceSelect = 1;
+ $wantSelect = 1 if $wantSelect ne '';
+ }
+ else
+ {
+ # Popup is refreshed by previous call.
+ # So we just need to explicitely do it here
+ if ($boxes[$newDisplayed])
+ {
+ $boxes[$newDisplayed]->setInfo($item);
+ $boxes[$newDisplayed]->refreshPopup;
+ }
+ }
+ if ($self->{filter})
+ {
+ # Test visibility
+ my $previouslyVisible = $self->{filter}->test($previous);
+ my $visible = $self->{filter}->test($new);
+ if ($previouslyVisible && ! $visible)
+ {
+ $self->{displayedNumber}--;
+ $self->restorePrevious if $wantSelect;
+ my $itemLine = int $newDisplayed / $self->{columns};
+
+ $self->{rowContainers}->[$itemLine]->remove(
+ $self->{cache}->[$idx]->{imageBox}
+ );
+ my $info = $self->{boxes}->[$newDisplayed]->{info};
+ splice @{$self->{boxes}}, $newDisplayed, 1;
+ $self->shiftItems($newDisplayed, -1, 0, scalar @{$self->{boxes}});
+ $self->initConversionTables;
+ $info->{displayed} = $visible;
+ $idx = $self->getFirstVisibleIdx($newDisplayed);
+ $wantSelect = 0 if ! scalar @{$self->{boxes}}
+ }
+ }
+ $self->select($idx, $forceSelect) if $wantSelect;
+ return $idx;
+ }
+
+ sub showSearch
+ {
+ my ($self, $char) = @_;
+ $self->{searchEntry}->set_text($char);
+ $self->{searchEntry}->show_all;
+ $self->activateSearch;
+ $self->{container}->{searchTimeOut} = Glib::Timeout->add(4000, sub {
+ $self->hideSearch;
+ $self->{searchTimeOut} = 0;
+ return 0;
+ });
+ }
+
+ sub activateSearch
+ {
+ my ($self) = @_;
+ $self->{searchEntry}->grab_focus;
+ $self->{searchEntry}->select_region(length($self->{searchEntry}->get_text), -1);
+ }
+
+ sub hideSearch
+ {
+ my $self = shift;
+ $self->{searchEntry}->set_text('');
+ $self->{searchEntry}->hide;
+ $self->grab_focus;
+ $self->{previousSearch} = '';
+ }
+
+ sub internalSearch
+ {
+ my $self = shift;
+
+ my $query = $self->{searchEntry}->get_text;
+ return if !$query;
+ my $newDisplayed = -1;
+
+ my $current = 0;
+ my $length = length($query);
+ if ($self->{currentOrder})
+ {
+ if (($length > 1) && ($length > length($self->{previousSearch})))
+ {
+ $current = $self->{idxToDisplayed}->{$self->{itemsArray}->[$self->{current}]->{idx}};
+ }
+ foreach(@{$self->{itemsArray}}[$current..$self->{count} - 1])
+ {
+ next if !$_->{displayed};
+ if ($_->{title} ge $query)
+ {
+ $newDisplayed = $self->{idxToDisplayed}->{$_->{idx}};
+ last;
+ }
+ }
+ }
+ else
+ {
+ foreach(@{$self->{itemsArray}}[$current..$self->{count} - 1])
+ {
+ next if !$_->{displayed};
+ if (($_->{title} =~ m/^\Q$query\E/i) || ($_->{title} lt $query))
+ {
+ $newDisplayed = $self->{idxToDisplayed}->{$_->{idx}};
+ last;
+ }
+ }
+ }
+
+ if ($newDisplayed != -1)
+ {
+ my $valueIdx = $self->{displayedToIdx}->{$newDisplayed};
+ $self->select($valueIdx);
+ $self->{parent}->display($valueIdx);
+ $self->{boxes}->[$newDisplayed]->grab_focus;
+ $self->showCurrent;
+ $self->activateSearch;
+ }
+ $self->{previousSearch} = $query;
+ }
+
+}
+
+{
+ package GCImageList;
+
+ use base "Gtk2::VBox";
+ use File::Temp qw/ tempfile /;
+
+ my $defaultGroup = 'GCMAINDEFAULTGROUP';
+
+ sub new
+ {
+ my ($proto, $parent, $columns) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(0,0);
+ bless ($self, $class);
+
+ $self->{preferences} = $parent->{model}->{preferences};
+ $self->{parent} = $parent;
+ $self->{columns} = $columns;
+
+ $self->{borrowerField} = $parent->{model}->{commonFields}->{borrower}->{name};
+
+ $self->{scroll} = new Gtk2::ScrolledWindow;
+ $self->{scroll}->set_policy ('automatic', 'automatic');
+ $self->{scroll}->set_shadow_type('none');
+
+ $self->{searchEntry} = new Gtk2::Entry;
+ #$self->{list} = new GCBaseImageList($self, $columns);
+
+ $self->{orderSet} = 0;
+ $self->{sortButton} = Gtk2::Button->new;
+ $self->setSortButton($self->{preferences}->sortOrder);
+ $self->{searchEntry}->signal_connect('changed' => sub {
+ return if ! $self->{searchEntry}->get_text;
+ $self->internalSearch;
+ });
+ $self->{searchEntry}->signal_connect('key-press-event' => sub {
+ my ($widget, $event) = @_;
+ Glib::Source->remove($self->{searchTimeOut})
+ if $self->{searchTimeOut};
+ return if ! $self->{searchEntry}->get_text;
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+ if ($key eq 'Escape')
+ {
+ $self->hideSearch;
+ return 1;
+ }
+ $self->{searchTimeOut} = Glib::Timeout->add(4000, sub {
+ $self->hideSearch;
+ $self->{searchTimeOut} = 0;
+ return 0;
+ });
+
+ return 0;
+ });
+
+ #$self->{scroll}->add_with_viewport($self->{list});
+ $self->{mainList} = new Gtk2::VBox(0,0);
+ $self->{scroll}->add_with_viewport($self->{mainList});
+ #$self->{list}->initPixmaps;
+
+ $self->pack_start($self->{sortButton},0,0,0);
+ $self->pack_start($self->{scroll},1,1,0);
+ $self->pack_start($self->{searchEntry},0,0,0);
+
+ $self->{sortButton}->signal_connect('clicked' => sub {
+ $self->setSortOrder(-1);
+ $self->setSortButton;
+ });
+
+ $self->initStyle;
+ $self->setGroupingInformation;
+ $self->{empty} = 1;
+ $self->{orderedLists} = [];
+ $self->{displayed} = {};
+ return $self;
+ }
+
+ sub setSortButton
+ {
+ my ($self, $order) = @_;
+ $order = $self->{currentOrder}
+ if !defined $order;
+ my $image = Gtk2::Image->new_from_stock($order
+ ? 'gtk-sort-descending'
+ : 'gtk-sort-ascending',
+ 'button');
+ my $stockItem = Gtk2::Stock->lookup($order
+ ? 'gtk-sort-ascending'
+ : 'gtk-sort-descending');
+ $stockItem->{label} =~ s/_//g;
+ $self->{sortButton}->set_label($stockItem->{label});
+ $self->{sortButton}->set_image($image);
+
+ }
+
+ sub show_all
+ {
+ my $self = shift;
+ $self->SUPER::show_all;
+ $self->{mainList}->show_all;
+ $self->{searchEntry}->hide;
+ }
+
+ sub done
+ {
+ my $self = shift;
+ foreach (values %{$self->{lists}})
+ {
+ $_->done;
+# $self->{style}->{vboxWidth} = $_->{style}->{vboxWidth}
+# if !exists $self->{style}->{vboxWidth};
+ }
+ # We set a number of ms to wait before enhancing the pictures
+ my $offset = 0;
+ foreach (@{$self->{orderedLists}})
+ {
+ $self->{lists}->{$_}->{offset} = $offset;
+ $offset += $timeOutBetweenEnhancements * ($self->{lists}->{$_}->{displayedNumber} + 1);
+ }
+ if ($self->{columns} == 0)
+ {
+ $self->signal_connect('size-allocate' => sub {
+ $self->computeAllocation;
+ });
+ $self->computeAllocation;
+ }
+ else
+ {
+ foreach (values %{$self->{lists}})
+ {
+ $_->setColumnsNumber($self->{columns}, 0);
+ }
+ }
+ }
+
+ sub computeAllocation
+ {
+ my $self = shift;
+ return if !$self->{style}->{vboxWidth};
+ my $width = $self->{scroll}->child->allocation->width - 15;
+ return if $width < 0;
+ if (($self->{scroll}->get_hscrollbar->visible)
+ || ($width > (($self->{columns} + 1) * $self->{style}->{vboxWidth})))
+ {
+ my $columns = int ($width / $self->{style}->{vboxWidth});
+ if ($columns)
+ {
+ return if $columns == $self->{columns};
+ $self->{columns} = $columns;
+ foreach (values %{$self->{lists}})
+ {
+ $_->setColumnsNumber($columns, 1);
+ }
+ # TODO : We should maybe select an item here
+ #$self->{parent}->display($self->select(-1, 1))
+ # if !$self->{current};
+ }
+ else
+ {
+ $self->{columns} = 1;
+ }
+ }
+
+ }
+
+ sub initStyle
+ {
+ my $self = shift;
+ my $parent = $self->{parent};
+
+ my $size = $self->{preferences}->listImgSize;
+ $self->{style}->{withAnimation} = $self->{preferences}->animateImgList;
+ $self->{style}->{withImage} = $self->{preferences}->listBgPicture;
+ $self->{style}->{useOverlays} = ($self->{preferences}->useOverlays) && ($parent->{model}->{collection}->{options}->{overlay}->{image});
+ $self->{preferences}->listImgSkin($GCStyle::defaultList) if ! $self->{preferences}->exists('listImgSkin');
+ $self->{style}->{skin} = $self->{preferences}->listImgSkin;
+ # Reflect setting can be enabled using "withReflect=1" in the listbg style file
+ $self->{style}->{withReflect} = 0;
+ $self->{preferences}->listImgSize(2) if ! $self->{preferences}->exists('listImgSize');
+
+ my $bgdir;
+ # Load in extra settings from the style file
+ if ($self->{style}->{withImage})
+ {
+ $bgdir = $ENV{GCS_SHARE_DIR}.'/list_bg/'.$self->{style}->{skin};
+ if (open STYLE, $bgdir.'/style')
+ {
+ while (<STYLE>)
+ {
+ chomp;
+ next if !$_;
+ m/^(.*?)\s*=\s*(.*)$/;
+ my $item = $1;
+ (my $value = $2) =~ s/^"(.*?)"$/$1/;
+ $self->{style}->{$item} = $value;
+ }
+ close STYLE;
+ }
+ }
+
+ # Sets image width/height (for size = 2), getting value from the collection model or setting to
+ # default values of 120, 160 if not specified in model file
+ $self->{style}->{imgWidth} = (exists $parent->{model}->{collection}->{options}->{defaults}->{listImageWidth})
+ ? $parent->{model}->{collection}->{options}->{defaults}->{listImageWidth}
+ : 120;
+ $self->{style}->{imgHeight} = (exists $parent->{model}->{collection}->{options}->{defaults}->{listImageHeight})
+ ? $parent->{model}->{collection}->{options}->{defaults}->{listImageHeight}
+ : 160;
+
+ $self->{style}->{factor} = ($size == 0) ? 0.5
+ : ($size == 1) ? 0.8
+ : ($size == 3) ? 1.5
+ : ($size == 4) ? 2
+ : 1;
+ $self->{style}->{imgWidth} *= $self->{style}->{factor};
+ $self->{style}->{imgHeight} *= $self->{style}->{factor};
+ $self->{style}->{offsetX} = 11;
+ if ($self->{style}->{withImage})
+ {
+ if (! $self->{style}->{useOverlays})
+ {
+ $self->{style}->{offsetX} = 26;
+ }
+ }
+ else
+ {
+ $self->{style}->{offsetX} = 22;
+ }
+
+ $self->{style}->{vboxWidth} = $self->{style}->{imgWidth} + ($self->{style}->{offsetX} * $self->{style}->{factor});
+
+ $self->{style}->{vboxHeight} = $self->{style}->{imgHeight} + (10 * $self->{style}->{factor});
+ $self->{style}->{vboxHeight} += (20 * $self->{style}->{factor}) if $self->{style}->{withImage};
+ $self->{style}->{vboxHeight} += (30 * $self->{style}->{factor}) if $self->{style}->{withReflect};
+ $self->{style}->{pageCount} = int 5 / $self->{style}->{factor};
+
+ # Pixbuf for lending icon
+ my $lendImageFile = $ENV{GCS_SHARE_DIR}.'/overlays/lend_';
+ $lendImageFile .= ($size < 1) ? 'verysmall'
+ : ($size < 2) ? 'small'
+ : ($size < 3) ? 'med'
+ : ($size < 4) ? 'large'
+ : 'xlarge';
+ $self->{style}->{lendPixbuf} = Gtk2::Gdk::Pixbuf->new_from_file($lendImageFile.'.png');
+
+ # Pixbuf for favourite icon
+ my $favImageFile = $ENV{GCS_SHARE_DIR}.'/overlays/favourite_';
+ $favImageFile .= ($size < 1) ? 'verysmall'
+ : ($size < 2) ? 'small'
+ : ($size < 3) ? 'med'
+ : ($size < 4) ? 'large'
+ : 'xlarge';
+ $self->{style}->{favPixbuf} = Gtk2::Gdk::Pixbuf->new_from_file($favImageFile.'.png');
+
+ if ($self->{style}->{useOverlays})
+ {
+ $self->{style}->{overlayImage} = $ENV{GCS_SHARE_DIR}.'/overlays/'.$parent->{model}->{collection}->{options}->{overlay}->{image};
+ $self->{style}->{overlayPixbuf} = Gtk2::Gdk::Pixbuf->new_from_file($self->{style}->{overlayImage});
+
+ $self->{style}->{overlayPaddingLeft} = $parent->{model}->{collection}->{options}->{overlay}->{paddingLeft};
+ $self->{style}->{overlayPaddingRight} = $parent->{model}->{collection}->{options}->{overlay}->{paddingRight};
+ $self->{style}->{overlayPaddingTop} = $parent->{model}->{collection}->{options}->{overlay}->{paddingTop};
+ $self->{style}->{overlayPaddingBottom} = $parent->{model}->{collection}->{options}->{overlay}->{paddingBottom};
+ }
+
+ # Default value for align
+ $self->{style}->{groupAlign} = 'center';
+
+ if ($self->{style}->{withImage})
+ {
+ $self->{style}->{bgPixmap} = $bgdir.'/list_bg.png';
+
+ my $tmpPixbuf = Gtk2::Gdk::Pixbuf->new_from_file($self->{style}->{bgPixmap});
+ $tmpPixbuf = GCUtils::scaleMaxPixbuf($tmpPixbuf,
+ $self->{style}->{vboxWidth},
+ $self->{style}->{vboxHeight},
+ 1);
+ (my $fh, $self->{style}->{tmpBgPixmapFile}) = tempfile(UNLINK => 1);
+ close $fh;
+ if ($^O =~ /win32/i)
+ {
+ # It looks like Win32 version only supports JPEG pictures for background
+ $tmpPixbuf->save($self->{style}->{tmpBgPixmap}, 'jpeg', quality => '100');
+ }
+ else
+ {
+ $tmpPixbuf->save($self->{style}->{tmpBgPixmapFile}, 'png');
+ }
+
+ #($self->{style}->{tmpBgPixmap}, $self->{style}->{tmpBgMask}) = $tmpPixbuf->render_pixmap_and_mask(255);
+
+ GCUtils::setWidgetPixmap($self->{mainList}->parent, $self->{style}->{tmpBgPixmapFile});
+
+ $self->{style}->{backgroundPixbuf} = Gtk2::Gdk::Pixbuf->new_from_file($self->{style}->{bgPixmap});
+ $self->{style}->{backgroundPixbuf} = GCUtils::scaleMaxPixbuf($self->{style}->{backgroundPixbuf},
+ $self->{style}->{vboxWidth},
+ $self->{style}->{vboxHeight},
+ 1);
+ my @colors = split m/,/, $self->{preferences}->listFgColor;
+ ($colors[0], $colors[1], $colors[2]) = (65535, 65535, 65535) if !@colors;
+ my $red = int($colors[0] / 257);
+ my $green = int($colors[1] / 257);
+ my $blue = int($colors[2] / 257);
+ $self->{style}->{activeBgValue} = ($red << 16) + ($green << 8) + $blue;
+
+ if ($self->{style}->{withReflect})
+ {
+ $self->{style}->{foregroundPixbuf} = Gtk2::Gdk::Pixbuf->new_from_file($bgdir.'/list_fg.png');
+ $self->{style}->{foregroundPixbuf} = GCUtils::scaleMaxPixbuf($self->{style}->{foregroundPixbuf},
+ $self->{style}->{vboxWidth},
+ $self->{style}->{vboxHeight},
+ 1);
+ }
+
+ $self->{groupBgFile} = $bgdir.'/group.png';
+ }
+ else
+ {
+ my @colors = split m/,/, $self->{preferences}->listBgColor;
+ ($colors[0], $colors[1], $colors[2]) = (65535, 65535, 65535) if !@colors;
+ $self->{style}->{inactiveBg} = new Gtk2::Gdk::Color($colors[0], $colors[1], $colors[2]);
+ @colors = split m/,/, $self->{preferences}->listFgColor;
+ ($colors[0], $colors[1], $colors[2]) = (0, 0, 0) if !@colors;
+ $self->{style}->{activeBg} = new Gtk2::Gdk::Color($colors[0], $colors[1], $colors[2]);
+ $self->{mainList}->parent->modify_bg('normal', $self->{style}->{inactiveBg});
+ $self->{mainList}->parent->modify_bg('active', $self->{style}->{inactiveBg});
+ $self->{mainList}->parent->modify_bg('prelight', $self->{style}->{inactiveBg});
+ $self->{mainList}->parent->modify_bg('selected', $self->{style}->{inactiveBg});
+ $self->{mainList}->parent->modify_bg('insensitive', $self->{style}->{inactiveBg});
+ }
+ }
+
+ sub initListStyle
+ {
+ my ($self, $list) = @_;
+ $list->{style} = $self->{style};
+ if ($self->{style}->{withImage})
+ {
+ GCUtils::setWidgetPixmap($list->parent, $self->{style}->{tmpBgPixmapFile});
+ }
+ else
+ {
+ $self->set_border_width(5);
+ $list->parent->modify_bg('normal', $self->{style}->{inactiveBg});
+ $list->parent->modify_bg('active', $self->{style}->{inactiveBg});
+ $list->parent->modify_bg('prelight', $self->{style}->{inactiveBg});
+ $list->parent->modify_bg('selected', $self->{style}->{inactiveBg});
+ $list->parent->modify_bg('insensitive', $self->{style}->{inactiveBg});
+ }
+ }
+
+ sub setCurrentList
+ {
+ my ($self, $list) = @_;
+ $self->{currentList} = $list;
+ }
+
+ sub setGroupingInformation
+ {
+ my $self = shift;
+
+ $self->{collectionField} = $self->{preferences}->groupBy;
+ $self->{groupItems} = ($self->{collectionField} ne '');
+ if (!$self->{groupItems})
+ {
+ $self->addGroup($defaultGroup, uc $defaultGroup, 1)
+ if !$self->{currentList};
+ }
+ }
+
+ sub getGroups
+ {
+ my ($self, $info) = @_;
+
+ my $field = $self->{collectionField};
+ my $value = $info->{$field};
+ my $type = '';
+ $type = $self->{parent}->{model}->{fieldsInfo}->{$field}->{type}
+ if defined $self->{parent}->{model}->{fieldsInfo}->{$field}->{type};
+
+ $value = $self->{parent}->transformValue($value, $field, 1);
+
+ if (ref($value) eq 'ARRAY')
+ {
+ if (!scalar (@$value))
+ {
+ $value = [$defaultGroup];
+ }
+ }
+ else
+ {
+ $value = $defaultGroup
+ if ($type =~ /text$/) && ($value eq '');
+ my @array = ($value);
+ $value = \@array;
+ }
+
+
+ return $value;
+ }
+
+ sub sortAndFind
+ {
+ my ($self, $group) = @_;
+
+ # We insert it in the list
+ my @tmpList = @{$self->{orderedLists}};
+ #push @tmpList, $group;
+ # We sort it
+ if ($self->{currentOrder} == 0)
+ {
+ @tmpList = reverse sort {GCUtils::gccmpe($a, $b)} @tmpList;
+ }
+ else
+ {
+ @tmpList = sort {GCUtils::gccmpe($a, $b)} @tmpList;
+ }
+
+ # And now we find back its position
+ $self->{orderedLists} = \@tmpList;
+ return GCUtils::inArray($group, @tmpList);
+ }
+
+ sub getNbItems
+ {
+ my $self = shift;
+
+ # We count the number of items in displayed hash where value is 1
+ return scalar grep {$_ == 1} values %{$self->{displayed}};
+ }
+
+ sub createHeader
+ {
+ my ($self, $title) = @_;
+ my $label;
+ my $fixedTitle = $title;
+ $fixedTitle =~ s/&/&amp;/;
+ $fixedTitle =~ s/</&lt;/;
+ $fixedTitle =~ s/>/&gt;/;
+
+ if ($self->{style}->{withImage})
+ {
+ $label = new GCColorLabel(Gtk2::Gdk::Color->parse('#000000'));
+ $label->set_markup('<span '.$self->{style}->{groupStyle}.">$fixedTitle</span>");
+ GCUtils::setWidgetPixmap($label, $self->{groupBgFile});
+ }
+ else
+ {
+ $label = new GCColorLabel($self->{style}->{activeBg});
+ $label->set_markup('<span weight="bold" color="'.$self->{style}->{inactiveBg}->to_string."\">$fixedTitle</span>");
+ }
+ $label->set_justify($self->{style}->{groupAlign});
+ $label->set_padding($GCUtils::halfMargin, $GCUtils::halfMargin);
+ return $label;
+ return new Gtk2::Label($title);
+ }
+
+ sub addGroup
+ {
+ my ($self, $group, $refGroup, $immediate) = @_;
+
+ my $listBox = new Gtk2::VBox(0,0);
+ my $list = new GCBaseImageList($self, $self->{columns});
+ if ($self->{groupItems})
+ {
+ my $label;
+ if ($refGroup eq $defaultGroup)
+ {
+ $label = $self->createHeader('');
+ }
+ else
+ {
+ $label = $self->createHeader($group);
+ }
+ $listBox->pack_start($label, 0, 0, 0);
+ $list->setHeader($label);
+ $list->{refGroup} = $refGroup;
+ $label->show_all;
+ }
+ my $eventBox = new Gtk2::EventBox;
+ $eventBox->add($list);
+ $listBox->pack_start($eventBox, 0, 0, 0);
+ $self->{mainList}->pack_start($listBox, 0, 0, 0);
+
+ push @{$self->{orderedLists}}, $refGroup
+ if ($refGroup ne $defaultGroup);
+
+ if ($immediate && $self->{groupItems})
+ {
+ my $place = $self->sortAndFind($refGroup);
+ $self->{mainList}->reorder_child($listBox, $place);
+ }
+
+ $listBox->show_all;
+ $self->initListStyle($list);
+ $self->{lists}->{$refGroup} = $list;
+ $self->{listBoxes}->{$refGroup} = $listBox;
+ $self->{currentList} = $list if ! $self->{currentList};
+ $list->done(undef, 1) if $immediate;
+ return $list;
+ }
+
+ sub addItem
+ {
+ my ($self, $info, $immediate) = @_;
+ my $groups = [];
+ if ($self->{groupItems})
+ {
+ $groups = $self->getGroups($info);
+ }
+ else
+ {
+ $groups = [$defaultGroup];
+ }
+ foreach my $group(@$groups)
+ {
+ my $refGroup = uc($group);
+ if (! exists $self->{lists}->{$refGroup})
+ {
+ $self->addGroup($group, $refGroup, $immediate);
+ }
+ $self->{currentList} = $self->{lists}->{$refGroup} if $immediate;
+ $self->{lists}->{$refGroup}->addItem($info, $immediate, $self->{count}, 0);
+ # Storing conversion from index to the actual list
+ $self->{idxToList}->{$self->{count}} = $self->{lists}->{$refGroup};
+ }
+ # Default is to display it. It will maybe be filtered later
+ $self->{displayed}->{$self->{count}} = 1;
+ $self->{count}++;
+ }
+
+ sub couldExpandAll
+ {
+ my $self = shift;
+
+ return $self->{groupItems};
+ }
+
+ sub showCurrent
+ {
+ my $self = shift;
+ # TODO:
+ $self->{currentList}->showCurrent
+ if $self->{currentList};
+ }
+
+ sub clearSelected
+ {
+ my ($self, $current) = @_;
+ foreach (values %{$self->{lists}})
+ {
+ next if $_ == $current;
+ $_->restorePrevious(1);
+ }
+
+ }
+
+ sub reset
+ {
+ my $self = shift;
+ foreach (values %{$self->{lists}})
+ {
+ $_->reset;
+ }
+ $self->{count} = 0;
+ $self->{idxToList} = {};
+ }
+
+ sub clearCache
+ {
+ my ($self) = @_;
+ foreach (values %{$self->{lists}})
+ {
+ $_->clearCache;
+ }
+ #$self->{vboxWidth} = 1;
+ }
+
+ sub setSortOrder
+ {
+ my ($self, $order) = @_;
+ $self->{orderSet} = 1;
+
+ if ($self->{groupItems})
+ {
+ my $first = 1;
+ foreach (values %{$self->{lists}})
+ {
+ $_->setSortOrder($order);
+ # We get it computed by the first internal list
+ $self->{currentOrder} = $_->{currentOrder}
+ if $first;
+ $first = 0;
+ }
+ # Now the internal lists are ordered, we need to order them
+ my @tmpList = @{$self->{orderedLists}};
+
+ # We sort the list, using gccmpe to handle sorting of numeric values and dates
+ if ($self->{currentOrder} == 0)
+ {
+ @tmpList = reverse sort {GCUtils::gccmpe($a, $b)} @{$self->{orderedLists}};
+ }
+ else
+ {
+ @tmpList = sort {GCUtils::gccmpe($a, $b)} @{$self->{orderedLists}};
+ }
+
+ # Clear the current view
+ my @children = $self->{mainList}->get_children;
+ foreach my $child(@children)
+ {
+ $self->{mainList}->remove($child);
+ }
+ # And fill it again with the current order
+ foreach my $refGroup(@tmpList, $defaultGroup)
+ {
+ next if !$self->{listBoxes}->{$refGroup};
+ $self->{mainList}->pack_start($self->{listBoxes}->{$refGroup}, 0, 0, 0);
+ $self->{listBoxes}->{$refGroup}->show_all;
+ }
+
+ # Save the new order
+ $self->{orderedLists} = \@tmpList;
+ }
+ else
+ {
+ $self->{currentList}->setSortOrder($order);
+ $self->{currentList}->show_all;
+ # We get it computed by the first internal list
+ $self->{currentOrder} = $self->{currentList}->{currentOrder};
+ }
+ }
+
+ sub setFilter
+ {
+ my ($self, $filter, $items, $refresh, $splash) = @_;
+ shift;
+ my $current;
+ my $result = -1;
+ my $list;
+ $self->{displayed} = {};
+ foreach (keys %{$self->{lists}})
+ {
+ $list = $self->{lists}->{$_};
+ $current = $list->setFilter(@_);
+ $result = $current if $list == $self->{currentList};
+ if ($list->{displayedNumber})
+ {
+ $self->{listBoxes}->{$_}->show_all;
+ }
+ else
+ {
+ $self->{listBoxes}->{$_}->hide;
+ }
+ }
+ $result = -1 if !defined $result;
+ return $result;
+ }
+
+ sub setDisplayed
+ {
+ my ($self, $idx, $displayed) = @_;
+ $self->{displayed}->{$idx} = $displayed;
+ }
+
+ sub select
+ {
+ my ($self, $idx, $init, $keepPrevious) = @_;
+ my $list;
+ if ($self->{groupItems})
+ {
+ if (($idx == -1) || (!defined $idx))
+ {
+ if (defined $self->{orderedLists}->[0])
+ {
+ $list = $self->{lists}->{$self->{orderedLists}->[0]};
+ }
+ else
+ {
+ $list = $self->{lists}->{$defaultGroup};
+ }
+ }
+ else
+ {
+ $list = $self->{idxToList}->{$idx};
+ }
+ }
+ else
+ {
+ $list = $self->{currentList};
+ }
+ $list->select($idx, $init, $keepPrevious)
+ if $list;
+ }
+
+ sub savePreferences
+ {
+ my ($self, $preferences) = @_;
+ return if !$self->{orderSet};
+ $preferences->sortField($self->{titleField});
+ $preferences->sortOrder($self->{currentOrder});
+ }
+
+ sub getCurrentIdx
+ {
+ my $self = shift;
+ return 0 if !$self->{currentList};
+ return $self->{currentList}->getCurrentIdx;
+ }
+
+ sub removeCurrentItems
+ {
+ my $self = shift;
+ # TODO : This doesn't work if there are items selected in many lists
+
+ my @indexes = sort @{$self->getCurrentItems};
+ my $selected;
+ my @listWhereAlreadyRemoved;
+ # Find other lists where they were
+ foreach my $list(values %{$self->{lists}})
+ {
+ next if $list == $self->{currentList};
+ foreach my $idx(@indexes)
+ {
+ my $nbRemoved = 0;
+ if (exists $list->{idxToDisplayed}->{$idx - $nbRemoved})
+ {
+ $list->removeItem($idx - $nbRemoved);
+ push @listWhereAlreadyRemoved, 0 + $list;
+ $nbRemoved++;
+ }
+ #splice @{$list->{cache}}, $idx - $nbRemoved, 1;
+ delete $self->{displayed}->{$idx};
+ }
+ }
+ # Adjust the total number of items according to what we removed
+ $self->{count} -= scalar @indexes;
+
+ $selected = $self->{currentList}->removeCurrentItems;
+ push @listWhereAlreadyRemoved, $self->{currentList};
+
+ # Now we have to adjust all of the indexes in other lists
+ foreach my $list(values %{$self->{lists}})
+ {
+ # We don't perform the switch if we already removed the item
+ my $found = 0;
+ foreach my $listRm(@listWhereAlreadyRemoved)
+ {
+ if ($listRm == $list)
+ {
+ # Found a list where we removed it
+ $found = 1;
+ last;
+ }
+ }
+ next if $found;
+ $list->shiftIndexes(\@indexes);
+ $list->initConversionTables;
+ }
+
+ # If we removed all the items in the current group, we are looking for the 1st one
+ # of the next group (fallback on previous if last one)
+ if (!defined $selected)
+ {
+ my $nextList;
+ foreach my $i(0 .. $#{$self->{orderedLists}})
+ {
+ if ($self->{orderedLists}->[$i] eq $self->{currentList}->{refGroup})
+ {
+ if ($i < $#{$self->{orderedLists}})
+ {
+ $nextList = $self->{orderedLists}->[$i+1];
+ last;
+ }
+ else
+ {
+ $nextList = $self->{orderedLists}->[$i-1]
+ if $i > 0;
+ last;
+ }
+ }
+ }
+ if ($nextList)
+ {
+ my $currentList = $self->{lists}->{$nextList};
+ $selected = $currentList->{displayedToIdx}->{0};
+ $currentList->select($selected);
+ $self->{currentList} = $currentList;
+ }
+ }
+ return $selected;
+ }
+
+ sub getCurrentItems
+ {
+ my $self = shift;
+ # TODO : This doesn't work if there are items selected in many lists
+ return $self->{currentList}->getCurrentItems;
+ }
+
+ sub changeCurrent
+ {
+ my ($self, $previous, $new, $idx, $wantSelect) = @_;
+ if ($self->{groupItems})
+ {
+ # Will be set to a true value if the 1st added item should be selected
+ my $shouldBeSelected = 0;
+ # Get the list where it was
+ my @prevGroups = sort @{$self->getGroups($previous)};
+
+ # And the one where it should be
+ my @newGroups = sort @{$self->getGroups($new)};
+
+ my ($found, $place);
+ # First look for previous ones
+ foreach my $pg(@prevGroups)
+ {
+ my $pg = uc $pg;
+ ($found, $place) = (0, 0);
+ # Try to find it in the new groups
+ foreach my $ng (@newGroups)
+ {
+ my $refGroup = uc($ng);
+ $found = 1 if $refGroup eq $pg;
+ # As it is sorted, we can stop when we find a greater one
+ last if $refGroup ge $pg;
+ $place++;
+ }
+ # If found, we just change it
+ if ($found)
+ {
+ $self->{lists}->{$pg}->changeCurrent($previous, $new, $idx, $wantSelect);
+ # And we remove it from the list
+ splice @newGroups, $place, 1;
+ }
+ # Otherwise, it means it was removed from this group
+ else
+ {
+ $shouldBeSelected = 1
+ if $self->{lists}->{$pg}->isSelected($idx);
+ $self->{lists}->{$pg}->removeItem($idx,1);
+ }
+ }
+ # Now we should have a list whith just the new groups
+ foreach my $ng(@newGroups)
+ {
+ my $refGroup = uc $ng;
+ # We should create the list if it doesn't exist
+ if (! exists $self->{lists}->{$refGroup})
+ {
+ my $list = $self->addGroup($ng, $refGroup, 1);
+ }
+
+ # 2nd parameter means it should be added immediately
+ # 4th one is that we should not change the conversion tables because it's not
+ # a new item
+ $self->{lists}->{$refGroup}->addItem($new, 1, $idx, 1);
+ if ($shouldBeSelected)
+ {
+ $self->{lists}->{$refGroup}->select($idx, 0, 1);
+ $shouldBeSelected = 0;
+ }
+ }
+ # TODO It should return something else if filtered
+ return $idx;
+ }
+ else
+ {
+ return $self->{currentList}->changeCurrent($previous, $new, $idx, $wantSelect);
+ }
+ }
+
+ sub AUTOLOAD
+ {
+ return if our $AUTOLOAD =~ /::DESTROY$/;
+ (my $name = $AUTOLOAD) =~ s/.*?::(.*)/$1/;
+ my $self = shift;
+ #GCUtils::printStack(6);
+ #print "CALLING $name\n";
+ return $self->{currentList}->$name(@_);
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCItemsLists/GCListOptions.pm b/lib/gcstar/GCItemsLists/GCListOptions.pm
new file mode 100644
index 0000000..c41084b
--- /dev/null
+++ b/lib/gcstar/GCItemsLists/GCListOptions.pm
@@ -0,0 +1,496 @@
+package GCListOptions;
+
+###################################################
+#
+# Copyright 2005-2011 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use Gtk2;
+
+{
+ package GCListOptionsPanel;
+ use base "Gtk2::Frame";
+
+ sub setView
+ {
+ my ($self, $view) = @_;
+ if ((!exists $self->{currentView}) || ($view != $self->{currentView}))
+ {
+ $self->{currentView} = $view;
+ if ($self->{panel})
+ {
+ $self->{scroll}->remove($self->{scroll}->get_child);
+ $self->{panel}->destroy;
+ }
+
+ $self->{cancel}->set_sensitive(1);
+ $self->{apply}->set_sensitive(1);
+
+ if ($view == 0)
+ {
+ $self->{panel} = new GCEmptyOptionsPanel($self->{parent}->{model}->{preferences}, $self->{parent});
+ $self->{cancel}->set_sensitive(0);
+ $self->{apply}->set_sensitive(0);
+ }
+ elsif ($view == 1)
+ {
+ $self->{panel} = new GCImagesOptionsPanel($self->{parent}->{model}->{preferences}, $self->{parent});
+ }
+ else
+ {
+ $self->{panel} = new GCDetailedOptionsPanel($self->{parent}->{model}->{preferences}, $self->{parent});
+ }
+ $self->{scroll}->add_with_viewport($self->{panel});
+ $self->{scroll}->child->set_shadow_type('none');
+ }
+ $self->{panel}->initValues;
+ }
+
+ sub new
+ {
+ my ($proto, $optionsManager, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+ $self->{optionsManager} = $optionsManager;
+ $self->{parent} = $parent;
+ $self->{scroll} = new Gtk2::ScrolledWindow;
+ $self->{scroll}->set_policy ('automatic', 'automatic');
+ $self->{scroll}->set_shadow_type('none');
+ $self->{hboxButtons} = new Gtk2::HBox(0,0);
+ $self->{cancel} = GCButton->newFromStock('gtk-clear');
+ $self->{apply} = GCButton->newFromStock('gtk-apply');
+
+ $self->{vbox} = new Gtk2::VBox(0,0);
+
+ $self->{hboxButtons}->pack_end($self->{apply}, 0, 0, $GCUtils::halfMargin);
+ $self->{hboxButtons}->pack_end($self->{cancel}, 0, 0, $GCUtils::halfMargin);
+ $self->add($self->{vbox});
+
+ $self->{vbox}->pack_start($self->{scroll}, 1, 1, $GCUtils::quarterMargin);
+ $self->{vbox}->pack_start($self->{hboxButtons}, 0, 0, $GCUtils::quarterMargin);
+
+ $self->{cancel}->signal_connect('clicked' => sub {
+ $self->{panel}->initValues
+ if $self->{panel};
+ });
+ $self->{apply}->signal_connect('clicked' => sub {
+ if ($self->{panel})
+ {
+ $self->{panel}->saveValues;
+ $self->{parent}->setItemsList(0, 1);
+ }
+ });
+
+
+ bless $self, $class;
+ return $self;
+ }
+}
+
+{
+ # Class used when there is no option
+ package GCEmptyOptionsPanel;
+ use base "Gtk2::VBox";
+ use GCStyle;
+
+ sub initValues
+ {
+ my $self = shift;
+ }
+ sub saveValues
+ {
+ my $self = shift;
+ }
+ sub new
+ {
+ my ($proto, $optionsManager, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new(0,0);
+ bless $self, $class;
+ # TODO to be replaced with a translatable label
+ my $label = new GCLabel("No option");
+ $self->pack_start($label,1,1,0);
+ $self->show_all;
+ return $self;
+ }
+}
+
+{
+ # Class used to let user select images options
+ package GCImagesOptionsPanel;
+ use base "Gtk2::Table";
+ #use base "Gtk2::VBox";
+ use GCStyle;
+
+ sub initValues
+ {
+ my $self = shift;
+ $self->{resizeImgList}->set_active($self->{optionsManager}->resizeImgList);
+ $self->{animateImgList}->set_active($self->{optionsManager}->animateImgList);
+ $self->{columns}->set_value($self->{optionsManager}->columns);
+ $self->{imgSizeOption}->setValue($self->{optionsManager}->listImgSize);
+ $self->{optionStyle}->setValue($self->{optionsManager}->listImgSkin);
+ $self->{useOverlays}->set_active($self->{optionsManager}->useOverlays);
+ $self->{listBgPicture}->set_active($self->{optionsManager}->listBgPicture);
+ $self->activateColors(! $self->{optionsManager}->listBgPicture);
+ $self->{mlbg} = $self->{optionsManager}->listBgColor;
+ $self->{mlfg} = $self->{optionsManager}->listFgColor;
+ $self->{groupByOption}->setValue($self->{optionsManager}->groupBy);
+ $self->{secondarySortOption}->setValue($self->{optionsManager}->secondarySort);
+ }
+
+ sub saveValues
+ {
+ my $self = shift;
+
+ $self->{optionsManager}->resizeImgList(($self->{resizeImgList}->get_active) ? 1 : 0);
+ $self->{optionsManager}->animateImgList(($self->{animateImgList}->get_active) ? 1 : 0);
+ $self->{optionsManager}->columns($self->{columns}->get_value);
+ $self->{optionsManager}->listImgSize($self->{imgSizeOption}->getValue);
+ $self->{optionsManager}->listImgSkin($self->{optionStyle}->getValue);
+ $self->{optionsManager}->listBgColor($self->{mlbg});
+ $self->{optionsManager}->listFgColor($self->{mlfg});
+ $self->{optionsManager}->listBgPicture(($self->{listBgPicture}->get_active) ? 1 : 0);
+ $self->{optionsManager}->useOverlays(($self->{useOverlays}->get_active) ? 1 : 0);
+ $self->{optionsManager}->groupBy($self->{groupByOption}->getValue);
+ $self->{optionsManager}->secondarySort( $self->{secondarySortOption}->getValue);
+ }
+
+ sub changeColor
+ {
+ my ($self, $type) = @_;
+
+ my $dialog = new Gtk2::ColorSelectionDialog($self->{lang}->{ImagesOptionsSelectColor});
+ my $vboxPicture = new Gtk2::VBox(0,0);
+ my @colors = split m/,/, $self->{'ml'.$type};
+ my $previous = new Gtk2::Gdk::Color($colors[0], $colors[1], $colors[2]);
+ $dialog->colorsel->set_current_color($previous) if $previous;
+ my $response = $dialog->run;
+ if ($response eq 'ok')
+ {
+ my $color = $dialog->colorsel->get_current_color;
+ $self->{'ml'.$type} = join ',',$color->red, $color->green, $color->blue;
+ }
+ $dialog->destroy;
+ }
+
+ sub activateColors
+ {
+ my ($self, $value) = @_;
+
+ $self->{labelStyle}->set_sensitive(!$value);
+ $self->{optionStyle}->set_sensitive(!$value);
+ $self->{labelBg}->set_sensitive($value);
+ $self->{buttonBg}->set_sensitive($value);
+ }
+
+ sub new
+ {
+ my ($proto, $optionsManager, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new(14,4);
+ #my $self = $class->SUPER::new(0,0);
+
+ $self->{optionsManager} = $optionsManager;
+ $self->{lang} = $parent->{lang};
+
+# $self->set_row_spacings($GCUtils::halfMargin);
+ $self->set_col_spacings($GCUtils::margin);
+ $self->set_border_width($GCUtils::margin);
+
+ $self->{labelColumns} = new GCLabel($self->{lang}->{OptionsColumns});
+ my $adj = Gtk2::Adjustment->new(0, 1, 20, 1, 1, 0) ;
+ $self->{columns} = Gtk2::SpinButton->new($adj, 0, 0);
+
+ $self->{resizeImgList} = new Gtk2::CheckButton($self->{lang}->{ImagesOptionsResizeImgList});
+ $self->{resizeImgList}->signal_connect('clicked' => sub {
+ $self->{columns}->set_sensitive(! $self->{resizeImgList}->get_active);
+ });
+ $self->{resizeImgList}->set_active($self->{resizeImgList});
+
+ $self->{animateImgList} = new Gtk2::CheckButton($self->{lang}->{ImagesOptionsAnimateImgList});
+ $self->{animateImgList}->signal_connect('clicked' => sub {
+ $self->{columns}->set_sensitive(! $self->{animateImgList}->get_active);
+ });
+ $self->{animateImgList}->set_active($self->{animateImgList});
+
+ $self->{imgSizeLabel} = new GCLabel($self->{lang}->{ImagesOptionsSizeLabel});
+ $self->{imgSizeOption} = new GCMenuList;
+ my %imgSizes = %{$self->{lang}->{ImagesOptionsSizeList}};
+ my @imgValues = map {{value => $_, displayed => $imgSizes{$_}}}
+ (sort keys %imgSizes);
+ $self->{imgSizeOption}->setValues(\@imgValues);
+
+ $self->{useOverlays} = new Gtk2::CheckButton($self->{lang}->{ImagesOptionsUseOverlays});
+ $self->{useOverlays}->set_active($self->{useOverlays});
+
+ $self->{listBgPicture} = new Gtk2::CheckButton($self->{lang}->{ImagesOptionsBgPicture});
+ $self->{listBgPicture}->signal_connect('clicked' => sub {
+ $self->activateColors(! $self->{listBgPicture}->get_active);
+ });
+
+ $self->{labelStyle} = new GCLabel($self->{lang}->{OptionsStyle});
+ $self->{optionStyle} = new GCMenuList;
+ my @styleValues;
+ foreach (@GCStyle::lists)
+ {
+ (my $displayed = $_) =~ s/_/ /g;
+ push @styleValues, {value => $_, displayed => $displayed};
+ }
+ $self->{optionStyle}->setValues(\@styleValues);
+
+ $self->{labelBg} = new GCLabel($self->{lang}->{ImagesOptionsBg});
+ $self->{buttonBg} = new Gtk2::Button($self->{lang}->{ImagesOptionsSelectColor});
+ $parent->{tooltips}->set_tip($self->{buttonBg},
+ $self->{lang}->{ImagesOptionsBgTooltip});
+ $self->{buttonBg}->signal_connect('clicked' => sub {
+ $self->changeColor('bg');
+ });
+
+ $self->{labelFg} = new GCLabel($self->{lang}->{ImagesOptionsFg});
+ $self->{buttonFg} = new Gtk2::Button($self->{lang}->{ImagesOptionsSelectColor});
+ $self->{buttonFg}->signal_connect('clicked' => sub {
+ $self->changeColor('fg');
+ });
+ $parent->{tooltips}->set_tip($self->{buttonFg},
+ $self->{lang}->{ImagesOptionsFgTooltip});
+
+ $self->{groupItems} = new GCLabel($self->{lang}->{DetailedOptionsGroupItems});
+ $self->{groupByOption} = new GCFieldSelector(0, undef, 1);
+ $self->{groupByOption}->setModel($parent->{model});
+
+ $self->{secondarySort} = new GCLabel($self->{lang}->{DetailedOptionsSecondarySort});
+ $self->{secondarySortOption} = new GCFieldSelector(0, undef, 1);
+ $self->{secondarySortOption}->setModel($parent->{model});
+
+# my $tableDisplay = new Gtk2::Table(5,2);
+# $tableDisplay->set_row_spacings($GCUtils::halfMargin);
+# $tableDisplay->set_col_spacings($GCUtils::margin);
+# $tableDisplay->set_border_width($GCUtils::margin);
+ my $imagesDisplayExpander = new GCExpander($self->{lang}->{OptionsImagesDisplayGroup}, 1);
+ $self->attach($imagesDisplayExpander, 0, 4, 0, 1, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{resizeImgList}, 2, 4, 1, 2, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{animateImgList}, 2, 4, 2, 3, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{labelColumns}, 2, 3, 3, 4, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{columns}, 3, 4, 3, 4, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{imgSizeLabel}, 2, 3, 4, 5, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{imgSizeOption}, 3, 4, 4, 5, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{groupItems}, 2, 3, 5, 6, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{groupByOption}, 3, 4, 5, 6, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{secondarySort}, 2, 3, 6, 7, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{secondarySortOption}, 3, 4, 6, 7, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+
+ my $imagesStyleExpander = new GCExpander($self->{lang}->{OptionsImagesStyleGroup}, 1);
+ $self->attach($imagesStyleExpander, 0, 4, 8, 9, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{useOverlays}, 2, 4, 9, 10, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{listBgPicture}, 2, 4, 10, 11, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{labelStyle}, 2, 3, 11, 12, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{optionStyle}, 3, 4, 11, 12, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{labelBg}, 2, 3, 12, 13, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{buttonBg}, 3, 4, 12, 13, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{labelFg}, 2, 3, 13, 14, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{buttonFg}, 3, 4, 13, 14, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+
+ $imagesDisplayExpander->signal_connect('activate' => sub {
+ if (!$imagesDisplayExpander->get_expanded)
+ {
+ $self->{resizeImgList}->show_all;
+ $self->{labelColumns}->show_all;
+ $self->{columns}->show_all;
+ $self->{imgSizeLabel}->show_all;
+ $self->{imgSizeOption}->show_all;
+ $self->{groupItems}->show_all;
+ $self->{groupByOption}->show_all;
+ $self->{secondarySort}->show_all;
+ $self->{secondarySortOption}->show_all;
+ }
+ else
+ {
+ $self->{resizeImgList}->hide_all;
+ $self->{labelColumns}->hide_all;
+ $self->{columns}->hide_all;
+ $self->{imgSizeLabel}->hide_all;
+ $self->{imgSizeOption}->hide_all;
+ $self->{groupItems}->hide_all;
+ $self->{groupByOption}->hide_all;
+ $self->{secondarySort}->hide_all;
+ $self->{secondarySortOption}->hide_all;
+ }
+ });
+ $imagesStyleExpander->signal_connect('activate' => sub {
+ if (!$imagesStyleExpander->get_expanded)
+ {
+ $self->{useOverlays}->show_all;
+ $self->{listBgPicture}->show_all;
+ $self->{labelStyle}->show_all;
+ $self->{optionStyle}->show_all;
+ $self->{labelBg}->show_all;
+ $self->{buttonBg}->show_all;
+ $self->{labelFg}->show_all;
+ $self->{buttonFg}->show_all;
+ }
+ else
+ {
+ $self->{useOverlays}->hide_all;
+ $self->{listBgPicture}->hide_all;
+ $self->{labelStyle}->hide_all;
+ $self->{optionStyle}->hide_all;
+ $self->{labelBg}->hide_all;
+ $self->{buttonBg}->hide_all;
+ $self->{labelFg}->hide_all;
+ $self->{buttonFg}->hide_all;
+ }
+ });
+
+ $self->show_all;
+ $imagesDisplayExpander->set_expanded(1);
+ $imagesStyleExpander->set_expanded(1);
+
+ bless ($self, $class);
+ return $self;
+ }
+}
+
+
+
+{
+ # Class used to let user select detailed options
+ package GCDetailedOptionsPanel;
+ use base "Gtk2::VBox";
+
+
+ sub initValues
+ {
+ my $self = shift;
+
+ $self->{imgSizeOption}->setValue($self->{optionsManager}->detailImgSize);
+ $self->{groupByOption}->setValue($self->{optionsManager}->groupBy);
+ $self->{secondarySortOption}->setValue($self->{optionsManager}->secondarySort);
+ $self->{groupedFirst}->setValue($self->{optionsManager}->groupedFirst);
+ $self->{addCount}->setValue($self->{optionsManager}->addCount);
+
+ my @tmpFieldsArray = split m/\|/, $self->{optionsManager}->details;
+ $self->{fieldsSelection}->setListFromIds(\@tmpFieldsArray);
+
+ }
+
+ sub saveValues
+ {
+ my $self = shift;
+ $self->{optionsManager}->detailImgSize($self->{imgSizeOption}->getValue);
+ $self->{optionsManager}->groupBy($self->{groupByOption}->getValue);
+ $self->{optionsManager}->secondarySort($self->{secondarySortOption}->getValue);
+ $self->{optionsManager}->groupedFirst($self->{groupedFirst}->getValue);
+ $self->{optionsManager}->addCount($self->{addCount}->getValue);
+ my $details = join('|', @{$self->{fieldsSelection}->getSelectedIds});
+ $self->{optionsManager}->details($details);
+ }
+
+ sub hideExtra
+ {
+ my $self = shift;
+
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->initValues;
+
+ my $code = $self->SUPER::show;
+ if ($code eq 'ok')
+ {
+ $self->saveValues;
+ }
+ $self->hide;
+ }
+
+ sub new
+ {
+ my ($proto, $optionsManager, $parent, $preIdList) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(0,0);
+
+ $self->{lang} = $parent->{lang};
+ $self->{optionsManager} = $optionsManager;
+
+ bless ($self, $class);
+
+ $self->set_border_width($GCUtils::margin);
+
+ $self->{groupItems} = new GCLabel($self->{lang}->{DetailedOptionsGroupItems});
+ $self->{groupByOption} = new GCFieldSelector(0, undef, 1);
+ $self->{groupByOption}->setModel($parent->{model});
+
+ $self->{secondarySort} = new GCLabel($self->{lang}->{DetailedOptionsSecondarySort});
+ $self->{secondarySortOption} = new GCFieldSelector(0, undef, 1);
+ $self->{secondarySortOption}->setModel($parent->{model});
+
+ $self->{groupedFirst} = new GCCheckBox($self->{lang}->{DetailedOptionsGroupedFirst});
+ $self->{addCount} = new GCCheckBox($self->{lang}->{DetailedOptionsAddCount});
+
+ $self->{imgSizeLabel} = new GCLabel($self->{lang}->{DetailedOptionsImageSize});
+ $self->{imgSizeOption} = new GCMenuList;
+ my %imgSizes = %{$self->{lang}->{ImagesOptionsSizeList}};
+ my @imgValues = map {{value => $_, displayed => $imgSizes{$_}}}
+ (sort keys %imgSizes);
+ $self->{imgSizeOption}->setValues(\@imgValues);
+
+ my $preferencesExpander = new GCExpander($self->{lang}->{OptionsDetailedPreferencesGroup}, 1);
+ $self->pack_start($preferencesExpander, 0, 0, $GCUtils::quarterMargin);
+
+ my $tablePreferences = new Gtk2::Table(4, 5);
+ $tablePreferences->set_col_spacings($GCUtils::margin);
+
+ $tablePreferences->attach($self->{imgSizeLabel}, 2, 3, 1, 2, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $tablePreferences->attach($self->{imgSizeOption}, 3, 4, 1, 2, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+
+ $tablePreferences->attach($self->{groupItems}, 2, 3, 2, 3, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $tablePreferences->attach($self->{groupByOption}, 3, 4, 2, 3, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $tablePreferences->attach($self->{secondarySort}, 2, 3, 3, 4, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $tablePreferences->attach($self->{secondarySortOption}, 3, 4, 3, 4, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+
+ $tablePreferences->attach($self->{groupedFirst}, 2, 4, 4, 5, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $tablePreferences->attach($self->{addCount}, 2, 4, 5, 6, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+
+ $preferencesExpander->add($tablePreferences);
+
+ my $fieldsExpander = new GCExpander($self->{lang}->{DetailedOptionsFields}, 1);
+ my @tmpFieldsArray = split m/\|/, $optionsManager->details;
+ $self->{fieldsSelection} = new GCFieldsSelectionWidget($parent, \@tmpFieldsArray, 1);
+
+ $self->pack_start($fieldsExpander, 0, 0, $GCUtils::quarterMargin);
+ $fieldsExpander->add($self->{fieldsSelection});
+ $self->{fieldsSelection}->set_border_width($GCUtils::margin);
+
+ $preferencesExpander->set_expanded(1);
+ $fieldsExpander->set_expanded(1);
+
+ $self->show_all;
+ return $self;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCItemsLists/GCTextLists.pm b/lib/gcstar/GCItemsLists/GCTextLists.pm
new file mode 100644
index 0000000..aaa080b
--- /dev/null
+++ b/lib/gcstar/GCItemsLists/GCTextLists.pm
@@ -0,0 +1,2101 @@
+package GCTextLists;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# This file handle the left list part, in text Mode and Detailed Mode
+#
+
+use strict;
+use locale;
+
+{
+ package GCBaseTextList;
+ use base "Gtk2::ScrolledWindow";
+ use GCUtils;
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+ $self->{parent} = $parent;
+ $self->{preferences} = $parent->{model}->{preferences};
+ $self->{preferences}->sortOrder(1)
+ if ! $self->{preferences}->exists('sortOrder');
+ $self->{count} = 0;
+ return $self;
+ }
+
+ sub getNbItems
+ {
+ my $self = shift;
+ return $self->{count};
+ }
+
+ sub convertIterToChildIter
+ {
+ my ($self, $iter) = @_;
+ my $result = $self->{completeModel}->convert_iter_to_child_iter($iter);
+ $result = $self->{subModel}->convert_iter_to_child_iter($result);
+ return $result;
+ }
+
+ sub convertChildIterToIter
+ {
+ my ($self, $iter) = @_;
+ my $result = $iter;
+ $result = $self->{subModel}->convert_child_iter_to_iter($result);
+ $result = $self->{completeModel}->convert_child_iter_to_iter($result);
+ return $result;
+ }
+
+ sub convertIterToString
+ {
+ my ($self, $iter) = @_;
+ return '' if ! $iter;
+
+ return $self->{completeModel}->get_string_from_iter($iter);
+ }
+
+ sub convertIdxToIter
+ {
+ my ($self, $idx) = @_;
+ $self->{completeModel}->foreach(sub {
+ my ($model, $path, $iter) = @_;
+ if (($self->convertIterToIdx($iter) == $idx)
+ && (!$model->iter_n_children($iter)))
+ {
+ $self->{currentIterString} = $model->get_path($iter)->to_string;
+ return 1;
+ }
+ return 0;
+ });
+ }
+
+ sub selectAll
+ {
+ my $self = shift;
+
+ $self->{list}->get_selection->select_all;
+ }
+
+ sub selectIter
+ {
+ my ($self, $iter, $deactivateUpdate) = @_;
+ $self->{deactivateUpdate} = $deactivateUpdate;
+ $self->{list}->get_selection->unselect_all;
+ $self->{list}->get_selection->select_iter($iter);
+ $self->{deactivateUpdate} = 0;
+ }
+
+ sub getCurrentIter
+ {
+ my $self = shift;
+ my $iter = undef;
+ #my $iter = $self->{list}->get_selection->get_selected;
+ my @rows = $self->{list}->get_selection->get_selected_rows;
+ $iter = $self->{list}->get_model->get_iter($rows[0]) if $rows[0];
+ return $iter;
+ }
+
+ sub getCurrentItems
+ {
+ my $self = shift;
+ my @indexes;
+ my @iterators;
+ my @rows = $self->{list}->get_selection->get_selected_rows;
+ foreach (@rows)
+ {
+ my $iter = $self->{list}->get_model->get_iter($_);
+ push @iterators, $iter;
+ push @indexes, $self->convertIterToIdx($iter);
+ }
+ @indexes = sort @indexes;
+ return (\@indexes, \@iterators) if wantarray;
+ return \@indexes;
+ }
+
+ sub getCurrentIterFromString
+ {
+ my $self = shift;
+ return ($self->{currentIterString})
+ ? $self->{completeModel}->get_iter_from_string($self->{currentIterString})
+ : $self->{completeModel}->get_iter_first;
+ }
+
+ sub removeCurrentItems
+ {
+ my ($self) = @_;
+ my ($indexes, $iterators) = $self->getCurrentItems;
+
+ $self->{deactivateSortCache} = 1;
+
+ my ($nextIter, $newIdx) = $self->getNextIter($iterators->[-1], $indexes);
+ my $realIter = $self->convertIterToChildIter($nextIter);
+ my $nextPath = $self->{model}->get_path($realIter)->to_string;
+
+ my $count = scalar @$indexes;
+
+ $self->{count} -= $count;
+ $self->{nextItemIdx} -= $count;
+
+ $self->{list}->expand_to_path($self->{completeModel}->get_path($nextIter))
+ if $self->{currentIterString} =~ /:/;
+ $self->selectIter($nextIter)
+ if ($nextIter);
+
+ my @toBeRemoved;
+ my %pathToChange;
+ foreach my $number(@$indexes)
+ {
+ #Shift backward all following items.
+ $self->{model}->foreach(sub {
+ my ($model, $path, $iter) = @_;
+ return 0 if $model->iter_has_child($iter);
+ my $currentIdx = ($model->get($iter))[$self->{idxColumn}];
+ if ($currentIdx > $number)
+ {
+ $pathToChange{$path->to_string}++;
+ }
+ elsif ($currentIdx == $number)
+ {
+ # We store them for future removal
+ push @toBeRemoved, new Gtk2::TreeRowReference($model, $path);
+ }
+ return 0;
+ });
+ }
+
+ # Perform the actual shift
+ my $offset = 0;
+ foreach my $path(keys %pathToChange)
+ {
+ my $iter = $self->{model}->get_iter(Gtk2::TreePath->new($path));
+ my $currentIdx = ($self->{model}->get($iter))[$self->{idxColumn}];
+ $self->{model}->set($iter, $self->{idxColumn}, ($currentIdx - $pathToChange{$path}));
+ if ($nextPath eq $path)
+ {
+ $newIdx = $currentIdx - $pathToChange{$path};
+ }
+ $offset++;
+ }
+
+ # Update caches
+ $self->{sorter}->clear_cache;
+ $self->{testCache} = [];
+
+ # Removing all the instances
+ foreach(@toBeRemoved)
+ {
+ $self->removeFromModel($self->{model}->get_iter($_->get_path));
+ }
+
+ $self->{deactivateSortCache} = 0;
+
+ return $newIdx;
+ }
+
+ sub changeItem
+ {
+ # Apply the changes from $previous to $new to the listView entry $idx
+ # Return the $idx of the new current item ($previous can now be hidden)
+ my ($self, $idx, $previous, $new) = @_;
+ $self->convertIdxToIter($idx);
+ return $self->changeCurrent($previous, $new, $idx, 0);
+ }
+
+ sub updateMenus
+ {
+ # Update menu items to reflect number of items selected
+ my ($self, $nbSelected) = @_;
+
+ my $menu = $self->{parent}->{menubar};
+ my @updateList;
+ if ($nbSelected > 1)
+ {
+ @updateList = (
+ [$menu, 'duplicateItem', 'MenuDuplicatePlural'],
+ [$menu, 'deleteCurrentItem', 'MenuEditDeleteCurrentPlural'],
+ [$self->{parent}, 'contextDuplicateItem', 'MenuDuplicatePlural'],
+ [$self->{parent}, 'contextItemDelete', 'MenuEditDeleteCurrentPlural'],
+ [$self->{parent}, 'contextNewWindow', 'MenuNewWindowPlural'],
+ );
+ }
+ else
+ {
+ @updateList = (
+ [$menu, 'duplicateItem', 'MenuDuplicate'],
+ [$menu, 'deleteCurrentItem', 'MenuEditDeleteCurrent'],
+ [$self->{parent}, 'contextDuplicateItem', 'MenuDuplicate'],
+ [$self->{parent}, 'contextItemDelete', 'MenuEditDeleteCurrent'],
+ [$self->{parent}, 'contextNewWindow', 'MenuNewWindow'],
+ );
+ }
+ foreach (@updateList)
+ {
+ $menu->updateItem($_->[0]->{$_->[1]}, $_->[2]);
+ }
+ }
+
+}
+
+{
+ package GCTextList;
+
+ use Gtk2::SimpleList;
+ use GCUtils;
+ use base 'GCBaseTextList';
+
+ sub new
+ {
+ my ($proto, $parent, $title) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent);
+ bless ($self, $class);
+
+ $self->{titleField} = $parent->{model}->{commonFields}->{title};
+ $self->{idxColumn} = 1;
+ $self->{orderSet} = 0;
+
+ $self->set_policy ('automatic', 'automatic');
+ $self->set_shadow_type('none');
+
+ my $columnType = ($parent->{model}->{fieldsInfo}->{$self->{titleField}}->{type} eq 'number') ?
+ 'Glib::Int' :
+ 'Glib::String';
+ my $column = Gtk2::TreeViewColumn->new_with_attributes($title, Gtk2::CellRendererText->new,
+ 'text' => 0);
+ $column->set_resizable(1);
+ $column->set_reorderable(1);
+ $column->set_sort_column_id(0);
+ # Columns are: Title, Index, isVisible
+ $self->{model} = new Gtk2::TreeStore($columnType, 'Glib::Int', 'Glib::Boolean');
+ $self->{filter} = new Gtk2::TreeModelFilter($self->{model});
+ $self->{filter}->set_visible_column(2);
+ {
+ package GCSimpleTreeModelSort;
+ use Glib::Object::Subclass
+ Gtk2::TreeModelSort::,
+ interfaces => [ 'Gtk2::TreeDragDest' ],
+ ;
+
+ sub new
+ {
+ my ($proto, $childModel) = @_;
+ my $class = ref($proto) || $proto;
+ return Glib::Object::new ($class, model => $childModel);
+ }
+ }
+ $self->{sorter} = new GCSimpleTreeModelSort($self->{filter});
+ $self->{subModel} = $self->{filter};
+ $self->{completeModel} = $self->{sorter};
+ $self->{list} = Gtk2::TreeView->new_with_model($self->{sorter});
+ $self->{list}->append_column($column);
+ $self->{list}->set_headers_clickable(1);
+ $self->{list}->set_rules_hint(1);
+ $self->{list}->set_name('GCItemsTextList');
+ $self->{list}->get_selection->set_mode ('multiple');
+ if ($parent->{model}->{fieldsInfo}->{$self->{titleField}}->{type} ne 'number')
+ {
+ $self->{sorter}->set_sort_func(0,
+ \&sortCaseInsensitive,
+ $self);
+ }
+
+ $self->{list}->get_selection->signal_connect ('changed' => sub {
+ return if $self->{deactivateUpdate};
+ my @indexes;
+ my $nbSelected;
+ $self->{list}->get_selection->selected_foreach(sub {
+ my ($model, $path, $iter, $self) = @_;
+ push @indexes, $self->{completeModel}->get_value($iter, 1);
+ $nbSelected++;
+ }, $self);
+ return if scalar @indexes == 0;
+ $parent->display(@indexes);
+ my $iter = $self->getCurrentIter;
+ $self->{currentIterString} = $self->convertIterToString($iter);
+
+ # Update menus to reflect number of items selected
+ $self->updateMenus($nbSelected);
+ });
+
+ $self->{list}->signal_connect ('row-activated' => sub {
+ $parent->displayInWindow;
+ });
+ $self->{list}->signal_connect('button_press_event' => sub {
+ my ($widget, $event) = @_;
+ return 0 if $event->button ne 3;
+
+ # Check if row clicked on is in the current selection
+ my ($path, $column, $cell_x, $cell_y) = $widget->get_path_at_pos( $event->x, $event->y );
+ my $selection = $widget->get_selection;
+ my @rows = $selection->get_selected_rows;
+ my $clickedOnSelection = 0;
+ # Loop through selection to see if current row is selected
+ foreach my $row(@rows)
+ {
+ if ($row->to_string eq $path->to_string)
+ {
+ $clickedOnSelection = 1;
+ }
+ }
+
+ # Popup the menu
+ $self->{parent}->{context}->popup(undef, undef, undef, undef, $event->button, $event->time);
+
+ # If row clicked on was in the selection, return true, else return false to clear selection
+ # to clicked on item
+ if ($clickedOnSelection)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ });
+
+ $self->{list}->signal_connect('key-press-event' => sub {
+ my ($widget, $event) = @_;
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+ if ($key eq 'Delete')
+ {
+ $self->{parent}->deleteCurrentItem;
+ return 1;
+ }
+ return 0;
+ });
+
+ $self->add($self->{list});
+ $self->show_all;
+ $self->{currentIdx} = 0;
+
+ return $self;
+ }
+
+ sub savePreferences
+ {
+ my ($self, $preferences) = @_;
+ return if !$self->{orderSet};
+ my ($fieldId, $order) = $self->{sorter}->get_sort_column_id;
+ $preferences->sortField($self->{titleField});
+ $preferences->sortOrder(($order eq 'ascending') ? 1 : 0);
+ }
+
+ sub couldExpandAll
+ {
+ my $self = shift;
+
+ return 0;
+ }
+
+ sub convertIterToIdx
+ {
+ my ($self, $iter) = @_;
+ return 0 if ! $iter;
+ return $self->{completeModel}->get_value($iter, 1)
+ }
+
+ sub getCurrentIdx
+ {
+ my $self = shift;
+ my $currentIter = $self->getCurrentIter;
+ return $self->{completeModel}->get_value(
+ $self->getCurrentIter, 1
+ )
+ if $currentIter;
+ return 0;
+ }
+
+ sub isUsingDate
+ {
+ my ($self) = @_;
+ return 0;
+ }
+
+ sub setSortOrder
+ {
+ my ($self, $order, $splash, $willFilter) = @_;
+ $self->{orderSet} = 1;
+ my $progressNeeded = ($splash && !$willFilter);
+ my $step;
+ if ($progressNeeded)
+ {
+ $step = GCUtils::round($self->{count} / 7);
+ $splash->setProgressForItemsSort(2*$step);
+ }
+ $self->{sorter}->set_sort_column_id(0,
+ $self->{preferences}->sortOrder ? 'ascending' : 'descending');
+ $self->{sorter}->set_default_sort_func(undef, undef);
+ $splash->setProgressForItemsSort(4*$step) if $progressNeeded;
+ }
+
+ sub sortCaseInsensitive
+ {
+ my ($childModel, $iter1, $iter2, $self) = @_;
+
+ if ($self->{deactivateSortCache})
+ {
+ my $val1 = uc($childModel->get_value($iter1, 0));
+ my $val2 = uc($childModel->get_value($iter2, 0));
+ # Use a natural string sort method
+ return (GCUtils::gccmp($val1, $val2));
+ }
+ else
+ {
+ my $idx1 = $childModel->get_value($iter1, 1);
+ my $idx2 = $childModel->get_value($iter2, 1);
+ my $val1 = uc($childModel->get_value($iter1, 0));
+ my $val2 = uc($childModel->get_value($iter2, 0));
+ # Use a natural string sort method
+ return (GCUtils::gccmp($val1, $val2));
+ }
+ }
+
+ sub testIter
+ {
+ my ($self, $filter, $items, $iter) = @_;
+ my $idx = ($self->{model}->get($iter))[1];
+ my $displayed;
+ if (defined $self->{testCache}->[$idx])
+ {
+ $displayed = $self->{testCache}->[$idx];
+ }
+ else
+ {
+ $displayed = $self->{testCache}->[$idx] = $filter->test($items->[$idx]);
+ # We increment only here to count only unique items
+ $self->{count}++ if $displayed;
+ }
+ $self->{model}->set($iter,
+ 2,
+ $displayed
+ );
+ return $displayed;
+ }
+
+ sub setFilter
+ {
+ my ($self, $filter, $items, $refresh, $splash) = @_;
+ $self->{count} = 0;
+ $self->{testCache} = [];
+ $self->{tester} = $filter;
+ my $iter = $self->{model}->get_iter_first;
+ my $idx = 0;
+ $self->{model}->foreach(sub {
+ $splash->setProgressForItemsSort($idx++) if $splash;
+ my ($model, $path, $iter) = @_;
+ GCTextList::testIter($self, $filter, $items, $iter);
+ return 0;
+ });
+ $self->{filter}->refilter;
+
+ my $currentIter = $self->getCurrentIter;
+ return $self->{completeModel}->get_value($currentIter, 1)
+ if $currentIter;
+ if ($self->{completeModel}->get_iter_first)
+ {
+ my $idx = $self->{completeModel}->get_value($self->{completeModel}->get_iter_first, 1);
+ $self->select($idx);
+ return $idx;
+ }
+ else
+ {
+ return 0;
+ }
+
+ }
+
+ sub clearCache
+ {
+ my $self = shift;
+ }
+
+ sub reset
+ {
+ my $self = shift;
+ $self->{list}->set_model(undef);
+ $self->{model}->clear;
+ $self->{currentIdx} = 0;
+ $self->{nextItemIdx} = -1;
+ }
+
+ sub done
+ {
+ my $self = shift;
+ $self->{list}->set_model($self->{sorter});
+ }
+
+ sub getNextIter
+ {
+ my ($self, $viewedIter) = @_;
+ my $nextIter = $self->{completeModel}->iter_next($viewedIter);
+ # If we removed the last one, we are using the previous one.
+ $nextIter = $self->{completeModel}->iter_nth_child(undef, $self->{count} - 1)
+ if !$nextIter && ($self->{count} > 0);
+ my $newIdx = 0;
+ if ($nextIter)
+ {
+ $newIdx = $self->{completeModel}->get_value($nextIter, 1);
+ #$self->selectIter($nextIter);
+ }
+ return ($nextIter, $newIdx);
+ }
+
+ sub addItem
+ {
+ my ($self, $info, $immediate) = @_;
+ $self->{nextItemIdx}++;
+ $self->{count}++;
+ my @data = (
+ 0 => $self->{parent}->transformTitle($info->{$self->{titleField}}),
+ 1 => $self->{nextItemIdx},
+ 2 => 1
+ );
+ $self->{model}->set($self->{model}->append(undef), @data);
+ }
+
+ sub removeFromModel
+ {
+ my ($self, $iter) = @_;
+ $self->{model}->remove($iter);
+ }
+
+ sub removeItem
+ {
+ my ($self, $number) = @_;
+ splice @{$self->{testCache}}, $number, 1;
+ #Shift backward all following items.
+ $self->{model}->foreach(sub {
+ my ($model, $path, $iter) = @_;
+ my $currentIdx = $model->get_value($iter,1);
+ if ($currentIdx >= $number)
+ {
+ $model->set($iter, 1, $currentIdx - 1)
+ if $currentIdx != $number;
+ }
+ return 0;
+ });
+
+ $self->{count}--;
+ $self->{nextItemIdx}--;
+ my $viewedCurrentIter = $self->getCurrentIter;
+ my $currentIter = $self->convertIterToChildIter($viewedCurrentIter);
+ my $newIdx = $self->selectNextIter($viewedCurrentIter);
+ $self->{model}->remove($currentIter);
+ return $newIdx;
+ }
+
+ sub select
+ {
+ my ($self, $idx, $init) = @_;
+ if ($idx == -1)
+ {
+ $self->{currentIterString} = '0';
+ my $currentIter = $self->{completeModel}->get_iter_first;
+ if (!$currentIter)
+ {
+ $idx = 0;
+ return;
+ }
+ $idx = $self->{completeModel}->get_value($currentIter, 1);
+ $self->selectIter($currentIter);
+ }
+ else
+ {
+ $self->{currentIterString} = '0' if ! $self->{currentIterString};
+ $self->{completeModel}->foreach(sub {
+ my ($model, $path, $iter) = @_;
+ if ($model->get_value($iter, 1) == $idx)
+ {
+ $self->{currentIterString} = $model->get_path($iter)->to_string;
+ $self->selectIter($iter);
+ return 1;
+ }
+ return 0;
+ });
+ }
+ return $idx;
+ }
+
+ sub showCurrent
+ {
+ my $self = shift;
+
+ my $path = $self->{list}->get_selection->get_selected_rows;
+ $self->{list}->scroll_to_cell($path) if $path;
+ }
+
+ sub changeCurrent
+ {
+ my ($self, $previous, $new, $idx, $wantSelect) = @_;
+ my $selected = $self->getCurrentIterFromString;;
+ return if ! $selected;
+ my $currentIter = $self->convertIterToChildIter($selected);
+ my $newValue = $self->{parent}->transformTitle($new->{$self->{titleField}});
+ my $newIdx = $idx;
+ my $visible = $self->{tester} ? $self->{tester}->test($new) : 1;
+
+ if (!$visible)
+ {
+ my $nextIter;
+ ($nextIter, $newIdx) = $self->getNextIter($selected);
+ $self->selectIter($nextIter, 1) if $nextIter && $wantSelect;
+ $self->{count}--;
+ }
+ $self->{model}->set($currentIter, 0, $newValue);
+ # Update the isVisible field
+ $self->{model}->set($currentIter, 2, $visible);
+
+ my $iter = $self->getCurrentIter;
+ $self->{currentIterString} = $self->convertIterToString($iter);
+ return $newIdx;
+ }
+
+}
+
+{
+ package GCDetailedList;
+
+ use File::Basename;
+ use base 'GCBaseTextList';
+ use GCUtils;
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent);
+ bless ($self, $class);
+
+ $self->{multi} = 1;
+ $self->{orderSet} = 0;
+ $self->{groupItems} = 0;
+ $self->{isUsingDate} = 0;
+ $self->{titleField} = $parent->{model}->{commonFields}->{title};
+
+ $self->{imgWidth} = 60;
+ $self->{imgHeight} = 80;
+
+ # Setting default options if they don't exist
+ $self->{preferences}->detailImgSize(2) if ! $self->{preferences}->exists('detailImgSize');
+ $self->{preferences}->details($self->{titleField})
+ if ! $self->{preferences}->details;
+ $self->{preferences}->groupedFirst(1)
+ if ! $self->{preferences}->exists('groupedFirst');
+ $self->{preferences}->addCount(0)
+ if ! $self->{preferences}->exists('addCount');
+
+ # Image size
+ my $size = $self->{preferences}->detailImgSize;
+ $self->{factor} = ($size == 0) ? 0.5
+ : ($size == 1) ? 0.8
+ : ($size == 3) ? 1.5
+ : ($size == 4) ? 2
+ : 1;
+ $self->{imgWidth} *= $self->{factor};
+ $self->{imgHeight} *= $self->{factor};
+
+ $self->clearCache;
+
+ $self->set_policy ('automatic', 'automatic');
+ $self->set_shadow_type('none');
+
+ my @tmpArray = split m/\|/, $self->{preferences}->details;
+ $self->{fieldsArray} = \@tmpArray;
+
+ $self->{imageIndex} = -1;
+ my @columnsType;
+ $self->{columnsArray} = [];
+ $self->{columns} = {};
+ my $col = 0;
+
+ $self->{borrowerField} = $parent->{model}->{commonFields}->{borrower}->{name};
+
+ $self->setGroupingInformation;
+ # We don't need count if not grouped
+ $self->{addCount} = $self->{groupItems} && $self->{preferences}->addCount;
+
+ $self->{secondaryField} = $self->{preferences}->secondarySort;
+ $self->{secondaryIndex} = -1;
+ $self->{addSecondary} = 0;
+
+ foreach my $field(@tmpArray)
+ {
+ my $title = $parent->{model}->{fieldsInfo}->{$field}->{displayed};
+
+ my $renderer;
+ my $attribute;
+ if ($parent->{model}->{fieldsInfo}->{$field}->{type} eq 'image')
+ {
+ push @columnsType, 'Gtk2::Gdk::Pixbuf';
+ $renderer = Gtk2::CellRendererPixbuf->new;
+ $attribute = 'pixbuf';
+ $self->{imageIndex} = $col;
+ }
+ elsif ($parent->{model}->{fieldsInfo}->{$field}->{type} eq 'yesno')
+ {
+ push @columnsType, 'Glib::Boolean';
+ $renderer = Gtk2::CellRendererToggle->new;
+ $attribute = 'active';
+ }
+ elsif ($parent->{model}->{fieldsInfo}->{$field}->{type} eq 'number')
+ {
+ push @columnsType, 'Glib::Double';
+ $renderer = Gtk2::CellRendererText->new;
+ $attribute = 'text';
+ }
+ else
+ {
+ $self->{isUsingDate} = 1
+ if $parent->{model}->{fieldsInfo}->{$field}->{type} eq 'date';
+ push @columnsType, 'Glib::String';
+ $renderer = Gtk2::CellRendererText->new;
+ $attribute = 'text';
+ }
+ $self->{secondaryIndex} = $col if $field eq $self->{secondaryField};
+ $self->{columns}->{$field} = Gtk2::TreeViewColumn->new_with_attributes($title, $renderer,
+ ($attribute) ? ($attribute => $col) : ());
+ if ($parent->{model}->{fieldsInfo}->{$field}->{type} eq 'number')
+ {
+ $self->{columns}->{$field}->set_cell_data_func($renderer, sub {
+ my ($column, $cell, $model, $iter, $colNum) = @_;
+ my $value = $model->get_value($iter, $colNum);
+ # TODO - not returning correct value when first column is a number
+ # and a grouping field is set.
+ # Remove trailing 0
+ $value =~ s/\.[0-9]*?0+$//;
+ $cell->set_property('text', $value);
+ }, $col);
+ }
+
+ # We store the field name in it to ease the save of the column order in preferences
+ $self->{columns}->{$field}->{field} = $field;
+ $self->{columns}->{$field}->set_resizable(1);
+ $self->{columns}->{$field}->set_reorderable(1);
+ if ($parent->{model}->{fieldsInfo}->{$field}->{type} eq 'image')
+ {
+ $self->{columns}->{$field}->set_clickable(0);
+ }
+ else
+ {
+ $self->{columns}->{$field}->set_sort_column_id($col);
+ }
+ push @{$self->{columnsArray}}, $self->{columns}->{$field};
+ $self->{fieldToId}->{$field} = $col;
+ $col++;
+ }
+ push @columnsType, 'Glib::Int';
+ $self->{idxColumn} = $col;
+ push @columnsType, 'Glib::Boolean';
+ $self->{visibleCol} = ++$col;
+
+ # There is a secondary field for sort, but we didn't add it yet
+ if ($self->{secondaryField} && ($self->{secondaryIndex} == -1))
+ {
+ push @columnsType, 'Glib::String';
+ $self->{addSecondary} = 1;
+ $self->{secondaryIndex} = ++$col;
+ }
+
+ $self->{model} = new Gtk2::TreeStore(@columnsType);
+ {
+ package GCTreeModelSort;
+ use Glib::Object::Subclass
+ Gtk2::TreeModelSort::,
+ interfaces => [ Gtk2::TreeDragDest:: ],
+ ;
+
+ sub new
+ {
+ my ($proto, $childModel) = @_;
+ my $class = ref($proto) || $proto;
+ return Glib::Object::new ($class, model => $childModel);
+ }
+ }
+
+ $self->{filter} = new Gtk2::TreeModelFilter($self->{model});
+ $self->{sorter} = new GCTreeModelSort($self->{filter});
+
+ $self->{filter}->set_visible_column($self->{visibleCol});
+
+ $self->{subModel} = $self->{filter};
+ $self->{completeModel} = $self->{sorter};
+
+ $self->{list} = Gtk2::TreeView->new_with_model($self->{completeModel});
+ $self->{list}->append_column($_) foreach (@{$self->{columnsArray}});
+
+ $self->{list}->set_name('GCItemsDetailsList');
+ $self->{list}->set_headers_clickable(1);
+ $self->{list}->set_rules_hint(1);
+ $self->{list}->set_reorderable(1);
+
+ # Restore size of columns
+ if ($self->{preferences}->exists('columnsWidths'))
+ {
+ my $i = 0;
+ my @widths = split /\|/, $self->{preferences}->columnsWidths;
+ #/ For syntax highlighting
+ foreach (@{$self->{columnsArray}})
+ {
+ $_->set_sizing('fixed');
+ $_->set_resizable(1);
+ $_->set_fixed_width($widths[$i] || 70);
+ $i++;
+ }
+ }
+
+ # Use grouping field for generated masters, or if that field isn't displayed,
+ # fallback on title, or first column
+ if (exists $self->{columns}->{$self->{collectionField}})
+ {
+ $self->{generatedField} = $self->{collectionField};
+ }
+ elsif (exists $self->{columns}->{$self->{titleField}})
+ {
+ $self->{generatedField} = $self->{titleField};
+ }
+ else
+ {
+ $self->{generatedField} = $tmpArray[0];
+ }
+ $self->{generatedIndex} = $self->{fieldToId}->{$self->{generatedField}};
+ $self->{list}->set_expander_column($self->{columns}->{$self->{generatedField}});
+
+ if (exists $self->{columns}->{$self->{titleField}})
+ {
+ $self->{searchField} = $self->{titleField};
+ }
+ else
+ {
+ $self->{searchField} = $tmpArray[0];
+ }
+ $self->{searchIndex} = $self->{fieldToId}->{$self->{searchField}};
+ $self->{list}->set_search_column($self->{searchIndex});
+
+ $self->{sorter}->signal_connect('rows-reordered' => sub {
+ my ($fieldId, $order) = $self->{sorter}->get_sort_column_id;
+ $self->{list}->set_search_column($fieldId);
+ });
+
+ # Initializing sort methods
+ my $colIdx = 0;
+ #my $secondarySort = 1;
+ my $sorttype = "";
+ foreach my $field(@tmpArray)
+ {
+ my ($secondaryIndex, $secondaryField) = ($self->{secondaryIndex}==-1)
+ ? ($colIdx, $field)
+ : ($self->{secondaryIndex}, $self->{secondaryField});
+ my $data = [$self, $colIdx, $secondaryIndex];
+ foreach my $sorter($field, $secondaryField)
+ {
+ next if !$sorter;
+ # Work out how to sort the column
+ if ((!exists $self->{columns}->{$self->{collectionField}}) &&
+ ($self->{groupItems}) &&
+ ($sorter eq $self->{generatedField}))
+ {
+ # The grouping field isn't visible, so we need to set
+ # the sort order on the column we're using for the group
+ # headers to be sorted using the grouping field type
+ if (($parent->{model}->{fieldsInfo}->{$self->{collectionField}}->{type} eq 'date') ||
+ ($parent->{model}->{fieldsInfo}->{$self->{collectionField}}->{sorttype} eq 'date'))
+ {
+ $sorttype = "date";
+ }
+ elsif (($parent->{model}->{fieldsInfo}->{$self->{collectionField}}->{type} eq 'number') ||
+ ($parent->{model}->{fieldsInfo}->{$self->{collectionField}}->{sorttype} eq 'number'))
+ {
+ $sorttype = "number";
+ }
+ else
+ {
+ $sorttype = "text";
+ }
+ }
+ elsif (($parent->{model}->{fieldsInfo}->{$sorter}->{type} eq 'number') ||
+ ($parent->{model}->{fieldsInfo}->{$sorter}->{sorttype} eq 'number'))
+ {
+ $sorttype = "number";
+ }
+ elsif (($parent->{model}->{fieldsInfo}->{$sorter}->{type} eq 'date') ||
+ ($parent->{model}->{fieldsInfo}->{$sorter}->{sorttype} eq 'date'))
+ {
+ $sorttype = "date";
+ }
+ else
+ {
+ $sorttype = "text";
+ }
+
+ # Set the column for the desired type of sorting
+ if ($sorttype eq "number")
+ {
+ # Small trick to convert number as follows with a letter
+ # in front of them so cmp will work as expected
+ # e.g.: 3 -> b3; 42 -> c42; 56 -> c56; 5897446 -> h5897446
+ # This could not work if your system uses a character encoding
+ # which is not contiguous as EBCDIC
+ push @$data, sub {return chr(length($_[0]*1000)+ord('a')).($_[0]*1000)};
+ }
+ elsif ($sorttype eq "date")
+ {
+ push @$data, \&GCPreProcess::reverseDate;
+ }
+ else
+ {
+ #push @$data, \&uc;
+ push @$data, sub {return uc $_[0]};
+ }
+ }
+ if ($self->{groupItems} && ($self->{preferences}->groupedFirst))
+ {
+ $self->{sorter}->set_sort_func($colIdx,
+ \&sortWithParentFirst,
+ $data);
+ }
+ else
+ {
+ $self->{sorter}->set_sort_func($colIdx,
+ \&sortAll,
+ $data);
+ }
+ $colIdx++;
+ }
+ $self->{list}->get_selection->set_mode ('multiple');
+
+ $self->{list}->get_selection->signal_connect('changed' => \&onSelectionChanged,
+ $self);
+
+# $self->{list}->get_selection->set_select_function(sub {
+# my ($selection, $model, $path) = @_;
+# return !$model->iter_has_child($model->get_iter($path));
+# });
+
+ $self->{list}->signal_connect ('row-activated' => sub {
+ $parent->displayInWindow;
+ });
+
+ $self->add($self->{list});
+
+ $self->{list}->signal_connect('button_press_event' => sub {
+ my ($widget, $event) = @_;
+ return 0 if $event->button ne 3;
+
+ # Check if row clicked on is in the current selection
+ my ($path, $column, $cell_x, $cell_y) = $widget->get_path_at_pos( $event->x, $event->y );
+ my $selection = $widget->get_selection;
+ my @rows = $selection->get_selected_rows;
+ my $clickedOnSelection = 0;
+ # Loop through selection to see if current row is selected
+ foreach my $row(@rows)
+ {
+ if ($row->to_string eq $path->to_string)
+ {
+ $clickedOnSelection = 1;
+ }
+ }
+
+ # Popup the menu
+ $self->{parent}->{context}->popup(undef, undef, undef, undef, $event->button, $event->time);
+
+ # If row clicked on was in the selection, return true, else return false to clear selection
+ # to clicked on item
+ if ($clickedOnSelection)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ });
+
+ $self->{list}->signal_connect('key-press-event' => sub {
+ my ($treeview, $event) = @_;
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+ if ($key eq 'Delete')
+ {
+ return 1 if !$self->{count};
+ return 1 if !$self->getCurrentIter;
+ return 1 if $self->{completeModel}->iter_has_child(
+ $self->getCurrentIter
+ );
+ $self->{parent}->deleteCurrentItem;
+ return 1;
+ }
+ return 0;
+ });
+
+ if ($self->{groupItems})
+ {
+ my $targetEntryMove = {
+ target => 'MY_ROW_TARGET',
+ flags => ['same-widget'],
+ info => 42,
+ };
+
+ $self->{list}->enable_model_drag_source('button1-mask','move', $targetEntryMove);
+ $self->{list}->enable_model_drag_dest('move', $targetEntryMove);
+
+ $self->{list}->signal_connect('drag_data_get' => sub {
+ return 1;
+ });
+
+ $self->{list}->signal_connect('drag_data_received' => \&dropHandler, $self);
+ }
+ else
+ {
+ $self->{list}->unset_rows_drag_dest;
+ $self->{list}->unset_rows_drag_source;
+ }
+
+ $self->reset;
+
+ $self->show_all;
+ return $self;
+ }
+
+ sub destroy
+ {
+ my $self = shift;
+ # Unlock panel if we locked it when displaying a category
+ $self->{parent}->{panel}->lock(0);
+ $self->SUPER::destroy;
+ }
+
+ sub onSelectionChanged
+ {
+ my ($selection, $self) = @_;
+ return if $self->{deactivateUpdate};
+ my @indexes;
+ my $nbSelected;
+ $self->{list}->get_selection->selected_foreach(sub {
+ my ($model, $path, $iter, $self) = @_;
+ push @indexes, $self->convertIterToIdx($iter);
+ $nbSelected++;
+ }, $self);
+ return if scalar @indexes == 0;
+ my $iter = $self->getCurrentIter;
+ $self->{selectedIterString} = $self->convertIterToString($iter);
+ $self->{currentRemoved} = 0;
+ $self->{parent}->display(@indexes);
+ $self->{currentIterString} = $self->{selectedIterString}
+ if !$self->{currentRemoved};
+ $self->checkLock;
+
+ # Update menu items to reflect number of items selected
+ $self->updateMenus($nbSelected);
+
+ }
+
+ sub savePreferences
+ {
+ my ($self, $preferences) = @_;
+
+ # Save the columns order and their sizes as pipe separated lists
+ my $details = '';
+ my $widths = '';
+ foreach my $col($self->{list}->get_columns)
+ {
+ $details .= $col->{field}.'|';
+ $widths .= $col->get_width.'|';
+ }
+ $preferences->details($details);
+ $preferences->columnsWidths($widths);
+
+ # We return here if the order has not been set previously
+ return if !$self->{orderSet};
+ my ($fieldId, $order) = $self->{sorter}->get_sort_column_id;
+ $preferences->sortField($self->{fieldsArray}->[$fieldId]);
+ $preferences->sortOrder(($order eq 'ascending') ? 1 : 0);
+
+ }
+
+ sub couldExpandAll
+ {
+ my $self = shift;
+
+ return 1;
+ }
+
+ sub expandAll
+ {
+ my $self = shift;
+
+ $self->{list}->expand_all;
+ }
+
+ sub collapseAll
+ {
+ my $self = shift;
+
+ $self->{list}->collapse_all;
+ }
+
+ sub setGroupingInformation
+ {
+ my $self = shift;
+ $self->{collectionField} = $self->{preferences}->groupBy;
+ $self->{groupItems} = ($self->{collectionField} ne '');
+ }
+
+ sub sortAll
+ {
+ my ($childModel, @iter, $data);
+ ($childModel, $iter[0], $iter[1], $data) = @_;
+ my ($self, $colId1, $colId2, $converter1, $converter2) = @$data;
+
+ my @val;
+ my $colId;
+ my $converter;
+ foreach my $i(0..1)
+ {
+ ($colId, $converter) = ($childModel->iter_parent($iter[$i]))
+ ? ($colId2, $converter2)
+ : ($colId1, $converter1);
+ push @val, $converter->($childModel->get_value($iter[$i], $colId));
+ }
+ return (GCUtils::gccmp($val[0], $val[1]));
+ }
+
+ sub sortWithParentFirst
+ {
+ my ($childModel, $iter1, $iter2, $data) = @_;
+ my ($self, $colId1, $colId2, $converter1, $converter2) = @$data;
+
+ my $hasChildren1 = $childModel->iter_has_child($iter1);
+ my $hasChildren2 = $childModel->iter_has_child($iter2);
+
+ my $colId;
+ my $converter;
+ if ($hasChildren1 == $hasChildren2)
+ {
+ ($colId, $converter) = ($childModel->iter_parent($iter1))
+ ? ($colId2, $converter2)
+ : ($colId1, $converter1);
+
+ # FIXME If we don't copy the value first, it will crash on win32 systems
+ # with an iterator not matching model
+ my $val1 = $converter->($childModel->get_value($iter1, $colId));
+ my $val2 = $converter->($childModel->get_value($iter2, $colId));
+ return (GCUtils::gccmp($val1, $val2));
+ }
+ else
+ {
+ return ($hasChildren1 ? -1 : 1);
+ }
+ }
+
+ sub dropHandler
+ {
+ my ($treeview, $context, $widget_x, $widget_y, $data, $info, $time, $self) = @_;
+ my $source = $context->get_source_widget;
+ return if ($source ne $treeview);
+ my $model = $treeview->get_model;
+ my ($targetPath, $targetPos) = $treeview->get_dest_row_at_pos($widget_x, $widget_y);
+ if ($targetPath)
+ {
+ my $targetIter = $model->get_iter($targetPath);
+ #my $origIter = $treeview->get_selection->get_selected;
+
+ # Deactivate DnD for multiple selection
+ my @rows = $self->{list}->get_selection->get_selected_rows;
+ if (scalar(@rows) > 1)
+ {
+ $context->finish(1,0,$time);
+ return;
+ }
+
+ my $origIter = $self->getCurrentIter;
+ if ($model->iter_has_child($origIter)) # We can't move a master
+ {
+ $context->finish(1,0,$time);
+ return;
+ }
+
+ my $origIdx = $self->convertIterToIdx($origIter);
+ my $origCollection = '';
+ my $origParentIter = $model->iter_parent($origIter);
+ my ($origParentPath, $origParentChildIter);
+ if ($origParentIter)
+ {
+ $origParentChildIter = $self->convertIterToChildIter($origParentIter);
+ $origParentPath = $self->{model}->get_path($origParentChildIter)
+ if ($self->{addCount});
+ }
+ $origCollection = $self->getIterCollection($origParentChildIter)
+ if $origParentChildIter;
+ #We cannot drop an item on itself
+ if ($targetIter == $origIter)
+ {
+ $context->finish(1,0,$time);
+ return;
+ }
+ my @origData;
+ my $i = 0;
+ foreach ($model->get_value($origIter))
+ {
+ push @origData, $i, $_;
+ $i++;
+ }
+ my $collectionIter = $model->iter_parent($targetIter);
+ #if ($collectionIter)
+ my $collection = $collectionIter
+ ? $self->getIterCollection($self->convertIterToChildIter($collectionIter))
+ : $self->getIterCollection($self->convertIterToChildIter($targetIter));
+
+ my $newIter;
+ my $refreshCountNeeded = 0;
+ if ($targetPos =~ /^into/)
+ {
+ if (
+ (!$model->iter_has_child($targetIter)) # We can't drop on a single item
+ || ($targetPath->get_depth > 1) # We can't add an item to an item in a collection.
+ || ($model->iter_has_child($origIter)) # We can't move a master
+ )
+ {
+ $context->finish(1,0,$time);
+ return;
+ }
+ else
+ {
+ #Creating a new collection item
+ $newIter = $self->{model}->append($self->convertIterToChildIter($targetIter));
+ $refreshCountNeeded = 1;
+ }
+ }
+ else
+ {
+ my $origPath = $model->get_path($origIter);
+ if ($targetPath->get_depth == 1)
+ {
+ if ($origPath->get_depth == 1)
+ {
+ #Just moving a master item is not allowed
+ $context->finish(1,0,$time);
+ return;
+ }
+ else
+ {
+ #We get an item out of a collection
+ $newIter = $self->{model}->append(undef);
+ $collection = '';
+ }
+ }
+ else
+ {
+ #We are placing a collection item
+ $newIter = $self->{model}->append(
+ $self->convertIterToChildIter($model->iter_parent($targetIter))
+ );
+ $refreshCountNeeded = 1;
+ }
+ }
+
+ $self->{model}->set($newIter, @origData);
+ if ($self->{addCount})
+ {
+ # Refreshing target
+ $self->refreshCount($self->{model}->iter_parent($newIter))
+ if ($refreshCountNeeded);
+
+ # Refreshing origin
+ # We remove 1 to the count because the original has not been removed yet
+ # It will be removed when returning from this method
+ $self->refreshCount($self->{model}->get_iter($origParentPath), 0, -1)
+ if $origParentPath;
+ }
+ #$origIter = $treeview->get_selection->get_selected;
+ $origIter = $self->getCurrentIter;
+ #$self->removeParentIfNeeded($origIter);
+
+ # Removing previous instances in other collections
+ $self->removeOtherInstances($origCollection, $origIdx);
+
+ $self->{parent}->{items}->setValue($origIdx, $self->{collectionField}, $collection);
+ $context->finish(1,1,$time);
+ $self->select($origIdx);
+ $self->{parent}->markAsUpdated;
+ }
+ }
+
+ sub removeOtherInstances
+ {
+ my ($self, $collection, $idx, $fullCollection) = @_;
+ if ($collection)
+ {
+ my $collectionArray =
+ $self->transformValue(
+ $fullCollection || $self->{parent}->{items}->getValue($idx, $self->{collectionField}),
+ $self->{collectionField},
+ 0,
+ $self->{groupItems}
+ );
+ if (ref($collectionArray) eq 'ARRAY')
+ {
+ foreach (@$collectionArray)
+ {
+ next if $_ eq $collection;
+ $self->removeInCollection($_, $idx);
+ }
+ }
+
+ }
+ }
+
+ sub removeParentIfNeeded
+ {
+ my ($self, $iter) = @_;
+ #Destroy the previous auto-generated item if there was only one child
+ my $parentIter = $self->{model}->iter_parent($self->convertIterToChildIter($iter));
+ if ($parentIter && ($self->{model}->iter_n_children($parentIter) <= 1))
+ {
+ $self->{model}->remove($parentIter);
+ }
+ }
+
+ sub removeFromModel
+ {
+ my ($self, $iter) = @_;
+ my $parentToRemove = undef;
+
+ my $parentIter = $self->{model}->iter_parent($iter);
+ my $refreshCountNeeded = 0;
+ if ($parentIter)
+ {
+ if ($self->{model}->iter_n_children($parentIter) <= 1)
+ {
+ $parentToRemove = $parentIter;
+ }
+ else
+ {
+ # If we removed the 1st one, we should change the index of the master
+ # to be the new 1st
+ my $removedIdx = $self->convertChildIterToIdx($iter);
+ my $firstIdx = $self->convertChildIterToIdx($self->{model}->iter_children($parentIter));
+ if ($firstIdx == $removedIdx)
+ {
+ my $newIdx = $self->convertChildIterToIdx($self->{model}->iter_nth_child($parentIter, 1));
+ $self->{model}->set($parentIter, $self->{idxColumn}, $newIdx);
+ }
+ }
+ # Update count if needed
+ if (($self->{addCount})
+ && ($self->{model}->get($iter, $self->{visibleCol}))
+ && ($self->{model}->get($parentIter, $self->{visibleCol})))
+ {
+ $refreshCountNeeded = 1;
+ }
+
+ }
+
+ $self->{model}->remove($iter);
+ $self->refreshCount($parentIter) if $refreshCountNeeded;
+ $self->{model}->remove($parentToRemove) if $parentToRemove;
+ }
+
+ sub isUsingDate
+ {
+ my ($self) = @_;
+ return $self->{isUsingDate};
+ }
+
+ sub setSortOrder
+ {
+ my ($self, $order, $splash, $willFilter) = @_;
+ $self->{orderSet} = 1;
+ my $progressNeeded = ($splash && !$willFilter);
+ my ($realOrder, $field) = ($self->{preferences}->sortOrder, $self->{preferences}->sortField);
+ my $step;
+ if ($progressNeeded)
+ {
+ $step = GCUtils::round($self->{count} / 7);
+ $splash->setProgressForItemsSort(2*$step);
+ }
+ $self->{sorter}->set_sort_column_id($self->{fieldToId}->{$field},
+ $realOrder ? 'ascending' : 'descending');
+ $self->{list}->set_search_column($self->{fieldToId}->{$field});
+ $self->{sorter}->set_default_sort_func(undef, undef);
+ $splash->setProgressForItemsSort(4*$step) if $progressNeeded;
+ }
+
+ sub testIter
+ {
+ my ($self, $filter, $items, $iter) = @_;
+ my $idx = $self->convertChildIterToIdx($iter);
+ my $displayed;
+ if (exists $self->{testCache}->[$idx])
+ {
+ $displayed = $self->{testCache}->[$idx];
+ }
+ else
+ {
+ $displayed = $self->{testCache}->[$idx] = $filter->test($items->[$idx]);
+ # We increment only here to count only unique items
+ $self->{count}++ if $displayed;
+ }
+ $self->{model}->set($iter,
+ $self->{visibleCol},
+ $displayed
+ );
+ return $displayed;
+ }
+
+ sub setFilter
+ {
+ my ($self, $filter, $items, $refresh, $splash) = @_;
+ $self->{count} = 0;
+ $self->{testCache} = [];
+ $self->{tester} = $filter;
+ my $idx = 0;
+ my $iter = $self->{model}->get_iter_first;
+ while ($iter)
+ {
+ $splash->setProgressForItemsSort($idx++) if $splash;
+ if ($self->{model}->iter_has_child($iter))
+ {
+ my $showParent = 0;
+ my $childIter = $self->{model}->iter_children($iter);
+ while ($childIter)
+ {
+ my $displayed = GCDetailedList::testIter($self, $filter, $items, $childIter);
+ $showParent ||= $displayed;
+ $childIter = $self->{model}->iter_next($childIter);
+ }
+ $self->{model}->set($iter,
+ $self->{visibleCol},
+ $showParent
+ );
+ }
+ else
+ {
+ GCDetailedList::testIter($self, $filter, $items, $iter);
+ }
+ $iter = $self->{model}->iter_next($iter);
+ }
+ $self->{filter}->refilter;
+ $self->refreshCounts if ($self->{addCount});
+ my $currentIter = $self->getCurrentIter;
+ return $self->convertIterToIdx($currentIter)
+ if $currentIter;
+ $idx = $self->convertIterToIdx($self->{completeModel}->get_iter_first);
+ return $idx;
+ }
+
+ sub getPixbufFromCache
+ {
+ my ($self, $path) = @_;
+
+ my $realPath = GCUtils::getDisplayedImage($path,
+ $self->{parent}->{defaultImage},
+ $self->{parent}->{options}->file);
+
+ if (! $self->{cache}->{$realPath})
+ {
+ my $pixbuf;
+ eval {
+ $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($realPath);
+ };
+ $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($self->{parent}->{defaultImage})
+ if $@;
+
+ $pixbuf = GCUtils::scaleMaxPixbuf($pixbuf,
+ $self->{imgWidth},
+ $self->{imgHeight},
+ $self->{withImage});
+ $self->{cache}->{$realPath} = $pixbuf;
+ }
+ return $self->{cache}->{$realPath};
+ }
+
+ sub clearCache
+ {
+ my $self = shift;
+ $self->{cache} = {};
+ }
+
+ sub reset
+ {
+ my $self = shift;
+ $self->{list}->set_model(undef);
+ $self->{model}->clear;
+ $self->{alreadyInserted} = {};
+ $self->{currentIdx} = 0;
+ $self->{nextItemIdx} = -1;
+
+ $self->setGroupingInformation;
+ }
+
+ sub done
+ {
+ my $self = shift;
+ $self->{list}->set_model($self->{completeModel});
+ $self->refreshCounts if ($self->{addCount});
+ }
+
+ sub refreshCount
+ {
+ my ($self, $iter, $added, $offset) = @_;
+
+ my $subIter = $self->{subModel}->convert_child_iter_to_iter($iter);
+ my $nbChildren = $subIter
+ ? $self->{subModel}->iter_n_children($subIter)
+ : ($added ? 1 : 0);
+ $nbChildren += $offset if defined $offset;
+ # Version below still works if the orders of filter and sorter are inverted
+ #my $nbChildren = 0;
+ #my $childIter = $self->{model}->iter_children($iter);
+ #while ($childIter)
+ #{
+ # $nbChildren++ if $self->{model}->get($childIter, $self->{visibleCol});
+ # $childIter = $self->{model}->iter_next($childIter);
+ #}
+ my $original = $self->getIterCollection($iter);
+ my $generated = "$original ($nbChildren)";
+ $self->{model}->set($iter,
+ $self->{fieldToId}->{$self->{generatedField}},
+ $generated);
+ $self->{originalValue}->{$generated} = $original;
+ $self->{model}->set($iter, $self->{visibleCol}, $nbChildren);
+ }
+
+ sub refreshCounts
+ {
+ my $self = shift;
+ $self->{model}->foreach(sub {
+ my ($model, $path, $iter) = @_;
+ if ($model->iter_has_child($iter))
+ {
+ $self->refreshCount($iter);
+ }
+ return 0;
+ });
+ }
+
+ sub transformValue
+ {
+ my ($self, $value, $field, $isGeneratedMaster, $multiAllowed, $isForSort, $forceArray) = @_;
+
+ my $type = '';
+ $type = $self->{parent}->{model}->{fieldsInfo}->{$field}->{type}
+ if defined $self->{parent}->{model}->{fieldsInfo}->{$field}->{type};
+
+ if ($type eq 'image')
+ {
+ $value = ($isGeneratedMaster ? undef : $self->getPixbufFromCache($value));
+ }
+ else
+ {
+ $value = $self->{parent}->transformValue($value, $field, ($multiAllowed && $self->{multi}));
+ }
+ if ($isForSort)
+ {
+ if ($type eq 'date')
+ {
+ $value = GCPreProcess::reverseDate($value);
+ }
+ else
+ {
+ $value = uc $value;
+ }
+ }
+ if ($forceArray)
+ {
+ if (ref($value) ne 'ARRAY')
+ {
+ my @array = ($value);
+ $value = \@array;
+ }
+ }
+ return $value;
+ }
+
+ sub convertChildPathToPath
+ {
+ my ($self, $path) = @_;
+
+ my $result = $path;
+ $result = $self->{subModel}->convert_child_path_to_path($result);
+ $result = $self->{completeModel}->convert_child_path_to_path($result)
+ if $result;
+ return $result;
+ }
+
+ sub getIterCollection
+ {
+ my ($self, $iter, $model) = @_;
+ $model ||= $self->{model};
+ my $val = ($model->get($iter))[$self->{generatedIndex}];
+ if ($self->{addCount} && ($val =~ / \(\d+\)$/))
+ {
+ $val = $self->{originalValue}->{$val}
+ if exists $self->{originalValue}->{$val};
+ }
+ return $val;
+ }
+
+ # This one should be called with a sorted/filtered iterator
+ sub convertIterToIdx
+ {
+ my ($self, $iter) = @_;
+ return 0 if ! $iter;
+ # If we have a master, we return idx from its 1st displayed child
+ if ($self->{completeModel}->iter_has_child($iter))
+ {
+ $iter = $self->{completeModel}->iter_children($iter);
+ }
+ return $self->{completeModel}->get_value($iter, $self->{idxColumn});
+ }
+
+ # This one should be called with an iterator from real model
+ sub convertChildIterToIdx
+ {
+ my ($self, $iter) = @_;
+ return 0 if ! $iter;
+ return ($self->{model}->get($iter))[$self->{idxColumn}];
+ }
+
+ sub getCurrentIdx
+ {
+ my $self = shift;
+ return $self->convertIterToIdx($self->getCurrentIter);
+ }
+
+ sub findMaster
+ {
+ my ($self, $collection) = @_;
+ my $realCollection = $self->{parent}->transformTitle($collection);
+ my $master = $self->{model}->get_iter_first;
+
+ while ($master)
+ {
+ return $master if ($self->{model}->iter_has_child($master))
+ && ($self->getIterCollection($master) eq $realCollection);
+ $master = $self->{model}->iter_next($master);
+ }
+ return undef;
+ }
+
+ sub removeInCollection
+ {
+ my ($self, $collec, $idx) = @_;
+ my $master = $self->findMaster($collec);
+ my $iter = $self->{model}->iter_nth_child($master, 0) || $master;
+ while ($iter)
+ {
+ last if $idx == $self->convertChildIterToIdx($iter);
+ $iter = $self->{model}->iter_next($iter);
+ }
+ if ($iter)
+ {
+ my $removedCurrent = ($self->{selectedIterString} eq $self->{currentIterString});
+ $self->removeFromModel($iter);
+ $self->{currentRemoved} = $removedCurrent;
+ }
+ }
+
+ sub createRowsData
+ {
+ my ($self, $info, $idx, $withTest) = @_;
+ my @data;
+ my $col = 0;
+ my $displayed = 1;
+ if ($withTest)
+ {
+ $displayed = $self->{tester}->test($info)
+ if $self->{tester};
+ $self->{testCache}->[$idx] = $displayed;
+ }
+ foreach my $field(@{$self->{fieldsArray}})
+ {
+ my $value = $self->transformValue($info->{$field}, $field, $info->{isGeneratedMaster});
+ push @data, $col, $value;
+ $col++;
+ }
+ push @data, $col++, $idx;
+ push @data, $col++, $displayed;
+ push @data, $col++, $self->transformValue($info->{$self->{secondaryField}})
+ if $self->{addSecondary};
+ return @data;
+ }
+
+ sub addItem
+ {
+ my ($self, $info, $immediate) = @_;
+
+ $self->{nextItemIdx}++;
+ $self->{count}++;
+
+ my $collection = $self->transformValue($info->{$self->{collectionField}}, $self->{collectionField},
+ 0, $self->{groupItems});
+
+ #Creating data;
+ my @data = $self->createRowsData($info, $self->{nextItemIdx});
+
+ if (
+ (! defined $collection)
+ || ($collection eq '')
+ || (!$self->{groupItems})
+ || (
+ (ref($collection) eq 'ARRAY')
+ && (
+ (! scalar @$collection)
+ || ((scalar @$collection == 1) && ((! defined $collection->[0]) || $collection->[0] eq ''))
+ )
+ )
+ )
+ {
+ #Simple entry
+ $self->{model}->set($self->{model}->append(undef), @data);
+ return;
+ }
+
+ if (ref($collection) ne 'ARRAY')
+ {
+ my @array = ($collection);
+ $collection = \@array;
+ }
+ foreach (@$collection)
+ {
+ next if $_ eq '';
+ if (exists $self->{alreadyInserted}->{$_})
+ {
+ #Master already exists
+ my $master;
+ $master = $self->findMaster($_);
+ my $childIter = $self->{model}->append($master);
+ $self->{model}->set($childIter, @data);
+ }
+ else
+ {
+ #No master and we are a child;
+ #Create the master
+ my $master = $self->{model}->append(undef);
+ $self->{alreadyInserted}->{$_} = 1;
+ my $masterName = $_;
+ my %info = (
+ $self->{generatedField} => $masterName,
+ #$self->{collectionField} => $_,
+ isGeneratedMaster => 1
+ );
+ my @masterData = $self->createRowsData(\%info, -1);
+ $self->{model}->set($master, @masterData);
+ #Insert the child
+ my $childIter = $self->{model}->append($master);
+ $self->{model}->set($childIter, @data);
+ }
+ }
+ }
+
+ sub getNextIter
+ {
+ my ($self, $iter, $indexes) = @_;
+ # Return index of iter following current one in view
+ my $nextIter = $self->{completeModel}->iter_next($iter);
+ if (!$nextIter)
+ {
+ my $parentIter = $self->{completeModel}->iter_parent($iter);
+ if ($parentIter)
+ {
+ $nextIter = $self->{completeModel}->iter_next($parentIter);
+ }
+ if (!$nextIter)
+ {
+ my $nbChildren = $self->{completeModel}->iter_n_children($parentIter);
+ if ($nbChildren > 1)
+ {
+ $nextIter = $self->{completeModel}->iter_nth_child(
+ $parentIter,
+ $self->{completeModel}->iter_n_children($parentIter) - 2
+ );
+ }
+ else
+ {
+ $nextIter = $self->{completeModel}->iter_nth_child(undef, 0);
+ }
+ }
+ }
+ my $idx = $self->convertIterToIdx($nextIter);
+
+ # If the one we got is in the list of the removed ones,
+ # We don't try to get another one, but we return the 1st one
+ if (GCUtils::inArrayTest($idx, @$indexes))
+ {
+ $nextIter = $self->{completeModel}->iter_nth_child(undef, 0);
+ $idx = $self->convertIterToIdx($nextIter);
+ }
+
+ return ($nextIter, $idx);
+ }
+
+ sub select
+ {
+ my ($self, $idx, $init) = @_;
+ my $currentIter;
+ if ($idx == -1)
+ {
+ $self->{currentIterString} = '0';
+ $currentIter = $self->{completeModel}->get_iter_first;
+ }
+ else
+ {
+ $self->convertIdxToIter($idx);
+ $self->{currentIterString} = '0' if ! $self->{currentIterString};
+ $currentIter = $self->getCurrentIterFromString;
+ }
+ $idx = $self->convertIterToIdx($currentIter);
+ return if !$currentIter;
+ if ($init)
+ {
+ my $parent = $self->{completeModel}->iter_parent($currentIter);
+ if ($parent)
+ {
+ my $treePath = $self->{completeModel}->get_path($parent);
+ if (!$self->{list}->row_expanded($treePath))
+ {
+ $self->{currentIterString} = $self->convertIterToString($parent);
+ $idx = $self->getCurrentIdx;
+ }
+ }
+ if ($self->{completeModel}->iter_has_child($currentIter))
+ {
+ $currentIter = $self->{completeModel}->iter_children($currentIter);
+ $idx = $self->convertIterToIdx($currentIter);
+ $self->{currentIterString} = $self->convertIterToString($currentIter);
+ }
+ }
+ $self->{list}->expand_to_path(Gtk2::TreePath->new($self->{currentIterString}))
+ if $self->{currentIterString} =~ /:/;
+ #Lock panel if we are on a master
+ $self->checkLock($currentIter);
+ if ($self->{list}->get_model)
+ {
+ $self->selectIter($currentIter);
+ }
+ return $idx;
+ }
+
+ sub checkLock
+ {
+ my ($self, $iter) = @_;
+ $iter = $self->getCurrentIter if !$iter;
+ if ($self->{completeModel}->iter_n_children($iter) > 0)
+ {
+ $self->{parent}->{panel}->lock(1);
+ }
+ else
+ {
+ $self->{parent}->{panel}->lock(0);
+ }
+ }
+
+ sub showCurrent
+ {
+ my $self = shift;
+
+ my $path = $self->{list}->get_selection->get_selected_rows;
+ $self->{list}->scroll_to_cell($path) if $path;
+ }
+
+ sub changeCurrent
+ {
+ my ($self, $previous, $new, $idx, $wantSelect) = @_;
+ my @data = ();
+ my $col = 0;
+ my $refilterNeeded = 0;
+ my $currentIter = $self->getCurrentIterFromString;
+ return $idx if !$currentIter;
+ my $currentDepth = $self->{completeModel}->get_path($currentIter)->get_depth;
+ my $newIdx = $idx;
+ if (($currentDepth == 1)
+ && $self->{completeModel}->iter_has_child($currentIter))
+ {
+ # We do nothing for generated masters
+ return $newIdx;
+ }
+ $idx = $self->convertIterToIdx($currentIter);
+
+ my $previousCollection = $self->transformValue($previous->{$self->{collectionField}}, $self->{collectionField});
+ my $newCollection = $self->transformValue($new->{$self->{collectionField}}, $self->{collectionField});
+ @data = $self->createRowsData($new, $idx, 1);
+ # If we hide it, we select next one
+ # We double the index because @data contains both values and indexes
+ my $visible = $data[2 * $self->{visibleCol} + 1];
+ if (! $visible)
+ {
+ my $nextIter;
+ ($nextIter, $newIdx) = $self->getNextIter($currentIter);
+ $self->selectIter($nextIter, 1) if $nextIter && $wantSelect;
+ $self->{count}--;
+ }
+
+ if ($self->{groupItems})
+ {
+ if ($previousCollection ne $newCollection)
+ {
+ my $previousCollectionArray;
+ my $newCollectionArray;
+ #An item is integrated or moved into a collection
+ #First we find its master
+ my @parents;
+
+ #Changing collection
+ $previousCollectionArray = $self->transformValue($previous->{$self->{collectionField}}, $self->{collectionField}, 0, $self->{groupItems}, 0, 1);
+ $newCollectionArray = $self->transformValue($new->{$self->{collectionField}}, $self->{collectionField}, 0, $self->{groupItems}, 0, 1);
+ foreach my $collec(@$newCollectionArray)
+ {
+ next if $collec eq '';
+ push @parents, $self->findMaster($collec);
+
+ if (!$parents[-1])
+ {
+ $refilterNeeded = 1;
+ #We have to create a new parent
+ #Create the master
+ $parents[-1] = $self->{model}->append(undef);
+ $self->{alreadyInserted}->{$newCollection} = 1;
+ my %info = (
+ $self->{generatedField} => $collec,
+ $self->{collectionField} => $newCollection,
+ isGeneratedMaster => 1
+ );
+ my @masterData = $self->createRowsData(\%info, -1);
+ $self->{model}->set($parents[-1], @masterData);
+ }
+ else
+ {
+ # The parent already exists
+ # Check if the child were already there
+
+ # If it was, we remove it from parents
+ pop @parents if GCUtils::inArrayTest($collec, @$previousCollectionArray);
+ }
+ }
+
+ my $childIter = 0;
+ if (!scalar @$newCollectionArray)
+ {
+ $childIter = $self->{model}->append(undef);
+ $self->{model}->set($childIter, @data);
+ }
+ else
+ {
+ foreach my $parent(@parents)
+ {
+ #First we insert it at correct position
+ my $cIter = $self->{model}->append($parent);
+ $self->{model}->set($cIter, @data);
+ # We point to the 1st one
+ $childIter = $cIter if !$childIter;
+ # Update count if needed
+ $self->refreshCount($parent, 1) if ($self->{addCount});
+ }
+ }
+
+ #First we store if we are removing the one that has been selected
+ $self->{currentRemoved} = ($self->{selectedIterString} eq $self->{currentIterString});
+
+ # For generated master, we could have copies of our item in many places.
+ # So we need to loop on all the previous collections
+ # If we have a real master, we have juste one occurrence, the current one
+ if (!scalar @$previousCollectionArray)
+ {
+ $self->removeInCollection(undef, $idx);
+ }
+ else
+ {
+ foreach my $collec(@$previousCollectionArray)
+ {
+ $self->removeInCollection($collec, $idx)
+ if !GCUtils::inArrayTest($collec, @$newCollectionArray);
+ }
+ }
+ if ($childIter)
+ {
+ my $childPath = $self->{model}->get_path($childIter);
+ $childPath = $self->convertChildPathToPath($childPath);
+ if ($childPath)
+ {
+ $self->{list}->expand_to_path($childPath);
+ $self->selectIter(
+ $self->{completeModel}->get_iter($childPath)
+ ) if $self->{currentRemoved} && $visible;
+ }
+ }
+ }
+ else
+ {
+ $self->{model}->foreach(sub {
+ my ($model, $path, $iter) = @_;
+ return 0 if $idx != $self->convertChildIterToIdx($iter);
+ $model->set($iter, @data);
+ return 0;
+ });
+ }
+ }
+ else
+ {
+ $self->{model}->set(
+ $self->convertIterToChildIter($currentIter),
+ @data
+ );
+ }
+
+ # Update count for each parents only if we are not changing collection
+ # Because we already did it otherwise
+ if ((! $visible)
+ && ($self->{groupItems})
+ && ($previousCollection eq $newCollection))
+ {
+ my $collectionArray = $self->transformValue($new->{$self->{collectionField}},
+ $self->{collectionField},
+ 0,
+ 1,
+ 0,
+ 1);
+ foreach my $collec(@$collectionArray)
+ {
+ next if $collec eq '';
+ $self->refreshCount($self->findMaster($collec))
+ if ($self->{addCount});
+ }
+ }
+
+ #my $iter = $self->{list}->get_selection->get_selected;
+ my $iter = $self->getCurrentIter;
+ $self->{selectedIterString} = $self->convertIterToString($iter);
+ $self->{currentIterString} = $self->{selectedIterString};
+ $self->showCurrent;
+ $self->{filter}->refilter if $refilterNeeded;
+ return $newIdx;
+ }
+
+}
+
+
+1;
diff --git a/lib/gcstar/GCLang.pm b/lib/gcstar/GCLang.pm
new file mode 100644
index 0000000..8751dff
--- /dev/null
+++ b/lib/gcstar/GCLang.pm
@@ -0,0 +1,274 @@
+{
+ package GCLang;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use base 'Exporter';
+our @EXPORT = qw(%langs);
+
+use File::Basename;
+use FindBin qw($RealBin $Script);
+use GCUtils 'glob';
+
+our %langs;
+our $loaded = 0;
+
+sub loadLang
+{
+ my ($lang, $nameOnly) = @_;
+
+ if ($nameOnly)
+ {
+ # We directly read the file here to save time and memory
+ open LANG, $ENV{GCS_LIB_DIR}."/GCLang/$lang/GCstar.pm" or return 0;
+ binmode(LANG, ':utf8' );
+ while (<LANG>)
+ {
+ next if !/LangName/;
+ /'?LangName'?\s*=>\s*'(.*)'/;
+ $langs{$lang} = {'LangName' => $1};
+ last;
+ }
+ close LANG;
+ }
+ else
+ {
+ eval "use GCLang::${lang}::GCstar";
+ my %tmpLang;
+ eval "%tmpLang = %GCLang::${lang}::lang";
+ return 0 if !%tmpLang;
+ $langs{$lang} = \%tmpLang;
+ }
+ return 1;
+}
+
+sub loadLangs
+{
+ my $lang = shift;
+
+ return if $loaded;
+ if ($lang)
+ {
+ return 0 if !loadLang($lang);
+ foreach (glob $ENV{GCS_LIB_DIR}.'/GCLang/*')
+ {
+ next if /CVS/ || /pm$/ || /$lang/;
+ my $lang = basename($_);
+ loadLang($lang, 1);
+ #$langs{$lang} = {'LangName' => $langs{$lang}{LangName}};
+ #eval "no GCLang::${lang}::GCstar";
+ }
+ }
+ else
+ {
+ foreach (glob $ENV{GCS_LIB_DIR}.'/GCLang/*')
+ {
+ next if /CVS/ || /pm$/;
+ my $lang = basename($_);
+ loadLang($lang);
+ }
+ }
+ $loaded = 1;
+ return 1;
+}
+
+sub loadPluginsLangs
+{
+ foreach (glob $ENV{GCS_LIB_DIR}.'/GCLang/*')
+ {
+ next if /CVS/ || /pm$/;
+ my $lang = basename($_);
+ foreach my $dir(glob $ENV{GCS_LIB_DIR}."/GCLang/$lang/*")
+ {
+ next if /\.pm$/;
+ foreach my $plugin(glob "$dir/*.pm")
+ {
+ my $module = basename($dir);
+ my %tmpLang;
+ ($plugin = basename($plugin)) =~ s/\.pm$//;
+ eval "use GCLang::".$lang."::".$module."::".$plugin."\n";
+ eval "%tmpLang = %GCLang::".$lang."::".$module."::".$plugin."::lang";
+ foreach my $key(keys %tmpLang)
+ {
+ $langs{$lang}->{$module.'/'.$plugin.".pm '".$key."'"} = $tmpLang{$key};
+ }
+ }
+ }
+ }
+
+}
+
+sub languageDirection
+{
+ my $lang = shift;
+
+ $lang =~ m/([a-z]*)/;
+ if ($1 eq 'ar')
+ {
+ # Langauge is RTL
+ return 'RTL';
+ }
+ else
+ {
+ return 'LTR';
+ }
+}
+
+# Used to convert a model-specific string to the full string (eg "New {1}" -> "New game")
+sub updateModelSpecificStrings
+{
+ my ($self) = @_;
+
+ # We need to make a copy of the original language strings, without the model-specific strings
+ if (!$self->{originalLang})
+ {
+ %{$self->{originalLang}} = %{$self->{lang}};
+ }
+
+ my $itemStrings = $self->{model}->{lang}->{Items};
+ # Add default lower case version if it doesn't exist, if the language has support for it
+ if (ref $itemStrings eq 'HASH')
+ {
+ foreach (keys %{$itemStrings})
+ {
+ next if /lowercase/;
+ next if exists $itemStrings->{'lowercase'.$_};
+ $itemStrings->{'lowercase'.$_} = lc $itemStrings->{$_};
+ }
+ }
+ # Now, go and replace any model-specific strings
+ foreach my $string (keys %{$self->{lang}})
+ {
+ $self->{lang}->{$string} = $self->{originalLang}->{$string};
+ if (ref $itemStrings eq 'HASH')
+ {
+ $self->{lang}->{$string} =~ s/{(.*)}/$itemStrings->{$1}/e;
+ }
+ else
+ {
+ $self->{lang}->{$string} =~ s/{(.*)}/$itemStrings/e;
+ }
+ }
+}
+
+# Used to convert a single model-specific string to the full string (eg "New {1}" -> "New game")
+sub getGenericModelString
+{
+ my ($self, $string) = @_;
+ my $itemStrings = $self->{model}->{lang}->{Items};
+ # Add default lower case version if it doesn't exist, if the language has support for it
+ if (ref $itemStrings eq 'HASH')
+ {
+ foreach (keys %{$itemStrings})
+ {
+ next if /lowercase/;
+ next if exists $itemStrings->{'lowercase'.$_};
+ $itemStrings->{'lowercase'.$_} = lc $itemStrings->{$_};
+ }
+ }
+
+ my $fixedString = $string;
+ if (ref $itemStrings eq 'HASH')
+ {
+ $fixedString =~ s/{(.*)}/$itemStrings->{$1}/e;
+ }
+ else
+ {
+ $fixedString =~ s/{(.*)}/$itemStrings/e;
+ }
+ return $fixedString;
+}
+
+# Used to check languages (which translation are missing)
+# Usage: perl -e "use GCLang; GCLang::checkLangs"
+sub checkLangs
+{
+ my @langsToCheck = @_;
+
+ my $ref = 'EN';
+ #my $otherRef = 'FR';
+
+ loadLangs;
+ loadPluginsLangs;
+
+ my @langsList = scalar @langsToCheck ? @langsToCheck : keys %langs;
+
+ my %results;
+ foreach (sort keys %{$langs{$ref}})
+ {
+ foreach my $langName(@langsList)
+ {
+ next if $langName eq $ref;
+ if (! exists $langs{$langName}->{$_})
+ {
+ push @{$results{$langName}{error}}, $_;
+ }
+ else
+ {
+ #next if $langName eq $otherRef;
+ push @{$results{$langName}{warning}}, $_
+ if ($langs{$langName}->{$_} eq $langs{$ref}->{$_})
+ # || ($langs{$langName}->{$_} eq $langs{$otherRef}->{$_});
+ }
+ }
+ }
+
+ foreach (sort keys %results)
+ {
+ print "\n\nLang $_\n-------\n\n";
+ print "Errors:\n\n";
+ foreach my $value(@{$results{$_}{error}})
+ {
+ next if $value =~ m|^GC.*?/|;
+ print "'$value' => '",$langs{$ref}->{$value},"',\n";
+ }
+ print "\n";
+ foreach my $value(@{$results{$_}{error}})
+ {
+ next if $value !~ m|^GC.*?/|;
+ print "$value => '",$langs{$ref}->{$value},"',\n";
+ }
+ next if $ENV{GCS_ERRORS_ONLY} eq 'YES';
+ print "\nWarnings:\n\n";
+ foreach my $value(@{$results{$_}{warning}})
+ {
+ next if $value =~ m|^GC.*?/|;
+ print "'$value' => '",$langs{$_}->{$value},"',\n";
+ }
+ print "\n";
+ foreach my $value(@{$results{$_}{warning}})
+ {
+ next if $value !~ m|^GC.*?/|;
+ print "$value => '",$langs{$_}->{$value},"',\n";
+ }
+ }
+}
+
+
+}
+
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/AR/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..96692e3
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCExport/GCExportCSV.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::AR::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'تضمين أسماء الحقول بالأعلى',
+ 'Separator' => 'الفاصلة',
+ 'Replacement' => 'إستبدال الفاصلة بـ',
+ 'Charset' => 'الترميز',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/AR/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..c87fc2f
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::AR::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/AR/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..e692fa5
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCExport/GCExportHTML.pm
@@ -0,0 +1,76 @@
+{
+ package GCLang::AR::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'قالب غير صالح',
+ 'UseFile' => 'قم بإستعمال الملف أدناه',
+ 'TemplateExternalFile' => 'القالب',
+ 'WithJS' => 'إستعمل Javascript',
+ 'FileTemplate' => 'قالب:',
+ 'Preview' => 'معاينة',
+ 'NoPreview' => 'المعاينة غير متاحة',
+ 'Title' => 'عنوان الصفحة',
+ 'InfoFile' => 'قائمة الأفلام في الملف: ',
+ 'InfoDir' => 'الصور في المجلد: ',
+ 'HeightImg' => 'إرتفاع الصور التي سيتم تصديرها (بالبكسل): ',
+ 'OpenFileInBrowser' => 'فتح الملف المنشئ بواسطة متصفح الإنترنت',
+ 'Note' => 'تم إنشاء القائمة بواسطة <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'أدخل نص البحث',
+ 'SearchType1' => 'عنوان فقط',
+ 'SearchType2' => 'معلومات كاملة',
+ 'SearchButton' => 'بحث',
+ 'SearchTitle' => 'عرض الأفلام الماطيقة للمعيار السابق فقط',
+ 'AllButton' => 'الكل',
+ 'AllTitle' => 'عرض كل الأفلام',
+ 'Expand' => 'توسيع الكل',
+ 'ExpandTitle' => 'عرض معلومات كل الأفلام',
+ 'Collapse' => 'طي الكل',
+ 'CollapseTitle' => 'طي كل معلومات الأفلام',
+ 'Borrowed' => 'تمت إستعارته من قبل: ',
+ 'NotBorrowed' => 'متاح',
+ 'Top' => 'للأعلى',
+ 'Bottom' => 'للأسفل',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/AR/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..984b4bf
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::AR::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/AR/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..7edff66
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCExport/GCExportSQL.pm
@@ -0,0 +1,53 @@
+
+{
+ package GCLang::AR::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'تضمين تعليمة DROP',
+ 'WithCreate' => 'تضمين تعليمة CREATE',
+ 'TableName' => 'إسم الجدول',
+ 'InfoFile' => 'ملف SQL: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/AR/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..3f8163c
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCExport/GCExportTarGz.pm
@@ -0,0 +1,49 @@
+{
+ package GCLang::AR::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'أرشفة للملف: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/AR/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..a36c7d2
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCExport/GCExportXML.pm
@@ -0,0 +1,53 @@
+{
+ package GCLang::AR::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'ملف القالب',
+ 'ModelText' => 'نص القالب',
+ 'Models' => 'قالب سيتم إستعماله',
+ 'UseFile' => 'إستعمل الملف',
+ 'UseModel' => 'إستعمل مربع النص',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/AR/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..7622dca
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,51 @@
+{
+ package GCLang::AR::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'مكان البحث',
+ 'Default' => 'مسار Alexandria الإفتراضي',
+ 'Specified' => 'المسار المحدّد أدناه',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/AR/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..ff92e5f
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCImport/GCImportCSV.pm
@@ -0,0 +1,55 @@
+{
+ package GCLang::AR::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'الترميز',
+ 'Header' => 'تجاهل السطر الأول',
+ 'Separator' => 'الفاصلة',
+ 'Plugin' => 'موقع سيتم إستعماله',
+ 'UseFirst' => 'حدد أول نتيجة',
+ 'SearchField' => 'Search for items using',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/AR/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..e72f5fa
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::AR::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/AR/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..8d5a41e
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCImport/GCImportGCstar.pm
@@ -0,0 +1,49 @@
+{
+ package GCLang::AR::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'نسخ الصور',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCImport/GCImportList.pm b/lib/gcstar/GCLang/AR/GCImport/GCImportList.pm
new file mode 100644
index 0000000..a424172
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCImport/GCImportList.pm
@@ -0,0 +1,54 @@
+{
+ package GCLang::AR::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'قائمة الأسماء',
+ 'Plugin' => 'موقع سيتم إستعماله',
+ 'UseFirst' => 'حدد أول نتيجة',
+ 'CommentAuto' => 'عنصر سيتم إستيراده بشكل تلقائي',
+ 'CommentSite' => 'موقع إنترنت: ',
+ 'CommentTitle' => 'عنوان: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/AR/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..3f98efc
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::AR::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/AR/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..3029f9f
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCImport/GCImportTellico.pm
@@ -0,0 +1,49 @@
+{
+ package GCLang::AR::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'الملف لا يدعم مجموعة Tellico ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/AR/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..a03bc0b
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::AR::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/AR/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..6f866c0
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::AR::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/AR/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..61d58e9
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::AR::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCbooks.pm b/lib/gcstar/GCLang/AR/GCModels/GCbooks.pm
new file mode 100644
index 0000000..f72cc67
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCbooks.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::AR::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'مجموعة الكتب',
+ Items => 'الكتب',
+ NewItem => 'كتاب جديد',
+
+ Isbn => 'ISBN',
+ Title => 'العنوان',
+ Cover => 'الغلاف',
+ Authors => 'المؤلفون',
+ Publisher => 'الناشر',
+ Publication => 'تاريخ النشر',
+ Language => 'اللغة',
+ Genre => 'النوع',
+ Serie => 'سلسلة',
+ Rank => 'الرتبة',
+ Bookdescription => 'الوصف',
+ Pages => 'صفحات',
+ Read => 'قُرء',
+ Acquisition => 'تاريخ الحصول على الكتاب',
+ Edition => 'الطبعة',
+ Format => 'الصيغة',
+ Comments => 'تعليقات',
+ Url => 'صفحة الإنترنت',
+ Translator => 'المترجم',
+ Artist => 'الرسّام',
+ DigitalFile => 'Digital version',
+
+ General => 'عام',
+ Details => 'تفاصيل',
+
+ ReadNo => 'لم يُقرء',
+ ReadYes => 'قُرء',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCcoins.pm b/lib/gcstar/GCLang/AR/GCModels/GCcoins.pm
new file mode 100644
index 0000000..ccb8bad
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCcoins.pm
@@ -0,0 +1,102 @@
+{
+ package GCLang::AR::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'مجموعة نقديّة',
+ Items => 'نقود',
+ NewItem => 'نقد جديد',
+
+ Name => 'الإسم',
+ Country => 'البلد',
+ Year => 'العام',
+ Currency => 'العملة',
+ Value => 'القيمة',
+ Picture => 'الصورة الرئيسية',
+ Diameter => 'القطر',
+ Metal => 'معدني',
+ Edge => 'الحافة',
+ Edge1 => 'الحافة 1',
+ Edge2 => 'الحافة 2',
+ Edge3 => 'الحافة 3',
+ Edge4 => 'الحافة 4',
+ Head => 'الترويسة',
+ Tail => 'التذييل',
+ Comments => 'تعليقات',
+ History => 'التاريخ',
+ Website => 'موقع الإنترنت',
+ Estimate => 'التخمين',
+ References => 'المراجع',
+ Type => 'النوع',
+ Coin => 'العملة',
+ Banknote => 'ملاحظة المصرف',
+
+ Main => 'عام',
+ Description => 'الوصف',
+ Other => 'معلومات أخرى',
+ Pictures => 'الصور',
+
+ Condition => 'الشروط (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCcomics.pm b/lib/gcstar/GCLang/AR/GCModels/GCcomics.pm
new file mode 100644
index 0000000..4e0fa7d
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::AR::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCfilms.pm b/lib/gcstar/GCLang/AR/GCModels/GCfilms.pm
new file mode 100644
index 0000000..d303348
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCfilms.pm
@@ -0,0 +1,104 @@
+{
+ package GCLang::AR::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'مجموعة الأفلام',
+ Items => 'أفلام',
+ NewItem => 'فيلم جديد',
+
+
+ Id => 'الرقم المعرّف',
+ Title => 'العنوان',
+ Date => 'التاريخ',
+ Time => 'المدّة الزمنية',
+ Director => 'المخرج',
+ Country => 'البلد',
+ MinimumAge => 'أقل عمر',
+ Genre => 'النوع',
+ Image => 'صورة',
+ Original => 'العنوان الأصلي',
+ Actors => 'الممثلون',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'تعليقات',
+ Synopsis => 'الخلاصة',
+ Seen => 'متى عُرض',
+ Number => '# مرة',
+ Format => 'الصيغة',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'صفحة الإنترنت',
+ Audio => 'الصوت',
+ Video => 'صيغة الفيديو',
+ Trailer => 'ملف الفيديو',
+ Serie => 'سلسلة',
+ Rank => 'الرتبة',
+ Subtitles => 'الترجمة الثانوية',
+ Added => 'تاريخ الإضافة',
+
+ SeenYes => 'عًرض',
+ SeenNo => 'لم يًعرض',
+
+ AgeUnrated => 'لم يتم تقييمه',
+ AgeAll => 'كل الأعمال',
+ AgeParent => 'التوجيه الأبوي',
+
+ Main => 'عناصر رئيسية',
+ General => 'عام',
+ Details => 'تفاصيل',
+
+ Information => 'معلومات',
+ Languages => 'لغات',
+ Encoding => 'ترميز',
+
+ FilterAudienceAge => 'عمر الجمهور',
+ FilterSeenNo => 'لم يتم عرضه حتى الآن',
+ FilterSeenYes => 'تم عرضه',
+ FilterRatingSelect => 'تم تقييمه على الأقل...',
+
+ ExtractSize => 'قياس',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCgames.pm b/lib/gcstar/GCLang/AR/GCModels/GCgames.pm
new file mode 100644
index 0000000..e23d7eb
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCgames.pm
@@ -0,0 +1,92 @@
+{
+ package GCLang::AR::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'مجموعة ألعاب الفيديو',
+ Items => 'ألعاب',
+ NewItem => 'لعبة جديدة',
+
+ Id => 'الرقم المعرّف',
+ Ean => 'EAN',
+ Name => 'الإسم',
+ Platform => 'منصة التشغيل',
+ Players => 'عدد اللاّعبين',
+ Released => 'تاريخ الإصدار',
+ Editor => 'المحرّر',
+ Developer => 'المطوّر',
+ Genre => 'النوع',
+ Box => 'صورة العلبة',
+ Case => 'الحالة',
+ Manual => 'دليل الإستخدام',
+ Completion => 'الإكمال (%)',
+ Executable => 'ملف تنفيذي',
+ Description => 'الوصف',
+ Codes => 'شيفرات',
+ Code => 'شيفرة',
+ Effect => 'تأثير',
+ Secrets => 'أسرار',
+ Screenshots => 'لقطات',
+ Screenshot1 => 'أول لقطة',
+ Screenshot2 => 'ثاني لقطة',
+ Comments => 'تعليقات',
+ Url => 'صفحة الإنترنت',
+ Unlockables => 'قابلة لإلغاء الأقفال',
+ Unlockable => 'قابلة لإلغاء القفل',
+ Howto => 'كيفية إلغاء القفل',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'عام',
+ Details => 'تفاصيل',
+ Tips => 'تلميحات',
+ Information => 'معلومات',
+
+ FilterRatingSelect => 'التقييم على الأقل...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/AR/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..a45ec28
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::AR::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCminicars.pm b/lib/gcstar/GCLang/AR/GCModels/GCminicars.pm
new file mode 100644
index 0000000..34fe51a
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::AR::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCmusics.pm b/lib/gcstar/GCLang/AR/GCModels/GCmusics.pm
new file mode 100644
index 0000000..921457f
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCmusics.pm
@@ -0,0 +1,78 @@
+{
+ package GCLang::AR::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'مجموعة الموسيقا',
+ Items => 'ألبومات',
+ NewItem => 'ألبوم جديد',
+
+ Unique => 'ISRC/EAN',
+ Title => 'العنوان',
+ Cover => 'الغلاف',
+ Artist => 'الفنّان',
+ Format => 'الصيغة',
+ Running => 'وقت التشغيل',
+ Release => 'تاريخ الإصدار',
+ Genre => 'النوع',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'قائمة المسارات',
+ Number => 'الرقم',
+ Track => 'العنوان',
+ Time => 'الزمن',
+
+ Composer => 'الملحّن',
+ Producer => 'المنتج',
+ Playlist => 'قائمة القراءة',
+ Comments => 'تعليقات',
+ Label => 'تسمية',
+ Url => 'صفحة الإنترنت',
+
+ General => 'عام',
+ Details => 'تفاصيل',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/AR/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..4821839
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::AR::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/AR/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..e8b414b
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::AR::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/AR/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..4596fa3
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::AR::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCstamps.pm b/lib/gcstar/GCLang/AR/GCModels/GCstamps.pm
new file mode 100644
index 0000000..70d3b0b
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::AR::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCwines.pm b/lib/gcstar/GCLang/AR/GCModels/GCwines.pm
new file mode 100644
index 0000000..db10bdd
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::AR::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Wines collection',
+ Items => 'Wines',
+ NewItem => 'New wine',
+
+ Name => 'Name',
+ Designation => 'Designation',
+ Vintage => 'Vintage',
+ Vineyard => 'Vineyard',
+ Type => 'Type',
+ Grapes => 'Grapes',
+ Soil => 'Soil',
+ Producer => 'Producer',
+ Country => 'Country',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medal/Honour',
+
+ Storage => 'Storage',
+ Location => 'Location',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantity',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Purchase date',
+ PurchasePrice => 'Purchase price',
+ Gift => 'Gift',
+ BottleLabel => 'Bottle label',
+ Website => 'Reference on the web',
+
+ Tasted => 'Tasted',
+ Comments => 'Comments',
+ Serving => 'Serving',
+ TastingField => 'Testing notes',
+
+ General => 'General',
+ Details => 'Details',
+ Tasting => 'Tasting',
+
+ TastedNo => 'Non tasted',
+ TastedYes => 'Tasted',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Not yet tasted',
+ FilterTastedYes => 'Already _tasted',
+ FilterRatingSelect => 'Rating at _least...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCstar.pm b/lib/gcstar/GCLang/AR/GCstar.pm
new file mode 100644
index 0000000..f5bdd58
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCstar.pm
@@ -0,0 +1,692 @@
+{
+ package GCLang::AR;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# mhdbnoimi@gmail.com
+# bashir.storm@gmail.com
+# mbnoimi@gmail.com
+# MY Blog:
+# http://mbnoimi.net/
+#
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Arabic عربي',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>تحذير</b>:
+
+المعلومات التي يتم تحميلها من الإنترنت (عن طريق
+ملحقات البحث) تستعمل فقط من أجل <b>الإستعمال الشخصي</b>.
+
+من أجل تحديد موقع الإنترنت المناسب لتحميل البيانات، بإمكانك
+إستعمال <b>الزر الواقع تحت تفاصيل العنصر </b>.',
+
+
+ 'AllItemsFiltered' => 'لم يتم العثور على أي عنصر من خلال معيار البحث الذي قمت بتخصيصه', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'تم تنصيبه ضمن ',
+ 'InstallMandatory' => 'مكونات أساسية',
+ 'InstallOptional' => 'مكونات إختيارية',
+ 'InstallErrorMissing' => 'خطأ : مكونات بيرل التالية يجب أن يتم تنصيبها: ',
+ 'InstallPrompt' => 'مجلد التنصيب [/usr/local]: ',
+ 'InstallEnd' => 'نهاية التنصيب',
+ 'InstallNoError' => 'لا توجد أخطاء',
+ 'InstallLaunch' => 'لتشغيل البرنامج يجب إستدعاء نسخة واحدة ',
+ 'InstallDirectory' => 'المجلد الرئيسي',
+ 'InstallTitle' => 'تنصيب جي سي ستار',
+ 'InstallDependencies' => 'الإعتمادية',
+ 'InstallPath' => 'مسار',
+ 'InstallOptions' => 'خيارات',
+ 'InstallSelectDirectory' => 'قم بتحديد مجلد التنصيب',
+ 'InstallWithClean' => 'إزالة الملفات الموجودة ضمن مجلد التنصيب',
+ 'InstallWithMenu' => 'إضافة جي سي ستار لقائمة البرامج',
+ 'InstallNoPermission' => 'خطأ : ليس لديك سماحية الكتابة ضمن المجلد المحدد',
+ 'InstallMissingMandatory' => 'إعتماديات أساسية مفقودة. ليس بإمكانك تنصيب جي سي ستار إلا بعد إضافة الإعتماديات الرئيسية لنظامك.',
+ 'InstallMissingOptional' => 'بعض الإعتماديات الإختيارية مفقودة كما هو موضح أدناه. يمكن تنصيب جي سي ستار لكن بعض الميزات لن تكون متوفرة للعمل.',
+ 'InstallMissingNone' => 'لا توجد إعتماديات مفقودة. بإمكانك الإستمرار و تنصيب جي سي ستار.',
+ 'InstallOK' => 'موافق',
+ 'InstallMissing' => 'مفقود',
+ 'InstallMissingFor' => 'مفقود',
+ 'InstallCleanDirectory' => 'إزالة ملفات جي سي ستار من المجلد: ',
+ 'InstallCopyDirectory' => 'نسخ الملفات للمجلد: ',
+ 'InstallCopyDesktop' => 'نسخ ملف سطح المكتب إلى: ',
+
+#Update
+ 'UpdateUseProxy' => 'البروكسي الذي سيتم إستعماله (قم بالنقر على Enter في حال عدم وجود بروكسي): ',
+ 'UpdateNoPermission' => 'لا توجد سماحية للكتابة ضمن هذا المجلّد ',
+ 'UpdateNone' => 'لم يتم العثور على تحديث جديد',
+ 'UpdateFileNotFound' => 'لم يتم العثور على الملف',
+
+#Splash
+ 'SplashInit' => 'تهيئة',
+ 'SplashLoad' => 'تحميل المجموعات',
+ 'SplashDisplay' => 'عرض المجموعات',
+ 'SplashSort' => 'ترتيب المجموعات',
+ 'SplashDone' => 'جاهز',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'يبدو أنك كنت تستعمل جي سي فيلم من قبل. هل ترغب بإستيراد البيانات من جي سي فيلم إلى جي سي ستار؟',
+ 'GCfilmsImportOptions' => 'إعدادات',
+ 'GCfilmsImportData' => 'قائمة الأفلام',
+
+#Menus
+ 'MenuFile' => '_ملف',
+ 'MenuNewList' => '_مجموعة جديدة',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_المجموعات السابقة',
+ 'MenuLend' => 'إظهار العناصر _المستعرضة سابقاً', # Accepts model codes
+ 'MenuImport' => '_إستيراد',
+ 'MenuExport' => '_تصدير',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_تحرير',
+ 'MenuDuplicate' => 'مضاعفة العنصر', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_حذف العنصر', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_تغيير حقول المجموعة',
+ 'MenuEditLockItems' => '_إقفال المجموعة',
+
+ 'MenuDisplay' => 'ت_صفية',
+ 'MenuSavedSearches' => 'حفظ البحث',
+ 'MenuSavedSearchesSave' => 'حفظ البحث الحالي',
+ 'MenuSavedSearchesEdit' => 'تعديل بحث محفوظ',
+ 'MenuAdvancedSearch' => 'ب_حث متقدّم',
+ 'MenuViewAllItems' => 'عرض _كل العناصر', # Accepts model codes
+ 'MenuNoFilter' => '_أي شيء',
+
+ 'MenuConfiguration' => '_إعدادات',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_المعلومات المعروضة',
+ 'MenuBorrowers' => '_إستعارة',
+ 'MenuToolbarConfiguration' => '_عناصر شريط الأدوات',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'نم_ط التحويل',
+
+ 'MenuBookmarks' => '_محفوظات',
+ 'MenuBookmarksAdd' => '_أضف الجموعة الحالية',
+ 'MenuBookmarksEdit' => '_تحرير المحفوظات',
+
+ 'MenuHelp' => '_مساعدة',
+ 'MenuHelpContent' => '_المحتوى',
+ 'MenuAllPlugins' => 'عرض الملحقات',
+ 'MenuBugReport' => 'الإبلاغ عن خطأ',
+ 'MenuAbout' => '_حول جي سي ستار',
+
+ 'MenuNewWindow' => 'عرض العنصر بنافذة _جديدة', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'توسيع الكل',
+ 'ContextCollapseAll' => 'طي الكل',
+ 'ContextChooseImage' => 'قم بإختيار صورة',
+ 'ContextOpenWith' => 'فتح بواسطة',
+ 'ContextImageEditor' => 'محرر الصور',
+ 'ContextImgFront' => 'الواجهة',
+ 'ContextImgBack' => 'الخلفية',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'قم بإدخال قيمة',
+
+ 'RemoveConfirm' => 'هل أنت متأكد من حذف هذا العنصر؟', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+
+ 'DefaultNewItem' => 'عنصر جديد',
+ 'NewItemTooltip' => 'إضافة عنصر جديد',
+ 'NoItemFound' => 'لم يتم العثور على أي شيء. هل تود البحث ضمن موقع آخر؟',
+ 'OpenList' => 'قم بتحديد مجموعة',
+ 'SaveList' => 'قم بتحديد مسار حفظ المجموعة',
+ 'SaveListTooltip' => 'حفظ المجموعة الحالية',
+ 'SaveUnsavedChanges' => 'لم يتم حفظ التعديلات على مجموعتك لم تُحفظ. هل تريد حفظ التعديلات؟',
+ 'SaveDontSave' => 'لا تحفظ',
+ 'PreferencesTooltip' => 'تفضيلات البرنامج',
+ 'ViewTooltip' => 'تغيير عرض المجموعة',
+ 'PlayTooltip' => 'قراءة ملف الفيديو المرتبط بالعنصر', # Accepts model codes
+ 'PlayFileNotFound' => 'الملف الذي سيتم إستدعاؤه غير موجود في هذا المسار:',
+ 'PlayRetry' => 'إعادة القراءة',
+
+ 'StatusSave' => 'الحفظ جاري...',
+ 'StatusLoad' => 'التحميل جاري...',
+ 'StatusSearch' => 'البحث جاري...',
+ 'StatusGetInfo' => 'الحصول على المعلومات...',
+ 'StatusGetImage' => 'الحصول على الصورة...',
+
+ 'SaveError' => 'غير قادر على حفظ قائمة العناصر. من فضلك قم بفحص سماحيات الكتابة على القرص',
+ 'OpenError' => 'غير قادر على فتح قائمة العناصر. من فضلك قم بفحص سماحيات القرص',
+ 'OpenFormatError' => 'غير قادر على فتح قائمة العناصر. تأكد من صحة التنسيق',
+ 'OpenVersionWarning' => 'المجموعة تم حفظها بواسطة عدة إصدارات من جي سي ستار. إذا قمت بحفظها هنالك إحتمال أن تفقد بعض البيانات.',
+ 'OpenVersionQuestion' => 'هل لا تزال ترغب بالإستمرار؟',
+ 'ImageError' => 'المسار المحدّد من أجل حفظ الصوّر غير صالح. من فضلك قم بتحديد مسار آخر',
+ 'OptionsCreationError'=> 'غير قادر على إنشاء ملف الخيارات: ',
+ 'OptionsOpenError'=> 'غير قادر على فتح ملف الخيارات: ',
+ 'OptionsSaveError'=> 'غير قادر على حفظ ملف الخيارات: ',
+ 'ErrorModelNotFound' => 'النموذج غير موجود: ',
+ 'ErrorModelUserDir' => 'النماذج المعرفة من قبل المستخدم موجودة ضمن: ',
+
+ 'RandomTooltip' => 'ما الذي ترغب برؤيته هذا المساء؟',
+ 'RandomError'=> 'لم يتم تحديد أي عنصر', # Accepts model codes
+ 'RandomEnd'=> 'لا توجد عناصر أكثر من ذلك', # Accepts model codes
+ 'RandomNextTip'=> 'الإقتراح التالي',
+ 'RandomOkTip'=> 'قبول هذا العنصر',
+
+ 'AboutTitle' => 'حول جي سي ستار',
+ 'AboutDesc' => 'لإدارة المجموعات',
+ 'AboutVersion' => 'إصدار',
+ 'AboutTeam' => 'فريق',
+ 'AboutWho' => 'مدير المشروع، مبرمج: Christian Jodar (Tian)
+مبرمج: Nyall Dawson (Zombiepig)
+مبرمج: TPF
+مبرمج: Adolfo González
+',
+ 'AboutLicense' => 'المشروع تم تطويره و توزيعه وفق رخصة البرامج مفتوحة المصدر GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'دعم اللغة العربية: محمد بشير النعيمي
+http://mbnoimi.net/
+mhdbnoimi@gmail.com
+bashir.storm@gmail.com
+mbnoimi@gmail.com',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+ تم أنجاز الشعار و تصميم الويب من قبل le Spektre',
+
+ 'ToolbarRandom' => 'هذه اللّيلة',
+
+ 'UnsavedCollection' => 'مجموعة لم يتم حفظها',
+ 'ModelsSelect' => 'حدّد نوع المجموعة',
+ 'ModelsPersonal' => 'نماذج شخصية',
+ 'ModelsDefault' => 'نماذج إفتراضية',
+ 'ModelsList' => 'تعريف المجموعة',
+ 'ModelSettings' => 'إعدادات المجموعة',
+ 'ModelNewType' => 'مجموعة جديدة',
+ 'ModelName' => 'إسم المجموعة: ',
+ 'ModelFields' => 'حقول',
+ 'ModelOptions' => 'خيارات',
+ 'ModelFilters' => 'مرشحات تصفية',
+ 'ModelNewField' => 'حقل جديد',
+ 'ModelFieldInformation' => 'معلومات',
+ 'ModelFieldName' => 'تسمية:',
+ 'ModelFieldType' => 'نوع:',
+ 'ModelFieldGroup' => 'مجموعة:',
+ 'ModelFieldValues' => 'القيم',
+ 'ModelFieldInit' => 'إفتراضي:',
+ 'ModelFieldMin' => 'الحد الأدنى:',
+ 'ModelFieldMax' => 'الحد الأعلى:',
+ 'ModelFieldList' => 'قائمة القيم:',
+ 'ModelFieldListLegend' => '<i>كل قيمة تفصل عن الأخرى بفاصلة</i>',
+ 'ModelFieldDisplayAs' => 'عرض بهيئة: ',
+ 'ModelFieldDisplayAsText' => 'نص',
+ 'ModelFieldDisplayAsGraphical' => 'عنصر تقييم',
+ 'ModelFieldTypeShortText' => 'نص قصير',
+ 'ModelFieldTypeLongText' => 'نص طويل',
+ 'ModelFieldTypeYesNo' => 'نعم/لا',
+ 'ModelFieldTypeNumber' => 'عدد',
+ 'ModelFieldTypeDate' => 'تاريخ',
+ 'ModelFieldTypeOptions' => 'قائمة قيم ذات تعريف مسبق',
+ 'ModelFieldTypeImage' => 'صورة',
+ 'ModelFieldTypeSingleList' => 'قائمة بسيطة',
+ 'ModelFieldTypeFile' => 'ملف',
+ 'ModelFieldTypeFormatted' => 'يعتمد على الحقول الأخرى',
+ 'ModelFieldParameters' => 'وسائط',
+ 'ModelFieldHasHistory' => 'إستعمال المحفوظات',
+ 'ModelFieldFlat' => 'عرض ضمن صفّ واحد',
+ 'ModelFieldStep' => 'خطوة الزيادة:',
+ 'ModelFieldFileFormat' => 'تنسيق الملف:',
+ 'ModelFieldFileFile' => 'ملف بسيط',
+ 'ModelFieldFileImage' => 'صورة',
+ 'ModelFieldFileVideo' => 'فيديو',
+ 'ModelFieldFileAudio' => 'صوت',
+ 'ModelFieldFileProgram' => 'برنامج',
+ 'ModelFieldFileUrl' => 'رابط',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'حقول للأستعمال',
+ 'ModelOptionsFieldsAuto' => 'تلقائي',
+ 'ModelOptionsFieldsNone' => 'لا شيء',
+ 'ModelOptionsFieldsTitle' => 'حسب العنوان',
+ 'ModelOptionsFieldsId' => 'حسب المعرّف',
+ 'ModelOptionsFieldsCover' => 'حسب الغلاف',
+ 'ModelOptionsFieldsPlay' => 'من أجل زر القراءة',
+ 'ModelCollectionSettings' => 'إعدادات المجموعة',
+ 'ModelCollectionSettingsLending' => 'إمكانية إعارة العناصر',
+ 'ModelCollectionSettingsTagging' => 'عناصر يسمح بوسمها',
+ 'ModelFilterActivated' => 'عرض ضمن صندوق البحث',
+ 'ModelFilterComparison' => 'مقارنة',
+ 'ModelFilterContain' => 'يحتوي',
+ 'ModelFilterDoesNotContain' => 'لا يحتوي على',
+ 'ModelFilterRegexp' => 'تعبير منتظم',
+ 'ModelFilterRange' => 'مجال',
+ 'ModelFilterNumeric' => 'المقارنة عددية',
+ 'ModelFilterQuick' => 'إنشاء تصفية سريعة',
+ 'ModelTooltipName' => 'إستعمل إسماً من أجل إعادة إستعمال هذا النموذج لمجموعات أخرى. في حال كان فارغاً، الإعدادات سيتم تخزينها مباشرة
+ضمن ملف المجموعة نفسه',
+ 'ModelTooltipLabel' => 'إسم الحقل كما سيتم إظهاره',
+ 'ModelTooltipGroup' => 'يستعمل من أجل تجميع الحقول. جميع العناصر التي لا تحتوي على قيم سيتم تجميعها ضمن مجموعة إفتراضية',
+ 'ModelTooltipHistory' => 'القيم المدخلة سابقاً سيتم تخزينها ضمن قائمة مرتبطة بالحقل',
+ 'ModelTooltipFormat' => 'تستعمل هذه الصيغة لتخصيص طريقة فتح الملف بإستعمال زر القراءة',
+ 'ModelTooltipLending' => 'سيتم إضافة بعض الحقول من أجل إدارة الإستعارة',
+ 'ModelTooltipTagging' => 'إضافة بعض الحقول من أجل إدارة الوسوم',
+ 'ModelTooltipNumeric' => 'سيتم معاملة جميع المقارنات على أنها أعداد',
+ 'ModelTooltipQuick' => 'سيتم إضافة قائمة فرعية ضمن قائمة التصفية',
+
+ 'ResultsTitle' => 'حدد عنصر', # Accepts model codes
+ 'ResultsNextTip' => 'البحث ضمن الموقع',
+ 'ResultsPreview' => 'معاينة',
+ 'ResultsInfo' => 'بإمكانك إضافة عدة عناصر للمجموعة عن طريق النقر المستمر على زر Ctrl أو Shift ثم إختيار العنصر', # Accepts model codes
+
+ 'OptionsTitle' => 'التفضيلات',
+ 'OptionsExpertMode' => 'متقدّم',
+ 'OptionsPrograms' => 'تخصيص التطبيقات الإفتراضية ضمن البرنامج، سيتم إستعمال إفتراضيات النظام في حال ترك الحقل فارغاً',
+ 'OptionsBrowser' => 'متصفّح الإنترنت',
+ 'OptionsPlayer' => 'قارئ الفيديو',
+ 'OptionsAudio' => 'قارئ الصوت',
+ 'OptionsImageEditor' => 'محرر الصور',
+ 'OptionsCdDevice' => 'جهاز القرص المدمج',
+ 'OptionsImages' => 'مجلد الصوّر',
+ 'OptionsUseRelativePaths' => 'إستعمال المسارات النسبية من أجل الصوّر',
+ 'OptionsLayout' => 'تخطيط العرض',
+ 'OptionsStatus' => 'عرض شريط الحالة',
+ 'OptionsUseStars' => 'إستعمال النجوم من أجل عرض التقييم',
+ 'OptionsWarning' => 'تحذير: جميع التعديلات ستظهر عند إعادة تشغيل البرنامج، و لن تظهر مباشرة الآن',
+ 'OptionsRemoveConfirm' => 'إظهار رسالة تأكيد حذف العنصر',
+ 'OptionsAutoSave' => 'حفظ المجموعة بشكل تلقائي',
+ 'OptionsAutoLoad' => 'فتح المجموعة السابقة عند بدء تشغيل البرنامج',
+ 'OptionsSplash' => 'عرض الشاشة الترحيبية',
+ 'OptionsTearoffMenus' => 'تمكين تثبيت القوائم',
+ 'OptionsSpellCheck' => 'إستعمال المدقق الإملائي ضمن حقول النص الطويلة',
+ 'OptionsProgramTitle' => 'حدد البرنامج الذي سيتم إستعماله',
+ 'OptionsPlugins' => 'الموقع الذي سيتم جلب البيانات منه',
+ 'OptionsAskPlugins' => 'سؤال جميع المواقع',
+ 'OptionsPluginsMulti' => 'عدد معيّن من المواقع',
+ 'OptionsPluginsMultiAsk' => 'سؤال عدد معين من المواقع',
+ 'OptionsPluginsMultiPerField' => 'Many sites (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each field we will fill the field with the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'تخصيص قائمة المواقع',
+ 'OptionsAskImport' => 'حدد الحقول التي سيتم إستيرادها',
+ 'OptionsProxy' => 'إستعمل البروكسي',
+ 'OptionsCookieJar' => 'إستعمال ملف الكوكي',
+ 'OptionsLang' => 'لغة',
+ 'OptionsMain' => 'عام',
+ 'OptionsPaths' => 'مسارات',
+ 'OptionsInternet' => 'إنترنت',
+ 'OptionsConveniences' => 'ميّزات',
+ 'OptionsDisplay' => 'عرض',
+ 'OptionsToolbar' => 'شريط الأدوات',
+ 'OptionsToolbars' => {0 => 'بلا', 1 => 'صغير', 2 => 'كبير'},
+ 'OptionsToolbarPosition' => 'توضّع',
+ 'OptionsToolbarPositions' => {0 => 'في الأعلى', 1 => 'في الأسفل', 2 => 'في اليسار', 3 => 'في اليمين'},
+ 'OptionsExpandersMode' => 'طريقة إحتواء العناصر الكبيرة',
+ 'OptionsExpandersModes' => {'asis' => 'لا تفعل شيء', 'cut' => 'إقتطاع', 'wrap' => 'إلتفاف السطر'},
+ 'OptionsDateFormat' => 'صيغة التاريخ',
+ 'OptionsDateFormatTooltip' => 'صيغة التاريخ. القيمة الإفتراضية هي: %d/%m/%Y',
+ 'OptionsView' => 'قائمة العناصر',
+ 'OptionsViews' => {0 => 'نص', 1 => 'صورة', 2 => 'تفاصيل'},
+ 'OptionsColumns' => 'أعمدة',
+ 'OptionsMailer' => 'إرسال البريد الإلكتروني بواسطة',
+ 'OptionsSMTP' => 'الملقم',
+ 'OptionsFrom' => 'عنوان بريدك الإلكتروني',
+
+ 'OptionsTransform' => 'وضع مقطع التعريف بنهاية العناوين',
+ 'OptionsArticles' => 'مقطع التعريف (كل مقطع مفصول عن الآخر بفاصلة)',
+ 'OptionsSearchStop' => 'السماح بإحباط عملية البحث',
+ 'OptionsBigPics' => 'إستعمال الصور بقياس كبير في حال توفرهم',
+
+ 'OptionsAlwaysOriginal' => 'استعمل العنوان الرئيسي كعنوان أصلي إن لم يتم تخصيصه',
+ 'OptionsRestoreAccelerators' => 'إستعادة الإختصارات الإفتراضية',
+ 'OptionsHistory' => 'حجم المحفوظات',
+ 'OptionsClearHistory' => 'مسح المحفوظات',
+ 'OptionsStyle' => 'مظهرية العرض',
+ 'OptionsDontAsk' => 'لا تسألني مرة أخرى',
+ 'OptionsPathProgramsGroup' => 'تطبيقات',
+ 'OptionsProgramsSystem' => 'إستعمال البرامج المعرفة من قبل النظام',
+ 'OptionsProgramsUser' => 'إستعمال البرامج المعرفة من قبل المستخدم',
+ 'OptionsProgramsSet' => 'تخصيص البرامج',
+ 'OptionsPathImagesGroup' => 'صور',
+ 'OptionsInternetDataGroup' => 'استيراد البيانات',
+ 'OptionsInternetSettingsGroup' => 'إعدادات',
+ 'OptionsDisplayInformationGroup' => 'عرض المعلومات',
+
+ 'OptionsDisplayArticlesGroup' => 'مقاطع التعريف',
+ 'OptionsImagesDisplayGroup' => 'عرض',
+ 'OptionsImagesStyleGroup' => 'نمط',
+ 'OptionsDetailedPreferencesGroup' => 'تفضيلات',
+#0
+ 'OptionsFeaturesConveniencesGroup' => 'وسائل الراحة',
+ 'OptionsPicturesFormat' => 'البادئة التي ستستعمل للصوّر',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'عنوان أو اسم العنصر المرتبط',
+ 'OptionsPicturesWorkingDir' => 'الصيغة %WORKING_DIR% . سيتم إستبدالها بمجلد المجموعة (تستعمل فقط في بداية المسار)',
+ 'OptionsPicturesFileBase' => 'الصيغة %FILE_BASE% سيتم إستبدالها بواسطة إسم ملف المجموعة دون اللاحقة (.gcs)',
+ 'OptionsPicturesWorkingDirError' => 'الصيغة %WORKING_DIR% يمكن إستعمالها فقط في بداية المسار للصور',
+ 'OptionsConfigureMailers' => 'تهيئة برامج البريد الإلكتروني',
+
+ 'ImagesOptionsButton' => 'إعدادات',
+ 'ImagesOptionsTitle' => 'إعدادات قائمة الصوّر',
+ 'ImagesOptionsSelectColor' => 'حدد لون',
+ 'ImagesOptionsUseOverlays' => 'عرض ضمن إطار زجاجي',
+ 'ImagesOptionsBg' => 'خلفية',
+ 'ImagesOptionsBgPicture' => 'إستعمل صورة الخلفية',
+ 'ImagesOptionsFg'=> 'تحديد',
+ 'ImagesOptionsBgTooltip' => 'تغيير لون الخلفية',
+ 'ImagesOptionsFgTooltip'=> 'تغيير لون التحديد',
+ 'ImagesOptionsResizeImgList' => 'تغيير عدد الأعمدة بشكل تلقائي',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'حجم',
+ 'ImagesOptionsSizeList' => {0 => 'صغير جداً', 1 => 'صغير', 2 => 'متوسط', 3 => 'كبير', 4 => 'كبير جداً'},
+ 'ImagesOptionsSizeTooltip' => 'حدد حجم الصورة',
+
+ 'DetailedOptionsTitle' => 'إعدادات قائمة تفاصيل',
+ 'DetailedOptionsImageSize' => 'قياس الصوّر',
+ 'DetailedOptionsGroupItems' => 'تجميع العناصر بواسطة',
+ 'DetailedOptionsSecondarySort' => 'ترتيب الحقول الفرعية',
+ 'DetailedOptionsFields' => 'حدد التي الحقول التي سيتم عرضها',
+ 'DetailedOptionsGroupedFirst' => 'فرز العناصر الغير مجمّعة',
+ 'DetailedOptionsAddCount' => 'إضافة عدد العناصر ضمن التصنيفات',
+ 'ExtractButton' => 'معلومات',
+ 'ExtractTitle' => 'معلومات الملف',
+ 'ExtractImport' => 'إستعمل القيم',
+
+ 'FieldsListOpen' => 'فتح قائمة الحقول من ملف',
+ 'FieldsListSave' => 'حفظ قائمة الحقول لملف',
+ 'FieldsListError' => 'لا يمكن إستعمال قائمة الحقول مع هذا النوع من المجموعات',
+ 'FieldsListIgnore' => '--- تجاهل',
+
+ 'ExportTitle' => 'تصدير قائمة العناصر',
+ 'ExportFilter' => 'تصدير العناصر المعروضة فقط',
+ 'ExportFieldsTitle' => 'حقول سيتم تصديرها',
+ 'ExportFieldsTip' => 'حدد الحقول التي تود تصديرها',
+ 'ExportWithPictures' => 'نسخ الصّور لمجلّد فرعي',
+ 'ExportSortBy' => 'ترتيب حسب',
+ 'ExportOrder' => 'ترتيب',
+
+ 'ImportListTitle' => 'إستيراد قائمة عناصر أخرى',
+ 'ImportExportData' => 'بيانات',
+ 'ImportExportFile' => 'ملف',
+ 'ImportExportFieldsUnused' => 'حقول عير مستعملة',
+ 'ImportExportFieldsUsed' => 'حقول مستعملة',
+ 'ImportExportFieldsFill' => 'إضافة الكل',
+ 'ImportExportFieldsClear' => 'إزالة الكل',
+ 'ImportExportFieldsEmpty' => 'يجب تحديد حقل واحد على الأقل',
+ 'ImportExportFileEmpty' => 'يجب تخصيص إسم الملف',
+ 'ImportFieldsTitle' => 'حقول سيتم إستيرادها',
+ 'ImportFieldsTip' => 'حدد الحقول التي تريد إستيرادها',
+ 'ImportNewList' => 'إنشاء مجموعة جديدة',
+ 'ImportCurrentList' => 'إضافة للمجموعة الحالية',
+ 'ImportDropError' => 'حدث خطأ أثناء فتح الملف. القائمة السابقة سيعاد تحميلها من جديد',
+ 'ImportGenerateId' => 'إنشاء رقم معرّف من أجل كل عنصر',
+
+ 'FileChooserOpenFile' => 'قم بتحديد ملف ليتم إستعاله',
+ 'FileChooserDirectory' => 'مجلد',
+ 'FileChooserOpenDirectory' => 'حدد مجلد',
+ 'FileChooserOverwrite' => 'الملف موجود مسبقاً. هل تود إستبداله؟',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ #Some default panels
+ 'PanelCompact' => 'مدمج',
+ 'PanelReadOnly' => 'للقراءة فقط',
+ 'PanelForm' => 'صفحات',
+
+ 'PanelSearchButton' => 'جلب المعلومات',
+ 'PanelSearchTip' => 'البحث بالإنترنت عن المعلومات التي تحمل هذا الإسم',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'إنقر على الصورة من أجل تحديد واحدة أخرى ',
+ 'PanelImageTipView' => ' إنقر على الصورة من أجل مشاهدة القياس الأصلي',
+ 'PanelImageTipMenu' => ' إنقر على الزر الأيمن للفأرة من أجل مزيد من الخيارات',
+ 'PanelImageTitle' => 'حدد صورة',
+ 'PanelImageNoImage' => 'لا توجد صورة',
+ 'PanelSelectFileTitle' => 'حدد ملف',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'إستعادة الإفتراضيات',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'من',
+ 'PanelTo' =>'إلى',
+
+ 'PanelWeb' => 'عرض المعلومات',
+ 'PanelWebTip' => 'عرض المعلومات من الإنترنت حول هذا العنصر', # Accepts model codes
+ 'PanelRemoveTip' => 'حذف العنصر الحالي', # Accepts model codes
+
+ 'PanelDateSelect' => 'حدد التاريخ',
+ 'PanelNobody' => 'لا أحد',
+ 'PanelUnknown' => 'غير معروف',
+ 'PanelAdded' => 'إضافة التاريخ',
+ 'PanelRating' => 'تقييم',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'المكان',
+
+ 'PanelLending' => 'إعارة',
+ 'PanelBorrower' => 'مستعير',
+
+ 'PanelLendDate' => 'تاريخ الإعارة',
+ 'PanelHistory' => 'تاريخ الإعارة',
+ 'PanelReturned' => 'عنصر مُعاد', # Accepts model codes
+ 'PanelReturnDate' => 'تاريخ الإعادة',
+ 'PanelLendedYes' => 'مُعار',
+ 'PanelLendedNo' => 'متاح',
+
+ 'PanelTags' => 'وسوم',
+ 'PanelFavourite' => 'محفوظات',
+ 'TagsAssigned' => 'وسوم مستعملة',
+
+ 'PanelUser' => 'حقول المستخدم',
+
+ 'CheckUndef' => 'اما',
+ 'CheckYes' => 'نعم',
+ 'CheckNo' => 'لا',
+
+ 'ToolbarAll' => 'عرض الكل',
+ 'ToolbarAllTooltip' => 'عرض كل العناصر',
+ 'ToolbarGroupBy' => 'تجميع حسب',
+ 'ToolbarGroupByTooltip' => 'حدد الحقل الذي سيستعمل من أجل تجميع عناصر القائمة',
+ 'ToolbarQuickSearch' => 'بحث سريع',
+ 'ToolbarQuickSearchLabel' => 'بحث',
+ 'ToolbarQuickSearchTooltip' => 'قم بتحديد الحقل الذي سيتم البحث ضمنه.',
+ 'ToolbarSeparator' => ' فاصل',
+
+ 'PluginsTitle' => 'البحث عن عنصر',
+ 'PluginsQuery' => 'إستعلام',
+ 'PluginsFrame' => 'موقع البحث',
+ 'PluginsLogo' => 'الشعار',
+ 'PluginsName' => 'الإسم',
+ 'PluginsSearchFields' => 'حقول البحث',
+ 'PluginsAuthor' => 'المؤلف',
+ 'PluginsLang' => 'اللغة',
+ 'PluginsUseSite' => 'أستخدم الموقع المحدّد من أجل عمليات البحث المستقبلية',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'إعدادات الإستعارة',
+ 'BorrowersList' => 'المستعيرون',
+ 'BorrowersName' => 'إسم',
+ 'BorrowersEmail' => 'بريد إلكتروني',
+ 'BorrowersAdd' => 'إضافة',
+ 'BorrowersRemove' => 'إزالة',
+ 'BorrowersEdit' => 'تحرير',
+ 'BorrowersTemplate' => 'قالب البريد',
+ 'BorrowersSubject' => 'عنوان الرسالة',
+ 'BorrowersNotice1' => '%1 سيتم إستبداله بإسم المستعير',
+ 'BorrowersNotice2' => '%2 سيتم إستبداله بعنوان العنصر',
+ 'BorrowersNotice3' => '%3 سيتم إستبداله بتاريخ الإستعارة',
+
+ 'BorrowersImportTitle' => 'إستيراد معلومات المستعيرين',
+ 'BorrowersImportType' => 'تنسيق الملف:',
+ 'BorrowersImportFile' => 'ملف:',
+
+ 'BorrowedTitle' => 'عناصر مُعارة', # Accepts model codes
+ 'BorrowedDate' => 'منذ',
+ 'BorrowedDisplayInPanel' => 'عرض العنصر في النافذة الرئيسية', # Accepts model codes
+
+ 'MailTitle' => 'إرسال رسالة إلكترونية',
+ 'MailFrom' => 'من: ',
+ 'MailTo' => 'إلى: ',
+ 'MailSubject' => 'عنوان الرسالة: ',
+ 'MailSmtpError' => 'حدث خطأ لدى محاولة الإتصال بملقم SMTP',
+ 'MailSendmailError' => 'حدث خطأ لدى محاولة الإتصال بواسطة Sendmail',
+
+ 'SearchTooltip' => 'البحث بعن عنصر', # Accepts model codes
+ 'SearchTitle' => 'البحث عن عنصر', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'حقل سيتم إستبداله',
+ 'QueryReplaceOld' => 'القيمة الحالية',
+ 'QueryReplaceNew' => 'قيمة جديدة',
+ 'QueryReplaceLaunch' => 'إستبدال',
+
+ 'ImportWindowTitle' => 'حدد الحقول التي سيتم إستيرادها',
+ 'ImportViewPicture' => 'عرض الصورة',
+ 'ImportSelectAll' => 'تحديد الكل',
+ 'ImportSelectNone' => 'إلغاء التحديد',
+
+ 'MultiSiteTitle' => 'مواقع سيتم إستعمالها في عمليات البحث',
+ 'MultiSiteUnused' => 'ملحقات غير مستعملة',
+ 'MultiSiteUsed' => 'ملحقات مستعملة',
+ 'MultiSiteLang' => 'قم بتعبئة القائمة بالملحقات العربية',
+ 'MultiSiteEmptyError' => 'لديك قائمة مواقع فارغة',
+ 'MultiSiteClear' => 'مسح القائمة',
+
+ 'DisplayOptionsTitle' => 'عناصر سيتم عرضها',
+ 'DisplayOptionsAll' => 'تحديد الكل',
+ 'DisplayOptionsSearch' => 'زر البحث',
+
+ 'GenresTitle' => 'نوع التحويل',
+ 'GenresCategoryName' => 'نوع سيتمل استعماله',
+ 'GenresCategoryMembers' => 'نوع سيتم استبداله',
+ 'GenresLoad' => 'فتح قائمة',
+ 'GenresExport' => 'حفظ القائمة لملف',
+ 'GenresModify' => 'تحرير التحويل',
+
+ 'PropertiesName' => 'إسم المجموعة',
+ 'PropertiesLang' => 'رمز اللغة',
+ 'PropertiesOwner' => 'المالك',
+ 'PropertiesEmail' => 'بريد إلكتروني',
+ 'PropertiesDescription' => 'الوصف',
+ 'PropertiesFile' => 'معلومات الملف',
+ 'PropertiesFilePath' => 'مسار كامل',
+ 'PropertiesItemsNumber' => 'عدد المرات', # Accepts model codes
+ 'PropertiesFileSize' => 'حجم',
+ 'PropertiesFileSizeSymbols' => ['بايت', 'كيلوبايت', 'ميغابايت', 'جيجابايت', 'تيرابايت', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'خصائص المجموعة',
+ 'PropertiesDefaultPicture' => 'الصورة الإفتراضية',
+
+ 'MailProgramsTitle' => 'برامج من أجل إرسال البريد الإلكتروني',
+ 'MailProgramsName' => 'الإسم',
+ 'MailProgramsCommand' => 'سطر الأوامر',
+ 'MailProgramsRestore' => 'أستعادة الإفتراضيات',
+ 'MailProgramsAdd' => 'إضافة برنامج',
+ 'MailProgramsInstructions' => 'في سطر الأوامر، البدائل التالية تقوم بـ:
+ %f يتم إستبدالها بعنوان البريد الإلكتروني للمستخدم.
+ %t يتم إستبدالها بعنوان البريد الإلكتروني للمستقبل.
+ %s يتم إستبدالها بعنوان الرسالة.
+ %b يتم إستبدالها بنص الرسالة.',
+
+ 'BookmarksBookmarks' => 'إشارات مرجعية',
+ 'BookmarksFolder' => 'مجلدات',
+ 'BookmarksLabel' => 'تسمية',
+ 'BookmarksPath' => 'مسار',
+ 'BookmarksNewFolder' => 'مجلد جديد',
+
+ 'AdvancedSearchType' => 'نوع البحث',
+ 'AdvancedSearchTypeAnd' => 'مطابقة كل المعايير', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'مطايقة معيار واحد على الأقل', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'المعيار',
+ 'AdvancedSearchAnyField' => 'أي حقل',
+ 'AdvancedSearchSaveTitle' => 'حفظ البحث',
+ 'AdvancedSearchSaveName' => 'الإسم',
+ 'AdvancedSearchSaveOverwrite' => 'عملية بحث تم حفظها سابقا تحمل نفس التسمية. قم بإختيار تسمية أخرى.',
+ 'AdvancedSearchUseCase' => 'تحسس حالة الأحرف',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'تقرير الإبلاغ عن خطأ قام بتوليده جي سي ستار',
+ 'BugReportVersion' => 'الإصدار',
+ 'BugReportPlatform' => 'نظام التشغيل',
+ 'BugReportMessage' => 'رسالة الخطأ',
+ 'BugReportInformation' => 'معلومات إضافية',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/BG/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/BG/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..0d269e6
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::BG::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Включително имена на полета в горната част',
+ 'Separator' => 'Разделител',
+ 'Replacement' => 'Замени разделителя с',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/BG/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..6f0cf6a
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::BG::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/BG/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..523a3ed
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::BG::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Invalid template file',
+ 'UseFile' => 'Use file specified below',
+ 'TemplateExternalFile' => 'Template file',
+ 'WithJS' => 'Използване Javascript',
+ 'FileTemplate' => 'Шаблон :',
+ 'Preview' => 'Предварителен изглед',
+ 'NoPreview' => 'Няма наличен предварителен изглед',
+ 'Title' => 'Заглание на страница',
+ 'InfoFile' => 'Списъкът на филми е във файл: ',
+ 'InfoDir' => 'Изображенията са в: ',
+ 'HeightImg' => 'Височина в (пиксели) на изображения за експортиране: ',
+ 'OpenFileInBrowser' => 'Отваряне на генерирания файл в уеб-четец',
+ 'Note' => 'Списък, генериран от <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Въведете текст за търсене',
+ 'SearchType1' => 'Само заглавие',
+ 'SearchType2' => 'Пълна информация',
+ 'SearchButton' => 'Търсене',
+ 'SearchTitle' => 'Показване само на филми, отговарящи на предишните критерии',
+ 'AllButton' => 'Вскички',
+ 'AllTitle' => 'Показване на всички филми',
+ 'Expand' => 'Разшири всички',
+ 'ExpandTitle' => 'Показване на цялата информация за филми',
+ 'Collapse' => 'Сгъване на всички',
+ 'CollapseTitle' => 'Сгъване на цялата информация за филми',
+ 'Borrowed' => 'Взет от: ',
+ 'NotBorrowed' => 'Наличен',
+ 'Top' => 'Горна част',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/BG/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..49ecb10
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::BG::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/BG/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..159da90
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::BG::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Включително DROP инструкция',
+ 'WithCreate' => 'Включително CREATE инструкция',
+ 'TableName' => 'Име на таблица',
+ 'InfoFile' => 'SQL файл: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/BG/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..12f70bc
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::BG::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Архивът е във файл: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/BG/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..c84e405
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::BG::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Файл-шаблон',
+ 'ModelText' => 'Текст на шаблон',
+ 'Models' => 'Шаблон за използване',
+ 'UseFile' => 'Използване на файл',
+ 'UseModel' => 'Използване на текстова област',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/BG/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..8fc4750
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::BG::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Where should it search',
+ 'Default' => 'Default Alexandria\'s directory',
+ 'Specified' => 'Directory specified below',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/BG/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..3c4b98d
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCImport/GCImportCSV.pm
@@ -0,0 +1,43 @@
+{
+ package GCLang::BG::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Игнориране на първия ред',
+ 'Separator' => 'Разделител',
+ 'Plugin' => 'Сайт, който да бъде използван',
+ 'UseFirst' => 'Избер на първия ако има много резултати',
+ 'SearchField' => 'Search for items using',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/BG/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..be9e59d
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::BG::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/BG/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..d3bd629
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::BG::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copy pictures',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCImport/GCImportList.pm b/lib/gcstar/GCLang/BG/GCImport/GCImportList.pm
new file mode 100644
index 0000000..608aee9
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::BG::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Списък заглавия',
+ 'Plugin' => 'Сайт, който да бъде използван',
+ 'UseFirst' => 'Избер на първия ако има много резултати',
+ 'CommentAuto' => 'Филмът е импортиран автоматично.',
+ 'CommentSite' => 'Уеб-сайт: ',
+ 'CommentTitle' => 'Заглавие: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/BG/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..3ec57b5
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::BG::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/BG/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..657f7af
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::BG::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Файлът не е Tellico видео колекция',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/BG/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..b250f4a
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::BG::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/BG/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..f95dc9e
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::BG::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/BG/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..4426ac9
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::BG::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCbooks.pm b/lib/gcstar/GCLang/BG/GCModels/GCbooks.pm
new file mode 100644
index 0000000..a401bbd
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCbooks.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::BG::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Books collection',
+ Items => 'Books',
+ NewItem => 'New book',
+
+ Isbn => 'ISBN',
+ Title => 'Title',
+ Cover => 'Cover',
+ Authors => 'Authors',
+ Publisher => 'Publisher',
+ Publication => 'Publication date',
+ Language => 'Language',
+ Genre => 'Genre',
+ Serie => 'Колекция',
+ Rank => 'Ранг',
+ Bookdescription => 'Description',
+ Pages => 'Pages',
+ Read => 'Read',
+ Acquisition => 'Acquisition date',
+ Edition => 'Edition',
+ Format => 'Format',
+ Comments => 'Comments',
+ Url => 'Web page',
+ Translator => 'Translator',
+ Artist => 'Artist',
+ DigitalFile => 'Digital version',
+
+ General => 'General',
+ Details => 'Details',
+
+ ReadNo => 'Not read',
+ ReadYes => 'Read',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCcoins.pm b/lib/gcstar/GCLang/BG/GCModels/GCcoins.pm
new file mode 100644
index 0000000..fbdade6
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCcoins.pm
@@ -0,0 +1,102 @@
+{
+ package GCLang::BG::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Numismatic collection',
+ Items => 'Coins',
+ NewItem => 'New coin',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Currency => 'Currency',
+ Value => 'Value',
+ Picture => 'Main picture',
+ Diameter => 'Diameter',
+ Metal => 'Metal',
+ Edge => 'Edge',
+ Edge1 => 'Edge 1',
+ Edge2 => 'Edge 2',
+ Edge3 => 'Edge 3',
+ Edge4 => 'Edge 4',
+ Head => 'Head',
+ Tail => 'Tail',
+ Comments => 'Comments',
+ History => 'History',
+ Website => 'Website',
+ Estimate => 'Estimate',
+ References => 'References',
+ Type => 'Type',
+ Coin => 'Coin',
+ Banknote => 'Bank note',
+
+ Main => 'Main',
+ Description => 'Description',
+ Other => 'Other information',
+ Pictures => 'Pictures',
+
+ Condition => 'Condition (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCcomics.pm b/lib/gcstar/GCLang/BG/GCModels/GCcomics.pm
new file mode 100644
index 0000000..a0f8aba
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::BG::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCfilms.pm b/lib/gcstar/GCLang/BG/GCModels/GCfilms.pm
new file mode 100644
index 0000000..b8014e3
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCfilms.pm
@@ -0,0 +1,91 @@
+{
+ package GCLang::BG::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Movies collection',
+ Items => 'Филми',
+ NewItem => 'Нов филм',
+
+
+ Id => 'Id',
+ Title => 'Заглавие',
+ Date => 'Дата',
+ Time => 'Продължителност',
+ Director => 'Режисьор',
+ Country => 'Държава',
+ MinimumAge => 'Минимална възраст',
+ Genre => 'Жанр',
+ Image => 'Изображение',
+ Original => 'Оригинално заглавие',
+ Actors => 'Участват',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'Коментари',
+ Synopsis => 'Резюме',
+ Seen => 'Гледан',
+ Number => '# на медии',
+ Format => 'Тип медия',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'Уеб',
+ Audio => 'Аудио',
+ Video => 'Видео формат',
+ Trailer => 'Видео файл',
+ Serie => 'Колекция',
+ Rank => 'Ранг',
+ Subtitles => 'Субтитри',
+
+ SeenYes => 'Показани',
+ SeenNo => 'Непоказани',
+
+ AgeUnrated => 'Без рейтинг',
+ AgeAll => 'Всички възрасти',
+ AgeParent => 'Ръководство на родителя',
+
+ Main => 'Основни',
+ General => 'Общи',
+ Details => 'Детайли',
+
+ Information => 'Информация',
+ Languages => 'Езици',
+ Encoding => 'Кодиране',
+
+ FilterAudienceAge => 'Зрителска възраст',
+ FilterSeenNo => '_Още не показани',
+ FilterSeenYes => '_Already Viewed',
+ FilterRatingSelect => 'Рейтинг най-малко...',
+
+ ExtractSize => 'Размер',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCgames.pm b/lib/gcstar/GCLang/BG/GCModels/GCgames.pm
new file mode 100644
index 0000000..f43aec9
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCgames.pm
@@ -0,0 +1,80 @@
+{
+ package GCLang::BG::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Video games collection',
+ Items => 'Games',
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Players => 'Number of players',
+ Released => 'Release Date',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Genre => 'Genre',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instructions manual',
+ Completion => 'Completion (%)',
+ Executable => 'Executable',
+ Description => 'Description',
+ Codes => 'Codes',
+ Code => 'Code',
+ Effect => 'Effect',
+ Secrets => 'Secrets',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ Unlockables => 'Unlockables',
+ Unlockable => 'Unlockable',
+ Howto => 'How to unlock',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'General',
+ Details => 'Details',
+ Tips => 'Tips',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/BG/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..1ae618a
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::BG::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCminicars.pm b/lib/gcstar/GCLang/BG/GCModels/GCminicars.pm
new file mode 100644
index 0000000..1491f8d
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::BG::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCmusics.pm b/lib/gcstar/GCLang/BG/GCModels/GCmusics.pm
new file mode 100644
index 0000000..b55b554
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCmusics.pm
@@ -0,0 +1,66 @@
+{
+ package GCLang::BG::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Music collection',
+ Items => 'Albums',
+ NewItem => 'New album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Title',
+ Cover => 'Cover',
+ Artist => 'Artist',
+ Format => 'Format',
+ Running => 'Running time',
+ Release => 'Release date',
+ Genre => 'Genre',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Tracks list',
+ Number => 'Number',
+ Track => 'Title',
+ Time => 'Time',
+
+ Composer => 'Composer',
+ Producer => 'Producer',
+ Playlist => 'Playlist',
+ Comments => 'Comments',
+ Label => 'Label',
+ Url => 'Web page',
+
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/BG/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..47d7faa
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::BG::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/BG/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..7b5f440
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::BG::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/BG/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..05d869c
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::BG::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCstamps.pm b/lib/gcstar/GCLang/BG/GCModels/GCstamps.pm
new file mode 100644
index 0000000..1349d1d
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::BG::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCwines.pm b/lib/gcstar/GCLang/BG/GCModels/GCwines.pm
new file mode 100644
index 0000000..2131d9a
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::BG::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Wines collection',
+ Items => 'Wines',
+ NewItem => 'New wine',
+
+ Name => 'Name',
+ Designation => 'Designation',
+ Vintage => 'Vintage',
+ Vineyard => 'Vineyard',
+ Type => 'Type',
+ Grapes => 'Grapes',
+ Soil => 'Soil',
+ Producer => 'Producer',
+ Country => 'Country',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medal/Honour',
+
+ Storage => 'Storage',
+ Location => 'Location',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantity',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Purchase date',
+ PurchasePrice => 'Purchase price',
+ Gift => 'Gift',
+ BottleLabel => 'Bottle label',
+ Website => 'Reference on the web',
+
+ Tasted => 'Tasted',
+ Comments => 'Comments',
+ Serving => 'Serving',
+ TastingField => 'Testing notes',
+
+ General => 'General',
+ Details => 'Details',
+ Tasting => 'Tasting',
+
+ TastedNo => 'Non tasted',
+ TastedYes => 'Tasted',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Not yet tasted',
+ FilterTastedYes => 'Already _tasted',
+ FilterRatingSelect => 'Rating at _least...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCstar.pm b/lib/gcstar/GCLang/BG/GCstar.pm
new file mode 100644
index 0000000..17d1e5a
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCstar.pm
@@ -0,0 +1,674 @@
+{
+ package GCLang::BG;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Bulgarian',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Внимание</b>:
+
+Информация, свалена от уеб-страници (чрез приставките за търсене) е
+ <b>само за лично ползване</b>.
+
+Всякакво разпространение е забранено без <b>изричното съгласие</b>
+на собствениците на страницата.
+
+За да определите коя страница притежава информацията, можете
+да използвате <b>бутона под детайлите на филма</b>.',
+
+ 'AllItemsFiltered' => 'Няма филм, отговарящ на критериите ви за търсене', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Инсталиране в ',
+ 'InstallMandatory' => 'Задължителни компоненти',
+ 'InstallOptional' => 'Незадължителни компоненти',
+ 'InstallErrorMissing' => 'Грешка : Следните Perl компоненти следва да се инсталират: ',
+ 'InstallPrompt' => 'Основна директория за инсталиране [/usr/local]: ',
+ 'InstallEnd' => 'Край на инсталацията',
+ 'InstallNoError' => 'Няма възникнали грешки',
+ 'InstallLaunch' => 'За да използвате приложението, можете да стартирате ',
+ 'InstallDirectory' => 'Базова директория',
+ 'InstallTitle' => 'GCstar инсталация',
+ 'InstallDependencies' => 'Зависимости',
+ 'InstallPath' => 'Пътека',
+ 'InstallOptions' => 'Настройки',
+ 'InstallSelectDirectory' => 'Изберете базова директория за инсталация',
+ 'InstallWithClean' => 'Премахване на файлове в инстлационната директория',
+ 'InstallWithMenu' => 'Добавяне на GCstar в менюто',
+ 'InstallNoPermission' => 'Грешка: Нямате права за писане в избраната директория',
+ 'InstallMissingMandatory' => 'Липсват задължителни модули. Няма да сте в състояние да инсталирате GCstar преди те да бъдат добавени на вашата система.',
+ 'InstallMissingOptional' => 'Някои незадължителни зависимости липсват. Техния списък е предоставен по-долу. GCstar може да бъде инсталиран, но някои негови функции няма да бъдат налични.',
+ 'InstallMissingNone' => 'Няма липсващи зависимости. Можете да продължите с инсталацията на GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Липсващ',
+ 'InstallMissingFor' => 'Липсващ за',
+ 'InstallCleanDirectory' => 'Removing GCstar\'s files in directory: ',
+ 'InstallCopyDirectory' => 'Copying files in directory: ',
+ 'InstallCopyDesktop' => 'Copying desktop file in: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy to use (just press enter if none): ',
+ 'UpdateNoPermission' => 'Write permission denied in this directory: ',
+ 'UpdateNone' => 'No update have been found',
+ 'UpdateFileNotFound' => 'File not found',
+
+#Splash
+ 'SplashInit' => 'Инициализация',
+ 'SplashLoad' => 'Зареждане на колекцията',
+ 'SplashDisplay' => 'Displaying Collection',
+ 'SplashSort' => 'Sorting Collection',
+ 'SplashDone' => 'Готово',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'It seems you were using GCfilms before. What do you want to import from GCfilms to GCstar (it won\'t impact GCfilms if you still want to use it)?',
+ 'GCfilmsImportOptions' => 'Settings',
+ 'GCfilmsImportData' => 'Movies list',
+
+#Menus
+ 'MenuFile' => '_Файл',
+ 'MenuNewList' => '_Нова колекция',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_Скоро използвани колекции',
+ 'MenuLend' => 'Показване на заети филми', # Accepts model codes
+ 'MenuImport' => '_Импорт',
+ 'MenuExport' => '_Експорт',
+ 'MenuAddItem' => '_Add Item', # Accepts model codes
+
+ 'MenuEdit' => '_Редактиране',
+ 'MenuDuplicate' => '_Дубликат на филм', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Премахване на филм', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Change collection fields',
+ 'MenuEditLockItems' => '_Заключване на колекция',
+
+ 'MenuDisplay' => 'Ф_илтър',
+ 'MenuSavedSearches' => 'Saved searches',
+ 'MenuSavedSearchesSave' => 'Save current search',
+ 'MenuSavedSearchesEdit' => 'Modify saved searches',
+ 'MenuAdvancedSearch' => 'A_dvanced Search',
+ 'MenuViewAllItems' => 'Показване на _всички филми', # Accepts model codes
+ 'MenuNoFilter' => '_Всякакъв',
+
+ 'MenuConfiguration' => '_Настройки',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Показана информация',
+ 'MenuBorrowers' => '_Наематели',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Конвертиране на жанр',
+
+ 'MenuBookmarks' => 'My _Collections',
+ 'MenuBookmarksAdd' => '_Add current collection',
+ 'MenuBookmarksEdit' => '_Edit bookmarked collections',
+
+ 'MenuHelp' => '_Помощ',
+ 'MenuHelpContent' => '_Помощ',
+ 'MenuAllPlugins' => 'View _plugins',
+ 'MenuBugReport' => 'Report a _bug',
+ 'MenuAbout' => '_Относно GCstar',
+
+ 'MenuNewWindow' => 'Показване на филм в _Нов Прозорец', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Expand all',
+ 'ContextCollapseAll' => 'Collapse all',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Please enter value',
+
+ 'RemoveConfirm' => 'Сигурни ли сте, че желаето премахването на филма?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+
+ 'DefaultNewItem' => 'New item', # Accepts model codes
+ 'NewItemTooltip' => 'Добавяне на нов филм', # Accepts model codes
+ 'NoItemFound' => 'Не е намерен филм. Желаети ли търсене в друг сайт?',
+ 'OpenList' => 'Моля изберете колекция',
+ 'SaveList' => 'Моля изберете къде да се съхрани колекцията',
+ 'SaveListTooltip' => 'Съхраняване на текуща колекция',
+ 'SaveUnsavedChanges' => 'There are unsaved changes in your collection. Do you want to save them?',
+ 'SaveDontSave' => 'Don\'t save',
+ 'PreferencesTooltip' => 'Установете предпочитанията си',
+ 'ViewTooltip' => 'Промяна на изгледа на колекция',
+ 'PlayTooltip' => 'Възпроизвеждане на видео, асоцииран с филм', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Saving...',
+ 'StatusLoad' => 'Loading...',
+ 'StatusSearch' => 'Извършва се търсене...',
+ 'StatusGetInfo' => 'Получаване на информация...',
+ 'StatusGetImage' => 'Получаване на изображение...',
+
+ 'SaveError' => 'Списъкът с филми не може да бъде съхранен . Моля проверете правата за достъп и наличното дисково пространство.',
+ 'OpenError' => 'Списъкът с филми не може да бъде отворен. Моля проверенте правата за достъп.',
+ 'OpenFormatError' => 'Списъкът с филми не може да бъде отворен.',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'Избраната директория за съхраняване на изображения не е коректна. Моля изберете друга.',
+ 'OptionsCreationError'=> 'Файлът с настройки не може да бъде създаден: ',
+ 'OptionsOpenError'=> 'Файлът с настройки не може да бъде отворен: ',
+ 'OptionsSaveError'=> 'Файлът с настройки не може да бъде съхранен:',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'Какво да се гледа тази вечер?',
+ 'RandomError'=> 'Няме филми, които да не сте гледали', # Accepts model codes
+ 'RandomEnd'=> 'Няма повече филми', # Accepts model codes
+ 'RandomNextTip'=> 'Следващо предложение',
+ 'RandomOkTip'=> 'Приемане на този филм',
+
+ 'AboutTitle' => 'Относно GCstar',
+ 'AboutDesc' => 'Gtk2 каталог на филми',
+ 'AboutVersion' => 'Версия',
+ 'AboutTeam' => 'Екип',
+ 'AboutWho' => 'Christian Jodar (Tian): Мениджър на проекта, Програмист
+Nyall Dawson (Zombiepig): Програмист
+TPF: Програмист
+Adolfo González: Програмист
+',
+
+ 'AboutLicense' => 'Разпространява се под условията на GNU GPL
+Автор на логото le Spektre',
+ 'AboutTranslation' => 'Българският превод е направен от Филип Андонов',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Лого и дизайн на страницата от le Spektre',
+
+ 'ToolbarRandom' => 'Довечера',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+ 'ModelsSelect' => 'Select a collection type',
+ 'ModelsPersonal' => 'Personal models',
+ 'ModelsDefault' => 'Default models',
+ 'ModelsList' => 'Collection definition',
+ 'ModelSettings' => 'Collection settings',
+ 'ModelNewType' => 'New collection type',
+ 'ModelName' => 'Name of the collection type:',
+ 'ModelFields' => 'Fields',
+ 'ModelOptions' => 'Options',
+ 'ModelFilters' => 'Filters',
+ 'ModelNewField' => 'New field',
+ 'ModelFieldInformation' => 'Information',
+ 'ModelFieldName' => 'Label:',
+ 'ModelFieldType' => 'Type:',
+ 'ModelFieldGroup' => 'Group:',
+ 'ModelFieldValues' => 'Values',
+ 'ModelFieldInit' => 'Default:',
+ 'ModelFieldMin' => 'Minimum:',
+ 'ModelFieldMax' => 'Maximum:',
+ 'ModelFieldList' => 'Values list:',
+ 'ModelFieldListLegend' => '<i>Comma separated</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Short text',
+ 'ModelFieldTypeLongText' => 'Long text',
+ 'ModelFieldTypeYesNo' => 'Yes/No',
+ 'ModelFieldTypeNumber' => 'Number',
+ 'ModelFieldTypeDate' => 'Date',
+ 'ModelFieldTypeOptions' => 'Pre-defined values list',
+ 'ModelFieldTypeImage' => 'Image',
+ 'ModelFieldTypeSingleList' => 'Simple list',
+ 'ModelFieldTypeFile' => 'File',
+ 'ModelFieldTypeFormatted' => 'Dependant on other fields',
+ 'ModelFieldParameters' => 'Parameters',
+ 'ModelFieldHasHistory' => 'Use an history',
+ 'ModelFieldFlat' => 'Display on one line',
+ 'ModelFieldStep' => 'Increment step:',
+ 'ModelFieldFileFormat' => 'File format:',
+ 'ModelFieldFileFile' => 'Simple file',
+ 'ModelFieldFileImage' => 'Image',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Fields to use',
+ 'ModelOptionsFieldsAuto' => 'Automatic',
+ 'ModelOptionsFieldsNone' => 'None',
+ 'ModelOptionsFieldsTitle' => 'As title',
+ 'ModelOptionsFieldsId' => 'As identifier',
+ 'ModelOptionsFieldsCover' => 'As cover',
+ 'ModelOptionsFieldsPlay' => 'For Play button',
+ 'ModelCollectionSettings' => 'Collection settings',
+ 'ModelCollectionSettingsLending' => 'Items could be borrowed',
+ 'ModelCollectionSettingsTagging' => 'Items can be tagged',
+ 'ModelFilterActivated' => 'Should be in search box',
+ 'ModelFilterComparison' => 'Comparison',
+ 'ModelFilterContain' => 'Contains',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Range',
+ 'ModelFilterNumeric' => 'Comparison is numeric',
+ 'ModelFilterQuick' => 'Create a quick filter',
+ 'ModelTooltipName' => 'Use a name to re-use this model for many collections. If empty, the settings will be directly stored in the collection itself',
+ 'ModelTooltipLabel' => 'The field name as it will be displayed',
+ 'ModelTooltipGroup' => 'Used to group fields. Items with no value here will be in a default group',
+ 'ModelTooltipHistory' => 'Should the previous entered values be stored in a list associated to the field',
+ 'ModelTooltipFormat' => 'This format is used to determine the action to open the file with the Play button',
+ 'ModelTooltipLending' => 'This will add some fields to manage lendings',
+ 'ModelTooltipTagging' => 'This will add some fields to manage tags',
+ 'ModelTooltipNumeric' => 'Should the values be consider as numbers for comparison',
+ 'ModelTooltipQuick' => 'This will add a submenu in the Filters one',
+
+ 'ResultsTitle' => 'Избор на филм', # Accepts model codes
+ 'ResultsNextTip' => 'Търсене в следващ сайт',
+ 'ResultsPreview' => 'Preview',
+ 'ResultsInfo' => 'You can add multiple items to the collection by holding down the Ctrl or the Shift key and selecting them', # Accepts model codes
+
+ 'OptionsTitle' => 'Предпочитания',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Уеб-четец',
+ 'OptionsPlayer' => 'Видео плеър',
+ 'OptionsAudio' => 'Audio player',
+ 'OptionsImageEditor' => 'Image Editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Директория с изображения',
+ 'OptionsUseRelativePaths' => 'Използване на относителни пътеки към изображения',
+ 'OptionsLayout' => 'Оформление',
+ 'OptionsStatus' => 'Показване на статус-лента',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Внимание: Промените няма да имат ефект докато приложението не бъде рестартирано.',
+ 'OptionsRemoveConfirm' => 'Изисване на потвърждение преди изтриване',
+ 'OptionsAutoSave' => 'Автоматично съхраняване на колекция',
+ 'OptionsAutoLoad' => 'Load previous collection on startup',
+ 'OptionsSplash' => 'Показване на splash екран',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Use spelling checker for long text fields',
+ 'OptionsProgramTitle' => 'Избор на програма, която да бъде използвана',
+ 'OptionsPlugins' => 'Сайтове, от които да се получава информация',
+ 'OptionsAskPlugins' => 'Питане (Всички сайтове)',
+ 'OptionsPluginsMulti' => 'Много сайтове',
+ 'OptionsPluginsMultiAsk' => 'Питане (Много сайтове)',
+ 'OptionsPluginsMultiPerField' => 'Много сайтове (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Установяване на списък',
+ 'OptionsAskImport' => 'Избор на полета, които да бъдат импортирани',
+ 'OptionsProxy' => 'Използване на proxy',
+ 'OptionsCookieJar' => 'Use this cookie jar file',
+ 'OptionsLang' => 'Език',
+ 'OptionsMain' => 'Основен',
+ 'OptionsPaths' => 'Пътеки',
+ 'OptionsInternet' => 'Интернет',
+ 'OptionsConveniences' => 'Свойства',
+ 'OptionsDisplay' => 'Дисплей',
+ 'OptionsToolbar' => 'Лента с инструменти',
+ 'OptionsToolbars' => {0 => 'Без', 1 => 'Малък', 2 => 'Голям', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'Позиция',
+ 'OptionsToolbarPositions' => {0 => 'Горе', 1 => 'Долу', 2 => 'Ляво', 3 => 'Дясно'},
+ 'OptionsExpandersMode' => 'Expanders too long',
+ 'OptionsExpandersModes' => {'asis' => 'Do nothing', 'cut' => 'Cut', 'wrap' => 'Line wrap'},
+ 'OptionsDateFormat' => 'Date Format',
+ 'OptionsDateFormatTooltip' => 'Format is the one used by strftime(3). Default is %d/%m/%Y',
+ 'OptionsView' => 'Дисплей',
+ 'OptionsViews' => {0 => 'Техт', 1 => 'Изображение', 2 => 'Детайлно'},
+ 'OptionsColumns' => 'Колони',
+ 'OptionsMailer' => 'Програма за електронна поща',
+ 'OptionsSMTP' => 'Сървър',
+ 'OptionsFrom' => 'Вашият адрес',
+ 'OptionsTransform' => 'Поставяне на статиите в края на заглавията',
+ 'OptionsArticles' => 'Статии (Разделени със запетая)',
+ 'OptionsSearchStop' => 'Позволяване прекъсване на търсенето',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'Използване на основното заглавие ако оригиналното не е представено',
+ 'OptionsRestoreAccelerators' => 'Restore accelerators',
+ 'OptionsHistory' => 'Размер на историята',
+ 'OptionsClearHistory' => 'Изчистване на историята',
+ 'OptionsStyle' => 'Кожа',
+ 'OptionsDontAsk' => 'Не питай повече',
+ 'OptionsPathProgramsGroup' => 'Applications',
+ 'OptionsProgramsSystem' => 'Use programs defined by system',
+ 'OptionsProgramsUser' => 'Use specified programs',
+ 'OptionsProgramsSet' => 'Set programs',
+ 'OptionsPathImagesGroup' => 'Images',
+ 'OptionsInternetDataGroup' => 'Data import',
+ 'OptionsInternetSettingsGroup' => 'Settings',
+ 'OptionsDisplayInformationGroup' => 'Information display',
+ 'OptionsDisplayArticlesGroup' => 'Articles',
+ 'OptionsImagesDisplayGroup' => 'Display',
+ 'OptionsImagesStyleGroup' => 'Style',
+ 'OptionsDetailedPreferencesGroup' => 'Preferences',
+ 'OptionsFeaturesConveniencesGroup' => 'Conveniences',
+ 'OptionsPicturesFormat' => 'Prefix to use for pictures:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Title or name of the associated item',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% or . will be replaced with collection directory (use only on beginning of path)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% will be replaced by collection file name without suffix (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% could only be used on the beginning of the path for pictures',
+ 'OptionsConfigureMailers' => 'Configure mailing programs',
+
+ 'ImagesOptionsButton' => 'Настройки',
+ 'ImagesOptionsTitle' => 'Настройки за списък с изображения',
+ 'ImagesOptionsSelectColor' => 'Избор на цвят',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Фон',
+ 'ImagesOptionsBgPicture' => 'Използване на изображение за фон',
+ 'ImagesOptionsFg'=> 'Избор',
+ 'ImagesOptionsBgTooltip' => 'Промяна на фонов цвят',
+ 'ImagesOptionsFgTooltip'=> 'Промяна на избран цвят',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Размер',
+ 'ImagesOptionsSizeList' => {0 => 'Много малък', 1 => 'Малък', 2 => 'Среден', 3 => 'Голям', 4 => 'Много голям'},
+ 'ImagesOptionsSizeTooltip' => 'Избор на размер на изображение',
+
+ 'DetailedOptionsTitle' => 'Настройки за детайлен списък',
+ 'DetailedOptionsImageSize' => 'Размер на изображение',
+ 'DetailedOptionsGroupItems' => 'Group items by',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'ИЗбор на приятели за показване',
+ 'DetailedOptionsGroupedFirst' => 'Keep together orphaned items',
+ 'DetailedOptionsAddCount' => 'Add number of elements on categories',
+
+ 'ExtractButton' => 'Информация',
+ 'ExtractTitle' => 'Информация за видео файл',
+ 'ExtractImport' => 'Използване на стойности',
+
+ 'FieldsListOpen' => 'Load a fields list from a file',
+ 'FieldsListSave' => 'Save fields list to a file',
+ 'FieldsListError' => 'This fields list cannot be used with this kind of collection',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Експортиране на списък с филми',
+ 'ExportFilter' => 'Експортиране само на показани филми',
+ 'ExportFieldsTitle' => 'Полета, които да бъдат експортирани',
+ 'ExportFieldsTip' => 'Избор на полета, които да бъдат експортирани',
+ 'ExportWithPictures' => 'Копиране на изображенията в под-директория',
+ 'ExportSortBy' => 'Sort by',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Импортиране на друг списък с филми',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'Файл',
+ 'ImportExportFieldsUnused' => 'Неизползвани полета',
+ 'ImportExportFieldsUsed' => 'Използвани полета',
+ 'ImportExportFieldsFill' => 'Добавяне на всички',
+ 'ImportExportFieldsClear' => 'Премахване на всички',
+ 'ImportExportFieldsEmpty' => 'Необходимо е да изберете поне едно поле',
+ 'ImportExportFileEmpty' => 'Необходимо е да определите име на файл',
+ 'ImportFieldsTitle' => 'Полета, които да бъдат импортирани',
+ 'ImportFieldsTip' => 'Избор на полета, които желаете да бъдат импортирани',
+ 'ImportNewList' => 'Създаване на нова колекция',
+ 'ImportCurrentList' => 'Добавяне към текущата колекция',
+ 'ImportDropError' => 'There was an error opening at least one file. Previous list will be reloaded.',
+ 'ImportGenerateId' => 'Generate identifier for each item',
+
+ 'FileChooserOpenFile' => 'Моля изберете друг файл',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Избор на директория',
+ 'FileChooserOverwrite' => 'Този файл вече съществува. Желаете ли презапис?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ 'PanelCompact' => 'Компактен',
+ 'PanelReadOnly' => 'Само за четене',
+ 'PanelForm' => 'Табове',
+
+ 'PanelSearchButton' => 'Добиване на информация',
+ 'PanelSearchTip' => 'Търсене в уеб за информация относно това заглавие',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Щракнете върху изображението за да изберете друго.',
+ 'PanelImageTipView' => 'Click on the picture to view it in real size.',
+ 'PanelImageTipMenu' => ' Десен бутон за повече възможности.',
+ 'PanelImageTitle' => 'Избор на изображение',
+ 'PanelImageNoImage' => 'No image',
+ 'PanelSelectFileTitle' => 'Избор на файл',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restore default',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'From',
+ 'PanelTo' =>'To',
+
+ 'PanelWeb' => 'Показване на информация',
+ 'PanelWebTip' => 'Показване на информация от уеб за този филм', # Accepts model codes
+ 'PanelRemoveTip' => 'Премахване на текущ филм', # Accepts model codes
+
+ 'PanelDateSelect' => 'Избор на дата',
+ 'PanelNobody' => 'Никой',
+ 'PanelUnknown' => 'Неизвестен',
+ 'PanelAdded' => 'Add date',
+ 'PanelRating' => 'Рейтинг',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Местоположение',
+
+ 'PanelLending' => 'Заемане',
+ 'PanelBorrower' => 'Взел',
+ 'PanelLendDate' => 'Не е наличен от',
+ 'PanelHistory' => 'История на заемането',
+ 'PanelReturned' => 'Върнат филм', # Accepts model codes
+ 'PanelReturnDate' => 'Дата на връщане',
+ 'PanelLendedYes' => 'Даден',
+ 'PanelLendedNo' => 'Наличен',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favourite',
+ 'TagsAssigned' => 'Assigned Tags',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Без значение',
+ 'CheckYes' => 'Да',
+ 'CheckNo' => 'Не',
+
+ 'ToolbarAll' => 'Показване на всички',
+ 'ToolbarAllTooltip' => 'Показване на всички филми',
+ 'ToolbarGroupBy' => 'Group by',
+ 'ToolbarGroupByTooltip' => 'Select the field to use to group items in list',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Търсене на филм',
+ 'PluginsQuery' => 'Query',
+ 'PluginsFrame' => 'Сайт за търсене',
+ 'PluginsLogo' => 'Лого',
+ 'PluginsName' => 'Име',
+ 'PluginsSearchFields' => 'Search fields',
+ 'PluginsAuthor' => 'Автор',
+ 'PluginsLang' => 'Език',
+ 'PluginsUseSite' => 'Използване на избрания сайт за бъдещи търсения',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Конфигуриране на наемателя',
+ 'BorrowersList' => 'Наематели',
+ 'BorrowersName' => 'Име',
+ 'BorrowersEmail' => 'Е-поща',
+ 'BorrowersAdd' => 'Добавяне',
+ 'BorrowersRemove' => 'Премахване',
+ 'BorrowersEdit' => 'Редактиране',
+ 'BorrowersTemplate' => 'Шаблон за писмо',
+ 'BorrowersSubject' => 'Заглавие на писмото',
+ 'BorrowersNotice1' => '%1 ще бъде заменено с името на наемателя',
+ 'BorrowersNotice2' => '%2 ще бъде заменено със заглавието на филма',
+ 'BorrowersNotice3' => '%3 ще бъде заменено с датата на заемане',
+
+ 'BorrowersImportTitle' => 'Import borrowers information',
+ 'BorrowersImportType' => 'File format:',
+ 'BorrowersImportFile' => 'File:',
+
+ 'BorrowedTitle' => 'Дадени филми', # Accepts model codes
+ 'BorrowedDate' => 'От',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'Изпращане на е-поща',
+ 'MailFrom' => 'От: ',
+ 'MailTo' => 'До: ',
+ 'MailSubject' => 'Заглавие: ',
+ 'MailSmtpError' => 'Проблем при свързване със SMTP сървър',
+ 'MailSendmailError' => 'Проблем при стартиране на sendmail',
+
+ 'SearchTooltip' => 'Търсене на всички филми', # Accepts model codes
+ 'SearchTitle' => 'Търсене на филм', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Field to replace',
+ 'QueryReplaceOld' => 'Текущо име',
+ 'QueryReplaceNew' => 'Ново име',
+ 'QueryReplaceLaunch' => 'Replace',
+
+ 'ImportWindowTitle' => 'Избор на приятели, които да бъдат импортирани',
+ 'ImportViewPicture' => 'Показване на изображение',
+ 'ImportSelectAll' => 'Избор на всички',
+ 'ImportSelectNone' => 'Премахване на избор',
+
+ 'MultiSiteTitle' => 'Сайтове които да бъдат използвани за търсене',
+ 'MultiSiteUnused' => 'Неизползвани приставки',
+ 'MultiSiteUsed' => 'Приставки, които да бъдат използвани',
+ 'MultiSiteLang' => 'Попълване на списъка с английски приставки',
+ 'MultiSiteEmptyError' => 'Вие имате празен списък със сайтове',
+ 'MultiSiteClear' => 'Изчистване на списъка',
+
+ 'DisplayOptionsTitle' => 'Неща за показване',
+ 'DisplayOptionsAll' => 'Избор на всички',
+ 'DisplayOptionsSearch' => 'Бутон за търсене',
+
+ 'GenresTitle' => 'Конвертиране на жанр',
+ 'GenresCategoryName' => 'Използване на жанр',
+ 'GenresCategoryMembers' => 'Жанр за подмяна',
+ 'GenresLoad' => 'Зареждане на списък',
+ 'GenresExport' => 'Съхраняване на списък във файл',
+ 'GenresModify' => 'Редактиране на конвертирането',
+
+ 'PropertiesName' => 'Collection name',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Owner',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => 'Description',
+ 'PropertiesFile' => 'File Information',
+ 'PropertiesFilePath' => 'Full path',
+ 'PropertiesItemsNumber' => 'Number of items', # Accepts model codes
+ 'PropertiesFileSize' => 'Size',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Collection properties',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Programs for mail sending',
+ 'MailProgramsName' => 'Name',
+ 'MailProgramsCommand' => 'Command line',
+ 'MailProgramsRestore' => 'Restore defaults',
+ 'MailProgramsAdd' => 'Add a program',
+ 'MailProgramsInstructions' => 'In command line, some substitutions are made:
+ %f is replaced with user\'s e-mail address.
+ %t is replaced with the recipient address.
+ %s is replaced with the subject of the message.
+ %b is replaced with the body of the message.',
+
+ 'BookmarksBookmarks' => 'Bookmarks',
+ 'BookmarksFolder' => 'Directory',
+ 'BookmarksLabel' => 'Label',
+ 'BookmarksPath' => 'Path',
+ 'BookmarksNewFolder' => 'New folder',
+
+ 'AdvancedSearchType' => 'Type of search',
+ 'AdvancedSearchTypeAnd' => 'Items matching all criteria', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Items matching at least one criterion', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criteria',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Bug report generated from GCstar',
+ 'BugReportVersion' => 'Version',
+ 'BugReportPlatform' => 'Operating system',
+ 'BugReportMessage' => 'Error message',
+ 'BugReportInformation' => 'Additional information',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/CA/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/CA/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..5fff8e4
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::CA::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Inclou els noms dels camps a sobre',
+ 'Separator' => 'Delimitador',
+ 'Replacement' => 'Substitueix el delimitador amb',
+ 'Charset' => 'Joc de caràcters',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/CA/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..d91a1fd
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::CA::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/CA/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..36a86f5
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::CA::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Fitxer de plantilla invàlid',
+ 'UseFile' => 'Utilitza el fitxer especificat abaix',
+ 'TemplateExternalFile' => 'Fitxer de plantilla',
+ 'WithJS' => 'Utilitza Javascript',
+ 'FileTemplate' => 'Plantilla:',
+ 'Preview' => 'Vista prèvia',
+ 'NoPreview' => 'Vista prèvia no disponible',
+ 'Title' => 'Títol de la pàgina',
+ 'InfoFile' => 'El llistat de les pel·lícules es troba a l\'arxiu: ',
+ 'InfoDir' => 'Les imatges es troben a: ',
+ 'HeightImg' => 'Alçada en píxels de les imatges a exportar: ',
+ 'OpenFileInBrowser' => 'Obri el fitxer generat en el navegador web',
+ 'Note' => 'Llistat generat amb <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Introduíeu el text a cercar',
+ 'SearchType1' => 'Només el Títol',
+ 'SearchType2' => 'Tota la informació',
+ 'SearchButton' => 'Cerca',
+ 'SearchTitle' => 'Mostra només les pel·lícules coincidents amb els criteris anteriors',
+ 'AllButton' => 'Totes',
+ 'AllTitle' => 'Mostra totes les pel·lícules',
+ 'Expand' => 'Tots desplegats',
+ 'ExpandTitle' => 'Mostrar la informació de totes les pel·lícules',
+ 'Collapse' => 'Tots plegats',
+ 'CollapseTitle' => 'Oculta la informació de totes les pel·lícules',
+ 'Borrowed' => 'Prestatari: ',
+ 'NotBorrowed' => 'Disponible',
+ 'Top' => 'Amunt',
+ 'Bottom' => 'Devall',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/CA/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..8297c90
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::CA::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Nom de la base de dades',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/CA/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..e5b7683
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::CA::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Inclou una instrucció DROP',
+ 'WithCreate' => 'Inclou una instrucció CREATE',
+ 'TableName' => 'Nom de la taula',
+ 'InfoFile' => 'Fitxer SQL: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/CA/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..d907044
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::CA::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'L\'arxiu .tar.gz es troba a: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/CA/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..129377c
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::CA::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Fitxer plantilla',
+ 'ModelText' => 'Text de plantilla',
+ 'Models' => 'Plantilla a utilitzar',
+ 'UseFile' => 'Utilitza el fitxer',
+ 'UseModel' => 'Utilitza la zona de text',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/CA/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..9a14b8f
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::CA::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'On l\'hauria de cercar',
+ 'Default' => 'Directori predeterminat d\'Alexandria',
+ 'Specified' => 'Directori especificat a sota',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/CA/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..d85084f
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCImport/GCImportCSV.pm
@@ -0,0 +1,43 @@
+{
+ package GCLang::CA::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Joc de caràcters',
+ 'Header' => 'Ignora la primera línia',
+ 'Separator' => 'Delimitador',
+ 'Plugin' => 'Lloc a utilitzar',
+ 'UseFirst' => 'Selecciona el primer si hi ha molts resultats',
+ 'SearchField' => 'Cercar articles mitjançant',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/CA/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..5e17dde
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::CA::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Carpeta',
+ 'Recursive' => 'Navega per sub-carpetes',
+ 'Suffixes' => 'Sufixes o extensions dels fitxers',
+ 'SuffixesTooltip' => 'Una llista separada per comes de sufixes o extensions de fitxters a considerar',
+ 'Remove' => 'Per ser borrats dels noms',
+ 'RemoveTooltip' => 'Una llista separada per comes de paraules que haurien de ser borrades dels noms de fitxers per a crear els noms que es desen',
+ 'Ask'=> 'Pregunta',
+ 'AskEnd'=> 'Pregunta al final',
+ 'AddWithoutInfo'=> 'Afegeix sense informació',
+ 'DontAdd'=> 'No afegeixis',
+ 'TakeFirst' => 'Selecciona primer',
+ 'MultipleResult'=> 'Ignora quan hi ha més d\'un resultat',
+ 'MultipleResultTooltip'=> 'El fitxer s\'afegirà sense recollir la informació si hi ha més d\'un resutat',
+ 'RemoveWholeWord' => 'Elimina només paraules senceres',
+ 'NoResult'=> 'Sense resultats',
+ 'NoResultTooltip'=> 'Què feim quan no es retorna un resultat',
+ 'RemoveTooltipWholeWord' => 'Les paraules s\'eliminaran només si apareixen com paraules senceres',
+ 'RemoveRegularExpr' => 'Expressió regular',
+ 'RemoveTooltipRegularExpr' => 'Es considera que \'Esser eliminat dels noms\' és una expressió regular',
+ 'SkipFileAlreadyInCollection' => 'Només afegeix fitxers nous',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Només afegeix fitxers que encara no estiguin en la col·lecció',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'basat en el camí cencer',
+ 'SkipFileFileName' => 'basat en el nom del fitxer',
+ 'SkipFileFileNameAndUpdate' => 'basat en el nom del fitxer (però actualitza el camí a la col·lecció)',
+ 'InfoFromFileNameRegExp' => 'Analitza el nom de fitxer amb aquesta expressió regular',
+ 'InfoFromFileNameRegExpTooltip' => 'Utilitza aquest per treure informació del nom de fitxer (després d\'eliminar l\'extensió). Deixa-ho buid si no fa falta. Camps coneguts: $T:Títol, $A:Títol alfabetitzat, $Y:Data de sortida, $S:Temporada, $E:Episodi, $N:Nom alfabetitzat de la sèrie , $x:Número de part, $y: Número total de parts',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/CA/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..e1b7eef
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::CA::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copia les imatges',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCImport/GCImportList.pm b/lib/gcstar/GCLang/CA/GCImport/GCImportList.pm
new file mode 100644
index 0000000..ad17559
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::CA::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Llista de noms',
+ 'Plugin' => 'Lloc a utilitzar',
+ 'UseFirst' => 'Selecciona el primer si hi ha molts resultats',
+ 'CommentAuto' => 'Element importat automàticament.',
+ 'CommentSite' => 'Lloc web: ',
+ 'CommentTitle' => 'Títol: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/CA/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..6fe44a9
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::CA::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/CA/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..0d2469c
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::CA::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'El fitxer no és una colecció Tellico compatible',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/CA/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..e8893cf
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCTVepisodes.pm
@@ -0,0 +1,45 @@
+{
+ package GCLang::CA::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ CollectionDescription => 'Col·lecció de sèries (episodis) de TV',
+ Items => 'Episodis',
+ NewItem => 'Nou episodi',
+ NewSeries => 'Nova sèrie',
+ Episode => 'Episodi',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/CA/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..8b80841
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCTVseries.pm
@@ -0,0 +1,55 @@
+{
+ package GCLang::CA::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Col·lecció de sèries de televisió',
+ Items => { 0 => 'Sèries',
+ 1 => 'Sèrie',
+ X => 'Sèries',
+ lowercase1 => 'sèrie',
+ lowercaseX => 'sèries'
+ },
+ NewItem => 'Sèrie nova',
+ Name => 'Nom',
+ Season => 'Temporada',
+ Part => 'Part',
+ Episodes => 'Episodis',
+ FirstAired => 'Primera emissió',
+ Time => 'Durada de l\'episodi',
+ Producer => 'Productor',
+ Music => 'Música',
+ );
+ importTranslation('films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/CA/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..4941aff
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::CA::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCbooks.pm b/lib/gcstar/GCLang/CA/GCModels/GCbooks.pm
new file mode 100644
index 0000000..364eeed
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCbooks.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::CA::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Col·lecció de llibres',
+ Items => 'Llibres',
+ NewItem => 'Nou llibre',
+
+ Isbn => 'ISBN',
+ Title => 'Títol',
+ Cover => 'Coberta',
+ Authors => 'Autors',
+ Publisher => 'Editorial',
+ Publication => 'Data de publicació',
+ Language => 'Idioma',
+ Genre => 'Gènere',
+ Serie => 'Sèrie',
+ Rank => 'Capítol',
+ Bookdescription => 'Descripció',
+ Pages => 'Pàgines',
+ Read => 'Llegit',
+ Acquisition => 'Data d\'adquisició',
+ Edition => 'Edició',
+ Format => 'Format',
+ Comments => 'Comentaris',
+ Url => 'Pàgina Web',
+ Translator => 'Translator',
+ Artist => 'Artist',
+ DigitalFile => 'Digital version',
+
+ General => 'General',
+ Details => 'Detalls',
+
+ ReadNo => 'Sense llegir',
+ ReadYes => 'Llegit',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCcoins.pm b/lib/gcstar/GCLang/CA/GCModels/GCcoins.pm
new file mode 100644
index 0000000..7b9c148
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCcoins.pm
@@ -0,0 +1,102 @@
+{
+ package GCLang::CA::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Col·lecció de monedes',
+ Items => 'Monedes',
+ NewItem => 'Moneda nova',
+
+ Name => 'Nom',
+ Country => 'País',
+ Year => 'Any',
+ Currency => 'Divisa',
+ Value => 'Valor',
+ Picture => 'Imatge principal',
+ Diameter => 'Diàmetre',
+ Metal => 'Metall',
+ Edge => 'Tall',
+ Edge1 => 'Tall 1',
+ Edge2 => 'Tall 2',
+ Edge3 => 'Tall 3',
+ Edge4 => 'Tall 4',
+ Head => 'Cara',
+ Tail => 'Creu',
+ Comments => 'Comentaris',
+ History => 'Història',
+ Website => 'Lloc web',
+ Estimate => 'Estimat',
+ References => 'Referències',
+ Type => 'Tipus',
+ Coin => 'Moneda',
+ Banknote => 'Nota del banc',
+
+ Main => 'Principal',
+ Description => 'Descripció',
+ Other => 'Altra informació',
+ Pictures => 'Imatges',
+
+ Condition => 'Condició (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCcomics.pm b/lib/gcstar/GCLang/CA/GCModels/GCcomics.pm
new file mode 100644
index 0000000..87527e5
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::CA::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCfilms.pm b/lib/gcstar/GCLang/CA/GCModels/GCfilms.pm
new file mode 100644
index 0000000..19dd082
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCfilms.pm
@@ -0,0 +1,93 @@
+{
+ package GCLang::CA::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Col·lecció de pel·lícules',
+ Items => 'Pel·lícules',
+ NewItem => 'Nova pel·lícula',
+
+
+ Id => 'Id',
+ Title => 'Títol',
+ Date => 'Data de sortida',
+ Time => 'Durada',
+ Director => 'Director',
+ Country => 'Nacionalitat',
+ MinimumAge => 'Edat mínima',
+ Genre => 'Gèneres',
+ Image => 'Imatge',
+ Original => 'Títol original',
+ Actors => 'Actors',
+ Actor => 'Actor',
+ Role => 'Paper',
+ Comment => 'Comentaris',
+ Synopsis => 'Sinopsi',
+ Seen => 'Vista',
+ Number => 'Número de suport',
+ Format => 'Suport',
+ Region => 'Regió',
+ Identifier => 'Identificador',
+ Url => 'Pàgina web',
+ Audio => 'Audio',
+ Video => 'Format de vídeo',
+ Trailer => 'Fitxer de vídeo',
+ Serie => 'Sèrie',
+ Rank => 'Capítol',
+ Subtitles => 'Subtítols',
+ Added => 'Afegida el (data)',
+
+ SeenYes => 'Vista',
+ SeenNo => 'Sense veure',
+
+ AgeUnrated => 'Desconeguda',
+ AgeAll => 'Cap',
+ AgeParent => 'Control patern',
+
+ Main => 'Elements principals',
+ General => 'General',
+ Details => 'Detalls',
+ Lending => 'Préstec',
+
+ Information => 'Informació',
+ Languages => 'Idiomes',
+ Encoding => 'Codificació',
+
+ FilterAudienceAge => 'Edat mínima',
+ FilterSeenNo => '_No vistes',
+ FilterSeenYes => '_Vistes',
+ FilterRatingSelect => 'Valoració al _menys igual a...',
+
+ ExtractSize => 'Mida',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCgames.pm b/lib/gcstar/GCLang/CA/GCModels/GCgames.pm
new file mode 100644
index 0000000..0221755
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCgames.pm
@@ -0,0 +1,83 @@
+{
+ package GCLang::CA::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Col·lecció de Vídeo jocs',
+ Items => {0 => 'Joc',
+ 1 => 'Joc',
+ X => 'Jocs'
+ },
+ NewItem => 'Joc nou',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Nom',
+ Platform => 'Plataforma',
+ Players => 'Nombre de jugadors',
+ Released => 'Data de publicació',
+ Editor => 'Editorial',
+ Developer => 'Desenvolupador',
+ Genre => 'Gènere',
+ Box => 'Caràtula',
+ Case => 'Capça',
+ Manual => 'Manual d\'instruccions',
+ Completion => 'Completat (%)',
+ Executable => 'Executable',
+ Description => 'Descripció',
+ Codes => 'Codis',
+ Code => 'Codi',
+ Effect => 'Efecte',
+ Secrets => 'Secrets',
+ Screenshots => 'Captures de pantalla',
+ Screenshot1 => 'Primera captura de pantalla',
+ Screenshot2 => 'Segona captura de pantalla',
+ Comments => 'Comentaris',
+ Url => 'Pàgina Web',
+ Unlockables => 'Desbloquejables',
+ Unlockable => 'Desbloquejable',
+ Howto => 'Com desbloquejar',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Regió',
+ SerialNumber => 'Número de sèrie',
+
+ General => 'General',
+ Details => 'Detalls',
+ Tips => 'Consells',
+ Information => 'Informació',
+
+ FilterRatingSelect => 'Valoració al _menys...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/CA/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..284fe36
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::CA::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCminicars.pm b/lib/gcstar/GCLang/CA/GCModels/GCminicars.pm
new file mode 100644
index 0000000..84f9484
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::CA::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'Nou vehicle',
+ Currency => 'Moneda',
+
+# Main fields
+
+ Main => 'Informació principal',
+
+ Name => 'Nom',
+ Exchange => 'Per a vendre o canviar',
+ Wanted => 'El vull',
+ Rating1 => 'Classificació principal',
+ Picture1 => 'Imatge principal',
+ Scale => 'Escala',
+ Manufacturer => 'Fabricant',
+ Constructor => 'Constructor',
+ Type1 => 'Tipus',
+ Modele => 'Model',
+ Version => 'Versió',
+ Color => 'Color del Model',
+ Pub => 'Avís',
+ Year => 'Any',
+ Reference => 'Referència',
+ Kit => 'En forma de kit',
+ Transformation => 'Transformació personal',
+ Comments1 => 'Comentaris',
+
+# Details fields
+
+ Details => 'Detalls',
+
+ MiscCharacteristics => 'Característiques diverses',
+ Material => 'Material',
+ Molding => 'Motlle',
+ Condition => 'Condició',
+ Edition => 'Edició',
+ Collectiontype => 'Nom de la col·lecció',
+ Serial => 'Sèrie',
+ Serialnumber => 'Número de sèrie',
+ Designed => 'Data de Disseny',
+ Madein => 'Data de fabricació',
+ Box1 => 'Tipus de capça',
+ Box2 => 'Descripció de la capça',
+ Containbox => 'Contingut de la capça',
+ Rating2 => 'Realisme',
+ Rating3 => 'Acabat',
+ Acquisition => 'Data d\'adquisició',
+ Location => 'Lloc d\'adquisició',
+ Buyprice => 'Preu d\'adquisició',
+ Estimate => 'Estimació',
+ Comments2 => 'Comentaris',
+ Decorationset => 'Conjunt de decoració',
+ Characters => 'Personatges',
+ CarFromFilm => 'Pel·lícula del cotxe',
+ Filmcar => 'Pel·lícula relacionada al vehicle',
+ Filmpart => 'Part de la pel·lícula/episodi',
+ Parts => 'Nombre de parts',
+ VehiculeDetails => 'Detalls del vehicle',
+ Detailsparts => 'Detalls de les parts',
+ Detailsdecorations => 'Tipus de decoracions',
+ Decorations => 'Nombre de decoracions',
+ Lwh => 'Llarg / ample / alt',
+ Weight => 'Pes',
+ Framecar => 'Xassís',
+ Bodycar => 'Carrosseria',
+ Colormirror => 'Color del model',
+ Interior => 'Interior',
+ Wheels => 'Rodes',
+ Registrationnumber1 => 'Número de registre frontal',
+ Registrationnumber2 => 'Número de registre posterior',
+ RacingCar => 'Cotxe de carreres',
+ Course => 'Carrera',
+ Courselocation => 'Lloc de la carrera',
+ Courseyear => 'Data de la carrera',
+ Team => 'Equip',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Nombre de vehicle',
+ Pub2 => 'Publicistes',
+ Finishline => 'Posició final',
+ Steeringwheel => 'Posició del volant',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catàlegs',
+
+ OfficialPicture => 'Imatge oficial',
+ Barcode => 'Codi de barres',
+ Referencemirror => 'Referència',
+ Year3 => 'Data de disponibilitat',
+ CatalogCoverPicture => 'Portada',
+ CatalogPagePicture => 'Pàgina',
+ Catalogyear => 'Any del catàleg',
+ Catalogedition => 'Edició del catàleg',
+ Catalogpage => 'Pàgina del catàleg',
+ Catalogprice => 'Preu del catàleg',
+ Personalref => 'Referència personal',
+ Websitem => 'Pàgina web del fabricant del vehicle petit',
+ Websitec => 'Pàgina web del fabricant del vehicle real',
+ Websiteo => 'Enllaç interesant',
+ Comments3 => 'Comentaris',
+
+# Pictures fields
+
+ Pictures => 'Imatges',
+
+ OthersComments => 'Observacions generals',
+ OthersDetails => 'Altres detalls',
+ Top1 => 'Amunt',
+ Back1 => 'Avall',
+ AVG => 'Frontal esquerra',
+ AV => 'Davant',
+ AVD => 'Frontal dreta',
+ G => 'Esquerra',
+ BOX => 'Capça',
+ D => 'Dreta',
+ ARG => 'Posterior esquerra',
+ AR => 'Darrera',
+ ARD => 'Posterior dreta',
+ Others => 'Altres',
+
+# PanelLending fields
+
+ LendingExplanation => 'Canvis útils durant les temporades d\'exhibicions',
+ PanelLending => 'Préstecs (per a exhibicions)',
+ Comments4 => 'Comentaris',
+
+# Realmodel fields
+
+ Realmodel => 'Vehicle real',
+
+ Difference => 'Diferències amb la miniatura',
+ Front2 => 'Davant',
+ Back2 => 'Darrera',
+ Comments5 => 'Comentaris',
+
+ References => 'Referències',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCmusics.pm b/lib/gcstar/GCLang/CA/GCModels/GCmusics.pm
new file mode 100644
index 0000000..81f6049
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCmusics.pm
@@ -0,0 +1,66 @@
+{
+ package GCLang::CA::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Col·lecció de música',
+ Items => 'Àlbums',
+ NewItem => 'Nou àlbum',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Títol',
+ Cover => 'Portada',
+ Artist => 'Artista',
+ Format => 'Format',
+ Running => 'Durada',
+ Release => 'Data de publicació',
+ Genre => 'Gènere',
+ Origin => 'Origen',
+
+#For tracks list
+ Tracks => 'Llista de cançons',
+ Number => 'Nombre',
+ Track => 'Títol',
+ Time => 'Durada',
+
+ Composer => 'Compositor',
+ Producer => 'Productor',
+ Playlist => 'Llista de reproducció',
+ Comments => 'Comentaris',
+ Label => 'Etiqueta',
+ Url => 'Pàgina Web',
+
+ General => 'General',
+ Details => 'Detalls',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/CA/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..4404abb
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::CA::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/CA/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..9c7c04e
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::CA::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Col·lecció de targetes intel·ligents',
+ Items => {0 => 'Targeta intel·ligent',
+ 1 => 'Targeta intel·ligent',
+ X => 'Targetes intel·ligents'},
+ NewItem => 'Nova targeta intel·ligent',
+ Currency => 'Moneda',
+
+ Help => 'Ajuda pels camps',
+ Help1 => 'Ajuda',
+
+# Traduction des Champs "Main"
+
+ Main => 'La targenta intel·ligent',
+
+ Cover => 'Imatge',
+
+ Name => 'Nom',
+ Exchange => 'Per a canviar o vendre',
+ Wanted => 'La vull',
+ Rating1 => 'Classificació global',
+ TheSmartCard => 'La targeta intel·ligent, devant, derrera',
+
+ Country => 'País',
+ Color => 'Color',
+ Type1 => 'Tipus de targeta',
+ Type2 => 'Tipus de xip',
+ Dimension => 'Llarg / Ample / Gruix',
+
+ Box => 'Capça',
+ Chip => 'Xip',
+ Year1 => 'Any edició',
+ Year2 => 'Any de validesa',
+ Condition => 'Condició',
+ Charge => 'Targeta recarregable',
+ Variety => 'Varietat',
+
+ Edition => 'Nombre d\'exemplars',
+ Serial => 'Número de sèrie',
+ Theme => 'Tema',
+
+ Acquisition => 'Adquirida en',
+
+ Catalog0 => 'Catàleg',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Referència',
+ Reference1 => 'Referència Phonecote / Infopuce (YT)',
+ Reference2 => 'Referència La Cote en Poche',
+ Reference3 => 'Altra referència',
+
+ Quotationnew00 => 'Quota per a la nova targeta',
+ Quotationnew10 => 'Quota Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quota La Cote en Poche',
+ Quotationnew30 => 'Quota altra',
+ Quotationold00 => 'Quota per a la targeta usada',
+ Quotationold10 => 'Quota Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quota La Cote en Poche',
+ Quotationold30 => 'Altra quota',
+
+ Title1 => 'Títol',
+
+ Unit => 'Unitats / nombre de minuts',
+
+ Pressed => 'Tipus d\'impressió',
+ Location => 'Lloc d\'impressió',
+
+ Comments1 => 'Comentaris',
+
+ Others => 'Altres',
+ Weight => 'Pes',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/CA/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..449c3a3
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::CA::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Col·lecció de programari',
+ Items => {0 => 'Aplicació',
+ 1 => 'Aplicació',
+ X => 'Aplicacions',
+ lowercase1 => 'aplicació',
+ lowercaseX => 'aplicacions'},
+ NewItem => 'Aplicació Nova',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Nom',
+ Platform => 'Plataforma',
+ Released => 'Data de sortida',
+ Homepage => 'Pàgina web',
+ Editor => 'Editor',
+ Developer => 'Desenvolupador',
+ Category => 'Categoria',
+ NumberOfCopies => 'Còpies',
+ Price => 'Preu',
+ Box => 'Imatge de la caixa',
+ Case => 'Cas',
+ Manual => 'Manual d\'instruccions',
+ Executable => 'Executable',
+ Description => 'Descripció',
+ License => 'Llicència',
+ Commercial => 'Comercial',
+ FreewareNoncommercial => 'Freeware (per a us no comercial)',
+ OtherOpenSource => 'Altre codi obert',
+ PublicDomain => 'Domini públic',
+ OtherLicense => 'Altre',
+ Registration => 'Registre',
+ RegistrationInfo => 'Informació de registre',
+ RegInfo => 'Informació de registre',
+ RegistrationName => 'Nom d\'usuari',
+ RegistrationNumber => 'Número de registre',
+ PanelRegistration => 'Informació de registre',
+ RegistrationComments => 'Informació o cometaris adicionals',
+ Screenshots => 'Captures de pantalla',
+ Screenshot1 => 'Captura de la primera pantalla',
+ Screenshot2 => 'Captura de la segona pantalla',
+ Comments => 'Comentaris',
+ Url => 'Pàgina web',
+ General => 'General',
+ Details => 'Detalls',
+ Information => 'Informació',
+
+ FilterRatingSelect => 'Qualificació com a _Mínim...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCstamps.pm b/lib/gcstar/GCLang/CA/GCModels/GCstamps.pm
new file mode 100644
index 0000000..ae34f19
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::CA::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCwines.pm b/lib/gcstar/GCLang/CA/GCModels/GCwines.pm
new file mode 100644
index 0000000..a11a2b5
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::CA::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Col·lecció de vins',
+ Items => 'Vins',
+ NewItem => 'Nou vi',
+
+ Name => 'Nom',
+ Designation => 'Designació',
+ Vintage => 'Vermada',
+ Vineyard => 'Vinya',
+ Type => 'Tipus',
+ Grapes => 'Reïm',
+ Soil => 'Sol',
+ Producer => 'Productor',
+ Country => 'Païs',
+ Volume => 'Volum (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medalles/Premis',
+
+ Storage => 'Celler',
+ Location => 'Lloc',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantitat',
+ Acquisition => 'Adquisició',
+ PurchaseDate => 'Data de compra',
+ PurchasePrice => 'Preu de compra',
+ Gift => 'Regal',
+ BottleLabel => 'Etiqueta de la botella',
+ Website => 'Referències al web',
+
+ Tasted => 'Tastat',
+ Comments => 'Comentaris',
+ Serving => 'Porció',
+ TastingField => 'Notes de degustació',
+
+ General => 'General',
+ Details => 'Detalls',
+ Tasting => 'Degustació',
+
+ TastedNo => 'No tastat',
+ TastedYes => 'Tastat',
+
+ FilterRange => 'Rang',
+ FilterTastedNo => '_Encara no tastat',
+ FilterTastedYes => 'Ja _tastat',
+ FilterRatingSelect => 'Valoració al _menys...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCstar.pm b/lib/gcstar/GCLang/CA/GCstar.pm
new file mode 100644
index 0000000..c741c5f
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCstar.pm
@@ -0,0 +1,674 @@
+{
+ package GCLang::CA;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Català',
+
+ 'Separator' => ' : ',
+
+ 'Warning' => '<b>Avís</b>:
+
+La informació descarregada des d\'Internet (gràcies als
+connectors de cerca) és només per a <b>ús personal</b>
+
+Qualsevol redistribució queda prohibida <b>sense
+l\'autorització explícita dels respectius webs</b>.
+
+Per a saber quin és el web al que pertany la informació,
+podeu usar <b>el botó situat devall dels detalls de la pel·lícula</b>.',
+
+ 'AllItemsFiltered' => 'Cap pel·lícula compleix amb els criteris de filtrat', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Instal·la a ',
+ 'InstallMandatory' => 'Components obligatoris',
+ 'InstallOptional' => 'Components opcionals',
+ 'InstallErrorMissing' => 'Error: els components següents han d\'instal·lar-se: ',
+ 'InstallPrompt' => 'Directori predeterminat per a la instal·lació [/usr/local]: ',
+ 'InstallEnd' => 'Fi de la instal·lació',
+ 'InstallNoError' => 'Cap error',
+ 'InstallLaunch' => 'Per utilitzar l\'aplicació, executa ',
+ 'InstallDirectory' => 'Repertori bàsic',
+ 'InstallTitle' => 'Instal·lació de GCstar',
+ 'InstallDependencies' => 'Dependències',
+ 'InstallPath' => 'Camí',
+ 'InstallOptions' => 'Opcions',
+ 'InstallSelectDirectory' => 'Trieu el directori per a la instal·lació',
+ 'InstallWithClean' => 'Elimina arxius del directori d\'instal·lació.',
+ 'InstallWithMenu' => 'Afegeix GCstar al menú d\'Aplicacions',
+ 'InstallNoPermission' => 'Error: No teniu permisos per a instal·lar en el directori seleccionat!!',
+ 'InstallMissingMandatory' => 'Algunes dependències obligatòries no estan disponibles. No podreu instal·lar GCstar fins que s\'instal·lin en el sistema.',
+ 'InstallMissingOptional' => 'Algunes dependències opcionals no estan disponibles. Es detallen a sota. GCstar s\'instal·larà amb algunes funcions deshabilitades.',
+ 'InstallMissingNone' => 'Dependències satisfetes. Podeu continuar i instal·lar GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'No disponible',
+ 'InstallMissingFor' => 'No disponible per',
+ 'InstallCleanDirectory' => 'Eliminats els fitxers de GCstar del directori: ',
+ 'InstallCopyDirectory' => 'Copiant fitxers en el directori: ',
+ 'InstallCopyDesktop' => 'Copiant el fitxer .desktop a: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy a utilitzar (si no n\'utilitzeu cap presioneu la tecla de retorn): ',
+ 'UpdateNoPermission' => 'Permís d\'escriptura denegat en aquest directori: ',
+ 'UpdateNone' => 'No s\'ha trobat cap actualització',
+ 'UpdateFileNotFound' => 'Fitxer no trobat',
+
+#Splash
+ 'SplashInit' => 'Inicialització',
+ 'SplashLoad' => 'Carregant pel·lícules',
+ 'SplashDisplay' => 'Mostrant Col·lecció',
+ 'SplashSort' => 'Sorting Collection',
+ 'SplashDone' => 'Fet',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Sembla que heu emprat GCfilms abans. Voleu importar des de GCfilms a GCstar (no afectarà a GCfilms si el voleu seguir utilitzant)?',
+ 'GCfilmsImportOptions' => 'Configuració',
+ 'GCfilmsImportData' => 'Llista de pel.lícules',
+
+#Menus
+ 'MenuFile' => '_Fitxer',
+ 'MenuNewList' => '_Nova llista de pel·lícules',
+ 'MenuStats' => 'Estadístiques',
+ 'MenuHistory' => '_Fitxers oberts recentment',
+ 'MenuLend' => '_Mostra pel·lícules prestades', # Accepts model codes
+ 'MenuImport' => '_Importa',
+ 'MenuExport' => '_Exporta',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Edita',
+ 'MenuDuplicate' => '_Duplica pel·lícula', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Esborra pel·lícula actual', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Canvia camps Col·lecció',
+ 'MenuEditLockItems' => '_Bloqueja la informació',
+
+ 'MenuDisplay' => '_Visualitza',
+ 'MenuSavedSearches' => 'Cerques desades',
+ 'MenuSavedSearchesSave' => 'Desa la cerca actual',
+ 'MenuSavedSearchesEdit' => 'Modica cerques desades',
+ 'MenuAdvancedSearch' => '_Cerca avançada',
+ 'MenuViewAllItems' => '_Mostra tots les elements', # Accepts model codes
+ 'MenuNoFilter' => '_Tot',
+
+ 'MenuConfiguration' => '_Configura',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Informació a mostrar',
+ 'MenuBorrowers' => '_Prestataris',
+ 'MenuToolbarConfiguration' => '_Controls de la barra d\'eines',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '_Conversió de gèneres',
+
+ 'MenuBookmarks' => 'Les _meves Col·leccions',
+ 'MenuBookmarksAdd' => '_Afegeix Col·lecció actual',
+ 'MenuBookmarksEdit' => '_Edita Col·leccions marcades',
+
+ 'MenuHelp' => '_?',
+ 'MenuHelpContent' => '_?',
+ 'MenuAllPlugins' => 'Mostra _complements',
+ 'MenuBugReport' => 'Comunica un _error',
+ 'MenuAbout' => 'A propòsit de _GCstar',
+
+ 'MenuNewWindow' => 'Mostra elements a una nova finestra', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Expandeix tots',
+ 'ContextCollapseAll' => 'Colapsa tots',
+ 'ContextChooseImage' => 'Tria _Imatge',
+ 'ContextImageEditor' => 'Obri amb l\'editor d\'imatges',
+ 'ContextOpenWith' => 'Obri _amb',
+ 'ContextImgFront' => 'A sobre',
+ 'ContextImgBack' => 'A sota',
+ 'ContextChooseFile' => 'Tria un fitxer',
+ 'ContextChooseFolder' => 'Tria una carpeta',
+
+ 'DialogEnterNumber' => 'Entreu un valor',
+
+ 'RemoveConfirm' => 'Realment voleu eliminar aquesta pel·lícula?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+
+ 'DefaultNewItem' => 'Nou element', # Accepts model codes
+ 'NewItemTooltip' => 'Afegeix un nou element', # Accepts model codes
+ 'NoItemFound' => 'Cap element trobat. Voleu intentar una nova cerca a un altre lloc?',
+ 'OpenList' => 'Seleccioneu una col·lecció',
+ 'SaveList' => 'Seleccioneu on voleu desar la col·lecció',
+ 'SaveListTooltip' => 'Desa la col·lecció actual',
+ 'SaveUnsavedChanges' => 'Hi ha canvis no desats a la Col·lecció. Voleu desar-los?',
+ 'SaveDontSave' => 'No ho guardis',
+ 'PreferencesTooltip' => 'Canvia les preferències',
+ 'ViewTooltip' => 'Canvia el tipus de col·lecció',
+ 'PlayTooltip' => 'Reprodueix el vídeo associat a l\'element', # Accepts model codes
+ 'PlayFileNotFound' => 'El fitxer a reproduir no s\'ha trobat en aquest lloc:',
+ 'PlayRetry' => 'Torna-ho a intentar',
+
+ 'StatusSave' => 'Desant...',
+ 'StatusLoad' => 'Carregant...',
+ 'StatusSearch' => 'Cercant...',
+ 'StatusGetInfo' => 'Descarregant la informació...',
+ 'StatusGetImage' => 'Descarregant la imatge...',
+
+ 'SaveError' => 'Impossible desar la llista d\'elements. Comproveu els permisos i l\'espai disponible en el disc.',
+ 'OpenError' => 'Impossible obrir la llista d\'elements. Comproveu els permisos.',
+ 'OpenFormatError' => 'Impossible obrir la llista d\'elements. El format pot ser incorrecte',
+ 'OpenVersionWarning' => 'La col·lecció s\'ha creat amb una versió més recent de GCstar. Si la deseu, podeu perdre dades.',
+ 'OpenVersionQuestion' => 'Encara voleu continuar?',
+ 'ImageError' => 'El directori triat per a desar les imatges no és correcte. Voleu triar-ne un altre?',
+ 'OptionsCreationError'=> 'Impossible crear el fitxer d\'opcions: ',
+ 'OptionsOpenError'=> 'Impossible obrir el fitxer d\'opcions: ',
+ 'OptionsSaveError'=> 'Impossible desar el fitxer d\'opcions: ',
+ 'ErrorModelNotFound' => 'Model no trobat: ',
+ 'ErrorModelUserDir' => 'Els models definits per l\'usuari són a: ',
+
+ 'RandomTooltip' => 'Qué voleu veure aquesta nit?',
+ 'RandomError'=> 'No queden elements per a seleccionar', # Accepts model codes
+ 'RandomEnd'=> 'No hi ha més elements', # Accepts model codes
+ 'RandomNextTip'=> 'Següent suggerència',
+ 'RandomOkTip'=> 'Accepta aquest element',
+
+ 'AboutTitle' => 'A propòsit de GCstar',
+ 'AboutDesc' => 'Gtk2 Catàleg de pel·lícules',
+ 'AboutVersion' => 'Versió',
+ 'AboutTeam' => 'Equip',
+ 'AboutWho' => 'Christian Jodar (Tian): Gestió del projecte, Programació
+Nyall Dawson (Zombiepig): Programació
+TPF: Programació
+Adolfo González: Programació
+',
+ 'AboutLicense' => 'Distribuït segons els termes de la GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Traducció: Ponç J. Llaneras',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logo i disseny web per le Spektre',
+
+ 'ToolbarRandom' => 'Aquesta nit',
+
+ 'UnsavedCollection' => 'Col·lecció no desada',
+ 'ModelsSelect' => 'Seleccioneu un tipus de Col·lecció',
+ 'ModelsPersonal' => 'Models personals',
+ 'ModelsDefault' => 'Models predeterminats',
+ 'ModelsList' => 'Definició de Col·lecció',
+ 'ModelSettings' => 'Opcions de Col·lecció',
+ 'ModelNewType' => 'Nou tipus de Col·lecció',
+ 'ModelName' => 'Nom del tipus de Col·lecció:',
+ 'ModelFields' => 'Camps',
+ 'ModelOptions' => 'Opcions',
+ 'ModelFilters' => 'Filtres',
+ 'ModelNewField' => 'Nou camp',
+ 'ModelFieldInformation' => 'Informació',
+ 'ModelFieldName' => 'Etiqueta:',
+ 'ModelFieldType' => 'Tipus:',
+ 'ModelFieldGroup' => 'Grup:',
+ 'ModelFieldValues' => 'Valors',
+ 'ModelFieldInit' => 'Predeterminat:',
+ 'ModelFieldMin' => 'Mínim:',
+ 'ModelFieldMax' => 'Màxim:',
+ 'ModelFieldList' => 'Llista de valors:',
+ 'ModelFieldListLegend' => '<i>Separat per a coma</i>',
+ 'ModelFieldDisplayAs' => 'Mostra com:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Control de rati',
+ 'ModelFieldTypeShortText' => 'Text curt',
+ 'ModelFieldTypeLongText' => 'Text llarg',
+ 'ModelFieldTypeYesNo' => 'Sí/No',
+ 'ModelFieldTypeNumber' => 'Nombre',
+ 'ModelFieldTypeDate' => 'Data',
+ 'ModelFieldTypeOptions' => 'Llista de valors predefinits',
+ 'ModelFieldTypeImage' => 'Imatge',
+ 'ModelFieldTypeSingleList' => 'Llista simple',
+ 'ModelFieldTypeFile' => 'Fitxer',
+ 'ModelFieldTypeFormatted' => 'Depèn d\'altres camps',
+ 'ModelFieldParameters' => 'Paràmetres',
+ 'ModelFieldHasHistory' => 'Utilitza un històric',
+ 'ModelFieldFlat' => 'Mostra amb una línia',
+ 'ModelFieldStep' => 'Increment:',
+ 'ModelFieldFileFormat' => 'Format del fitxer:',
+ 'ModelFieldFileFile' => 'Fitxer simple',
+ 'ModelFieldFileImage' => 'Imatge',
+ 'ModelFieldFileVideo' => 'Vídeo',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Programa',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Camps a utilitzar',
+ 'ModelOptionsFieldsAuto' => 'Automàtic',
+ 'ModelOptionsFieldsNone' => 'Cap',
+ 'ModelOptionsFieldsTitle' => 'Com a títol',
+ 'ModelOptionsFieldsId' => 'Com a identificador',
+ 'ModelOptionsFieldsCover' => 'Com a coberta',
+ 'ModelOptionsFieldsPlay' => 'Com a botó de "Play"',
+ 'ModelCollectionSettings' => 'Opcions de col·lecció',
+ 'ModelCollectionSettingsLending' => 'Elements que es poden prestar',
+ 'ModelCollectionSettingsTagging' => 'Els elements es poden etiquetar',
+ 'ModelFilterActivated' => 'Hauria d\'estar al formulari de cerca',
+ 'ModelFilterComparison' => 'Comparació',
+ 'ModelFilterContain' => 'Conté',
+ 'ModelFilterDoesNotContain' => 'No conté',
+ 'ModelFilterRegexp' => 'Expressió regular',
+ 'ModelFilterRange' => 'Rang',
+ 'ModelFilterNumeric' => 'La comparació és numèrica',
+ 'ModelFilterQuick' => 'Crea un filtre ràpid',
+ 'ModelTooltipName' => 'Empra un nom per a reutilitzar aquest model per a moltes Col·leccions. Si està buid, les opcions es desaran directament dins la mateixa col·lecció',
+ 'ModelTooltipLabel' => 'El camp nom es mostrarà tal qual',
+ 'ModelTooltipGroup' => 'Utilitzat per agrupar camps. Els elements sense valor aquí estaran al grup predeterminat',
+ 'ModelTooltipHistory' => 'Els valors entrats anteriorment es desaran a una llista associada al camp',
+ 'ModelTooltipFormat' => 'Aquest format s\'utilitza per determinar l\'acció per obrir el fitxer amb el botó "Play"',
+ 'ModelTooltipLending' => 'Aquest afegirà alguns camps per manejar els préstecs',
+ 'ModelTooltipTagging' => 'Això afegirà alguns camps per manejar les etiquetes',
+ 'ModelTooltipNumeric' => 'Els valors es consideran com nombres per a la comparació',
+ 'ModelTooltipQuick' => 'Aquest afegirà un submenú al de filtres',
+
+ 'ResultsTitle' => 'Tria una pel·lícula', # Accepts model codes
+ 'ResultsNextTip' => 'Cerca en el següent lloc',
+ 'ResultsPreview' => 'Previsualitza',
+ 'ResultsInfo' => 'Podeu afegir múltiples elements a la col·lecció pitjant la tecla Ctrl o Majús i seleccionant-los', # Accepts model codes
+
+ 'OptionsTitle' => 'Preferències',
+ 'OptionsExpertMode' => 'Mode Expert',
+ 'OptionsPrograms' => 'Especifiqueu els programes a utilitzar pels diferents continguts, deixau-ho en blanc per utilitzar els predeterminats del sistema',
+ 'OptionsBrowser' => 'Navegador d\'Internet',
+ 'OptionsPlayer' => 'Reproductor de vídeo',
+ 'OptionsAudio' => 'Reproductor d\'audio',
+ 'OptionsImageEditor' => 'Editor d\'imatges',
+ 'OptionsCdDevice' => 'Dispositiu de CD',
+ 'OptionsImages' => 'Directori d\'imatges',
+ 'OptionsUseRelativePaths' => 'Utilitza camins relatius per a les imatges',
+ 'OptionsLayout' => 'Disposició',
+ 'OptionsStatus' => 'Mostra la barra d\'estat',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Alerteu: Els canvis fets a n\'aquest formulari no es tindran en compte fins reiniciar l\'aplicació',
+ 'OptionsRemoveConfirm' => 'Demana confirmació abans d\'eliminar',
+ 'OptionsAutoSave' => 'Desa automàticament la col·lecció',
+ 'OptionsAutoLoad' => 'Carrega la col·lecció prèvia a l\'inici',
+ 'OptionsSplash' => 'Mostra la pantalla d\'inici',
+ 'OptionsTearoffMenus' => 'Activa els menús desplegables',
+ 'OptionsSpellCheck' => 'Utilitza la correcció ortogràfica pels camps de text llargs',
+ 'OptionsProgramTitle' => 'Tria el programa que ha d\'utilitzar-se',
+ 'OptionsPlugins' => 'Lloc per descarregar les fitxes',
+ 'OptionsAskPlugins' => 'Pregunta',
+ 'OptionsPluginsMulti' => 'Diversos llocs',
+ 'OptionsPluginsMultiAsk' => 'Pregunta (Diversos llocs)',
+ 'OptionsPluginsMultiPerField' => 'Molts llocs (per camp)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Molts llocs per ordre de selecció de camp',
+ 'OptionsPluginsMultiPerFieldDesc' => 'Per a cada camp l\'omplirem amb la primera informació no buida començant per l\'esquerra',
+ 'OptionsPluginsMultiPerFieldFirst' => 'Primer',
+ 'OptionsPluginsMultiPerFieldLast' => 'Darrer',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Elimina',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Llista de camps seleccionats buida',
+ 'OptionsPluginsList' => 'Defineix la llista',
+ 'OptionsAskImport' => 'Tria els camps que han d\'importar-se',
+ 'OptionsProxy' => 'Empra un proxy',
+ 'OptionsCookieJar' => 'Utilitza aquesta galeta jar',
+ 'OptionsMain' => 'Principal',
+ 'OptionsLang' => 'Idioma',
+ 'OptionsPaths' => 'Directoris',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Opcions',
+ 'OptionsDisplay' => 'Visualitza',
+ 'OptionsToolbar' => 'Barra d\'eines',
+ 'OptionsToolbars' => {0 => 'Cap', 1 => 'Petita', 2 => 'Gran', 3 => 'Ajustament per sistema'},
+ 'OptionsToolbarPosition' => 'Posició',
+ 'OptionsToolbarPositions' => {0 => 'Amunt', 1 => 'Avall', 2 => 'Esquerra', 3 => 'Dreta'},
+ 'OptionsExpandersMode' => 'Estensors massa llargs',
+ 'OptionsExpandersModes' => {'asis' => 'No facis res', 'cut' => 'Talla', 'wrap' => 'Divideix les línies'},
+ 'OptionsDateFormat' => 'Format de data',
+ 'OptionsDateFormatTooltip' => 'El format es l\'utilitzat per strftime(3). Per omissió és %d/%m/%Y',
+ 'OptionsView' => 'Llista dels elements',
+ 'OptionsViews' => {0 => 'Text', 1 => 'Imatge', 2 => 'Detallada'},
+ 'OptionsColumns' => 'Columnes',
+ 'OptionsMailer' => 'Mètode d\'enviament dels correus electrònics',
+ 'OptionsSMTP' => 'Servidor',
+ 'OptionsFrom' => 'El vostre correu electrònic',
+ 'OptionsTransform' => 'Posar els articles al final dels títols',
+ 'OptionsArticles' => 'Articles (separats per una coma)',
+ 'OptionsSearchStop' => 'L\'usuari pot aturar las cerques',
+ 'OptionsBigPics' => 'Utilitza les imatges grans quan estiguin disponibles',
+ 'OptionsAlwaysOriginal' => 'Empra el títol principal com l\'original si no se\'n troba cap',
+ 'OptionsRestoreAccelerators' => 'Restaura acceleradors',
+ 'OptionsHistory' => 'Mida de l\'historial',
+ 'OptionsClearHistory' => 'Neteja l\'historial',
+ 'OptionsStyle' => 'Pell',
+ 'OptionsDontAsk' => 'No ho demanis mai més',
+ 'OptionsPathProgramsGroup' => 'Aplicacions',
+ 'OptionsProgramsSystem' => 'Utilitza els programes definits pel sistema',
+ 'OptionsProgramsUser' => 'Utilitza els programes especificats',
+ 'OptionsProgramsSet' => 'Estableix els programes',
+ 'OptionsPathImagesGroup' => 'Imatges',
+ 'OptionsInternetDataGroup' => 'Importa dades',
+ 'OptionsInternetSettingsGroup' => 'Opcions',
+ 'OptionsDisplayInformationGroup' => 'Mostra informació',
+ 'OptionsDisplayArticlesGroup' => 'Articles',
+ 'OptionsImagesDisplayGroup' => 'Mostra',
+ 'OptionsImagesStyleGroup' => 'Estil',
+ 'OptionsDetailedPreferencesGroup' => 'Preferències',
+ 'OptionsFeaturesConveniencesGroup' => 'Conveniències',
+ 'OptionsPicturesFormat' => 'Prefixe a emprar per a les imatges:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Títol o nom de l\'element associat',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% o . se substituirà amb el directori de la col·lecció (utilitzeu només en el principi del camí)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% se substituirà pel nom de la col·lecció sense el sufixe (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% només es pot emprar en el començament del camí per a les imatges',
+ 'OptionsConfigureMailers' => 'Configura els programes de correu',
+
+ 'ImagesOptionsButton' => 'Preferències',
+ 'ImagesOptionsTitle' => 'Preferències per al llistat d\'imatges',
+ 'ImagesOptionsSelectColor' => 'Trieu un color',
+ 'ImagesOptionsUseOverlays' => 'Utilitza superposició d\'imatges',
+ 'ImagesOptionsBg' => 'Fons',
+ 'ImagesOptionsBgPicture' => 'Empra una imatge de fons',
+ 'ImagesOptionsFg'=> 'Selecció',
+ 'ImagesOptionsBgTooltip' => 'Canvia el color de fons',
+ 'ImagesOptionsFgTooltip'=> 'Canvia el color de la selecció',
+ 'ImagesOptionsResizeImgList' => 'Canvia automàticament el nombre de columnes',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Mida',
+ 'ImagesOptionsSizeList' => {0 => 'Molt Petit', 1 => 'Petit', 2 => 'Mitjà', 3 => 'Gran', 4 => 'Molt Gran'},
+ 'ImagesOptionsSizeTooltip' => 'Trieu la mida de la imatge',
+
+ 'DetailedOptionsTitle' => 'Preferències del llistat detallat',
+ 'DetailedOptionsImageSize' => 'Mida de les imatges',
+ 'DetailedOptionsGroupItems' => 'Agrupar elements per',
+ 'DetailedOptionsSecondarySort' => 'Ordena els camps pels nins',
+ 'DetailedOptionsFields' => 'Trieu els camps a mostrar',
+ 'DetailedOptionsGroupedFirst' => 'Manté junts els elements orfes',
+ 'DetailedOptionsAddCount' => 'Afegeix el nombre d\'elements a les categories',
+
+ 'ExtractButton' => 'Informació',
+ 'ExtractTitle' => 'Informació del fitxer',
+ 'ExtractImport' => 'Utilitza els valors',
+
+ 'FieldsListOpen' => 'Carrega una llista de camps des d\'un fitxer',
+ 'FieldsListSave' => 'Desa una llista de camps a un fitxer',
+ 'FieldsListError' => 'Aquesta llista de camps no es pot utilitzar amb aquesta classe de Col·lecció',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Exporta el llistat d\'elements',
+ 'ExportFilter' => 'Exporta només els elements mostrats',
+ 'ExportFieldsTitle' => 'Camps a exportar',
+ 'ExportFieldsTip' => 'Trieu els camps a exportar',
+ 'ExportWithPictures' => 'Copia les imatges a un subdirectori',
+ 'ExportSortBy' => 'Ordena per',
+ 'ExportOrder' => 'Ordre',
+
+ 'ImportListTitle' => 'Importa un altre llistat d\'elements',
+ 'ImportExportData' => 'Dades',
+ 'ImportExportFile' => 'fitxer',
+ 'ImportExportFieldsUnused' => 'Camps sense utilitzar',
+ 'ImportExportFieldsUsed' => 'Camps utilitzats',
+ 'ImportExportFieldsFill' => 'Tots els camps',
+ 'ImportExportFieldsClear' => 'Cap camp',
+ 'ImportExportFieldsEmpty' => 'Heu de marcar al menys un camp',
+ 'ImportExportFileEmpty' => 'Especifiqueu un nom per al fitxer',
+ 'ImportFieldsTitle' => 'Camps a importar',
+ 'ImportFieldsTip' => 'Trieu els camps a importar',
+ 'ImportNewList' => 'Crea un nou llistat',
+ 'ImportCurrentList' => 'Afegeix al llistat actual',
+ 'ImportDropError' => 'Hi ha hagut un error obrint al menys un fitxer. Es recarregarà el llistat anterior.',
+ 'ImportGenerateId' => 'Genera un identificador per a cada element',
+
+ 'FileChooserOpenFile' => 'Tria el fitxer a utilitzar',
+ 'FileChooserDirectory' => 'Directori',
+ 'FileChooserOpenDirectory' => 'Tria un directori',
+ 'FileChooserOverwrite' => 'Aquest fitxer ja existeix. Voleu substituir-lo?',
+ 'FileAllFiles' => 'Tots els fitxers',
+ 'FileVideoFiles' => 'Fitxers de vídeo',
+ 'FileEbookFiles' => 'Fitxers de llibres electrònics',
+ 'FileAudioFiles' => 'Fitxers de so',
+ 'FileGCstarFiles' => 'Col·leccions GCstar',
+
+ #Some default panels
+ 'PanelCompact' => 'Compacte',
+ 'PanelReadOnly' => 'Només de lectura',
+ 'PanelForm' => 'Pestanyes',
+
+ 'PanelSearchButton' => 'Cerca informació',
+ 'PanelSearchTip' => 'Cerca informació al web sobre aquest nom',
+ 'PanelSearchContextChooseOne' => 'Selecciona un lloc...',
+ 'PanelSearchContextMultiSite' => 'Utilitza "Molts llocs"',
+ 'PanelSearchContextMultiSitePerField' => 'Utilitza "Molts llocs per camp"',
+ 'PanelSearchContextOptions' => 'Canvia opcions...',
+ 'PanelImageTipOpen' => 'Feu clic a la imatge per triar-ne una altre.',
+ 'PanelImageTipView' => 'Feu clic a la imatge per veure-la a mida real.',
+ 'PanelImageTipMenu' => 'Feu clic amb el botó dret per a més opcions.',
+ 'PanelImageTitle' => 'Tria una imatge',
+ 'PanelImageNoImage' => 'Sense imatge',
+ 'PanelSelectFileTitle' => 'Tria un fitxer',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restaura els valors per defecte',
+ 'PanelRefresh' => 'Actualitza',
+ 'PanelRefreshTip' => 'Actualitza la informació des del web',
+
+ 'PanelFrom' =>'De',
+ 'PanelTo' =>'Per a',
+
+ 'PanelWeb' => 'Veure la fitxa a Internet',
+ 'PanelWebTip' => 'Veure la fitxa de l\'element a Internet', # Accepts model codes
+ 'PanelRemoveTip' => 'Elimina l\'element actual', # Accepts model codes
+
+ 'PanelDateSelect' => 'Canvia la data',
+ 'PanelNobody' => 'Ningú',
+ 'PanelUnknown' => 'Desconegut',
+ 'PanelAdded' => 'Afegeix una data',
+ 'PanelRating' => 'Valoració',
+ 'PanelPressRating' => 'Valoració de la premsa',
+ 'PanelLocation' => 'Lloc',
+
+ 'PanelLending' => 'Préstec',
+ 'PanelBorrower' => 'Prestatari',
+ 'PanelLendDate' => 'Data',
+ 'PanelHistory' => 'Historial',
+ 'PanelReturned' => 'Element retornat', # Accepts model codes
+ 'PanelReturnDate' => 'Data de devolució',
+ 'PanelLendedYes' => 'Prestada',
+ 'PanelLendedNo' => 'Disponible',
+
+ 'PanelTags' => 'Etiquetes',
+ 'PanelFavourite' => 'Favorit',
+ 'TagsAssigned' => 'Etiquetes assignades',
+
+ 'PanelUser' => 'Camps d\'usuari',
+
+ 'CheckUndef' => 'Qualsevol',
+ 'CheckYes' => 'Sí',
+ 'CheckNo' => 'No',
+
+ 'ToolbarAll' => 'Mostra tots',
+ 'ToolbarAllTooltip' => 'Mostra tots els elements',
+ 'ToolbarGroupBy' => 'Agrupa per',
+ 'ToolbarGroupByTooltip' => 'Tria el camp per agrupar elements a la llista',
+ 'ToolbarQuickSearch' => 'Cerca ràpida',
+ 'ToolbarQuickSearchLabel' => 'Cerca',
+ 'ToolbarQuickSearchTooltip' => 'Seleccioneu el camp per a cercar. Entreu els termes de cerca i premeu Intro',
+ 'ToolbarSeparator' => ' Separador',
+
+ 'PluginsTitle' => 'Cerca un element',
+ 'PluginsQuery' => 'Petició',
+ 'PluginsFrame' => 'Lloc on cercar',
+ 'PluginsLogo' => 'Logotip',
+ 'PluginsName' => 'Nom',
+ 'PluginsSearchFields' => 'Camps de cerca',
+ 'PluginsAuthor' => 'Autor',
+ 'PluginsLang' => 'Idioma',
+ 'PluginsUseSite' => 'Utilitza el lloc seleccionat per a futures cerques',
+ 'PluginsPreferredTooltip' => 'Lloc recomenat per GCstar',
+ 'PluginDisabled' => 'Desactivat',
+
+ 'BorrowersTitle' => 'Configuració dels prestataris',
+ 'BorrowersList' => 'Prestataris',
+ 'BorrowersName' => 'Nom',
+ 'BorrowersEmail' => 'Correu electrònic',
+ 'BorrowersAdd' => 'Afegeix',
+ 'BorrowersRemove' => 'Elimina',
+ 'BorrowersEdit' => 'Modifica',
+ 'BorrowersTemplate' => 'Model de correu electrònic',
+ 'BorrowersSubject' => 'Títol del correu electrònic',
+ 'BorrowersNotice1' => '%1 es substituirà pel nom del prestatari',
+ 'BorrowersNotice2' => '%2 es substituirà pel títol de l\'element',
+ 'BorrowersNotice3' => '%3 es substituirà per la data del préstec',
+
+ 'BorrowersImportTitle' => 'Importa informació dels prestataris',
+ 'BorrowersImportType' => 'Format del fitxer:',
+ 'BorrowersImportFile' => 'Fitxer:',
+
+ 'BorrowedTitle' => 'Elements prestats', # Accepts model codes
+ 'BorrowedDate' => 'Des del',
+ 'BorrowedDisplayInPanel' => 'Mostra l\'element a la finestra principal', # Accepts model codes
+
+ 'MailTitle' => 'Envia un correu electrònic',
+ 'MailFrom' => 'De: ',
+ 'MailTo' => 'A: ',
+ 'MailSubject' => 'Tema: ',
+ 'MailSmtpError' => 'Problema de connexió amb el servidor SMTP',
+ 'MailSendmailError' => 'Problema executant sendmail',
+
+ 'SearchTooltip' => 'Cerca a tots els elements', # Accepts model codes
+ 'SearchTitle' => 'Cerca elements', # Accepts model codes
+ 'SearchNoField' => 'No heu seleccionat cap camp a la finestra de cerca.
+Afegiu-ne alguns a la pestanya de filtres de la configuració de col·lecció.',
+
+ 'QueryReplaceField' => 'Camp per canviar',
+ 'QueryReplaceOld' => 'Nom actual',
+ 'QueryReplaceNew' => 'Nom nou',
+ 'QueryReplaceLaunch' => 'Canvia',
+
+ 'ImportWindowTitle' => 'Tria els camps que han d\'importar-se',
+ 'ImportViewPicture' => 'Mostra la imatge',
+ 'ImportSelectAll' => 'Selecciona-ho tot',
+ 'ImportSelectNone' => 'No seleccionis res',
+
+ 'MultiSiteTitle' => 'Llocs on cercar',
+ 'MultiSiteUnused' => 'Connectors no utilitzats',
+ 'MultiSiteUsed' => 'Connectors a utilitzar',
+ 'MultiSiteLang' => 'Utilitza tots els connectors espanyols',
+ 'MultiSiteEmptyError' => 'La llista de llocs està buida',
+ 'MultiSiteClear' => 'Buida la llista',
+
+ 'DisplayOptionsTitle' => 'Elements a mostrar',
+ 'DisplayOptionsAll' => 'Selecciona-ho tot',
+ 'DisplayOptionsSearch' => 'Cerca',
+
+ 'GenresTitle' => 'Conversió de gèneres',
+ 'GenresCategoryName' => 'Gènere a utilitzar',
+ 'GenresCategoryMembers' => 'Gèneres a canviar',
+ 'GenresLoad' => 'Carrega una llista predefinida',
+ 'GenresExport' => 'Desa la llista a un fitxer',
+ 'GenresModify' => 'Edita la conversió',
+
+ 'PropertiesName' => 'Nom de la col·lecció',
+ 'PropertiesLang' => 'Codi d\'idioma',
+ 'PropertiesOwner' => 'Propietari',
+ 'PropertiesEmail' => 'Correu electrònic',
+ 'PropertiesDescription' => 'Descripció',
+ 'PropertiesFile' => 'Informació del fitxer',
+ 'PropertiesFilePath' => 'Cami complet',
+ 'PropertiesItemsNumber' => 'Nombre d\'elements', # Accepts model codes
+ 'PropertiesFileSize' => 'Mida',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Propietats de la col·lecció',
+ 'PropertiesDefaultPicture' => 'Imatge per omissió',
+
+ 'MailProgramsTitle' => 'Programes per enviar correu',
+ 'MailProgramsName' => 'Nom',
+ 'MailProgramsCommand' => 'Línia d\'ordres',
+ 'MailProgramsRestore' => 'Restaura els valors per defecte',
+ 'MailProgramsAdd' => 'Afegeix un programa',
+ 'MailProgramsInstructions' => 'A la línia d\'ordres, es fan algunes substitucions:
+ %f es substituirà pel correu electrònic de l\'usuari.
+ %t es substituirà per l\'adreça.
+ %s es substituirà pel subjecte del missatge.
+ %b es substituirà pel cos del missatge.',
+
+ 'BookmarksBookmarks' => 'Marques',
+ 'BookmarksFolder' => 'Directoris',
+ 'BookmarksLabel' => 'Etiqueta',
+ 'BookmarksPath' => 'Camí',
+ 'BookmarksNewFolder' => 'Nova carpeta',
+
+ 'AdvancedSearchType' => 'Tipus de cerca',
+ 'AdvancedSearchTypeAnd' => 'Elements que compleixen amb tots els criteris', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Elements que compleixen al menys amb un criteri', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criteri',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Desa la cerca',
+ 'AdvancedSearchSaveName' => 'Nom',
+ 'AdvancedSearchSaveOverwrite' => 'Ja existeix una cerca desada amb aquest nom. Trieu-ne un altre.',
+ 'AdvancedSearchUseCase' => 'Sensible a les majúscules',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignora els accents',
+
+ 'BugReportSubject' => 'Informe d\'error generat per GCstar',
+ 'BugReportVersion' => 'Versió',
+ 'BugReportPlatform' => 'Sistema Operatiu',
+ 'BugReportMessage' => 'Missatge d\'error',
+ 'BugReportInformation' => 'Informació adicional',
+
+#Statistics
+ 'Stats3DPie' => 'Pastís 3D',
+ 'StatsAccumulate' => 'Acumula valors',
+ 'StatsArea' => 'Àrees',
+ 'StatsBars' => 'Barres',
+ 'StatsDisplayNumber' => 'Mostra nombres',
+ 'StatsFieldToUse' => 'Camp a utilitzar',
+ 'StatsFontSize' => 'Mida de la font',
+ 'StatsGenerate' => 'Genera',
+ 'StatsHeight' => 'Alçada',
+ 'StatsHistory' => 'Història',
+ 'StatsKindOfGraph' => 'Tipus de gràfica',
+ 'StatsPie' => 'Pastís',
+ 'StatsSave' => 'Desa la imatge de les estadístiques a un fitxer',
+ 'StatsShowAllDates' => 'Mostra totes les dates',
+ 'StatsSortByNumber' => 'Ordena pel nombre de {lowercaseX}',
+ 'StatsWidth' => 'Amplada',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/CS/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/CS/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..ddc768d
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::CS::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Včetně názvu polí nahoře',
+ 'Separator' => 'Oddělovač',
+ 'Replacement' => 'Nahradit oddělovač tímto',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/CS/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..7bfd2ce
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::CS::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/CS/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..0c0b970
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::CS::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Invalid template file',
+ 'UseFile' => 'Use file specified below',
+ 'TemplateExternalFile' => 'Template file',
+ 'WithJS' => 'Použít Javascript',
+ 'FileTemplate' => 'Šablona:',
+ 'Preview' => 'Náhled',
+ 'NoPreview' => 'Náhled není k dispozici',
+ 'Title' => 'Název HTML stránky: ',
+ 'InfoFile' => 'Seznam filmů je v souboru: ',
+ 'InfoDir' => 'Obrázky jsou v: ',
+ 'HeightImg' => 'Výška obrázků (v pixelech): ',
+ 'OpenFileInBrowser' => 'Generovaný soubor otevřít ve webovém prohlížeči',
+ 'Note' => 'Seznam generován aplikací <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Zadejte text k vyhledání',
+ 'SearchType1' => 'Pouze název',
+ 'SearchType2' => 'Všechny informace',
+ 'SearchButton' => 'Hledání',
+ 'SearchTitle' => 'Vyhledá filmy, které vyhovují zadaným kritériím',
+ 'AllButton' => 'Vše',
+ 'AllTitle' => 'Zobrazí všechny filmy',
+ 'Expand' => 'Zobrazit vše',
+ 'ExpandTitle' => 'Zobrazí všechny informace o filmu',
+ 'Collapse' => 'Skrýt vše',
+ 'CollapseTitle' => 'Skryje všechny informace o filmu',
+ 'Borrowed' => 'Má půjčeno: ',
+ 'NotBorrowed' => 'Nepůjčen',
+ 'Top' => 'Nahoře',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/CS/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..d7dc51d
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::CS::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/CS/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..60c40c2
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::CS::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Včetně instrukce DROP',
+ 'WithCreate' => 'Včetně instrukce CREATE',
+ 'TableName' => 'Jméno tabulky',
+ 'InfoFile' => 'SQL soubor: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/CS/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..2cadd8f
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::CS::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Archív je v souboru: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/CS/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..3ba9bed
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::CS::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Soubor šablony',
+ 'ModelText' => 'Text šablony',
+ 'Models' => 'Použít šablonu',
+ 'UseFile' => 'Použít soubor',
+ 'UseModel' => 'Použít oblast textu',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/CS/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..952490c
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::CS::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Kde hledat', #Where should it search
+ 'Default' => 'Implicitní adresář Alexandrie',
+ 'Specified' => 'Adresář specifikovaný níže',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/CS/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..eafe722
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::CS::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Ignorovat první řádek',
+ 'Separator' => 'Oddělovač',
+ 'Plugin' => 'Použít server',
+ 'UseFirst' => 'Při více výsledcích použít první',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/CS/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..03db588
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::CS::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/CS/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..84ae50b
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::CS::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Kopírovat obrázky',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCImport/GCImportList.pm b/lib/gcstar/GCLang/CS/GCImport/GCImportList.pm
new file mode 100644
index 0000000..16c0e18
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::CS::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Seznam názvů',
+ 'Plugin' => 'Použít server',
+ 'UseFirst' => 'Při více výsledcích použít první',
+ 'CommentAuto' => 'Film automaticky importován.',
+ 'CommentSite' => 'Server: ',
+ 'CommentTitle' => 'Název: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/CS/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..9f33833
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::CS::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/CS/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..f191f1e
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::CS::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Soubor není vytvořen aplikací Tellico',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/CS/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..c913588
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::CS::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/CS/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..611baeb
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::CS::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/CS/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..8940f06
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::CS::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCbooks.pm b/lib/gcstar/GCLang/CS/GCModels/GCbooks.pm
new file mode 100644
index 0000000..89b0e84
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCbooks.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::CS::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Sbírka knih',
+ Items => sub {
+ my $number = shift;
+ return 'Kniha' if $number eq '1';
+ return 'Knihy' if $number =~ /(?<!1)[2-4]$/;
+ return 'Knih';
+ },
+ NewItem => 'Nová kniha',
+
+ Isbn => 'ISBN',
+ Title => 'Název',
+ Cover => 'Obal',
+ Authors => 'Autoři',
+ Publisher => 'Vydavatel',
+ Publication => 'Datum vydání',
+ Language => 'Jazyk',
+ Genre => 'Žánr',
+ Serie => 'Sbírka',
+ Rank => 'Pořadí',
+ Bookdescription => 'Popis',
+ Pages => 'Počet stran',
+ Read => 'Přečteno',
+ Acquisition => 'Datum pořízení',
+ Edition => 'Náklad',
+ Format => 'Rozměr',
+ Comments => 'Poznámky',
+ Url => 'Web',
+ Translator => 'Překladatel',
+ Artist => 'Ilustrace',
+ DigitalFile => 'Digital version',
+
+ General => 'Hlavní',
+ Details => 'Detaily',
+
+ ReadNo => 'Nepřečteno',
+ ReadYes => 'Přečteno',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCcoins.pm b/lib/gcstar/GCLang/CS/GCModels/GCcoins.pm
new file mode 100644
index 0000000..b19874e
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCcoins.pm
@@ -0,0 +1,107 @@
+{
+ package GCLang::CS::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Sbírka mincí',
+ Items => sub {
+ my $number = shift;
+ return 'Mince' if $number eq '1';
+ return 'Mince' if $number =~ /(?<!1)[2-4]$/;
+ return 'Mincí';
+ },
+ NewItem => 'Nová mince',
+
+ Name => 'Název',
+ Country => 'Země',
+ Year => 'Rok',
+ Currency => 'Měna',
+ Value => 'Hodnota',
+ Picture => 'Hlavní obrázek',
+ Diameter => 'Průměr',
+ Metal => 'Kov',
+ Edge => 'Hrana',
+ Edge1 => 'Hrana 1',
+ Edge2 => 'Hrana 2',
+ Edge3 => 'Hrana 3',
+ Edge4 => 'Hrana 4',
+ Head => 'Hlava',
+ Tail => 'Orel',
+ Comments => 'Poznámky',
+ History => 'Historie',
+ Website => 'Webová stránka',
+ Estimate => 'Odhad',
+ References => 'Reference',
+ Type => 'Typ',
+ Coin => 'Mince',
+ Banknote => 'Bankovka',
+
+ Main => 'Hlavní',
+ Description => 'Popis',
+ Other => 'Další informace',
+ Pictures => 'Obrázky',
+
+ Condition => 'Stav (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCcomics.pm b/lib/gcstar/GCLang/CS/GCModels/GCcomics.pm
new file mode 100644
index 0000000..3f3e10b
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::CS::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCfilms.pm b/lib/gcstar/GCLang/CS/GCModels/GCfilms.pm
new file mode 100644
index 0000000..c22e53d
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCfilms.pm
@@ -0,0 +1,96 @@
+{
+ package GCLang::CS::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Sbírka filmů',
+ Items => sub {
+ my $number = shift;
+ return 'Film' if $number eq '1';
+ return 'Filmy' if $number =~ /(?<!1)[2-4]$/;
+ return 'Filmů';
+ },
+ NewItem => 'Nový film',
+
+
+ Id => 'Id',
+ Title => 'Název',
+ Date => 'Datum',
+ Time => 'Délka',
+ Director => 'Režie',
+ Country => 'Země',
+ MinimumAge => 'Věk',
+ Genre => 'Žánr',
+ Image => 'Obrázek',
+ Original => 'Původní název',
+ Actors => 'Obsazení',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'Komentář',
+ Synopsis => 'Anotace',
+ Seen => 'Shlédnuto',
+ Number => 'Počet médií',
+ Format => 'Medium',
+ Region => 'Region',
+ Identifier => 'Identifikátor',
+ Url => 'Web',
+ Audio => 'Zvuk',
+ Video => 'Video formát',
+ Trailer => 'Soubor s filmem',
+ Serie => 'Sbírka',
+ Rank => 'Pořadí',
+ Subtitles => 'Titulky',
+
+ SeenYes => 'Shlédnuto',
+ SeenNo => 'Neshlédnuto',
+
+ AgeUnrated => 'Nestanoven',
+ AgeAll => 'Pro všechny',
+ AgeParent => 'Pod dozorem rodičů',
+
+ Main => 'Hlavní položky',
+ General => 'Hlavní',
+ Details => 'Detaily',
+
+ Information => 'Informace',
+ Languages => 'Jazyky',
+ Encoding => 'Kódování',
+
+ FilterAudienceAge => 'Věk diváka',
+ FilterSeenNo => '_Neshlédnuté filmy',
+ FilterSeenYes => '_Shlédnuté filmy',
+ FilterRatingSelect => '_Hodnocení minimálně...',
+
+ ExtractSize => 'Velikost',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCgames.pm b/lib/gcstar/GCLang/CS/GCModels/GCgames.pm
new file mode 100644
index 0000000..a16822f
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCgames.pm
@@ -0,0 +1,85 @@
+{
+ package GCLang::CS::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Sbírka her',
+ Items => sub {
+ my $number = shift;
+ return 'Hra' if $number eq '1';
+ return 'Hry' if $number =~ /(?<!1)[2-4]$/;
+ return 'Her';
+ },
+ NewItem => 'Nová hra',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Název',
+ Platform => 'Platforma',
+ Players => 'Počet hráčů',
+ Released => 'Datum vydání',
+ Editor => 'Vydavatel',
+ Developer => 'Vývojář',
+ Genre => 'Žánr',
+ Box => 'Obrázek obalu',
+ Case => 'Obal',
+ Manual => 'Manuál',
+ Completion => 'Dokončeno (%)',
+ Executable => 'Spustitelný soubor',
+ Description => 'Popis',
+ Codes => 'Cheaty',
+ Code => 'Cheat',
+ Effect => 'Účel',
+ Secrets => 'Tajemství',
+ Screenshots => 'Snímek ze hry',
+ Screenshot1 => 'První snímek ze hry',
+ Screenshot2 => 'Druhý snímek ze hry',
+ Comments => 'Komentář',
+ Url => 'Web',
+ Unlockables => 'Možnosti odemčení',
+ Unlockable => 'Odemčení',
+ Howto => 'Jak odemknout',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Hlavní',
+ Details => 'Detaily',
+ Tips => 'Tipy',
+ Information => 'Informace',
+
+ FilterRatingSelect => 'Hodnocení _minimálně...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/CS/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..8257a08
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::CS::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCminicars.pm b/lib/gcstar/GCLang/CS/GCModels/GCminicars.pm
new file mode 100644
index 0000000..18c9c20
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::CS::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCmusics.pm b/lib/gcstar/GCLang/CS/GCModels/GCmusics.pm
new file mode 100644
index 0000000..719bd39
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCmusics.pm
@@ -0,0 +1,71 @@
+{
+ package GCLang::CS::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Sbírka hudby',
+ Items => sub {
+ my $number = shift;
+ return 'Album' if $number eq '1';
+ return 'Alba' if $number =~ /(?<!1)[2-4]$/;
+ return 'Alb';
+ },
+ NewItem => 'Nové album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Název',
+ Cover => 'Obal',
+ Artist => 'Umělec',
+ Format => 'Formát',
+ Running => 'Délka',
+ Release => 'Datum vydání',
+ Genre => 'Žánr',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Seznam skladeb',
+ Number => 'Číslo',
+ Track => 'Název',
+ Time => 'Čas',
+
+ Composer => 'Skladatel',
+ Producer => 'Producent',
+ Playlist => 'Playlist',
+ Comments => 'Poznámky',
+ Label => 'Vydavatel', #Label
+ Url => 'Webová stránka',
+
+ General => 'Hlavní',
+ Details => 'Detaily',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/CS/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..10a0117
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::CS::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/CS/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..c312da1
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::CS::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/CS/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..8745ae9
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::CS::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCstamps.pm b/lib/gcstar/GCLang/CS/GCModels/GCstamps.pm
new file mode 100644
index 0000000..d60bfa5
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::CS::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCwines.pm b/lib/gcstar/GCLang/CS/GCModels/GCwines.pm
new file mode 100644
index 0000000..8d94535
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCwines.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::CS::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Sbírka vín',
+ Items => sub {
+ my $number = shift;
+ return 'Víno' if $number eq '1';
+ return 'Vína' if $number =~ /(?<!1)[2-4]$/;
+ return 'Vín';
+ },
+ NewItem => 'Nové víno',
+
+ Name => 'Název',
+ Designation => 'Zatřídění',
+ Vintage => 'Ročník',
+ Vineyard => 'Vinice',
+ Type => 'Typ',
+ Grapes => 'Hrozny',
+ Soil => 'Půda',
+ Producer => 'Výrobce',
+ Country => 'Původ',
+ Volume => 'Obsah (ml)',
+ Alcohol => 'Alkohol (%)',
+ Medal => 'Ocenění/Vyznamenání',
+
+ Storage => 'Uskladnění',
+ Location => 'Umístění',
+ ShelfIndex => 'Index',
+ Quantity => 'Množství',
+ Acquisition => 'Přírůstek', #Acquisition
+ PurchaseDate => 'Datum nákupu',
+ PurchasePrice => 'Nákupní cena',
+ Gift => 'Dar',
+ BottleLabel => 'Viněta',
+ Website => 'Zmínka na webu',
+
+ Tasted => 'Ochutnáno',
+ Comments => 'Poznámky',
+ Serving => 'Servírování', #Serving
+ TastingField => 'Poznámky k jakkosti', #Testing notes
+
+ General => 'Hlavní',
+ Details => 'Detaily',
+ Tasting => 'Ochutnávka',
+
+ TastedNo => 'Neochutnáno',
+ TastedYes => 'Ochutnáno',
+
+ FilterRange => '_Rozmezí',
+ FilterTastedNo => '_Neochutnáno',
+ FilterTastedYes => '_Ochutnáno',
+ FilterRatingSelect => '_Hodnocení minimálně...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCstar.pm b/lib/gcstar/GCLang/CS/GCstar.pm
new file mode 100644
index 0000000..359f860
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCstar.pm
@@ -0,0 +1,672 @@
+{
+ package GCLang::CS;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Czech',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Varování</b>:
+
+Informace získané ze serverů (vyhledávacím pluginem)
+jsou pouze pro <b>osobní použití</b>.
+
+Jakákoliv redistribuce je zakázána bez <b>přímého souhlasu</b> serverů.
+
+K rozlišení, který server vlastní dané informace, můžete použít
+<b>tlačítko pod detaily každé položky</b>.',
+
+ 'AllItemsFiltered' => 'Žádný záznam pro Vaše zadání', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Instaluji do ',
+ 'InstallMandatory' => 'Povinné součásti',
+ 'InstallOptional' => 'Volitelné součásti',
+ 'InstallErrorMissing' => 'Chyba: Musí být nainstalovány následující komponenty Perlu: ',
+ 'InstallPrompt' => 'Základní adresář pro instalaci [/usr/local]: ',
+ 'InstallEnd' => 'Konec instalace',
+ 'InstallNoError' => 'Bez chyb',
+ 'InstallLaunch' => 'Před použitím aplikace musíte spustit ',
+ 'InstallDirectory' => 'Základní adresář',
+ 'InstallTitle' => 'Instalace GCstar',
+ 'InstallDependencies' => 'Závislosti',
+ 'InstallPath' => 'Cesta',
+ 'InstallOptions' => 'Volby',
+ 'InstallSelectDirectory' => 'Vyberte adresář pro instalaci',
+ 'InstallWithClean' => 'Odstraňte soubory z adresáře pro instalaci',
+ 'InstallWithMenu' => 'Přidat GCstar do menu Aplikace',
+ 'InstallNoPermission' => 'Chyba: Nemáte oprávnění k zápisu do zvoleného adresáře',
+ 'InstallMissingMandatory' => 'Povinné závislosti chybí. Instalace GCstar není možná, dokud nebudou přidány do systému.',
+ 'InstallMissingOptional' => 'Několik volitelných součástí chybí. Jejich seznam je níže. GCstar může být nainstalován, ale některé vlastnosti nebudou dostupné.',
+ 'InstallMissingNone' => 'Všechny potřebné součásti jsou nainstalovány. Instalace může pokračovat.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Chybí',
+ 'InstallMissingFor' => 'Chybí',
+ 'InstallCleanDirectory' => 'Odstraňování souborů programu GCstar v adresáři: ',
+ 'InstallCopyDirectory' => 'Kopírování souborů do adresáře: ',
+ 'InstallCopyDesktop' => 'Kopírování souboru pracovní plochy do: ', #Copying desktop file in
+
+#Update
+ 'UpdateUseProxy' => 'Použít Proxy (pokud není potřeba, stiskni enter): ',
+ 'UpdateNoPermission' => 'Nemáte právo zápisu v tomto adresáři: ',
+ 'UpdateNone' => 'Update není k dispozici',
+ 'UpdateFileNotFound' => 'Soubor nenalezen',
+
+#Splash
+ 'SplashInit' => 'Inicializace',
+ 'SplashLoad' => 'Nahrávám sbírku',
+ 'SplashDisplay' => 'Zobrazuji sbírku',
+ 'SplashSort' => 'Řadím sbírku',
+ 'SplashDone' => 'Hotovo',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Zdá se, že jste dříve používal(a) GCfilms. Co chcete importovat z GCfilms do GCstar (nebude to mít vliv na GCfilms pokud jej nadále budete chtít používat)?',
+ 'GCfilmsImportOptions' => 'Nastavení',
+ 'GCfilmsImportData' => 'Seznam filmů',
+
+#Menus
+ 'MenuFile' => '_Soubor',
+ 'MenuNewList' => '_Nová sbírka',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => 'N_edávné sbírky',
+ 'MenuLend' => 'Zobraz _půjčené položky', # Accepts model codes
+ 'MenuImport' => '_Import',
+ 'MenuExport' => '_Export',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Úpravy',
+ 'MenuDuplicate' => '_Duplikuj položku', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Vymaž položku', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Změň pole sbírky', # Change collection fields
+ 'MenuEditLockItems' => '_Uzamkni sbírku',
+
+ 'MenuDisplay' => '_Filtr',
+ 'MenuSavedSearches' => 'Saved searches',
+ 'MenuSavedSearchesSave' => 'Save current search',
+ 'MenuSavedSearchesEdit' => 'Modify saved searches',
+ 'MenuAdvancedSearch' => '_Pokročilé vyhledávání',
+ 'MenuViewAllItems' => 'Zobrazit _všechny položky', # Accepts model codes
+ 'MenuNoFilter' => '_Vše',
+
+ 'MenuConfiguration' => '_Nastavení',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Zobrazené informace',
+ 'MenuBorrowers' => '_Dlužníci',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '_Konverze žánru',
+
+ 'MenuBookmarks' => 'Mé _Sbíky',
+ 'MenuBookmarksAdd' => '_Přidat aktuální sbírku',
+ 'MenuBookmarksEdit' => '_Editovat založené sbírky', # Edit bookmarked collections
+
+ 'MenuHelp' => '_Nápověda',
+ 'MenuHelpContent' => '_Nápověda',
+ 'MenuAllPlugins' => 'Zobrazit _pluginy',
+ 'MenuBugReport' => 'Nahlásit _chybu',
+ 'MenuAbout' => '_O aplikaci GCstar',
+
+ 'MenuNewWindow' => 'Zobrazit položky v _novém okně', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Zobraz vše',
+ 'ContextCollapseAll' => 'Skryj vše',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Prosím zadej hodnotu',
+
+ 'RemoveConfirm' => 'Opravdu chcete vymazat tuto položku?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+
+ 'DefaultNewItem' => 'Nová položka', # Accepts model codes
+ 'NewItemTooltip' => 'Přidat novou položku', # Accepts model codes
+ 'NoItemFound' => 'Položka nebyla nalezena. Chcete ji zkusit najít na jiném serveru?',
+ 'OpenList' => 'Prosím vyberte sbírku',
+ 'SaveList' => 'Prosím vyberte, kam uložit sbírku',
+ 'SaveListTooltip' => 'Uložit současnou sbírku',
+ 'SaveUnsavedChanges' => 'Ve sbírce jste provedli změny. Chcete je nyní uložit?',
+ 'SaveDontSave' => 'Neukládat',
+ 'PreferencesTooltip' => 'Umožňuje změnu nastavení',
+ 'ViewTooltip' => 'Změní zobrazení sbírky',
+ 'PlayTooltip' => 'Přehraje video asociované filmem', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Ukládám...',
+ 'StatusLoad' => 'Nahrávám...',
+ 'StatusSearch' => 'Hledám...',
+ 'StatusGetInfo' => 'Stahuji informace...',
+ 'StatusGetImage' => 'Stahuji obrázek...',
+
+ 'SaveError' => 'Nemohu uložit seznam. Prosím zkontrolujte přístupová práva a volné místo na disku.',
+ 'OpenError' => 'Nemohu otevřít seznam. Prosím zkontrolujte přístupová práva.',
+ 'OpenFormatError' => 'Nemohu otevřít seznam.',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'Adresář vybraný k ukládání obrázků není správný. Prosím vyberte jiný.',
+ 'OptionsCreationError'=> 'Nemohu vytvořit soubor s nastavením: ',
+ 'OptionsOpenError'=> 'Nemohu otevřít soubor s nastavením: ',
+ 'OptionsSaveError'=> 'Nemohu uložit soubor s nastavením: ',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'Co budu dělat dnes večer?',
+ 'RandomError'=> 'Nic nemáte', # Accepts model codes
+ 'RandomEnd'=> 'Nic dalšího nemáte', # Accepts model codes
+ 'RandomNextTip'=> 'Další tip',
+ 'RandomOkTip'=> 'Přijmout tento tip',
+
+ 'AboutTitle' => 'O aplikaci GCstar',
+ 'AboutDesc' => 'Katalog sbírek',
+ 'AboutVersion' => 'Verze',
+ 'AboutTeam' => 'Tým',
+ 'AboutWho' => 'Christian Jodar (Tian): Project manager, Programmer
+Nyall Dawson (Zombiepig): Programmer
+TPF: Programmer
+Adolfo González: Programmer
+',
+ 'AboutLicense' => 'Distribuováno za podmínek GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Český překlad připravil Tomáš Klimek (Tomas.Klimek@gmail.com)',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logo a webdesign od le Spektre',
+
+ 'ToolbarRandom' => 'Dnes večer',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+ 'ModelsSelect' => 'Vyber typ sbírky',
+ 'ModelsPersonal' => 'Vlastní šablony',
+ 'ModelsDefault' => 'Standardní šablony',
+ 'ModelsList' => 'Typy sbírek',
+ 'ModelSettings' => 'Nastavení sbírek',
+ 'ModelNewType' => 'Nový typ sbírky',
+ 'ModelName' => 'Název nového typu sbírky:',
+ 'ModelFields' => 'Pole',
+ 'ModelOptions' => 'Nastavení',
+ 'ModelFilters' => 'Filtry',
+ 'ModelNewField' => 'Nové pole',
+ 'ModelFieldInformation' => 'Informace',
+ 'ModelFieldName' => 'Štítek:',
+ 'ModelFieldType' => 'Typ:',
+ 'ModelFieldGroup' => 'Skupina:',
+ 'ModelFieldValues' => 'Hodnoty',
+ 'ModelFieldInit' => 'Implicitní:',
+ 'ModelFieldMin' => 'Minimální:',
+ 'ModelFieldMax' => 'Maximální:',
+ 'ModelFieldList' => 'Seznam hodnot:',
+ 'ModelFieldListLegend' => '<i>Oddělovač je čárka</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Krátký text',
+ 'ModelFieldTypeLongText' => 'Dlouhý text',
+ 'ModelFieldTypeYesNo' => 'Ano/Ne',
+ 'ModelFieldTypeNumber' => 'Číslo',
+ 'ModelFieldTypeDate' => 'Datum',
+ 'ModelFieldTypeOptions' => 'Předdefinovaný seznam hodnot',
+ 'ModelFieldTypeImage' => 'Obrázek',
+ 'ModelFieldTypeSingleList' => 'Jednoduchý seznam',
+ 'ModelFieldTypeFile' => 'Soubor',
+ 'ModelFieldTypeFormatted' => 'Závislý na jiných typech',
+ 'ModelFieldParameters' => 'Parametry',
+ 'ModelFieldHasHistory' => 'Používat historii',
+ 'ModelFieldFlat' => 'Zobrazit v jedné řadě',
+ 'ModelFieldStep' => 'Krok přírůstku:',
+ 'ModelFieldFileFormat' => 'Typ souboru:',
+ 'ModelFieldFileFile' => 'Prostý soubor',
+ 'ModelFieldFileImage' => 'Obrázek',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Přiřazení polí',
+ 'ModelOptionsFieldsAuto' => 'Automaticky',
+ 'ModelOptionsFieldsNone' => 'Nic',
+ 'ModelOptionsFieldsTitle' => 'Nadpis',
+ 'ModelOptionsFieldsId' => 'Identifikátor',
+ 'ModelOptionsFieldsCover' => 'Obal',
+ 'ModelOptionsFieldsPlay' => 'Tlačítko přehrát',
+ 'ModelCollectionSettings' => 'Nastavení sbírky',
+ 'ModelCollectionSettingsLending' => 'Položky mohou být půjčeny',
+ 'ModelCollectionSettingsTagging' => 'Items can be tagged',
+ 'ModelFilterActivated' => 'Pole bude ve vyhledávání',
+ 'ModelFilterComparison' => 'Porovnání',
+ 'ModelFilterContain' => 'Obsahuje',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Rozsah',
+ 'ModelFilterNumeric' => 'Porovnávání je číselné',
+ 'ModelFilterQuick' => 'Vytvořit rychlý filtr',
+ 'ModelTooltipName' => 'Zadejte název pokud chcete šablonu použít v dalších kolekcích. Pokud název nezadáte, bude nastavení uloženo přímo v kolekci',
+ 'ModelTooltipLabel' => 'Zobrazený název pole',
+ 'ModelTooltipGroup' => 'Použití pro seskupování polí. Položky bez přiřazené hodnoty budou v implicitní skupině',
+ 'ModelTooltipHistory' => 'Pro uchování dříve zadaných hodnot do seznamu přiřazenému poli',
+ 'ModelTooltipFormat' => 'Typ souboru se použije pro rozlišení akce při otevírání souboru tlačítkem Přehrát',
+ 'ModelTooltipLending' => 'Tato možnost přidá několik polí pro správu půjčování',
+ 'ModelTooltipTagging' => 'This will add some fields to manage tags',
+ 'ModelTooltipNumeric' => 'Hodnoty budou považovány za čísla při porovnání',
+ 'ModelTooltipQuick' => 'Do menu filtr přidá submenu', #This will add a submenu in the Filters one
+
+ 'ResultsTitle' => 'Vyberte si ze seznamu', # Accepts model codes
+ 'ResultsNextTip' => 'Hledat na dalším serveru',
+ 'ResultsPreview' => 'Náhled',
+ 'ResultsInfo' => 'You can add multiple items to the collection by holding down the Ctrl or the Shift key and selecting them', # Accepts model codes
+
+ 'OptionsTitle' => 'Možnosti',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Webový prohlížeč',
+ 'OptionsPlayer' => 'Přehrávač videa',
+ 'OptionsAudio' => 'Přehrávač hudby',
+ 'OptionsImageEditor' => 'Image Editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Adresář s obrázky',
+ 'OptionsUseRelativePaths' => 'Pro obrázky používat relativní cesty',
+ 'OptionsLayout' => 'Rozložení',
+ 'OptionsStatus' => 'Zobrazit stavový řádek',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Varování: Změny v této záložce budou bez efektu až do restartu aplikace',
+ 'OptionsRemoveConfirm' => 'Před smazáním položky požadovat potvrzení',
+ 'OptionsAutoSave' => 'Automaticky ukládat sbírku',
+ 'OptionsAutoLoad' => 'Při startu nahrát předchozí sbírku',
+ 'OptionsSplash' => 'Zobrazit úvodní obrázek',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Use spelling checker for long text fields',
+ 'OptionsProgramTitle' => 'Vyberte webový prohlížeč',
+ 'OptionsPlugins' => 'Server, odkud stahovat data',
+ 'OptionsAskPlugins' => 'Zeptat se (všechny servery)',
+ 'OptionsPluginsMulti' => 'Více serverů',
+ 'OptionsPluginsMultiAsk' => 'Zeptat se (více serverů)',
+ 'OptionsPluginsMultiPerField' => 'Více serverů (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Nastavit seznam',
+ 'OptionsAskImport' => 'Vyberte pole, která se importují',
+ 'OptionsProxy' => 'Použít proxy',
+ 'OptionsCookieJar' => 'Use this cookie jar file',
+ 'OptionsLang' => 'Jazyk',
+ 'OptionsMain' => 'Hlavní',
+ 'OptionsPaths' => 'Cesty',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Vlastnosti',
+ 'OptionsDisplay' => 'Zobrazení',
+ 'OptionsToolbar' => 'Nástrojová lišta',
+ 'OptionsToolbars' => {0 => 'Žádná', 1 => 'Malá', 2 => 'Velká', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'Umístění',
+ 'OptionsToolbarPositions' => {0 => 'Nahoře', 1 => 'Dole', 2 => 'Vlevo', 3 => 'Vpravo'},
+ 'OptionsExpandersMode' => 'Expanders too long',
+ 'OptionsExpandersModes' => {'asis' => 'Do nothing', 'cut' => 'Cut', 'wrap' => 'Line wrap'},
+ 'OptionsDateFormat' => 'Date Format',
+ 'OptionsDateFormatTooltip' => 'Format is the one used by strftime(3). Default is %d/%m/%Y',
+ 'OptionsView' => 'Zobrazení',
+ 'OptionsViews' => {0 => 'Text', 1 => 'Obrázek', 2 => 'Detailní'},
+ 'OptionsColumns' => 'Sloupce',
+ 'OptionsMailer' => 'E-mailer',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'E-mail',
+ 'OptionsTransform' => 'Členy umístit na konce názvů',
+ 'OptionsArticles' => 'Členy (odděleny čárkou)',
+ 'OptionsSearchStop' => 'Umožnit zrušení hledání',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'Použít hlavní titul jako originální titul, pokud není vyplněn',
+ 'OptionsRestoreAccelerators' => 'Restore accelerators',
+ 'OptionsHistory' => 'Velikost historie',
+ 'OptionsClearHistory' => 'Vyčistit historii',
+ 'OptionsStyle' => 'Skin',
+ 'OptionsDontAsk' => 'Příště se nedotazovat',
+ 'OptionsPathProgramsGroup' => 'Programy',
+ 'OptionsProgramsSystem' => 'Použít programy stanovené v systému',
+ 'OptionsProgramsUser' => 'Použít jiné programy',
+ 'OptionsProgramsSet' => 'Nastavit programy',
+ 'OptionsPathImagesGroup' => 'Obrázky',
+ 'OptionsInternetDataGroup' => 'Import dat',
+ 'OptionsInternetSettingsGroup' => 'Nastavení',
+ 'OptionsDisplayInformationGroup' => 'Informační panel',
+ 'OptionsDisplayArticlesGroup' => 'Členy',
+ 'OptionsImagesDisplayGroup' => 'Zobrazení',
+ 'OptionsImagesStyleGroup' => 'Styl',
+ 'OptionsDetailedPreferencesGroup' => 'Předvolby',
+ 'OptionsFeaturesConveniencesGroup' => 'Nastavení',
+ 'OptionsPicturesFormat' => 'Předpona použitá pro obrázky:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Titul nebo název asociované položky',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% nebo . bude nahrazen adresářem se sbírkou (používat pouze pro začátek cesty)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% bude nahrazen názvem sbírky bez přípony (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% může být použit pouze pro začátek cesty s obrázky',
+ 'OptionsConfigureMailers' => 'Nastavení e-mailových programů',
+
+ 'ImagesOptionsButton' => 'Nastavení',
+ 'ImagesOptionsTitle' => 'Nastavení pro seznam obrázků',
+ 'ImagesOptionsSelectColor' => 'Vybrat barvu',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Pozadí',
+ 'ImagesOptionsBgPicture' => 'Použít obrázek na pozadí',
+ 'ImagesOptionsFg'=> 'Výběr',
+ 'ImagesOptionsBgTooltip' => 'Změna barvy pozadí',
+ 'ImagesOptionsFgTooltip'=> 'Změna barvy výběru',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Velikost obrázků',
+ 'ImagesOptionsSizeList' => {0 => 'Velmi malé', 1 => 'Malé', 2 => 'Středně velké', 3 => 'Velké', 4 => 'Velmi velké'},
+ 'ImagesOptionsSizeTooltip' => 'Výběr velikosti obrázků',
+
+ 'DetailedOptionsTitle' => 'Nastavení detailního seznamu',
+ 'DetailedOptionsImageSize' => 'Velikost obrázků',
+ 'DetailedOptionsGroupItems' => 'Řadit podle',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'Výběr zobrazených polí',
+ 'DetailedOptionsGroupedFirst' => 'Osiřelé položky nechat pohromadě',
+ 'DetailedOptionsAddCount' => 'Zobrazit počet prvků v kategoriích',
+
+ 'ExtractButton' => 'Informace',
+ 'ExtractTitle' => 'Informace o video souboru',
+ 'ExtractImport' => 'Použít hodnoty',
+
+ 'FieldsListOpen' => 'Nahrát seznam polí ze souboru',
+ 'FieldsListSave' => 'Uložit seznam polí do souboru',
+ 'FieldsListError' => 'Tento seznam polí nemůže být použit s tímto typem sbírky',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Export seznamu',
+ 'ExportFilter' => 'Export pouze zobrazených položek',
+ 'ExportFieldsTitle' => 'Pole k exportu',
+ 'ExportFieldsTip' => 'Vyber pole k exportu',
+ 'ExportWithPictures' => 'Zkopírovat obrázky do podadresáře',
+ 'ExportSortBy' => 'Řadit podle',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Import dalšího seznamu',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'Soubor',
+ 'ImportExportFieldsUnused' => 'Nepoužité pole',
+ 'ImportExportFieldsUsed' => 'Použité pole',
+ 'ImportExportFieldsFill' => 'Přidat vše',
+ 'ImportExportFieldsClear' => 'Odebrat vše',
+ 'ImportExportFieldsEmpty' => 'Musíte vybrat alespoň jedno pole',
+ 'ImportExportFileEmpty' => 'Musíte zadat jméno souboru',
+ 'ImportFieldsTitle' => 'Pole k importu',
+ 'ImportFieldsTip' => 'Vyberte pole k importu',
+ 'ImportNewList' => 'Vytvořit novou kolekci',
+ 'ImportCurrentList' => 'Přidat do stávající kolekce',
+ 'ImportDropError' => 'Při otevírání souboru se vyskytl problém. Znovu se načte předchozí seznam.',
+ 'ImportGenerateId' => 'Vytvořit identifikátor pro každou položku',
+
+ 'FileChooserOpenFile' => 'Prosím vyberte soubor',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Vyberte adresář pro ukládání obrázků',
+ 'FileChooserOverwrite' => 'Tento soubor již existuje. Chcete jej přepsat?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ 'PanelCompact' => 'Kompaktní',
+ 'PanelReadOnly' => 'Pouze pro čtení',
+ 'PanelForm' => 'Záložky',
+
+ 'PanelSearchButton' => 'Stáhnout Informace',
+ 'PanelSearchTip' => 'Hledá informace o tomto názvu na webu',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Pro výběr jiného obrázku na obrázek klikněte.',
+ 'PanelImageTipView' => 'Pro zobrazení skutečné velikosti obrázku na něj klikněte.',
+ 'PanelImageTipMenu' => 'Pod pravým tlačítkem je více voleb.',
+ 'PanelImageTitle' => 'Vyberte obrázek',
+ 'PanelImageNoImage' => 'Bez obrázku',
+ 'PanelSelectFileTitle' => 'Vyberte soubor',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Obnovit výchozí nastavení',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'Od',
+ 'PanelTo' =>'Do',
+
+ 'PanelWeb' => 'Zobrazit informace',
+ 'PanelWebTip' => 'Zobrazí informace o vybrané položce na webu', # Accepts model codes
+ 'PanelRemoveTip' => 'Odstraní stávající položku', # Accepts model codes
+
+ 'PanelDateSelect' => 'Vyberte datum',
+ 'PanelNobody' => 'Žádný',
+ 'PanelUnknown' => 'Neznámý',
+ 'PanelAdded' => 'Přidáno',
+ 'PanelRating' => 'Hodnocení',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Umístění',
+
+ 'PanelLending' => 'Zápůjčky',
+ 'PanelBorrower' => 'Dlužník',
+ 'PanelLendDate' => 'Půjčeno od',
+ 'PanelHistory' => 'Historie zápůjček',
+ 'PanelReturned' => 'Položka vrácena', # Accepts model codes
+ 'PanelReturnDate' => 'Datum vrácení',
+ 'PanelLendedYes' => 'Půjčeno',
+ 'PanelLendedNo' => 'Dostupné',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favourite',
+ 'TagsAssigned' => 'Assigned Tags',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Nezáleží',
+ 'CheckYes' => 'Ano',
+ 'CheckNo' => 'Ne',
+
+ 'ToolbarAll' => 'Zobrazit vše',
+ 'ToolbarAllTooltip' => 'Zobrazí celý seznam',
+ 'ToolbarGroupBy' => 'Řadit podle',
+ 'ToolbarGroupByTooltip' => 'Vyberte pole, podle kterého se mají řadit položky seznamu',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Hledat',
+ 'PluginsQuery' => 'Dotaz',
+ 'PluginsFrame' => 'Hledat na serveru',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Jméno',
+ 'PluginsSearchFields' => 'Hledat v poli',
+ 'PluginsAuthor' => 'Autor',
+ 'PluginsLang' => 'Jazyk',
+ 'PluginsUseSite' => 'Použít vybraný server pro další hledání',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Konfigurace dlužníků',
+ 'BorrowersList' => 'Dlužníci',
+ 'BorrowersName' => 'Jméno',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Přidat',
+ 'BorrowersRemove' => 'Odebrat',
+ 'BorrowersEdit' => 'Editace',
+ 'BorrowersTemplate' => 'Šablona mailu',
+ 'BorrowersSubject' => 'Předmět mailu',
+ 'BorrowersNotice1' => '%1 bude nahrazen jménem dlužníka',
+ 'BorrowersNotice2' => '%2 bude nahrazen názvem položky',
+ 'BorrowersNotice3' => '%3 bude nahrazen datem výpůjčky',
+
+ 'BorrowersImportTitle' => 'Importovat informace o dlužnících',
+ 'BorrowersImportType' => 'Formát souboru:',
+ 'BorrowersImportFile' => 'Soubor:',
+
+ 'BorrowedTitle' => 'Půjčené položky', # Accepts model codes
+ 'BorrowedDate' => 'Od',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'Poslat e-mail',
+ 'MailFrom' => 'Od: ',
+ 'MailTo' => 'Komu: ',
+ 'MailSubject' => 'Předmět: ',
+ 'MailSmtpError' => 'Problém s připojením k SMTP serveru',
+ 'MailSendmailError' => 'Problém se spuštěním sendmailu',
+
+ 'SearchTooltip' => 'Prohledává celý seznam', # Accepts model codes
+ 'SearchTitle' => 'Hledání', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Nahradit v poli',
+ 'QueryReplaceOld' => 'Současné jméno',
+ 'QueryReplaceNew' => 'Nové jméno',
+ 'QueryReplaceLaunch' => 'Nahradit',
+
+ 'ImportWindowTitle' => 'Vyberte pole k importu',
+ 'ImportViewPicture' => 'Zobrazit obrázek',
+ 'ImportSelectAll' => 'Vybrat vše',
+ 'ImportSelectNone' => 'Nevybírat nic',
+
+ 'MultiSiteTitle' => 'Pro hledání použít tyto servery',
+ 'MultiSiteUnused' => 'Nepoužité servery',
+ 'MultiSiteUsed' => 'Použité servery',
+ 'MultiSiteLang' => 'Vybrat české servery',
+ 'MultiSiteEmptyError' => 'Máte prázdný seznam serverů',
+ 'MultiSiteClear' => 'Vymazat seznam',
+
+ 'DisplayOptionsTitle' => 'Zobrazit položky',
+ 'DisplayOptionsAll' => 'Vybrat vše',
+ 'DisplayOptionsSearch' => 'Stáhnout informace',
+
+ 'GenresTitle' => 'Konverze žánrů',
+ 'GenresCategoryName' => 'Použít žánr',
+ 'GenresCategoryMembers' => 'Nahradit žánr',
+ 'GenresLoad' => 'Nahrát seznam',
+ 'GenresExport' => 'Uložit seznam do souboru',
+ 'GenresModify' => 'Upravit konverzi',
+
+ 'PropertiesName' => 'Název sbírky',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Vlastník',
+ 'PropertiesEmail' => 'E-mail',
+ 'PropertiesDescription' => 'Popis',
+ 'PropertiesFile' => 'Informace o souboru',
+ 'PropertiesFilePath' => 'Úplná cesta',
+ 'PropertiesItemsNumber' => 'Počet položek', # Accepts model codes
+ 'PropertiesFileSize' => 'Velikost',
+ 'PropertiesFileSizeSymbols' => ['Bytů', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Vlastnosti sbírky',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Programy pro odesílání mailů',
+ 'MailProgramsName' => 'Název',
+ 'MailProgramsCommand' => 'Příkazová řádka',
+ 'MailProgramsRestore' => 'Obnovit implicitní',
+ 'MailProgramsAdd' => 'Přidat program',
+ 'MailProgramsInstructions' => 'V příkazové řádce je provedeno několik substitucí:
+ %f je nahrazeno e-mailovou adresou uživatele.
+ %t je nahrazeno adresou příjemce.
+ %s je nahrazeno předmětem zprávy.
+ %b je nahrazeno obsahem zprávy.',
+
+ 'BookmarksBookmarks' => 'Záložky',
+ 'BookmarksFolder' => 'Adresář',
+ 'BookmarksLabel' => 'Štítek', #Label
+ 'BookmarksPath' => 'Cesta',
+ 'BookmarksNewFolder' => 'Nový adresář',
+
+ 'AdvancedSearchType' => 'Typ hledání',
+ 'AdvancedSearchTypeAnd' => 'Položky odpovídají všem podmínkám', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Položky odpovídají alespoň jedné podmínce', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Podmínky',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Zpráva o chybě generovaná z GCstar',
+ 'BugReportVersion' => 'Verze',
+ 'BugReportPlatform' => 'Operační systém',
+ 'BugReportMessage' => 'Chybová zpráva',
+ 'BugReportInformation' => 'Další informace',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/DE/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/DE/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..81ff935
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::DE::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Feldnamen im Header exportieren',
+ 'Separator' => 'Feldtrenner',
+ 'Replacement' => 'Feldtrenner ersetzen durch',
+ 'Charset' => 'Zeichenkodierung',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/DE/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..eca0d20
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::DE::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'externes Medium',
+ 'ZipAll' => 'alles in eine Zip-Datei packen (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/DE/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..b03268b
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::DE::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Ungültige Templatedatei',
+ 'UseFile' => 'Nutze angegebene Datei',
+ 'TemplateExternalFile' => 'Templatedatei',
+ 'WithJS' => 'Javascript verwenden',
+ 'FileTemplate' => 'Template:',
+ 'Preview' => 'Vorschau',
+ 'NoPreview' => 'Keine Vorschau verfügbar',
+ 'Title' => 'Seitentitel',
+ 'InfoFile' => 'Liste erstellt: ',
+ 'InfoDir' => 'Bilder gespeichert unter: ',
+ 'HeightImg' => 'Höhe der zu exportierenden Bilder (in Pixeln): ',
+ 'OpenFileInBrowser' => 'Erzeugte Datei im Webbrowser öffnen',
+ 'Note' => 'Liste erstellt mit <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Suchtext eingeben',
+ 'SearchType1' => 'Nur Titel',
+ 'SearchType2' => 'Alle Informationen',
+ 'SearchButton' => 'Suche',
+ 'SearchTitle' => 'Nur Elemente anzeigen die diesen Kriterien entsprechen',
+ 'AllButton' => 'Alle',
+ 'AllTitle' => 'Alle Elemente anzeigen',
+ 'Expand' => 'Alle maximieren',
+ 'ExpandTitle' => 'Alle Informationen anzeigen',
+ 'Collapse' => 'Alle minimieren',
+ 'CollapseTitle' => 'Nur Titel anzeigen',
+ 'Borrowed' => 'Ausgeliehen von: ',
+ 'NotBorrowed' => 'Verfügbar',
+ 'Top' => 'Oben',
+ 'Bottom' => 'Unten',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/DE/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..e2da12e
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::DE::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Databankname',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/DE/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..ae45cae
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::DE::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Exportiere mit DROP TABLE Anweisung',
+ 'WithCreate' => 'Exportiere mit CREATE TABLE Anweisung',
+ 'TableName' => 'Tabellenname',
+ 'InfoFile' => 'SQL Datei: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/DE/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..1bef88a
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::DE::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Archiv erstellt: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/DE/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..2b15bb7
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::DE::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Dateivorlage',
+ 'ModelText' => 'Textvorlage',
+ 'Models' => 'Zu verwendende Vorlage',
+ 'UseFile' => 'Datei verwenden',
+ 'UseModel' => 'Textvorlage verwenden',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/DE/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..d6bf1f7
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::DE::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Wo soll gesucht werden',
+ 'Default' => 'Vorgabeverzeichnis von Alexandria',
+ 'Specified' => 'Verzeichnis wie unten angegeben',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/DE/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..4d0b19c
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::DE::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Zeichenkodierung',
+ 'Header' => 'Erste Zeile ignorieren',
+ 'Separator' => 'Feldtrenner',
+ 'Plugin' => 'Zu verwendende Seite',
+ 'UseFirst' => 'Bei mehreren Ergebnissen erstes verwenden',
+ 'SearchField' => 'verwende dieses Feld für die Suche',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/DE/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..6ca92e0
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::DE::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Ordner',
+ 'Recursive' => 'Unterordner durchsuchen',
+ 'Suffixes' => 'Suffix oder Dateiendung der Dateien',
+ 'SuffixesTooltip' => 'Eine kommaseparierte Liste von in Frage kommenden Suffixen oder Dateiendungen',
+ 'Remove' => 'Von den Namen zu entfernen',
+ 'RemoveTooltip' => 'Eine kommaseparierte Liste on Wörtern, die aus den Dateinamen entfernt werden sollen um die Namen zu bestimmen',
+ 'Ask'=> 'Nachfragen',
+ 'AskEnd'=> 'Nachfragen nach dem Sammeln aller Informationen',
+ 'AddWithoutInfo'=> 'Ohne Informationen hinzufügen',
+ 'DontAdd'=> 'Nicht hinzufügen',
+ 'TakeFirst' => 'Erstes verwenden',
+ 'MultipleResult'=> 'Mehrere Ergebnisse',
+ 'MultipleResultTooltip'=> 'Vorgehensweise wenn das Plugin mehr als ein Ergebnis liefert',
+ 'RemoveWholeWord' => 'Nur ganze Wörter entfernen',
+ 'NoResult'=> 'Keine Ergebnisse',
+ 'NoResultTooltip'=> 'Vorgehensweise wenn das Plugin kein Ergebnis liefert',
+ 'RemoveTooltipWholeWord' => 'Wörter entfernen wenn sie als gesamtes Wort erscheinen',
+ 'RemoveRegularExpr' => 'Reguläre Ausdrücke',
+ 'RemoveTooltipRegularExpr' => 'Zähle \'To be removed from names\' als regulären Perl Ausdruck',
+ 'SkipFileAlreadyInCollection' => 'Nur unbekannte Dateien hinzufügen',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Nur Dateien hinzufügen, die nicht Teil der Sammlung sind',
+ 'SkipFileNo' => 'Nein',
+ 'SkipFileFullPath' => 'basierend auf kompletten Pfad',
+ 'SkipFileFileName' => 'basierend auf komplettem Pfad',
+ 'SkipFileFileNameAndUpdate' => 'basierend auf komplettem Pfad (neuen Pfad für bewegte Dateien eintragen)',
+ 'InfoFromFileNameRegExp' => 'Verarbeite Dateinamen mit diesem regulären Ausdruck',
+ 'InfoFromFileNameRegExpTooltip' => 'Nachfolgende Informationen können für die Verarbeitugn verwendet werden (nach dem Entfernen der Dateiendung).\nLeer lassen, wenn nicht benötigt wird.\nBekannte Felder: \n$T:Titel, $A:Alphabetisierte Titel, $Y:Veröffentlichungsdatum, $S:Jahrgang, $E:Episode, $N:Alphabetisierter Serienname, $x:Nummer der Folge, $y: Anzahl Gesamtfolgen',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/DE/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..e31bb99
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::DE::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Kopiere Bilder',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCImport/GCImportList.pm b/lib/gcstar/GCLang/DE/GCImport/GCImportList.pm
new file mode 100644
index 0000000..6f5be27
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::DE::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Titelliste',
+ 'Plugin' => 'Zu verwendende Seite',
+ 'UseFirst' => 'Bei mehreren Ergebnissen erstes verwenden',
+ 'CommentAuto' => 'Element automatisch importiert.',
+ 'CommentSite' => 'Webseite: ',
+ 'CommentTitle' => 'Titel: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/DE/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..8610ac6
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::DE::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcodescanner',
+ 'Type' => 'Art des Scanners',
+ 'Local' => 'Lokal (Tastaturersatz)',
+ 'Network' => 'Netzwerk (z.B.: GCstar Scanner for Android)',
+ 'Port' => 'zu nutzender Port',
+ 'Plugin' => 'zu nutzende Website',
+ 'UseFirst' => 'Verwende erstes von mehreren Ergebnissen',
+ 'Waiting' => 'Warte auf Barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Element scannen oder Vorgang beenden',
+ 'ScanOtherPrompt' => 'Ein anderes Element scannen oder Vorgang beenden',
+ 'Previous' => '"%s" wird hinzugefügt.',
+ 'NothingFound' => 'Für "%s" wurde nichts gefunden. Ein leeres Element wird hinzugefügt.',
+ 'Terminate' => 'Vorgang beenden',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/DE/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..1a3e773
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::DE::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Datei ist keine Tellico Video-Sammlung',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/DE/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..7650cbb
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCTVepisodes.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::DE::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Episodensammlung von Fernsehserien',
+ Items => {
+ 0 => 'Folge',
+ 1 => 'Folge',
+ X => 'Folgen'},
+ NewItem => 'Neue Folge',
+ NewSeries => 'Neue Serie',
+ Episode => 'Folge',
+ Writer => 'Drehbuch',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/DE/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..65f5848
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCTVseries.pm
@@ -0,0 +1,53 @@
+{
+ package GCLang::DE::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Fernsehseriensammlung',
+ Items => {
+ 0 => 'Serie',
+ 1 => 'Serie',
+ X => 'Serien'},
+ NewItem => 'Neue Serie',
+ Name => 'Name',
+ Season => 'Staffel',
+ Part => 'Teil',
+ Episodes => 'Folge',
+ FirstAired => 'Erstausstrahlung',
+ Time => 'Länge',
+ Producer => 'Produzent',
+ Music => 'Musik',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/DE/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..33a094a
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCboardgames.pm
@@ -0,0 +1,87 @@
+{
+ package GCLang::DE::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Brettspielsammlung',
+ Items => {0 => 'Spiel',
+ 1 => 'Spiel',
+ X => 'Spiele'},
+ NewItem => 'Neues Spiel',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Originalname',
+ Box => 'Verpackungsbild',
+ DesignedBy => 'Entwickelt von',
+ PublishedBy => 'Erschienen bei',
+ Players => 'Anzahl der Spieler',
+ PlayingTime => 'Spielzeit',
+ SuggestedAge => 'Empfohlenes Alter',
+ Released => 'Erscheinungsdatum',
+ Description => 'Beschreibung',
+ Category => 'Kategorie',
+ Mechanics => 'Spielaktionen',
+ ExpandedBy => 'Erweitert durch',
+ ExpansionFor => 'Erweiterung für',
+ GameFamily => 'Spieltyp',
+ IllustratedBy => 'Illustriert von',
+ Url => 'Webseite',
+ TimesPlayed => 'Wie oft gespielt',
+ CompleteContents => 'Inhalt vollständig',
+ Copies => 'Anzahl der Spiele',
+ Condition => 'Konditionen',
+ Photos => 'Fotos',
+ Photo1 => 'Erstes Bild',
+ Photo2 => 'Zweites Bild',
+ Photo3 => 'Drittes Bild',
+ Photo4 => 'Viertes Bild',
+ Comments => 'Kommentare',
+
+ Perfect => 'Perfekt',
+ Good => 'Gut',
+ Average => 'Durchschnitt',
+ Poor => 'Schlecht',
+
+ CompleteYes => 'Inhalt vollständig',
+ CompleteNo => 'Fehlende Teile',
+
+ General => 'Allgemein',
+ Details => 'Details',
+ Personal => 'Persönlich',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Bewertung _mindestens...',
+ );
+}
+
+1;
+
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCbooks.pm b/lib/gcstar/GCLang/DE/GCModels/GCbooks.pm
new file mode 100644
index 0000000..96aac2f
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCbooks.pm
@@ -0,0 +1,71 @@
+{
+ package GCLang::DE::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Büchersammlung',
+ Items => {0 => 'Buch',
+ 1 => 'Buch',
+ X => 'Bücher',
+ },
+ NewItem => 'Neues Buch',
+
+ Isbn => 'ISBN',
+ Title => 'Titel',
+ Cover => 'Umschlag',
+ Authors => 'Autoren',
+ Publisher => 'Verlag',
+ Publication => 'Erscheinungsdatum',
+ Language => 'Sprache',
+ Genre => 'Genre',
+ Serie => 'Sammlung',
+ Rank => 'Teil/Folge',
+ Bookdescription => 'Beschreibung',
+ Pages => 'Seiten',
+ Read => 'Gelesen',
+ Acquisition => 'Anschaffungsdatum',
+ Edition => 'Auflage',
+ Format => 'Format',
+ Comments => 'Kommentare',
+ Url => 'Webseite',
+ Translator => 'Übersetzung',
+ Artist => 'Künstler',
+ DigitalFile => 'Digitalversion',
+
+ General => 'Allgemein',
+ Details => 'Details',
+
+ ReadNo => 'Nicht gelesen',
+ ReadYes => 'Gelesen',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCcoins.pm b/lib/gcstar/GCLang/DE/GCModels/GCcoins.pm
new file mode 100644
index 0000000..5f858ba
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCcoins.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::DE::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Numismatische Sammlung',
+ Items => {0 => 'Münze',
+ 1 => 'Münze',
+ X => 'Münzen',
+ },
+ NewItem => 'Neue Münze',
+
+ Name => 'Name',
+ Country => 'Land',
+ Year => 'Jahr',
+ Currency => 'Währung',
+ Value => 'Wert',
+ Picture => 'Bild',
+ Diameter => 'Durchmesser',
+ Metal => 'Metall',
+ Front => 'Kopf',
+ Back => 'Zahl',
+ Edge => 'Rand',
+ Edge1 => 'Rand 1',
+ Edge2 => 'Rand 2',
+ Edge3 => 'Rand 3',
+ Edge4 => 'Rand 4',
+ Head => 'Kopf',
+ Tail => 'Zahl',
+ Comments => 'Kommentar',
+ Location => 'Ort',
+ History => 'Geschichte',
+ Website => 'Website',
+ Estimate => 'Schätzwert',
+ References => 'Verweise',
+ Type => 'Typ',
+ Coin => 'Münze',
+ Banknote => 'Banknote',
+
+ Main => 'Haupt',
+ Description => 'Beschreibung',
+ Other => 'andere Informationen',
+ Pictures => 'Bilder',
+
+ Condition => 'Erhaltungsgrad nach PCGS',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCcomics.pm b/lib/gcstar/GCLang/DE/GCModels/GCcomics.pm
new file mode 100644
index 0000000..97144f8
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCcomics.pm
@@ -0,0 +1,74 @@
+{
+ package GCLang::DE::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comicheftsammlung',
+ Items => {0 => 'Comicheft',
+ 1 => 'Comicheft',
+ X => 'Comichefte'
+ },
+ NewItem => 'Neues Comicheft',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Serie',
+ Volume => 'Ausgabe',
+ Title => 'Titel',
+ Writer => 'Autor',
+ Illustrator => 'Illustrator',
+ Colourist => 'Kolorist',
+ Publisher => 'Herausgeber',
+ Synopsis => 'Zusammenfassung',
+ Collection => 'Sammlung',
+ PublishDate => 'Erscheinungsdatum',
+ PrintingDate => 'Druckdatum',
+ ISBN => 'ISBN',
+ Type => 'Typ',
+ Category => 'Kategorie',
+ Format => 'Format',
+ NumberBoards => 'Anzahl der Boards',
+ Signing => 'signiert',
+ Cost => 'Preis',
+ Rating => 'Bewertung',
+ Comment => 'Bemerkungen',
+ Url => 'Internetseite',
+
+ FilterRatingSelect => 'Bewertung _mindestens...',
+
+ Main => 'Hauptelemente',
+ General => 'Allgemein',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCfilms.pm b/lib/gcstar/GCLang/DE/GCModels/GCfilms.pm
new file mode 100644
index 0000000..fdcb003
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCfilms.pm
@@ -0,0 +1,94 @@
+{
+ package GCLang::DE::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Filmsammlung',
+ Items => {0 => 'Film',
+ 1 => 'Film',
+ X => 'Filme',
+ },
+
+ NewItem => 'Neuer Film',
+
+ Id => 'Kennung',
+ Title => 'Titel',
+ Date => 'Datum',
+ Time => 'Länge',
+ Director => 'Regisseur',
+ Country => 'Land',
+ MinimumAge => 'Altersfreigabe',
+ Genre => 'Genre',
+ Image => 'Bild',
+ Original => 'Originaltitel',
+ Actors => 'Besetzung',
+ Actor => 'Schauspieler/in',
+ Role => 'Rolle',
+ Comment => 'Kommentar',
+ Synopsis => 'Beschreibung',
+ Seen => 'gesehen',
+ Number => '# der Medien',
+ Format => 'Format',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'Internetseite',
+ Audio => 'Audio',
+ Video => 'Videoformat',
+ Trailer => 'Videodatei',
+ Serie => 'Serie',
+ Rank => 'Teil/Folge',
+ Subtitles => 'Untertitel',
+
+ SeenYes => 'Film bereits gesehen',
+ SeenNo => 'Film noch nicht gesehen',
+
+ AgeUnrated => 'Unbewertet',
+ AgeAll => 'Ohne Altersbeschränkung',
+ AgeParent => '6',
+
+ Main => 'Wichtigste Felder',
+ General => 'Allgemein',
+ Details => 'Details',
+
+ Information => 'Informationen',
+ Languages => 'Sprachen',
+ Encoding => 'Kodierung',
+
+ FilterAudienceAge => 'Altersfreigabe',
+ FilterSeenNo => 'Noch _nicht gesehen',
+ FilterSeenYes => 'Bereits _gesehen',
+ FilterRatingSelect => 'Bewertung _mindestens...',
+
+ ExtractSize => 'Größe',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCgames.pm b/lib/gcstar/GCLang/DE/GCModels/GCgames.pm
new file mode 100644
index 0000000..4c0c028
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCgames.pm
@@ -0,0 +1,82 @@
+{
+ package GCLang::DE::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computerspiele Sammlung',
+ Items => {0 => 'Spiel',
+ 1 => 'Spiel',
+ X => 'Spiele'},
+ NewItem => 'Neues Spiel',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Plattform',
+ Players => 'Anzahl der Spieler',
+ Released => 'Erscheinungsdatum',
+ Editor => 'Herausgeber',
+ Developer => 'Entwickler',
+ Genre => 'Genre',
+ Box => 'Bild der Verpackung',
+ Case => 'Originalverpackung',
+ Manual => 'Bedienungsanleitung',
+ Completion => 'Durchgespielt (%)',
+ Executable => 'Startdatei',
+ Description => 'Beschreibung',
+ Codes => 'Cheats',
+ Code => 'Cheatcode',
+ Effect => 'Effekt',
+ Secrets => 'Geheimnisse',
+ Screenshots => 'Bildschirm Foto',
+ Screenshot1 => 'Erstes Bildschirm Foto',
+ Screenshot2 => 'Zweites Bildschirm Foto',
+ Comments => 'Kommentar',
+ Url => 'Internetseite',
+ Unlockables => 'Lösungen',
+ Unlockable => 'Ziel',
+ Howto => 'Lösungsweg',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Bildschirmauflösungen',
+ InstallationSize => 'Größe',
+ Region => 'Region',
+ SerialNumber => 'Seriennummer',
+
+ General => 'Allgemein',
+ Details => 'Details',
+ Tips => 'Tipps',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Bewertung _mindestens...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/DE/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..5512302
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::DE::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Eintrag',
+ 1 => 'Eintrag',
+ X => 'Einträge'
+ },
+ NewItem => 'Neuer Eintrag',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCminicars.pm b/lib/gcstar/GCLang/DE/GCModels/GCminicars.pm
new file mode 100644
index 0000000..d14de56
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCminicars.pm
@@ -0,0 +1,179 @@
+{
+ package GCLang::DE::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Miniaturfahrzeugsammlung',
+ Items => {0 => 'Fahrzeug',
+ 1 => 'Fahrzeug',
+ X => 'Fahrzeuge'},
+ NewItem => 'Neues Fahrzeug',
+ Currency => 'Währung',
+
+# Main fields
+
+ Main => 'Hauptinformation',
+
+ Name => 'Name',
+ Exchange => 'Zu verkaufen oder zu tauschen',
+ Wanted => 'gesucht',
+ Rating1 => 'Hauptbewertung',
+ Picture1 => 'Hauptbild',
+ Scale => 'Maßstab',
+ Manufacturer => 'Hersteller',
+ Constructor => 'Konstrukteur',
+ Type1 => 'Typ',
+ Modele => 'Modell',
+ Version => 'Version',
+ Color => 'Farbe des Modells',
+ Pub => 'Werbung',
+ Year => 'Jahr',
+ Reference => 'Verweise',
+ Kit => 'Als Bausatz',
+ Transformation => 'Persönliche Informationen',
+ Comments1 => 'Bemerkungen',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'verschiedene Eigenschaften',
+ Material => 'Material',
+ Molding => 'Guss',
+ Condition => 'Zustand',
+ Edition => 'Ausgabe',
+ Collectiontype => 'Sammlungsname',
+ Serial => 'Serie',
+ Serialnumber => 'Seriennummer',
+ Designed => 'Entwurfsdatum',
+ Madein => 'Herstellungsland',
+ Box1 => 'Art der Verpackung',
+ Box2 => 'Verpackungsbeschreibung',
+ Containbox => 'Verpackungsinhalt',
+ Rating2 => 'Realitätsnähe',
+ Rating3 => 'Ausführung',
+ Acquisition => 'Kaufdatum',
+ Location => 'wo gekauft',
+ Buyprice => 'Kaufpreis',
+ Estimate => 'Schätzwert',
+ Comments2 => 'Bemerkungen',
+ Decorationset => 'Dekorationsausführung',
+ Characters => 'Figuren',
+ CarFromFilm => 'Filmauto',
+ Filmcar => 'Film mit diesem Auto',
+ Filmpart => 'Serienfolge',
+ Parts => 'Anzahl der Teile',
+ VehiculeDetails => 'technische Daten',
+ Detailsparts => 'besondere Einzelheiten',
+ Detailsdecorations => 'Art der Dekoration',
+ Decorations => 'Anzahl der Dokorationen',
+ Lwh => 'Länge / Breite / Höhe',
+ Weight => 'Gewicht',
+ Framecar => 'Fahrgestell',
+ Bodycar => 'Karosserie',
+ Colormirror => 'Farbe des Modells',
+ Interior => 'Innenausstattung',
+ Wheels => 'Räder',
+ Registrationnumber1 => 'Nummernschild vorne',
+ Registrationnumber2 => 'Nummernschild hinten',
+ RacingCar => 'Rennwagen',
+ Course => 'Rennen',
+ Courselocation => 'Rennplatzierung',
+ Courseyear => 'Renndatum',
+ Team => 'Team',
+ Pilots => 'Fahrer(innen)',
+ Copilots => 'Beifahrer(innen)',
+ Carnumber => 'Fahrzeugnummer',
+ Pub2 => 'Werbepartner',
+ Finishline => 'Platzierung',
+ Steeringwheel => 'Position des Lenkrades',
+
+
+# Catalogs fields
+
+ Catalogs => 'Katalog',
+
+ OfficialPicture => 'Herstellerfoto',
+ Barcode => 'Strichcode',
+ Referencemirror => 'Verweise',
+ Year3 => 'Verfügbarkeitsdatum',
+ CatalogCoverPicture => 'Katalogcover',
+ CatalogPagePicture => 'Katalogseite',
+ Catalogyear => 'Katalogsjahr',
+ Catalogedition => 'Katalogsausgabe',
+ Catalogpage => 'Katalogseite',
+ Catalogprice => 'Katalogpreis',
+ Personalref => 'Persönlicher Bezug',
+ Websitem => 'Website vom Herstellers des Miniaturfahrzeuges',
+ Websitec => 'Website vom Hersteller des Originalfahrzeuges',
+ Websiteo => 'Nützlicher Link',
+ Comments3 => 'Kommentare',
+
+# Pictures fields
+
+ Pictures => 'Bilder',
+
+ OthersComments => 'Generelle Anmerkungen',
+ OthersDetails => 'andere Details',
+ Top1 => 'oben',
+ Back1 => 'unten',
+ AVG => 'vorne links',
+ AV => 'vorne',
+ AVD => 'vorne rechts',
+ G => 'links',
+ BOX => 'Verpackung',
+ D => 'rechts',
+ ARG => 'hinten links',
+ AR => 'hinten',
+ ARD => 'hinten rechts',
+ Others => 'andere',
+
+# PanelLending fields
+
+ LendingExplanation => 'Leihgaben für Ausstellungen',
+ PanelLending => 'Ausleihen',
+ Comments4 => 'Kommentare',
+
+# Realmodel fields
+
+ Realmodel => 'Modell',
+
+ Difference => 'Unterschiede zwischen Modell und Original',
+ Front2 => 'vorne',
+ Back2 => 'hinten',
+ Comments5 => 'Kommentare',
+
+ References => 'Verweise',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCmusics.pm b/lib/gcstar/GCLang/DE/GCModels/GCmusics.pm
new file mode 100644
index 0000000..3605487
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCmusics.pm
@@ -0,0 +1,69 @@
+{
+ package GCLang::DE::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Musiksammlung',
+ Items => {0 => 'Album',
+ 1 => 'Album',
+ X => 'Alben',
+ },
+ NewItem => 'Neues Album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Titel',
+ Cover => 'Cover',
+ Artist => 'Künstler',
+ Format => 'Format',
+ Running => 'Laufzeit',
+ Release => 'Veröffentlichungsdatum',
+ Genre => 'Genre',
+ Origin => 'Origin',
+
+ # For tracks list
+ Tracks => 'Titelliste',
+ Number => 'Nummer',
+ Track => 'Titel',
+ Time => 'Zeit',
+
+ Composer => 'Komponist/in',
+ Producer => 'Produzent/in',
+ Playlist => 'Wiedergabeliste',
+ Comments => 'Kommentare',
+ Label => 'Verlag',
+ Url => 'Internetseite',
+
+ General => 'Allgemein',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/DE/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..5cd7c20
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCperiodicals.pm
@@ -0,0 +1,56 @@
+{
+ package GCLang::DE::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Zeitschriftensammlung',
+ Items => {0 => 'Heft',
+ 1 => 'Heft',
+ X => 'Hefte'},
+ NewItem => 'Neues Heft',
+
+ Title => 'Titel',
+ Cover => 'Titelseite',
+ Periodical => 'Zeitschrift',
+ Number => 'Nummer',
+ Date => 'Datum',
+ Subject => 'Stichworte',
+ Articles => 'Inhalt',
+
+ Article => 'Artikel',
+ Page => 'Seite',
+ Résumé => 'Zusammenfassung',
+
+ General => 'Allgemein',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/DE/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..288eb69
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::DE::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Telefonkartensammlung',
+ Items => {0 => 'Karte',
+ 1 => 'Karte',
+ X => 'Karten'},
+ NewItem => 'Neue Karte',
+ Currency => 'Währung',
+
+ Help => 'Hinweise zu den Eingabefeldern',
+ Help1 => 'Hilfe',
+
+# Traduction des Champs "Main"
+
+ Main => 'Kartendaten',
+
+ Cover => 'Abbildung',
+
+ Name => 'Name',
+ Exchange => 'tauschen oder verkaufen',
+ Wanted => 'gesucht',
+ Rating1 => 'Gesamtbewertung',
+ TheSmartCard => 'Vorder-/Rückseite',
+
+ Country => 'Land',
+ Color => 'Farbe',
+ Type1 => 'Kartentyp',
+ Type2 => 'Modultyp',
+ Dimension => 'Länge/Breite/Dicke',
+
+ Box => 'Box',
+ Chip => 'Modul',
+ Year1 => 'Ausgabedatum',
+ Year2 => 'Gültigkeitsdatum',
+ Condition => 'Zustand',
+ Charge => 'aufladbar',
+ Variety => 'Variante',
+
+ Edition => 'Gesamtauflage',
+ Serial => 'Seriennummer',
+ Theme => 'Theme',
+
+ Acquisition => 'Kaufdatum',
+
+ Catalog0 => 'Katalog',
+ Catalog1 => 'Michel',
+ Catalog2 => 'Sherlock',
+
+ Reference0 => 'Katalognummer',
+ Reference1 => 'Michelnummer',
+ Reference2 => 'Katalognummer Sherlock',
+ Reference3 => 'andere Katalognummer',
+
+ Quotationnew00 => 'Wert ungebraucht',
+ Quotationnew10 => 'Wert Michel',
+ Quotationnew20 => 'Wert Sherlock',
+ Quotationnew30 => 'andere Bewertung',
+ Quotationold00 => 'Wert gebraucht',
+ Quotationold10 => 'Wert Michael',
+ Quotationold20 => 'Wert Sherlock',
+ Quotationold30 => 'andere Bewertung',
+
+ Title1 => 'Titel',
+
+ Unit => 'Einheiten/Minuten',
+
+ Pressed => 'Hersteller',
+ Location => 'Ort',
+
+ Comments1 => 'Bemerkung',
+
+ Others => 'Sonstiges',
+ Weight => 'Gewicht',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/DE/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..ed527cb
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCsoftware.pm
@@ -0,0 +1,82 @@
+{
+ package GCLang::DE::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Softwaresammlung',
+ Items => {0 => 'Programm',
+ 1 => 'Programm',
+ X => 'Programme'},
+ NewItem => 'Neues Programm',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Erscheinungsdatum',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Entwickler',
+ Category => 'Kategorie',
+ NumberOfCopies => '# Exemplare',
+ Price => 'Preis',
+ Box => 'Verpackungsbild',
+ Case => 'Verpackung',
+ Manual => 'Handbuch',
+ Executable => 'Datei',
+ Description => 'Beschreibung',
+ License => 'Lizenz',
+ Commercial => 'kommerziell',
+ FreewareNoncommercial => 'Freeware (für nicht-kommerziellen Einsatz)',
+ OtherOpenSource => 'sonstige Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'sonstige',
+ Registration => 'Registrierung',
+ RegistrationInfo => 'Registrierungsdaten',
+ RegInfo => 'Registrierungsdaten',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registierungsnumber',
+ PanelRegistration => 'Registrierungsdaten',
+ RegistrationComments => 'Bemerkungen',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'erster Screenshot',
+ Screenshot2 => 'zweiter Screenshot',
+ Comments => 'Bemerkungen',
+ Url => 'Webseite',
+ General => 'Allgemein',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Bewertung _mindestens...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCstamps.pm b/lib/gcstar/GCLang/DE/GCModels/GCstamps.pm
new file mode 100644
index 0000000..36ec79a
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::DE::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Briefmarkensammlung',
+ Items => {0 => 'Briefmarke',
+ 1 => 'Briefmarke',
+ X => 'Briefmarken'},
+ NewItem => 'Neue Briefmarke',
+
+ General => 'Allgemein',
+ Detail => 'Detail',
+ Value => 'Wert',
+ Notes => 'Bemerkungen',
+ Views => 'Fotos',
+
+ Name => 'Name',
+ Country => 'Land',
+ Year => 'Jahr',
+ Catalog => 'Katalog',
+ Number => 'Nummer',
+ Topic => 'Motiv',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Graveur',
+ Type => 'Typ',
+ Format => 'Art',
+ Description => 'Beschreibung',
+ Color => 'Farbe',
+ Gum => 'Gummierung',
+ Paper => 'Papier',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforationsgröße',
+ CancellationType => 'Stempel',
+ Comments => 'Bemerkungen',
+ PrintingVariety => 'Druck',
+ IssueDate => 'Erstausgabedatum',
+ EndOfIssue => 'gültig bis',
+ Issue => 'Auflage',
+ Grade => 'Erhaltung',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Entwertung',
+ CancellationCondition => 'Stempelqualität',
+ GumCondition => 'Zustand der Gummierung',
+ PerforationCondition => 'Zustand der Perforation',
+ ConditionNotes => 'Bemerkungen zum Zustand',
+ Error => 'Fehldruck',
+ ErrorNotes => 'Bemerkungen zum Druck',
+ FaceValue => 'Nennwert',
+ MintValue => 'Wert postfrisch',
+ UsedValue => 'Wert gestempelt',
+ PurchasedDate => 'Kaufdatum',
+ Quantity => 'Anzahl',
+ History => 'Geschichte',
+ Picture1 => 'Bild 1',
+ Picture2 => 'Bild 2',
+ Picture3 => 'Bild 3',
+
+ AirMail => 'Luftpost',
+ MilitaryStamp => 'Feldpost',
+ Official => 'offiziell',
+ PostageDue => 'Nachgebühr',
+ Regular => 'Regulär',
+ Revenue => 'Erlös',
+ SpecialDelivery => 'Sondermarke',
+ StrikeStamp => 'Streikmarke',
+ TelegraphStamp => 'Telegrafenmarke',
+ WarStamp => 'Feldpostmarke',
+ WarTaxStamp => 'Kriegssteuermarke',
+
+ Booklet => 'Markenheftchen',
+ BookletPane => 'Heftchenblatt',
+ Card => 'Postkarte',
+ Coil => 'Rolle',
+ Envelope => 'Umschlag',
+ FirstDayCover => 'Ersttagsbrief',
+ Sheet => 'Bogen',
+ Single => 'Einzelexemplar',
+
+ Heliogravure => 'Heliogravüre',
+ Lithography => 'Lithographie',
+ Offset => 'Offset',
+ Photogravure => 'Rastertiefdruck',
+ RecessPrinting => 'Stichtiefdruck',
+ Typography => 'Schriftsatz',
+
+ OriginalGum => 'Originalgummierung',
+ Ungummed => 'ungummiert',
+ Regummed => 'nachgummiert',
+
+ Chalky => 'gestrichenes Papier',
+ ChinaPaper => 'Chinapapier',
+ Coarsed => 'Rauh',
+ Glossy => 'Glänzend',
+ Granite => 'Granite',
+ Laid => 'Gestreift',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Zigarettenpapier',
+ Quadrille => 'Gegittert',
+ Ribbed => 'Riffelung',
+ Rice => 'Reis',
+ Silk => 'Seide',
+ Smoothed => 'Geglättet',
+ Thick => 'Dick',
+ Thin => 'Dünn',
+ Wove => 'Gewebt',
+
+ CoarsedPerforation => 'Rauhe Perforation',
+ CombPerforation => 'Gekämmte Perforation',
+ CompoundPerforation => 'Gemischte Perforation',
+ DamagedPerforation => 'Beschädigte Perforation',
+ DoublePerforation => 'Doppelte Oerforation',
+ HarrowPerforation => 'Eckige Perforation',
+ LinePerforation => 'Gerade Perforation',
+ NoPerforation => 'Keine Perforation',
+
+ CancellationToOrder => 'Gefälligkeitsstempel',
+ FancyCancellation => 'Sonderstempel',
+ FirstDayCancellation => 'Ersttagsstempel',
+ NumeralCancellation => 'Nummernstempel',
+ PenMarked => 'Federzugentwertung',
+ RailroadCancellation => 'Eisenbahnentwertung',
+ SpecialCancellation => 'Spezielle Entwertung',
+
+ Superb => 'Luxuserhaltung',
+ ExtraFine => 'Kabinetterhaltung',
+ VeryFine => 'Prachterhaltung',
+ FineVeryFine => 'Feinsterhaltung',
+ Fine => 'Feinerhaltung',
+ Average => 'Durchschnittserhaltung',
+ Poor => 'Knochenerhaltung',
+
+ Owned => 'im Besitz',
+ Ordered => 'bestellt',
+ Sold => 'verkauft',
+ ToSell => 'zu verkaufen',
+ Wanted => 'gesucht',
+
+ LightCancellation => 'schwacher Stempel',
+ HeavyCancellation => 'starker Stempel',
+ ModerateCancellation => 'normaler Stempel',
+
+ MintNeverHinged => 'Prägung niemals gefaltet',
+ MintLightHinged => 'Prägung leicht gefaltet',
+ HingedRemnant => 'Faltung sichtbar',
+ HeavilyHinged => 'Stark gefaltet',
+ LargePartOriginalGum => 'Große Teile der originalen Gummierung',
+ SmallPartOriginalGum => 'Kleine Teile der originalen Gummierung',
+ NoGum => 'Keine Gummierung',
+
+ Perfect => 'Perfekt',
+ VeryNice => 'Sehr gut',
+ Nice => 'Gut',
+ Incomplete => 'Unvollständig',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCwines.pm b/lib/gcstar/GCLang/DE/GCModels/GCwines.pm
new file mode 100644
index 0000000..cfc9891
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCwines.pm
@@ -0,0 +1,65 @@
+{
+ package GCLang::DE::GCModels::GCwines;
+
+ use utf8;
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Weinsammlung',
+ Items => {0 => 'Wein',
+ 1 => 'Wein',
+ X => 'Weine',
+ },
+
+ NewItem => 'Neuer Wein',
+
+ Name => 'Name',
+ Designation => 'Kennzeichnung',
+ Vintage => 'Jahrgang',
+ Vineyard => 'Weingut',
+ Type => 'Art',
+ Grapes => 'Rebsorte',
+ Soil => 'Erde',
+ Producer => 'Abfüller',
+ Country => 'Land',
+ Volume => 'Inhalt (ml)',
+ Alcohol => 'Alkohol (%)',
+ Medal => 'Auszeichnungen',
+
+ Storage => 'Aufbewahrung',
+ Location => 'Ortsangabe',
+ ShelfIndex => 'Ablageindex',
+ Quantity => 'Anzahl',
+ Acquisition => 'Erwerb',
+ PurchaseDate => 'Kaufdatum',
+ PurchasePrice => 'Kaufpreis',
+ Gift => 'Geschenk',
+ BottleLabel => 'Etikett',
+ Website => 'Website',
+
+ Tasted => 'verkostet',
+ Comments => 'Kommentar',
+ Serving => 'Portion',
+ TastingField => 'Bemerkungen',
+
+ General => 'Allgemein',
+ Details => 'Einzelheiten',
+ Tasting => 'Geschmack',
+
+ TastedNo => 'nicht gekostet',
+ TastedYes => 'gekostet',
+
+ FilterRange => 'Filter',
+ FilterTastedNo => '_Noch nicht gekostet',
+ FilterTastedYes => 'Bereits _gekostet',
+ FilterRatingSelect => 'Bewertung _mindestens...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCstar.pm b/lib/gcstar/GCLang/DE/GCstar.pm
new file mode 100644
index 0000000..2326204
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCstar.pm
@@ -0,0 +1,686 @@
+{
+ package GCLang::DE;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Deutsch',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Warnung</b>:
+
+Informationen, die Sie (durch Plugins) von Webseiten herunterladen,
+sind <b>ausschließlich für den persönlichen Gebrauch bestimmt.</b>.
+
+Jede <b>Weitergabe</b> ist ohne die explizite Erlaubnis der
+Seitenbetreiber <b>verboten</b>.
+
+Der Button unter den Elementen verweist Sie auf die jeweilige
+Webseite, von der die Informationen stammen.',
+
+ 'AllItemsFiltered' => 'Kein Element erfüllt Ihre Filtereinstellungen.', # Accepts model codes
+
+ 'InstallDirInfo' => 'Installiere nach ',
+ 'InstallMandatory' => 'Erforderliche Komponenten',
+ 'InstallOptional' => 'Optionale Komponenten',
+ 'InstallErrorMissing' => 'Fehler : Die folgenden Komponenten müssen installiert sein: ',
+ 'InstallPrompt' => 'Basisverzeichnis für die Installation [/usr/local]: ',
+ 'InstallEnd' => 'Installation beendet',
+ 'InstallNoError' => 'Keine Fehler',
+ 'InstallLaunch' => 'Um die Anwendung zu verwenden starten Sie ',
+ 'InstallDirectory' => 'Installationsverzeichnis',
+ 'InstallTitle' => 'Installation von GCstar',
+ 'InstallDependencies' => 'Abhängigkeiten',
+ 'InstallPath' => 'Pfad',
+ 'InstallOptions' => 'Optionen',
+ 'InstallSelectDirectory' => 'Wählen Sie ein Basisverzeichnis für die Installation',
+ 'InstallWithClean' => 'Daten im Installationsverzeichnis löschen',
+ 'InstallWithMenu' => 'GCstar zum Anwendungsmenü hinzufügen',
+ 'InstallNoPermission' => 'Fehler: Sie haben keine Schreibrechte im gewählten Verzeichnis',
+ 'InstallMissingMandatory' => 'Abhängigkeiten können auf Ihrem System nicht gelöst werden. Sie müssen diese ergänzen, um GCstar installieren zu können.',
+ 'InstallMissingOptional' => 'Einige unten aufgelistete optionale Abhängigkeiten können nicht gelöst werden. GCstar kann installiert werden, aber einige Eigenschaften werden nicht verfügbar sein.',
+ 'InstallMissingNone' => 'Es gibt keine ungelösten Abhängigkeiten. Sie können mit der Installation fortfahren.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Fehlt',
+ 'InstallMissingFor' => 'Fehlt für',
+ 'InstallCleanDirectory' => 'Entferne GCstar\'s Dateien im Verzeichnis: ',
+ 'InstallCopyDirectory' => 'Kopiere Dateien in Verzeichnis: ',
+ 'InstallCopyDesktop' => 'Kopiere Desktop Datei nach: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy (drücken Sie Enter für keinen): ',
+ 'UpdateNoPermission' => 'Keine Schreibrechte im Verzeichnis: ',
+ 'UpdateNone' => 'Keine Updates gefunden',
+ 'UpdateFileNotFound' => 'Datei nicht gefunden',
+
+#Splash
+ 'SplashInit' => 'Initialisiere',
+ 'SplashLoad' => 'Lade Sammlung',
+ 'SplashDisplay' => 'Sammlung anzeigen',
+ 'SplashSort' => 'Sammlung sortieren',
+ 'SplashDone' => 'Fertig',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Sie scheinen bereits GCfilms benutzt zu haben. Was möchten Sie von GCfilms nach GCstar importieren (die Daten von GCfilms bleiben erhalten)?',
+ 'GCfilmsImportOptions' => 'Einstellungen',
+ 'GCfilmsImportData' => 'Filmliste',
+
+#Menus
+ 'MenuFile' => '_Datei',
+ 'MenuNewList' => '_Neue Liste',
+ 'MenuStats' => 'Statistische Auswertung',
+ 'MenuHistory' => '_Letzte Sammlung',
+ 'MenuLend' => '_Verliehenes anzeigen', # Accepts model codes
+ 'MenuImport' => '_Importieren',
+ 'MenuExport' => '_Exportieren',
+ 'MenuAddItem' => '_Hinzufügen', # Accepts model codes
+
+ 'MenuEdit' => '_Bearbeiten',
+ 'MenuDuplicate' => '{1} _duplizieren', # Accepts model codes
+ 'MenuDuplicatePlural' => '{X} _duplizieren', # Accepts model codes
+ 'MenuEditSelectAllItems' => '_alle {X} auswählen', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '{1} _löschen', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '{X} _löschen', # Accepts model codes
+ 'MenuEditFields' => 'Felder _bearbeiten',
+ 'MenuEditLockItems' => 'Liste _sperren',
+
+ 'MenuDisplay' => '_Filter',
+ 'MenuSavedSearches' => 'Gespeicherte Suchanfragen',
+ 'MenuSavedSearchesSave' => 'Aktuelle Suchanfrage speichern',
+ 'MenuSavedSearchesEdit' => 'Gespeicherte Suchanfragen bearbeiten',
+ 'MenuAdvancedSearch' => 'Erweiterte Suche',
+ 'MenuViewAllItems' => '_Alle {X} anzeigen', # Accepts model codes
+ 'MenuNoFilter' => '_Alle',
+
+ 'MenuConfiguration' => '_Einstellungen',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => 'Sichtbare _Felder',
+ 'MenuBorrowers' => 'Ent_leiher',
+ 'MenuToolbarConfiguration' => '_Werkzeugleiste konfigurieren',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Genres _konvertieren',
+
+ 'MenuBookmarks' => 'Meine _Sammlung',
+ 'MenuBookmarksAdd' => 'aktuelle Sammlung _hinzufügen',
+ 'MenuBookmarksEdit' => 'Sammlung _bearbeiten',
+
+ 'MenuHelp' => '_Hilfe',
+ 'MenuHelpContent' => '_Hilfe',
+ 'MenuAllPlugins' => 'Zeige _Plugins',
+ 'MenuBugReport' => '_Programmfehler melden',
+ 'MenuAbout' => '_Über GCstar',
+
+ 'MenuNewWindow' => '{1} in neuem _Fenster zeigen', # Accepts model codes
+ 'MenuNewWindowPlural' => '{X} in neuem _Fenster zeigen', # Accepts model codes
+
+ 'ContextExpandAll' => 'alle ausklappen',
+ 'ContextCollapseAll' => 'alle zusammenklappen',
+ 'ContextChooseImage' => '_Bild wählen',
+ 'ContextOpenWith' => 'Öffnen mit',
+ 'ContextImageEditor' => 'Bildbearbeitungsprogramm',
+ 'ContextImgFront' => 'Vorderseite',
+ 'ContextImgBack' => 'Rückseite',
+ 'ContextChooseFile' => 'Datei auswählen',
+ 'ContextChooseFolder' => 'Verzeichnis auswählen',
+
+ 'DialogEnterNumber' => 'Bitte geben Sie einen Wert ein',
+
+ 'RemoveConfirm' => 'Wollen Sie dieses Element wirklich löschen?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Sollen alle diese {X} wirklich gelöscht werden?', # Accepts model codes
+
+ 'DefaultNewItem' => 'Neues Element', # Accepts model codes
+ 'NewItemTooltip' => '{1} hinzufügen', # Accepts model codes
+ 'NoItemFound' => 'Element nicht gefunden. Möchten Sie auf einer anderen Seite suchen?',
+ 'OpenList' => 'Bitte wählen Sie eine Liste',
+ 'SaveList' => 'Bitte wählen Sie den Speicherort für die Liste',
+ 'SaveListTooltip' => 'Aktuelle Liste speichern',
+ 'SaveUnsavedChanges' => 'Es gibt ungespeicherte Änderungen in Ihrere Sammlung. Wollen Sie diese speichern?',
+ 'SaveDontSave' => 'Nicht speichern',
+ 'PreferencesTooltip' => 'Ändern der Programmeinstellungen',
+ 'ViewTooltip' => 'Anzeige der Liste ändern',
+ 'PlayTooltip' => 'Mit dem Film verknüpftes Video abspielen', # Accepts model codes
+ 'PlayFileNotFound' => 'Abzuspielende Datei nicht gefunden in:',
+ 'PlayRetry' => 'noch einmal versuchen',
+
+ 'StatusSave' => 'Speichere...',
+ 'StatusLoad' => 'Lade...',
+ 'StatusSearch' => 'Suche...',
+ 'StatusGetInfo' => 'Lade Informationen...',
+ 'StatusGetImage' => 'Lade Bild...',
+
+ 'SaveError' => 'Die Liste kann nicht gespeichert werden. Bitte überprüfen Sie die Dateirechte, und ob genügend freier Speicherplatz zur Verfügung steht.',
+ 'OpenError' => 'Kann die Liste nicht öffnen. Bitte überprüfen Sie die Dateirechte.',
+ 'OpenFormatError' => 'Kann die Liste nicht öffnen.',
+ 'OpenVersionWarning' => 'Die Sammlung wurde mit einer neueren Version von GCStar erzeugt. Beim speichern können Daten verloren gehen.',
+ 'OpenVersionQuestion' => 'Möchten Sie trotzdem fortfahren?',
+ 'ImageError' => 'Das Verzeichnis zum Speichern der Bilder ist nicht korrekt. Bitte wählen Sie ein anderes.',
+ 'OptionsCreationError'=> 'Kann die Einstellungsdatei nicht erstellen: ',
+ 'OptionsOpenError'=> 'Kann die Einstellungen nicht laden: ',
+ 'OptionsSaveError'=> 'Kann die Einstellungen nicht speichern: ',
+ 'ErrorModelNotFound' => 'Folgendes Modell wurde nicht gefunden: ',
+ 'ErrorModelUserDir' => 'Die nutzerdefinierten Modelle sind in: ',
+
+ 'RandomTooltip' => '{1} für heute Abend vorschlagen',
+ 'RandomError'=> 'Sie haben keine ungesehenen {X}', # Accepts model codes
+ 'RandomEnd'=> 'Keine weiteren Vorschläge verfügbar', # Accepts model codes
+ 'RandomNextTip'=> 'Nächster Vorschlag',
+ 'RandomOkTip'=> 'Diesen Vorschlag akzeptieren',
+
+ 'AboutTitle' => 'Über GCstar',
+ 'AboutDesc' => 'Gtk2 Sammlungs Manager',
+ 'AboutVersion' => 'Version',
+ 'AboutTeam' => 'Team',
+ 'AboutWho' => 'Christian Jodar (Tian) : Projektmanager, Programmierer
+Nyall Dawson (Zombiepig) : Programmierer
+TPF : Programmierer
+Adolfo González : Programmierer
+',
+ 'AboutLicense' => 'Veröffentlicht unter den Bedingungen der GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Deutsche Übersetzung von Gabriel Meier und FrenkX',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logo und Webdesign von le Spektre',
+
+ 'ToolbarRandom' => 'Heute Abend',
+
+ 'UnsavedCollection' => 'Ungespeicherte Sammlung',
+ 'ModelsSelect' => 'Wählen Sie den Typ der Sammlung',
+ 'ModelsPersonal' => 'Eigene Modelle',
+ 'ModelsDefault' => 'Vorgegebene Modelle',
+ 'ModelsList' => 'Definitionen von Sammlungen',
+ 'ModelSettings' => 'Einstellungen von Sammlungen',
+ 'ModelNewType' => 'Neuer Sammlungstyp',
+ 'ModelName' => 'Name des Sammlungstypes:',
+ 'ModelFields' => 'Felder',
+ 'ModelOptions' => 'Optionen',
+ 'ModelFilters' => 'Filter',
+ 'ModelNewField' => 'Neues Feld',
+ 'ModelFieldInformation' => 'Information',
+ 'ModelFieldName' => 'Beschriftung:',
+ 'ModelFieldType' => 'Typ:',
+ 'ModelFieldGroup' => 'Gruppe:',
+ 'ModelFieldValues' => 'Werte',
+ 'ModelFieldInit' => 'Vorgaben:',
+ 'ModelFieldMin' => 'Minimum:',
+ 'ModelFieldMax' => 'Maximum:',
+ 'ModelFieldList' => 'Wertliste:',
+ 'ModelFieldListLegend' => '<i>Kommasepariert</i>',
+ 'ModelFieldDisplayAs' => 'Anzeige als:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Bewertungselement',
+ 'ModelFieldTypeShortText' => 'Kurzer Text',
+ 'ModelFieldTypeLongText' => 'Langer Text',
+ 'ModelFieldTypeYesNo' => 'Ja/Nein',
+ 'ModelFieldTypeNumber' => 'Zahl',
+ 'ModelFieldTypeDate' => 'Datum',
+ 'ModelFieldTypeOptions' => 'Vordefinierte Auswahlliste',
+ 'ModelFieldTypeImage' => 'Bild',
+ 'ModelFieldTypeSingleList' => 'Einfache List',
+ 'ModelFieldTypeFile' => 'Datei',
+ 'ModelFieldTypeFormatted' => 'von anderen Feldern abhängig',
+ 'ModelFieldParameters' => 'Parameter',
+ 'ModelFieldHasHistory' => 'Benutze Verlauf',
+ 'ModelFieldFlat' => 'Auf einer Zeile anzeigen',
+ 'ModelFieldStep' => 'Schrittweite:',
+ 'ModelFieldFileFormat' => 'Dateiformat:',
+ 'ModelFieldFileFile' => 'Einfache Datei',
+ 'ModelFieldFileImage' => 'Bild',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Programm',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'E-Book',
+ 'ModelOptionsFields' => 'zu benutzende Felder',
+ 'ModelOptionsFieldsAuto' => 'Automatisch',
+ 'ModelOptionsFieldsNone' => 'Keine',
+ 'ModelOptionsFieldsTitle' => 'Als Titel',
+ 'ModelOptionsFieldsId' => 'Als Identifikator',
+ 'ModelOptionsFieldsCover' => 'Als Cover',
+ 'ModelOptionsFieldsPlay' => 'Für Abspielen Knopf',
+ 'ModelCollectionSettings' => 'Sammlungseinstellungen',
+ 'ModelCollectionSettingsLending' => 'Elemente können verborgt werden',
+ 'ModelCollectionSettingsTagging' => 'Elemente können getaggt werden',
+ 'ModelFilterActivated' => 'Soll in Suchfeld sein',
+ 'ModelFilterComparison' => 'Vergleich',
+ 'ModelFilterContain' => 'Beinhaltet',
+ 'ModelFilterDoesNotContain' => 'ist nicht enthalten',
+ 'ModelFilterRegexp' => 'Regulärer Ausdruck',
+ 'ModelFilterRange' => 'Bereich',
+ 'ModelFilterNumeric' => 'numerischer Vergleich',
+ 'ModelFilterQuick' => 'Schnellen Filter erstellen',
+ 'ModelTooltipName' => 'Benutzen Sie einen Namen, der in vielen Sammlungen verwendet werden kann. Wenn Sie nichts angeben, werden die Einstellungen direkt in der Sammlung gespeichert',
+ 'ModelTooltipLabel' => 'Der Feldname, so wie er angezeigt wird',
+ 'ModelTooltipGroup' => 'Kann zum gruppieren verwendet werden. Elemente ohne Gruppenangabe werden in einer vorgegebenen Gruppe zusammengefasst',
+ 'ModelTooltipHistory' => 'Alle hier eingegebenen Werte werden in einer Liste gespeichert und können darüber auch wieder ausgewählt werden',
+ 'ModelTooltipFormat' => 'Das Format wird benutzt, um eine geeignete Anwendung mit dem "Öffnen"-Knopf zu verbinden',
+ 'ModelTooltipLending' => 'Fügt Felder zur Verwaltung der Ausleihe hinzu',
+ 'ModelTooltipTagging' => 'Fügt Felder zur Verwaltung von Markierungen hinzu',
+ 'ModelTooltipNumeric' => 'In Vergleichsoperationen wird der Wert als Zahl interpretiert',
+ 'ModelTooltipQuick' => 'Fügt ein Untermenü zu "Filter" hinzu',
+
+ 'ResultsTitle' => 'Wählen Sie einen Eintrag', # Accepts model codes
+ 'ResultsNextTip' => 'Auf der nächsten Seite suchen',
+ 'ResultsPreview' => 'Vorschau',
+ 'ResultsInfo' => 'Es können mehrere Elemente durch Auswahl bei gedrückter STRG oder UMSCHALT Taste zu der Sammlung hinzugefügt werden.', # Accepts model codes
+
+ 'OptionsTitle' => 'Einstellungen',
+ 'OptionsExpertMode' => 'Expertenmodus',
+ 'OptionsPrograms' => 'Wählen Sie eine Anwendung für verschiedene Medientypen. Wird nichts eingetragen, werden die Voreinstellungen des Systems verwendet.',
+ 'OptionsBrowser' => 'Internetbrowser',
+ 'OptionsPlayer' => 'Videoabspielprogramm',
+ 'OptionsAudio' => 'Musikabspielprogramm',
+ 'OptionsImageEditor' => 'Bildbearbeitungsprogramm',
+ 'OptionsCdDevice' => 'CD Gerät',
+ 'OptionsImages' => 'Verzeichnis für Bilder',
+ 'OptionsUseRelativePaths' => 'Relative Pfade für Bilder verwenden',
+ 'OptionsLayout' => 'Layout',
+ 'OptionsStatus' => 'Statusleiste am unteren Fensterrand anzeigen',
+ 'OptionsUseStars' => 'Sterne für die Bewertung nutzen',
+ 'OptionsWarning' => 'Warnung: Die Einstellungen in diesem Panel werden erst nach dem Neustart der Anwendung wirksam!',
+ 'OptionsRemoveConfirm' => 'Löschen von Elementen bestätigen lassen',
+ 'OptionsAutoSave' => 'Sammlung automatisch speichern',
+ 'OptionsAutoLoad' => 'Vorhergehende Sammlung beim Programmstart laden',
+ 'OptionsSplash' => 'Splash-Screen anzeigen',
+ 'OptionsTearoffMenus' => 'Ablösbare Menüs aktivieren',
+ 'OptionsSpellCheck' => 'Rechtschreibprüfung für lange Textfelder verwenden',
+ 'OptionsProgramTitle' => 'Wählen Sie die gewünschte Anwendung',
+ 'OptionsPlugins' => 'Seite zum Bezug von Informationen',
+ 'OptionsAskPlugins' => 'Fragen (Alle Seiten)',
+ 'OptionsPluginsMulti' => 'Mehrere...',
+ 'OptionsPluginsMultiAsk' => 'Fragen (Mehrere...)',
+ 'OptionsPluginsMultiPerField' => 'Mehrere... (pro Feld)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Datenquellen für die einzeln Felder zuordnen',
+ 'OptionsPluginsMultiPerFieldDesc' => 'Jedes ausgewählte Feld wird mit dem ersten gefunden Inhalt gefüllt, von links angefangen.',
+ 'OptionsPluginsMultiPerFieldFirst' => 'Anfang',
+ 'OptionsPluginsMultiPerFieldLast' => 'Ende',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Entfernen',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Ausgewählte Feldliste leeren',
+ 'OptionsPluginsList' => 'Sammlung bearbeiten',
+ 'OptionsAskImport' => 'Zu importierende Felder wählen',
+ 'OptionsProxy' => 'Proxy verwenden',
+ 'OptionsCookieJar' => 'Speichere Cookies in dieser Datei',
+ 'OptionsLang' => 'Sprache',
+ 'OptionsMain' => 'Allgemein',
+ 'OptionsPaths' => 'Pfade',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Eigenschaften',
+ 'OptionsDisplay' => 'Anzeige',
+ 'OptionsToolbar' => 'Werkzeugleiste',
+ 'OptionsToolbars' => {
+ 0 => 'Keine',
+ 1 => 'Klein',
+ 2 => 'Groß',
+ 3 => 'Systemeinstellung'},
+ 'OptionsToolbarPosition' => 'Position',
+ 'OptionsToolbarPositions' => {
+ 0 => 'Oben',
+ 1 => 'Unten',
+ 2 => 'Links',
+ 3 => 'Rechts'},
+ 'OptionsExpandersMode' => 'ausklappbare Zeile zu lang',
+ 'OptionsExpandersModes' => {
+ 'asis' => 'Unverändert',
+ 'cut' => 'Abschneiden',
+ 'wrap' => 'Zeilenumbruch'},
+ 'OptionsDateFormat' => 'Datumsformat',
+ 'OptionsDateFormatTooltip' => 'Das Format entspricht dem bei der Funktion strftime(3) genutzten. Voreinstellung ist %d/%m/%Y',
+ 'OptionsView' => 'Listenansicht',
+ 'OptionsViews' => {
+ 0 => 'Text',
+ 1 => 'Bilder',
+ 2 => 'Detailliert'},
+ 'OptionsColumns' => 'Spalten',
+ 'OptionsMailer' => 'E-Mail-Versand per',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'E-Mail-Adresse des Absenders',
+ 'OptionsTransform' => 'Artikel ans Ende des Titels stellen',
+ 'OptionsArticles' => 'Artikel (getrennt durch Kommata)',
+ 'OptionsSearchStop' => 'Suche kann abgebrochen werden',
+ 'OptionsBigPics' => 'Große Bilder anzeigen sofern verfügbar',
+ 'OptionsAlwaysOriginal' => 'Titel statt Originaltitel verwenden, wenn dieser nicht vorhanden ist',
+ 'OptionsRestoreAccelerators' => 'Schnellzugriffe wiederherstellen',
+ 'OptionsHistory' => 'Größe des Verlaufs',
+ 'OptionsClearHistory' => 'Verlauf löschen',
+ 'OptionsStyle' => 'Erscheinungsbild',
+ 'OptionsDontAsk' => 'Nicht mehr fragen',
+ 'OptionsPathProgramsGroup' => 'Anwendungsprogramme',
+ 'OptionsProgramsSystem' => 'Nutze systemweite Einstellungen',
+ 'OptionsProgramsUser' => 'Nutze hier angegebene Programme',
+ 'OptionsProgramsSet' => 'Programmeinstellungen',
+ 'OptionsPathImagesGroup' => 'Bilder',
+ 'OptionsInternetDataGroup' => 'Datenimport',
+ 'OptionsInternetSettingsGroup' => 'Einstellungen',
+ 'OptionsDisplayInformationGroup' => 'Informationsanzeige',
+ 'OptionsDisplayArticlesGroup' => 'Artikel',
+ 'OptionsImagesDisplayGroup' => 'Anzeige',
+ 'OptionsImagesStyleGroup' => 'Style',
+ 'OptionsDetailedPreferencesGroup' => 'Einstellungen',
+ 'OptionsFeaturesConveniencesGroup' => 'Annehmlichkeiten',
+ 'OptionsPicturesFormat' => 'Prefix für Bilddateien:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Titel oder Name für das verbundene Element',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% oder . wird durch das Verzeichnis der Sammlung ersetzt (nur am Anfang der Pfadangabe nutzen!)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% wird durch den Dateinamen der Sammlung ohne Erweiterung (.gcs) ersetzt',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% kann nur am Anfang der Pfadangabe für die Bilder genutzt werden',
+ 'OptionsConfigureMailers' => 'E-Mail Programmeinstellung',
+
+ 'ImagesOptionsButton' => 'Einstellungen',
+ 'ImagesOptionsTitle' => 'Einstellungen für die Bilderliste',
+ 'ImagesOptionsSelectColor' => 'Farbe wählen',
+ 'ImagesOptionsUseOverlays' => '3D-Rahmen um Bild',
+ 'ImagesOptionsBg' => 'Hintergrund',
+ 'ImagesOptionsBgPicture' => 'Hintergrundbild verwenden',
+ 'ImagesOptionsFg'=> 'Auswahl',
+ 'ImagesOptionsBgTooltip' => 'Hintergrundfarbe ändern',
+ 'ImagesOptionsFgTooltip'=> 'Farbe für die Auswahl einstellen',
+ 'ImagesOptionsResizeImgList' => 'Anzahl der Spalten automatisch anpassen',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Größe',
+ 'ImagesOptionsSizeList' => {0 => 'Sehr klein', 1 => 'Klein', 2 => 'Mittel', 3 => 'Groß', 4 => 'Sehr Groß'},
+ 'ImagesOptionsSizeTooltip' => 'Bildgröße auswählen',
+
+ 'DetailedOptionsTitle' => 'Einstellungen für die detaillierte Sammlung',
+ 'DetailedOptionsImageSize' => 'Bildgröße',
+ 'DetailedOptionsGroupItems' => 'Gruppiere Elemente nach',
+ 'DetailedOptionsSecondarySort' => 'Sortiere gruppierte Felder nach',
+ 'DetailedOptionsFields' => 'Anzuzeigende Felder wählen',
+ 'DetailedOptionsGroupedFirst' => 'leere Elemente zusammenhalten',
+ 'DetailedOptionsAddCount' => 'Anzahl der enthaltenen Elemente anzeigen',
+
+ 'ExtractButton' => 'Information',
+ 'ExtractTitle' => 'Dateiinformationen',
+ 'ExtractImport' => 'Werte verwenden',
+
+ 'FieldsListOpen' => 'Lade Liste von Feldern aus Datei',
+ 'FieldsListSave' => 'Speichere Liste von Feldern in Datei',
+ 'FieldsListError' => 'Diese Liste von Feldern kann nicht für diese Sammlung benutzt werden',
+ 'FieldsListIgnore' => '--- Ignoriere',
+
+ 'ExportTitle' => 'Sammlung exportieren',
+ 'ExportFilter' => 'Nur angezeigte Elemente exportieren',
+ 'ExportFieldsTitle' => 'Zu exportierende Felder',
+ 'ExportFieldsTip' => 'Wählen Sie die zu exportierenden Felder',
+ 'ExportWithPictures' => 'Bilder in ein Unterverzeichnis kopieren',
+ 'ExportSortBy' => 'Sortierung nach',
+ 'ExportOrder' => 'Reihenfolge',
+
+ 'ImportListTitle' => 'Eine weitere Sammlung importieren',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'Datei',
+ 'ImportExportFieldsUnused' => 'Freie Felder',
+ 'ImportExportFieldsUsed' => 'Verwendete Felder',
+ 'ImportExportFieldsFill' => 'Alle hinzufügen',
+ 'ImportExportFieldsClear' => 'Alle entfernen',
+ 'ImportExportFieldsEmpty' => 'Sie müssen mindestens ein Feld wählen',
+ 'ImportExportFileEmpty' => 'Sie müssen einen Dateinamen angeben',
+ 'ImportFieldsTitle' => 'Zu importierende Felder',
+ 'ImportFieldsTip' => 'Wählen Sie die zu importierenden Felder',
+ 'ImportNewList' => 'Eine neue Sammlung erstellen',
+ 'ImportCurrentList' => 'Zur aktuellen Sammlung hinzufügen',
+ 'ImportDropError' => 'Es gab mindestens einen Fehler beim Öffnen der Dateien. Vorherige Liste wird wiederhergestellt.',
+ 'ImportGenerateId' => 'ID für jedes Element erzeugen',
+
+ 'FileChooserOpenFile' => 'Bitte wählen Sie die zu verwendende Datei',
+ 'FileChooserDirectory' => 'Verzeichnis',
+ 'FileChooserOpenDirectory' => 'Wählen Sie ein Verzeichnis',
+ 'FileChooserOverwrite' => 'Diese Datei existiert bereits. Möchten Sie sie überschreiben?',
+ 'FileAllFiles' => 'Alle Dateien',
+ 'FileVideoFiles' => 'nur Video-Dateien',
+ 'FileEbookFiles' => 'nur Ebook-Dateien',
+ 'FileAudioFiles' => 'nur Audio-Dateien',
+ 'FileGCstarFiles' => 'GCstar Sammlungen',
+
+ 'PanelCompact' => 'Komprimieren',
+ 'PanelReadOnly' => 'Nur Lesen',
+ 'PanelForm' => 'Tabs',
+
+ 'PanelSearchButton' => 'Internetsuche',
+ 'PanelSearchTip' => 'Im Internet nach Informationen zu diesem Titel suchen',
+ 'PanelSearchContextChooseOne' => 'Wähle eine Seite ...',
+ 'PanelSearchContextMultiSite' => 'Verwende "Viele Seiten"',
+ 'PanelSearchContextMultiSitePerField' => 'Verwende "Viele Seiten pro Feld"',
+ 'PanelSearchContextOptions' => 'Optionen ändern ...',
+ 'PanelImageTipOpen' => 'Klicken, um das Bild zu ändern.',
+ 'PanelImageTipView' => 'Klicken, um das Bild in Orginalgröße anzuzeigen.',
+ 'PanelImageTipMenu' => ' Rechtsklick für weitere Optionen.',
+ 'PanelImageTitle' => 'Wählen Sie ein Bild',
+ 'PanelImageNoImage' => 'kein Bild',
+ 'PanelSelectFileTitle' => 'Datei auswählen',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Voreinstellung herstellen',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Noch offene Einträge aus dem Internet auffüllen',
+
+ 'PanelFrom' =>'Von',
+ 'PanelTo' =>'Bis',
+
+ 'PanelWeb' => 'Zeige Informationen',
+ 'PanelWebTip' => 'Zeige Informationen über dieses Element im Internet', # Accepts model codes
+ 'PanelRemoveTip' => 'Dieses Element entfernen', # Accepts model codes
+
+ 'PanelDateSelect' => 'Wählen Sie ein Datum',
+ 'PanelNobody' => 'Niemand',
+ 'PanelUnknown' => 'Unbekannt',
+ 'PanelAdded' => 'Hinzufügedatum',
+ 'PanelRating' => 'Bewertung',
+ 'PanelPressRating' => 'Fremdbewertung',
+ 'PanelLocation' => 'Ort',
+
+ 'PanelLending' => 'Verleih',
+ 'PanelBorrower'=> 'Entleiher',
+ 'PanelLendDate'=> 'verliehen am',
+ 'PanelHistory'=> 'Verlauf',
+ 'PanelReturned' => 'Element zurückgegeben', # Accepts model codes
+ 'PanelReturnDate' => 'Rückgabedatum',
+ 'PanelLendedYes' => 'Verliehen',
+ 'PanelLendedNo' => 'Verfügbar',
+
+ 'PanelTags' => 'Markierungen',
+ 'PanelFavourite' => 'Favoriten',
+ 'TagsAssigned' => 'Zugeordnete Markierungen',
+
+ 'PanelUser' => 'Nutzerfeld',
+
+ 'CheckUndef' => 'Egal',
+ 'CheckYes' => 'Ja',
+ 'CheckNo' => 'Nein',
+
+ 'ToolbarAll' => 'Zeige alle',
+ 'ToolbarAllTooltip' => 'Alle Elemente anzeigen',
+ 'ToolbarGroupBy' => 'Gruppiere nach',
+ 'ToolbarGroupByTooltip' => 'Wählen Sie das Feld, nach dem die Einträge gruppiert werden sollen',
+ 'ToolbarQuickSearch' => 'Schnelle Suche',
+ 'ToolbarQuickSearchLabel' => 'Suche',
+ 'ToolbarQuickSearchTooltip' => 'Bitte wählen Sie das Feld, in dem gesucht werden soll. Geben Sie den Suchbegriff ein und drücken Sie anschließend Enter.',
+ 'ToolbarSeparator' => ' Trenner',
+
+ 'PluginsTitle' => 'Nach einem Element suchen',
+ 'PluginsQuery' => 'Abfrage',
+ 'PluginsFrame' => 'Eine Website durchsuchen',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Name',
+ 'PluginsSearchFields' => 'Suchfelder',
+ 'PluginsAuthor' => 'Autor',
+ 'PluginsLang' => 'Sprache',
+ 'PluginsUseSite' => 'Gewählte Seite für zukünftige Suchen verwenden',
+ 'PluginsPreferredTooltip' => 'Empfohlen von GCstar',
+ 'PluginDisabled' => 'Deaktiviert',
+
+ 'BorrowersTitle' => 'Entleiher bearbeiten',
+ 'BorrowersList' => 'Entleiher',
+ 'BorrowersName' => 'Name',
+ 'BorrowersEmail' => 'E-Mail',
+ 'BorrowersAdd' => 'Hinzufügen',
+ 'BorrowersRemove' => 'Entfernen',
+ 'BorrowersEdit' => 'Bearbeiten',
+ 'BorrowersTemplate' => 'E-Mail Vorlage',
+ 'BorrowersSubject' => 'E-Mail Betreff',
+ 'BorrowersNotice1' => '%1 wird durch den Namen des Entleihers ersetzt',
+ 'BorrowersNotice2' => '%2 wird durch den Titel ersetzt',
+ 'BorrowersNotice3' => '%3 wird durch das Entleihdatum ersetzt',
+
+ 'BorrowersImportTitle' => 'Importiere Informationen zum Ausleiher',
+ 'BorrowersImportType' => 'Dateiformat:',
+ 'BorrowersImportFile' => 'Datei:',
+
+ 'BorrowedTitle' => 'Verliehene Elemente', # Accepts model codes
+ 'BorrowedDate' => 'Seit',
+ 'BorrowedDisplayInPanel' => 'Elemente im Hauptfenster anzeigen', # Accepts model codes
+
+ 'MailTitle' => 'E-Mail senden',
+ 'MailFrom' => 'Von: ',
+ 'MailTo' => 'An: ',
+ 'MailSubject' => 'Betreff: ',
+ 'MailSmtpError' => 'Problem beim Verbinden zum SMTP-Server',
+ 'MailSendmailError' => 'Problem beim Starten von Sendmail',
+
+ 'SearchTooltip' => 'Alle Elemente durchsuchen', # Accepts model codes
+ 'SearchTitle' => 'Titelsuche', # Accepts model codes
+ 'SearchNoField' => 'Es wurden keine Felder für die Suchanfrage ausgewählt.
+Füge einige davon in der Filtersektion unter Einstellungen hinzu.',
+
+ 'QueryReplaceField' => 'Felder zu ersetzen',
+ 'QueryReplaceOld' => 'Bisheriger Name',
+ 'QueryReplaceNew' => 'Neuer Name',
+ 'QueryReplaceLaunch' => 'Ersetzen',
+
+ 'ImportWindowTitle' => 'Wählen Sie die zu importierenden Felder',
+ 'ImportViewPicture' => 'Bild ansehen',
+ 'ImportSelectAll' => 'Alles auswählen',
+ 'ImportSelectNone' => 'Nichts auswählen',
+
+ 'MultiSiteTitle' => 'Seite für Internetrecherche',
+ 'MultiSiteUnused' => 'Nicht verwendete Plugins',
+ 'MultiSiteUsed' => 'Zu verwendende Plugins',
+ 'MultiSiteLang' => 'deutschsprachige Plugins verwenden',
+ 'MultiSiteEmptyError' => 'Die Liste der zu verwendenden Plugins ist leer!',
+ 'MultiSiteClear' => 'Liste löschen',
+
+ 'DisplayOptionsTitle' => 'Anzuzeigende Felder',
+ 'DisplayOptionsAll' => 'Alle auswählen',
+ 'DisplayOptionsSearch' => 'Suchbutton',
+
+ 'GenresTitle' => 'Genre konvertieren',
+ 'GenresCategoryName' => 'Verwendete Genres',
+ 'GenresCategoryMembers' => 'Zu ersetzende Genres',
+ 'GenresLoad' => 'Lade eine Liste',
+ 'GenresExport' => 'Liste in Datei speichern',
+ 'GenresModify' => 'Genre bearbeiten',
+
+ 'PropertiesName' => 'Name der Sammlung',
+ 'PropertiesLang' => 'Sprachcode',
+ 'PropertiesOwner' => 'Besitzer',
+ 'PropertiesEmail' => 'E-Mail',
+ 'PropertiesDescription' => 'Beschreibung',
+ 'PropertiesFile' => 'Dateieigenschaften',
+ 'PropertiesFilePath' => 'Vollständiger Pfad',
+ 'PropertiesItemsNumber' => 'Anzahl enthaltener Elemente', # Accepts model codes
+ 'PropertiesFileSize' => 'Dateigröße',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Eigenschaften der Sammlung',
+ 'PropertiesDefaultPicture' => 'Standardbild',
+
+ 'MailProgramsTitle' => 'Programm zum senden von E-Mails',
+ 'MailProgramsName' => 'Name',
+ 'MailProgramsCommand' => 'Kommandozeile',
+ 'MailProgramsRestore' => 'Vorgabe wiederherstellen',
+ 'MailProgramsAdd' => 'Programm hinzufügen',
+ 'MailProgramsInstructions' => 'In der Kommandozeile werden einige Ersetzungen vorgenommen:
+ %f wird ersetzt mit der E-Mailadresse des Nutzers.
+ %t wird ersetzt mit der E-Mailadresse des Empfängers.
+ %s wird ersetzt mit dem Betreff der Nachricht.
+ %b wird ersetzt mit dem Nachrichtentext.',
+
+ 'BookmarksBookmarks' => 'Lesezeichen',
+ 'BookmarksFolder' => 'Verzeichnis',
+ 'BookmarksLabel' => 'Beschriftung',
+ 'BookmarksPath' => 'Pfad',
+ 'BookmarksNewFolder' => 'Neues Verzeichnis',
+
+ 'AdvancedSearchType' => 'Art der Suche',
+ 'AdvancedSearchTypeAnd' => 'Elemente, die alle Kriterien erfüllen', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Elemente, die mindestens ein Kriterium erfüllen', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Suchkriterium',
+ 'AdvancedSearchAnyField' => 'In allen Elementen',
+ 'AdvancedSearchSaveTitle' => 'Suchanfrage speichern',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'Es existiert bereits eine Suchanfrage mit diesem Namen. Bitte nutzen Sie einen anderen.',
+ 'AdvancedSearchUseCase' => 'Groß/Kleinschreibung beachten',
+ 'AdvancedSearchIgnoreDiacritics' => 'Sonderzeichen ignorieren',
+
+ 'BugReportSubject' => 'Fehlermeldung erstellt von GCstar',
+ 'BugReportVersion' => 'Version',
+ 'BugReportPlatform' => 'Betriebssystem',
+ 'BugReportMessage' => 'Fehlermeldung',
+ 'BugReportInformation' => 'Zusätzliche Informationen',
+
+#Statistics
+ 'StatsFieldToUse' => 'Auszuwertendes Feld',
+ 'StatsSortByNumber' => 'Nach Anzahl der {X} sortieren',
+ 'StatsGenerate' => 'Erzeugen',
+ 'StatsKindOfGraph' => 'Diagrammart',
+ 'StatsBars' => 'Balken',
+ 'StatsPie' => 'Kuchen',
+ 'Stats3DPie' => '3D Kuchen',
+ 'StatsArea' => 'Fläche',
+ 'StatsHistory' => 'Häufigkeitsverteilung',
+ 'StatsWidth' => 'Breite',
+ 'StatsHeight' => 'Höhe',
+ 'StatsFontSize' => 'Schriftgröße',
+ 'StatsDisplayNumber' => 'Häufigkeiten eintragen',
+ 'StatsSave' => 'Diagramm als Grafik speichern',
+ 'StatsAccumulate' => 'Werte zusammenzählen',
+ 'StatsShowAllDates' => 'alle Daten berücksichtigen',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/EL/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/EL/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..2c50d30
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::EL::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Να συμπεριλαμβανονται τα ονοματα των πεδίων στην αρχή',
+ 'Separator' => 'Διαχωριστής',
+ 'Replacement' => 'Αντικατάσταση διαχωριστή με',
+ 'Charset' => 'Κωδικοποίηση χαρακτήρων',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/EL/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..98e21f7
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::EL::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/EL/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..49f373d
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::EL::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Άκυρο αρχείο μοντέλου',
+ 'UseFile' => 'Χρήση του κατωτέρω αρχείου',
+ 'WithJS' => 'Χρήση Javascript',
+ 'FileTemplate' => 'Μοντέλο',
+ 'Preview' => 'Προεπισκόπηση',
+ 'NoPreview' => 'Δεν είναι διαθέσιμη η προεπισκόπιση',
+ 'TemplateExternalFile' => 'Αρχείο μοντέλου',
+ 'Title' => 'Τίτλος σελίδας',
+ 'InfoFile' => 'Η λίστα βρίσκεται μέσα στο αρχείο: ',
+ 'InfoDir' => 'Οι εικόνες είναι στο: ',
+ 'HeightImg' => 'Ύψος (in pixels) των εικόνων',
+ 'OpenFileInBrowser' => 'Άνοιγμα του δημιουργημένου αρχείου στον web browser',
+ 'Note' => 'Η λίστα δημιουργήθηκε από <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Εισάγετε το κείμενο για αναζήτηση',
+ 'SearchType1' => 'Τίτλος μόνο',
+ 'SearchType2' => 'Όλες οι πληροφορίες',
+ 'SearchButton' => 'Αναζήτηση',
+ 'SearchTitle' => 'Εμφάνιση μόνο των ταινιών που αντιστοιχούν στα προηγούμενα κριτήρια',
+ 'AllButton' => 'Όλα',
+ 'AllTitle' => 'Εμφάνιση όλων των ταινιών',
+ 'Expand' => 'Επέκταση όλων',
+ 'ExpandTitle' => 'Εμφάνιση πληροφοριών όλων των ταινιών',
+ 'Collapse' => 'Απόκρυψη όλων',
+ 'CollapseTitle' => 'Απόκρυψη πληροφοριών όλων των ταινιών',
+ 'Borrowed' => 'Δανείστηκε από : ',
+ 'NotBorrowed' => 'Διαθέσιμο',
+ 'Top' => 'Επάνω',
+ 'Bottom' => 'Κάτω',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/EL/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..023f556
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::EL::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Όνομα βάσης δεδομένων',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/EL/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..75ebec8
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::EL::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Include DROP instruction',
+ 'WithCreate' => 'Include CREATE instruction',
+ 'TableName' => 'Όνομα πίνακα',
+ 'InfoFile' => 'Αρχείο SQL: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/EL/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..a4058e9
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::EL::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Το αρχείο είναι μέσα στο αρχείο: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/EL/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..8d91a99
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::EL::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Αρχείο μοντέλου',
+ 'ModelText' => 'Κείμενο του μοντέλου',
+ 'Models' => 'Χρήση του μοντέλου',
+ 'UseFile' => 'Χρήση αρχείου',
+ 'UseModel' => 'Χρήση περιοχής κειμένου',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/EL/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..2a2d87d
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::EL::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Αναζήτηση:',
+ 'Default' => 'Προεπιλεγμένος κατάλογος Alexandria',
+ 'Specified' => 'Ο κατωτέρο κατάλογος',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/EL/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..cf004be
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::EL::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Κωδικοποίηση χαρακτήρων',
+ 'Header' => 'Να αγνοηθεί η πρώτη γραμμή',
+ 'Separator' => 'Διαχωριστής',
+ 'Plugin' => 'Ιστοσελίδες που θα χρησιμοποιηθούν',
+ 'UseFirst' => 'Αν υπάρχουν περισσότερα αποτελέσματα να επιλέγεται το πρώτο',
+ 'SearchField' => 'Αναζήτηση αντικειμένων χρησιμοποιώντας',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/EL/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..857fd95
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCImport/GCImportFolder.pm
@@ -0,0 +1,67 @@
+{
+ package GCLang::EL::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Φάκελος',
+ 'Recursive' => 'Εξερεύνηση υπό-καταλόγων',
+ 'Suffixes' => 'Suffixes ή η επέκταση των αρχείων',
+ 'SuffixesTooltip' => 'Να ληφθεί υπ\'όψη η λίστα με διαχωρισμό με κόμμα των suffixes ή με τις επεκτάσεις των αρχείων',
+ 'Remove' => 'Να διαγραφεί από τα ονόματα',
+ 'RemoveTooltip' => 'Η λίστα των λέξεων διαχωρισμένες με κόμμα που θα πρέπει να διαγραφεί από τα ονόματα αρχείων για την δημιουργία ονόματος αναζήτησης',
+ 'Ask'=> 'Ερώτηση',
+ 'AskEnd'=> 'ερώτηση όλων στο τέλο',
+ 'AddWithoutInfo'=> 'Προσθήκη χωρίς πληροφορίες',
+ 'DontAdd'=> 'Να μην προστεθεί',
+ 'TakeFirst' => 'Επιλογή πρώτου',
+ 'MultipleResult'=> 'Αγνόησε όταν υπάρχουν περισσότερο από 1 απαντήσεις',
+ 'MultipleResultTooltip'=> 'Το αρχείο θα προστεθεί χωρίς αναζήτηση πληροφοριών αν υπάρχουν περισσότερο από 1 απαντήσεις',
+ 'RemoveWholeWord' => 'Αφαίρεση μόνο ολόκληρων λέξεων',
+ 'RemoveTooltipWholeWord' => 'Οι λέξεις θα αφαιρούνται μόνο αν εμφανίζονται σαν ολόκληρη λέξη',
+ 'RemoveRegularExpr' => 'Κανονική έκφραση',
+ 'RemoveTooltipRegularExpr' => 'Υπολογίστε ότι \'Για να αφαιρεθεί από τα ονόματα\' είναι μια κανονική έκφραση perl',
+ 'SkipFileAlreadyInCollection' => 'Προσθήκη μόνο νέων αρχείων',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Προσθήκη μόνο των αρχείων που δεν υπάρχουν στη συλλογή',
+ 'SkipFileNo' => 'Όχι',
+ 'SkipFileFullPath' => 'βασισμένο σε ολόκληρη τη διαδρομή',
+ 'SkipFileFileName' => 'βασισμένο στο όνομα αρχείου',
+ 'SkipFileFileNameAndUpdate' => 'βασισμένο στο όνομα αρχείου (αλλά με ενημέρωση διαδρομής στη συλλογή)',
+ 'NoResult'=> 'Κανένα αποτέλεσμα',
+ 'NoResultTooltip'=> 'Τι θα γίνεται αν δεν βρεθούν αποτελέσματα αναζήτησης από το πρόσθετο',
+ 'InfoFromFileNameRegExp' => 'Ανάλυση ονόματος αρχείου με αυτη την κανονική έκφραση',
+ 'InfoFromFileNameRegExpTooltip' => 'Χρήση αυτού για ανάκτηση πληροφοριών από το όνομα αρχείου (εφαρμόζεται μετά την αφαίρεση της επέκτασης). Αφήστε κενό αν δεν χρησιμοποιείται. Γνωστά πεδία: $T:Τίτλος, $A:Τίτλος αλφαβητικά, $Y:Ημερομηνία έκδοσης, $S:Σεζόν, $E:Επισόδειο, $N:Όνομα σειράς αλφαβητικά, $x:Αριθμός μέρους, $y: Σύνολο αριθμού μερών',
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/EL/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..c29abd3
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::EL::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Αντιγραφή εικόνων',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCImport/GCImportList.pm b/lib/gcstar/GCLang/EL/GCImport/GCImportList.pm
new file mode 100644
index 0000000..ff1d219
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::EL::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Όνομα λίστας',
+ 'Plugin' => 'Ιστοσελίδες που θα χρησιμοποιηθούν',
+ 'UseFirst' => 'Αν υπάρχουν περισσότερα αποτελέσματα να επιλέγεται το πρώτο',
+ 'CommentAuto' => 'Εισαγωγή στοιχείου αυτόματα.',
+ 'CommentSite' => 'Ιστοσελίδα: ',
+ 'CommentTitle' => 'Τίτλος: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/EL/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..7dc51ef
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::EL::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/EL/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..bcc4e1d
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::EL::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Το αρχείο δεν είναι τύπου Tellico collection',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/EL/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..7666f79
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCTVepisodes.pm
@@ -0,0 +1,45 @@
+{
+ package GCLang::EL::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ CollectionDescription => 'Συλλογή τηλεοπτικών εκπομπών',
+ Items => 'Επεισόδια',
+ NewItem => 'Νέο επεισόδιο',
+ NewSeries => 'Νέα σειρά',
+ Episode => 'Επεισόδιο',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/EL/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..7ba017c
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCTVseries.pm
@@ -0,0 +1,55 @@
+{
+ package GCLang::EL::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή τηλεοπτικών σειρών',
+ Items => { 0 => 'Σειρά',
+ 1 => 'Σειρά',
+ X => 'Σειρές',
+ lowercase1 => 'σειρά',
+ lowercaseX => 'σειρές'
+ },
+ NewItem => 'Νέα σειρά',
+ Name => 'Όνομα',
+ Season => 'Σεζόν',
+ Part => 'Μέρος',
+ Episodes => 'Επισόδεια',
+ FirstAired => 'Πρώτη προβολή',
+ Time => 'Διάρκεια',
+ Producer => 'Παραγωγός',
+ Music => 'Μουσική',
+ );
+ importTranslation('ταινίες');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/EL/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..1c4ca21
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::EL::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή επιτραπέζιων παιχνιδιών',
+ Items => {0 => 'Παιχνίδι',
+ 1 => 'Παιχνίδι',
+ X => 'Παιχνίδια'},
+ NewItem => 'Νέο παιχνίδι',
+
+ Id => 'Id',
+ Name => 'Όνομα',
+ Original => 'Αυθεντικό όνομα',
+ Box => 'Εικόνα συσκευασίας',
+ DesignedBy => 'Δημιουργός',
+ PublishedBy => 'Εκδότης',
+ Players => 'Αριθμός παικτών',
+ PlayingTime => 'Χρόνος παρτίδας',
+ SuggestedAge => 'Προτεινόμενη ηλικία',
+ Released => 'Ημερομηνία έκδοσης',
+ Description => 'Περιγραφή',
+ Category => 'Κατηγορία',
+ Mechanics => 'Μηχανισμοί',
+ ExpandedBy => 'Υπάρχουσα επέκταση',
+ ExpansionFor => 'Επέκταση για',
+ GameFamily => 'Κατηγορία παιχνιδιού',
+ IllustratedBy => 'Εικονογράφηση από',
+ Url => 'Ιστοσελίδα',
+ TimesPlayed => 'Αριθμός παρτίδων που έχουν παιχτεί',
+ CompleteContents => 'Πλήρες περιεχόμενο',
+ Copies => 'Αριθμός αντιγράφων',
+ Condition => 'Κατάσταση',
+ Photos => 'Εικόνες',
+ Photo1 => 'Πρώτη εικόνα',
+ Photo2 => 'Δεύτερη εικόνα',
+ Photo3 => 'Τρίτη εικόνα',
+ Photo4 => 'Τέταρτη εικόνα',
+ Comments => 'Σχόλια',
+
+ Perfect => 'Εξαίρετο',
+ Good => 'Καλό',
+ Average => 'Μέτριο',
+ Poor => 'Κακό',
+
+ CompleteYes => 'Πλήρες περιεχόμενο',
+ CompleteNo => 'Ελλειπή στοιχεία',
+
+ General => 'Γενικά',
+ Details => 'Λεπτομέρειες',
+ Personal => 'Προσωπικά',
+ Information => 'Πληροφορίες',
+
+ FilterRatingSelect => '_Βαθμολογία τουλάχιστο...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCbooks.pm b/lib/gcstar/GCLang/EL/GCModels/GCbooks.pm
new file mode 100644
index 0000000..fd601f1
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCbooks.pm
@@ -0,0 +1,70 @@
+{
+ package GCLang::EL::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή βιβλίων',
+ Items => {0 => 'Βιβλίο',
+ 1 => 'Βιβλίο',
+ X => 'Βιβλία'},
+ NewItem => 'Νέο βιβλίο',
+
+ Isbn => 'ISBN',
+ Title => 'Τίτλος',
+ Cover => 'Εξώφυλλο',
+ Authors => 'Συγγραφέας',
+ Publisher => 'Εκδότης',
+ Publication => 'Ημερομηνία έκδοσης',
+ Language => 'Γλώσσα',
+ Genre => 'Κατηγορία',
+ Serie => 'Σειρά',
+ Rank => 'Rank',
+ Bookdescription => 'Περιγραφή',
+ Pages => 'Σελίδες',
+ Read => 'Διαβασμένο',
+ Acquisition => 'Ημερομηνία απόκτησης',
+ Edition => 'Έκδοση',
+ Format => 'Μορφή',
+ Comments => 'Σχόλια',
+ Url => 'Ιστοσελίδα',
+ Translator => 'Μετάφραση:',
+ Artist => 'Επιμέλεια:',
+ DigitalFile => 'Digital version',
+
+ General => 'Γενικά',
+ Details => 'Λεπτομέρειες',
+
+ ReadNo => 'Not read',
+ ReadYes => 'Read',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCcoins.pm b/lib/gcstar/GCLang/EL/GCModels/GCcoins.pm
new file mode 100644
index 0000000..004537d
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCcoins.pm
@@ -0,0 +1,104 @@
+{
+ package GCLang::EL::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή νομισμάτων',
+ Items => {0 => 'Νόμισμα',
+ 1 => 'Νόμισμα',
+ X => 'Νομίσματα'},
+ NewItem => 'Νέο νόμισμα',
+
+ Name => 'Όνομα',
+ Country => 'Χώρα',
+ Year => 'Έτος',
+ Currency => 'Νόμισμα',
+ Value => 'Αξία',
+ Picture => 'Κεντρική εικόνα',
+ Diameter => 'Διάμετρος',
+ Metal => 'Μέταλλο',
+ Edge => 'Στεφάνη',
+ Edge1 => 'Στεφάνη 1',
+ Edge2 => 'Στεφάνη 2',
+ Edge3 => 'Στεφάνη 3',
+ Edge4 => 'Στεφάνη 4',
+ Head => 'Όψη κύρια',
+ Tail => 'Όψη πίσω',
+ Comments => 'Σχόλια',
+ History => 'Ιστορικό',
+ Website => 'Ιστοσελίδα',
+ Estimate => 'Εκτιμώμενη αξία (€)',
+ References => 'Παραπομπές',
+ Type => 'Τύπος',
+ Coin => 'Κέρμα',
+ Banknote => 'Χαρτονόμισμα',
+
+ Main => 'Κυρίως',
+ Description => 'Περιγραφή',
+ Other => 'Λοιπές πληροφορίες',
+ Pictures => 'Εικόνες',
+
+ Condition => 'Condition (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCcomics.pm b/lib/gcstar/GCLang/EL/GCModels/GCcomics.pm
new file mode 100644
index 0000000..b5cc1de
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::EL::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή Κόμικς',
+ Items => {0 => 'Κόμικς',
+ 1 => 'Κόμικ',
+ X => 'Κόμικς'},
+ NewItem => 'Νέο κόμικ',
+
+
+ Id => 'Id',
+ Name => 'Όνομα',
+ Series => 'Σειρά',
+ Volume => 'Τόμος',
+ Title => 'Τίτλος',
+ Writer => 'Συγγραφέας',
+ Illustrator => 'Εικονογράφος',
+ Colourist => 'Κολορίστας',
+ Publisher => 'Εκδότης',
+ Synopsis => 'Περίληψη',
+ Collection => 'Συλλογή',
+ PublishDate => 'Ημερομηνία έκδοσης',
+ PrintingDate => 'Ημερομηνία εκτύπωσης',
+ ISBN => 'ISBN',
+ Type => 'Τύπος',
+ Category => 'Κατηγορία',
+ Format => 'Μορφή',
+ NumberBoards => 'Αριθμός Σελίδων',
+ Signing => 'Αφιέρωση',
+ Cost => 'Κόστος',
+ Rating => 'Βαθμολογία',
+ Comment => 'Σχόλια',
+ Url => 'Ιστοσελίδα',
+
+ FilterRatingSelect => 'Βαθμός _τουλάχιστο...',
+
+ Main => 'Κεντρικό μενού',
+ General => 'Γενικά',
+ Details => 'Λεπτομέρειες',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCfilms.pm b/lib/gcstar/GCLang/EL/GCModels/GCfilms.pm
new file mode 100644
index 0000000..7dea458
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCfilms.pm
@@ -0,0 +1,93 @@
+{
+ package GCLang::EL::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή ταινιών',
+ Items => {0 => 'Ταινία',
+ 1 => 'Ταινία',
+ X => 'Ταινίες'},
+ NewItem => 'Νέα ταινία',
+
+
+ Id => 'Id',
+ Title => 'Τίτλος',
+ Date => 'Ημερομηνία',
+ Time => 'Διάρκεια',
+ Director => 'Σκηνοθέτης',
+ Country => 'Χώρα',
+ MinimumAge => 'Όριο ηλικίας',
+ Genre => 'Είδος',
+ Image => 'Εικόνα',
+ Original => 'Αυθεντικός τίτλος',
+ Actors => 'Ηθοποιοί',
+ Actor => 'Ηθοποιός',
+ Role => 'Ρόλος',
+ Comment => 'Σχόλια',
+ Synopsis => 'Περίληψη',
+ Seen => 'Το \'χω δει',
+ Number => 'Αριθμός',
+ Format => 'Τύπος μέσου',
+ Region => 'Χώρα',
+ Identifier => 'Αναγνωριστικό',
+ Url => 'Ιστοσελίδα',
+ Audio => 'Ήχος',
+ Video => 'Video format',
+ Trailer => 'Αρχείο video',
+ Serie => 'Σειρά',
+ Rank => 'Rank',
+ Subtitles => 'Υπότιτλοι',
+
+ SeenYes => 'Το \'χω δει',
+ SeenNo => 'Δεν το \'χω δει',
+
+ AgeUnrated => 'Άγνωστο',
+ AgeAll => 'Για όλη την οικογένεια',
+ AgeParent => 'Με γονική συναίνεση',
+
+ Main => 'Βασικά στοιχεία',
+ General => 'Γενικά',
+ Details => 'Λεπτομέρειες',
+
+ Information => 'Πληροφορίες',
+ Languages => 'Γλώσσες',
+ Encoding => 'Κωδικοποίηση',
+
+ FilterAudienceAge => 'Ηλικία θεατή',
+ FilterSeenNo => '_Δεν το \'χω δει',
+ FilterSeenYes => '_Το \'χω δει',
+ FilterRatingSelect => '_Βαθμολογία τουλάχιστο...',
+
+ ExtractSize => 'Μέγεθος',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCgames.pm b/lib/gcstar/GCLang/EL/GCModels/GCgames.pm
new file mode 100644
index 0000000..807a47f
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCgames.pm
@@ -0,0 +1,82 @@
+{
+ package GCLang::EL::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή παιχνιδιών Video ',
+ Items => {0 => 'Παιχνίδι',
+ 1 => 'Παιχνίδι',
+ X => 'Παιχνίδια'},
+ NewItem => 'Νέο παιχνίδι',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Όνομα',
+ Platform => 'Πλατφόρμα',
+ Players => 'Αριθμός παικτών',
+ Released => 'Ημερομηνία έκδοσης',
+ Editor => 'Εκδότης',
+ Developer => 'Δημιουργός',
+ Genre => 'Είδος',
+ Box => 'Εικόνα συσκευασίας',
+ Case => 'Συσκευασία',
+ Manual => 'Οδηγίες χρήσης',
+ Completion => 'Ολοκλήρωση (%)',
+ Executable => 'Εκτελέσιμο',
+ Description => 'Περιγραφή',
+ Codes => 'Κωδικοί',
+ Code => 'Κώδικας',
+ Effect => 'Effect',
+ Secrets => 'Secrets',
+ Screenshots => 'Στιγμιότυπα',
+ Screenshot1 => 'Πρώτο στιγμιότυπο',
+ Screenshot2 => 'Δεύτερο στιγμιότυπο',
+ Comments => 'Σχόλια',
+ Url => 'Ιστοσελίδα',
+ Unlockables => 'Μπορούν να ξεκλειδωθουν',
+ Unlockable => 'Μπορεί να ξεκλειδωθεί',
+ Howto => 'Τρόπος ξεκλειδώματος',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Περιοχή',
+ SerialNumber => 'Σειριακός αριθμός',
+
+ General => 'Γενικά',
+ Details => 'Λεπτομέρειες',
+ Tips => 'Tips',
+ Information => 'Πληροφορίες',
+
+ FilterRatingSelect => '_Βαθμολογία τουλάχιστο...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/EL/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..2e18bbe
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::EL::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCminicars.pm b/lib/gcstar/GCLang/EL/GCModels/GCminicars.pm
new file mode 100644
index 0000000..54fc2e1
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::EL::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή μινιατούρων αυτοκινήτων',
+ Items => {0 => 'Όχημα',
+ 1 => 'Όχημα',
+ X => 'Οχήματα',
+ lowercase1 => 'όχημα',
+ lowercaseX => 'οχήματα'
+ },
+ NewItem => 'Νέο όχημα',
+ Currency => 'Νόμισμα',
+
+# Main fields
+
+ Main => 'Κύριες πληροφορίες',
+
+ Name => 'Όνομα',
+ Exchange => 'Προς πώληση ή ανταλλαγή',
+ Wanted => 'Ζήτηση',
+ Rating1 => 'Κύρια αξιολόγηση',
+ Picture1 => 'Κύρια εικόνα',
+ Scale => 'Κλίμακα',
+ Manufacturer => 'Εργοστάσιο',
+ Constructor => 'Κατασκευαστής',
+ Type1 => 'Τύπος',
+ Modele => 'Μοντέλο',
+ Version => 'Έκδοση',
+ Color => 'Χρώμα μοντέλου',
+ Pub => 'Διαφήμιση',
+ Year => 'Έτος',
+ Reference => 'Κωδικός',
+ Kit => 'Σε κιτ',
+ Transformation => 'Προσωπική τροποποίηση',
+ Comments1 => 'Σχόλια',
+
+# Details fields
+
+ Details => 'Λεπτομέρειες',
+
+ MiscCharacteristics => 'Διάφορα χαρακτηριστικά',
+ Material => 'Υλικό',
+ Molding => 'Καλούπι',
+ Condition => 'Κατάσταση',
+ Edition => 'Έκδοση',
+ Collectiontype => 'Όνομα συλλογής',
+ Serial => 'Σειρά',
+ Serialnumber => 'Σειριακός αριθμός',
+ Designed => 'Ημερομηνία σχεδιασμού',
+ Madein => 'Ημερομηνία κατασκευής',
+ Box1 => 'Τύπος κουτιού',
+ Box2 => 'Περιγραφή κουτιού',
+ Containbox => 'Περιεχόμενο κουτιού',
+ Rating2 => 'Ρεαλιστικό',
+ Rating3 => 'Φινίρισμα',
+ Acquisition => 'Ημερομηνία αγοράς',
+ Location => 'Τόπος αγοράς',
+ Buyprice => 'Τιμή αγοράς',
+ Estimate => 'Εκτίμηση',
+ Comments2 => 'Σχόλια',
+ Decorationset => 'Σετ διακόσμησης',
+ Characters => 'Χαρακτήρες',
+ CarFromFilm => 'Αυτοκίνητο από ταινία',
+ Filmcar => 'Ταινία σχετική με το όχημα',
+ Filmpart => 'Μέρος/επισόδειο ταινίας',
+ Parts => 'Αριθμός μερών',
+ VehiculeDetails => 'Λεπτομέρειες αυτοκινήτου',
+ Detailsparts => 'Αναλυτικά στοιχεία',
+ Detailsdecorations => 'Τύπος διακοσμήσεων',
+ Decorations => 'Αριθμός διακοσμήσεων',
+ Lwh => 'Μήκος / Πλάτος / Ύψος',
+ Weight => 'Βάρος',
+ Framecar => 'Σασί',
+ Bodycar => 'Αμάξωμα',
+ Colormirror => 'Χρώμα μοντέλου',
+ Interior => 'Εσωτερικό',
+ Wheels => 'Τροχοί',
+ Registrationnumber1 => 'Εμπρόσθιος αριθμός καταχώρησης',
+ Registrationnumber2 => 'Οπίσθιος αριθμός καταχώρησης',
+ RacingCar => 'Αγωνιστικό αυτοκίνητο',
+ Course => 'Αγώνας',
+ Courselocation => 'Τοποθεσία αγώνα',
+ Courseyear => 'Ημερομηνία αγώνα',
+ Team => 'Ομάδα',
+ Pilots => 'Οδηγός(οι)',
+ Copilots => 'Συνοδηγός(οι)',
+ Carnumber => 'Αριθμός οχήματος',
+ Pub2 => 'Διαφημιστές',
+ Finishline => 'Τελική κατάταξη',
+ Steeringwheel => 'Θέση τιμονιού',
+
+
+# Catalogs fields
+
+ Catalogs => 'Κατάλογοι',
+
+ OfficialPicture => 'Επίσημη εικόνα',
+ Barcode => 'Barcode',
+ Referencemirror => 'Κωδικός',
+ Year3 => 'Ημερομηνία διαθεσιμότητας',
+ CatalogCoverPicture => 'Εξώφυλλο',
+ CatalogPagePicture => 'Σελίδα',
+ Catalogyear => 'Έτος καταλόγου',
+ Catalogedition => 'Έκδοση καταλόγου',
+ Catalogpage => 'Σελίδα καταλόγου',
+ Catalogprice => 'Τιμή καταλόγου',
+ Personalref => 'Προσωπικός κωδικός',
+ Websitem => 'Ιστοσελίδα κατασκευαστή μινιατούρας',
+ Websitec => 'Ιστοσελίδα κατασκευαστή του πραγματικού οχήματος',
+ Websiteo => 'Χρήσιμοι σύνδεσμοι',
+ Comments3 => 'Σχόλια',
+
+# Pictures fields
+
+ Pictures => 'Εικόνες',
+
+ OthersComments => 'Γενικές παρατηρήσεις',
+ OthersDetails => 'Άλλες λεπτομέρειες',
+ Top1 => 'Επάνω',
+ Back1 => 'Κάτω',
+ AVG => 'Επάνω αριστερά',
+ AV => 'Επάνω',
+ AVD => 'Επάνω δεξιά',
+ G => 'Αριστερά',
+ BOX => 'Κουτί',
+ D => 'Δεξιά',
+ ARG => 'Πίσω αριστερά',
+ AR => 'Πίσω',
+ ARD => 'Πίσω δεξιά',
+ Others => 'Διάφορα',
+
+# PanelLending fields
+
+ LendingExplanation => 'Χρήσιμες ανταλλαγές κατα την διαρκεια περιοδικών εκθέσεων',
+ PanelLending => 'Χορηγήσεις (για εκθέσεις)',
+ Comments4 => 'Σχόλια',
+
+# Realmodel fields
+
+ Realmodel => 'Πραγματικό αυτοκίνητο',
+
+ Difference => 'Διαφορές με την μινιατούρα',
+ Front2 => 'Εμπρός',
+ Back2 => 'Πίσω',
+ Comments5 => 'Σχόλια',
+
+ References => 'Αναφορές',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCmusics.pm b/lib/gcstar/GCLang/EL/GCModels/GCmusics.pm
new file mode 100644
index 0000000..be29c6e
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCmusics.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::EL::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή μουσικής',
+ Items => {0 => 'Δίσκος',
+ 1 => 'Δίσκος',
+ X => 'Δίσκοι'},
+ NewItem => 'Νέος δίσκος',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Τίτλος',
+ Cover => 'Εξώφυλλο',
+ Artist => 'Καλλιτέχνης',
+ Format => 'Format',
+ Running => 'Διάρκεια',
+ Release => 'Ημερομηνία έκδοσης',
+ Genre => 'Είδος',
+ Origin => 'Προέλευση',
+
+#For tracks list
+ Tracks => 'Λίστα τραγουδιών',
+ Number => 'Νούμερο',
+ Track => 'Τίτλος',
+ Time => 'Διάρκεια',
+
+ Composer => 'Συνθέτης',
+ Producer => 'Παραγωγός',
+ Playlist => 'Λίστα αναπαραγωγής',
+ Comments => 'Σχόλια',
+ Label => 'Δισκογραφική εταιρεία',
+ Url => 'Ιστοσελίδα',
+
+ General => 'Γενικά',
+ Details => 'Λεπτομέρειες',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/EL/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..d4fc659
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::EL::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή Περιοδικών',
+ Items => {0 => 'Περιοδικό',
+ 1 => 'Περιοδικό',
+ X => 'Περιοδικά'},
+ NewItem => 'Νέο περιοδικό',
+
+ Title => 'Τίτλος',
+ Cover => 'Εξώφυλλο',
+ Periodical => 'Περιοδικό',
+ Number => 'Τεύχος',
+ Date => 'Ημερομηνία',
+ Subject => 'Θέμα',
+ Articles => 'Άρθρα',
+
+ General => 'Γενικά',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/EL/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..30eaff2
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::EL::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή τηλεκαρτών',
+ Items => {0 => 'Τηλεκάρτα',
+ 1 => 'Τηλεκάρτα',
+ X => 'Τηλεκάρτες'},
+ NewItem => 'Νέα τηλεκάρτα',
+ Currency => 'Νόμισμα',
+
+ Help => 'Βοήθεια για τα πεδία',
+ Help1 => 'Βοήθεια',
+
+# Traduction des Champs "Main"
+
+ Main => 'Η τηλεκάρτα',
+
+ Cover => 'Εικόνα',
+
+ Name => 'Όνομα',
+ Exchange => 'Προς πώληση ή ανταλλαγή',
+ Wanted => 'Ζήτηση',
+ Rating1 => 'Γενική αξιολόγηση',
+ TheSmartCard => 'Η τηλεκάρτα, εμπρός/πίσω',
+
+ Country => 'Χώρα',
+ Color => 'Χρώμα',
+ Type1 => 'Τύπος κάρτας',
+ Type2 => 'Τύπος τσιπ',
+ Dimension => 'Μήκος / Πλάτος / Πάχος',
+
+ Box => 'Κουτί',
+ Chip => 'Τσίπ',
+ Year1 => 'Έτος έκδοσης',
+ Year2 => 'Ετος εγκυρότητας',
+ Condition => 'Κατάσταση',
+ Charge => 'Φορτιζόμερνη κάρτα',
+ Variety => 'Είδος',
+
+ Edition => 'Αριθμός δειγμάτων',
+ Serial => 'Σειριακός αριθμός',
+ Theme => 'Θέμα',
+
+ Acquisition => 'Αγοραστηκε στο',
+
+ Catalog0 => 'Κατάλογος',
+ Catalog1 => 'OTE',
+ Catalog2 => 'Κινητής τηλεφωνίας',
+
+ Reference0 => 'Κωδικός',
+ Reference1 => 'Κωδικός ΟΤΕ',
+ Reference2 => 'Κωδικός κινητής τηλεφωνίας',
+ Reference3 => 'Άλλος κωδικός',
+
+ Quotationnew00 => 'Αξία νέας κάρτας',
+ Quotationnew10 => 'Αξία κάρτας ΟΤΕ',
+ Quotationnew20 => 'Αξία κάρτας κινητής',
+ Quotationnew30 => 'Άλλη αξία',
+ Quotationold00 => 'Αξία μεταχειρισμένης κάρτας',
+ Quotationold10 => 'Αξία κάρτας ΟΤΕ',
+ Quotationold20 => 'Αξία κάρτας κινητής',
+ Quotationold30 => 'Άλλη αξία',
+
+ Title1 => 'Τίτλος',
+
+ Unit => 'Μονάδες / Αριθμός λεπτών',
+
+ Pressed => 'Τύπος εκτύπωσης',
+ Location => 'Τόπος εκτύπωσης',
+
+ Comments1 => 'Σχόλια',
+
+ Others => 'Διάφορα.',
+ Weight => 'Βάρος',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/EL/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..274d7e4
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::EL::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή προγραμμάτων υπολογιστών',
+ Items => {0 => 'Εφαρμογή',
+ 1 => 'Εφαρμογή',
+ X => 'Εφαρμογές',
+ lowercase1 => 'εφαρμογή',
+ lowercaseX => 'εφαρμογες'},
+ NewItem => 'Νέα εφαρμογή',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Όνομα',
+ Platform => 'Πλατφόρμα',
+ Released => 'Ημερομηνία κυκλοφορίας',
+ Homepage => 'Ιστοσελίδα',
+ Editor => 'Εκδότης',
+ Developer => 'Προγραμματιστής',
+ Category => 'Κατηγορία',
+ NumberOfCopies => 'Αντίγραφα',
+ Price => 'Τιμή',
+ Box => 'Εικόνα κουτιού',
+ Case => 'Θήκη',
+ Manual => 'Εγχειρίδιο χρήσης',
+ Executable => 'Εκτελέσιμο',
+ Description => 'Περιγραφή',
+ License => 'Άδεια χρήσης',
+ Commercial => 'Εμπορικό',
+ FreewareNoncommercial => 'Freeware (μη εμπορική χρήση)',
+ OtherOpenSource => 'Άλλο ανοιχτού λογισμικού',
+ PublicDomain => 'Δημόσιος τομέας',
+ OtherLicense => 'Άλλο',
+ Registration => 'Εγγραφή',
+ RegistrationInfo => 'Πληροφορίες εγγραφής',
+ RegInfo => 'Πληροφορίες εγγραφής',
+ RegistrationName => 'Όνομα χρήστη',
+ RegistrationNumber => 'Αριθμός εγγραφής',
+ PanelRegistration => 'Πληροφορίες εγγραφής',
+ RegistrationComments => 'Πρόσθετες πληροφορίες ή σχόλια',
+ Screenshots => 'Στιγμιότυπα',
+ Screenshot1 => 'Πρώτο στιγμιότυπο',
+ Screenshot2 => 'Δεύτερο στιγμιότυπο',
+ Comments => 'Σχόλια',
+ Url => 'Ιστοσελίδα',
+ General => 'Γενικά',
+ Details => 'Λεπτομέρειες',
+ Information => 'Πληροφορίες',
+
+ FilterRatingSelect => 'Αξιολόγηση τουλάχιστο...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCstamps.pm b/lib/gcstar/GCLang/EL/GCModels/GCstamps.pm
new file mode 100644
index 0000000..c48b9f0
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::EL::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή γραμματοσήμων',
+ Items => {0 => 'Γραμματόσημα',
+ 1 => 'Γραμματόσημο',
+ X => 'Γραμματόσημα'},
+ NewItem => 'Νέο γραμματόσημο',
+
+ General => 'Γενικά',
+ Detail => 'Λεπτομέρεια',
+ Value => 'Αξία',
+ Notes => 'Σημειώσεις',
+ Views => 'Όψεις',
+
+ Name => 'Όνομα',
+ Country => 'Χώρα',
+ Year => 'Έτος',
+ Catalog => 'Κατάλογος',
+ Number => 'Αριθμός',
+ Topic => 'Θέμα',
+ Serie => 'Σειρά',
+ Designer => 'Σχεδιαστής',
+ Engraver => 'Χαράκτης',
+ Type => 'Τύπος',
+ Format => 'Μορφή',
+ Description => 'Περιγραφή',
+ Color => 'Χρώμα',
+ Gum => 'Κόλλα',
+ Paper => 'Χαρτί',
+ Perforation => 'Οδόντωση',
+ PerforationSize => 'Μέγεθος οδόντωσης',
+ CancellationType => 'Τύπος σφράγισης',
+ Comments => 'Σχόλια',
+ PrintingVariety => 'Ποικιλία εκτύπωσης',
+ IssueDate => 'Ημερομηνία έκδοσης',
+ EndOfIssue => 'Τέλος έκδοσης',
+ Issue => 'Έκδοση',
+ Grade => 'Ποιότητα',
+ Status => 'Θέση',
+ Adjusted => 'Προσαρμοσμένο',
+ Cancellation => 'Σφράγιση',
+ CancellationCondition => 'Κατάσταση σφραγίδας',
+ GumCondition => 'Κατάσταση κόλλας',
+ PerforationCondition => 'Κατάσταση οδόντωσης',
+ ConditionNotes => 'Σημειώσεις για την κατάσταση',
+ Error => 'Λάθος',
+ ErrorNotes => 'Σημειώσεις Λάθους',
+ FaceValue => 'Αξία όψης',
+ MintValue => 'Αξία καινούργιου',
+ UsedValue => 'Αξία σφραγισμένου',
+ PurchasedDate => 'Ημερομηνία αγοράς',
+ Quantity => 'Ποσότητα',
+ History => 'Ιστορικό',
+ Picture1 => 'Εικόνα 1',
+ Picture2 => 'Εικόνα 2',
+ Picture3 => 'Εικόνα 3',
+
+ AirMail => 'Ταχυδρομημένο αεροπορικώς',
+ MilitaryStamp => 'Στρατιωτική σφραγίδα',
+ Official => 'Σφραγίδα υπηρεσίας',
+ PostageDue => 'Φόρος γραμματοσήμου',
+ Regular => 'Κανονικό γραμματόσημο',
+ Revenue => 'Χαρτόσημο',
+ SpecialDelivery => 'Ταχεία αποστολή',
+ StrikeStamp => 'Γραμματόσημο απεργίας',
+ TelegraphStamp => 'Γραμματόσημο τηλέγραφου',
+ WarStamp => 'Γραμματόσημο πολέμου',
+ WarTaxStamp => 'Χαρτόσημο πολέμου',
+
+ Booklet => 'Κλασέρ',
+ BookletPane => 'Ποσεττα',
+ Card => 'Κάρτα',
+ Coil => 'Γραμματόσημο τροχίσου',
+ Envelope => 'Φάκελος',
+ FirstDayCover => 'Φάκελος πρώτης ημέρας κυκλοφορίας',
+ Sheet => 'Φεγιέ',
+ Single => 'Μεμονωμένο',
+
+ Heliogravure => 'Φωτοχαραξη',
+ Lithography => 'Λιθογραφία',
+ Offset => 'Offset',
+ Photogravure => 'Φωτοτσιγκογραφία',
+ RecessPrinting => 'Χαλκογραφική',
+ Typography => 'Τυπογραφία',
+
+ OriginalGum => 'Αυθεντική κόλλα',
+ Ungummed => 'Ξεκολλημένο',
+ Regummed => 'Επανακολλημενο',
+
+ Chalky => 'Ασβεστολιθικό χαρτί',
+ ChinaPaper => 'Χαρτί Κίνας',
+ Coarsed => 'Τραχύ χαρτί',
+ Glossy => 'Γυαλιστερό',
+ Granite => 'Γρανίτης',
+ Laid => 'Στρωτό',
+ Manila => 'Χαρτί με φυσαλίδες',
+ Native => 'Φυσικό',
+ Pelure => 'Φλοιώδες',
+ Quadrille => 'Χαρτί καντριλέ',
+ Ribbed => 'Ραβδωτό',
+ Rice => 'Ρυζόχαρτο',
+ Silk => 'Μεταξωτό',
+ Smoothed => 'Λείο',
+ Thick => 'Παχύ',
+ Thin => 'Λεπτό',
+ Wove => 'Κυματιστό',
+
+ CoarsedPerforation => 'Χονδροειδή οδόντωση',
+ CombPerforation => 'Οδόντωση χτένα',
+ CompoundPerforation => 'Ανάμικτη οδόντωση',
+ DamagedPerforation => 'Αλλοιωμένη οδόντωση',
+ DoublePerforation => 'Διπλή διάτρηση',
+ HarrowPerforation => 'Σκισμένη οδόντωση',
+ LinePerforation => 'Γραμμική οδόντωση',
+ NoPerforation => 'Χωρίς οδόντωση',
+
+ CancellationToOrder => 'Σφράγιση παραγγελίας',
+ FancyCancellation => 'Εντυπωσιακή σφράγιση',
+ FirstDayCancellation => 'Σφράγιση φακέλου πρώτης ημέρας',
+ NumeralCancellation => 'Ψηφιακή σφράγιση',
+ PenMarked => 'Σημειωμένο με πένα',
+ RailroadCancellation => 'Σφράγιση σιδηρόδρομου',
+ SpecialCancellation => 'Ειδική σφράγιση',
+
+ Superb => 'Εξαίσιο',
+ ExtraFine => 'Πάρα πολυ ωραίο',
+ VeryFine => 'Πολυ ωραίο',
+ FineVeryFine => 'Ωραίο/Πολύ ωραίο',
+ Fine => 'Ωραίο',
+ Average => 'Μέτριο',
+ Poor => 'Κακό',
+
+ Owned => 'Κατεχόμενο',
+ Ordered => 'Σε παραγγελία',
+ Sold => 'Πουλημένο',
+ ToSell => 'Προς πώληση',
+ Wanted => 'Ζητούμενο',
+
+ LightCancellation => 'Ελαφριά σφράγιση',
+ HeavyCancellation => 'Έντονη σφράγιση',
+ ModerateCancellation => 'Μέτρια σφράγιση',
+
+ MintNeverHinged => 'Ανέπαφο',
+ MintLightHinged => 'Ελαφριά τσάκιση',
+ HingedRemnant => 'Τσάκιση',
+ HeavilyHinged => 'Μεγάλη τσάκιση',
+ LargePartOriginalGum => 'Γνήσια κόλλα σε μεγάλη επιφάνεια',
+ SmallPartOriginalGum => 'Γνήσια κόλλα σε μικρή επιφάνεια',
+ NoGum => 'Χωρίς κόλλα',
+
+ Perfect => 'Τέλειο',
+ VeryNice => 'Πολύ όμορφο',
+ Nice => 'Όμορφο',
+ Incomplete => 'Ατελείωτο',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCwines.pm b/lib/gcstar/GCLang/EL/GCModels/GCwines.pm
new file mode 100644
index 0000000..a596e3a
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCwines.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::EL::GCModels::GCwines;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή κρασιών',
+ Items => {0 => 'Κρασί',
+ 1 => 'Κρασί',
+ X => 'Κρασιά'},
+ NewItem => 'Νέο κρασί',
+
+ Name => 'Όνομα',
+ Designation => 'Ονομασία',
+ Vintage => 'Χρονιά παραγωγής',
+ Vineyard => 'Αμπελώνας',
+ Type => 'Κατηγορία',
+ Grapes => 'Σταφύλι',
+ Soil => 'Έδαφος',
+ Producer => 'Παραγωγός',
+ Country => 'Χώρα',
+ Volume => 'Ποσότητα (ml)',
+ Alcohol => 'Αλκοόλ (%)',
+ Medal => 'Διακρίσεις',
+
+ Storage => 'Αποθήκευση',
+ Location => 'Τοποθεσία',
+ ShelfIndex => 'Θέση',
+ Quantity => 'Ποσότητα',
+ Acquisition => 'Απόκτηση',
+ PurchaseDate => 'Ημερομηνία απόκτησης',
+ PurchasePrice => 'Τιμή απόκτησης',
+ Gift => 'Δώρο',
+ BottleLabel => 'Ετικέτα φιάλης',
+ Website => 'Παραπομπή στο Internet',
+
+ Tasted => 'Δοκιμασμένο',
+ Comments => 'Παρατηρήσεις',
+ Serving => 'Σερβίρισμα',
+ TastingField => 'Χαρακτήρας',
+
+ General => 'Γενικά',
+ Details => 'Λεπτομέρειες',
+ Tasting => 'Γεύση',
+
+ TastedNo => 'Δεν είναι δοκιμασμένο',
+ TastedYes => 'Δοκιμασμένο',
+
+ FilterRange => 'Εύρος',
+ FilterTastedNo => '_Δεν έχει δοκιμαστεί ακόμα',
+ FilterTastedYes => 'Δοκιμασμένο',
+ FilterRatingSelect => '_Βαθμολογία τουλάχιστο...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCstar.pm b/lib/gcstar/GCLang/EL/GCstar.pm
new file mode 100644
index 0000000..5cc5efc
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCstar.pm
@@ -0,0 +1,674 @@
+{
+ package GCLang::EL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Ελληνικά',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Προσοχή</b>:
+
+Οι πληροφορίες που ανακτώνται από τις ιστοσελίδες (μέσω των
+search plugins) προορίζονται για <b>προσωπική χρήση μόνο</b>.
+
+Οποιαδήποτε αναδιανομή απαγορεύεται <b>ρητά χωρίς την άδεια</b>
+των ιστοσελίδων.
+
+Για να προσδιορίσετε από ποιο site προέρχονται οι πληροφορίες, μπορείτε
+να χρησιμοποιήσετε το κουμπί κάτω από το σημείο <b>λεπτομέρειες</b>.',
+
+ 'AllItemsFiltered' => 'Δεν βρέθηκαν αποτελέσματα σύμφωνα με τα κριτήρια αναζήτησης', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Εγκατάσταση σε ',
+ 'InstallMandatory' => 'Υποχρεωτικά στοιχεία',
+ 'InstallOptional' => 'Προαιρετικά στοιχεία',
+ 'InstallErrorMissing' => 'Σφάλμα : Τα ακόλουθα στοιχεία Perl πρέπει να εγκατασταθούν: ',
+ 'InstallPrompt' => 'Βασικός κατάλογος για την εγκατάσταση [/usr/local]: ',
+ 'InstallEnd' => 'Η εγκατάσταση ολοκληρώθηκε',
+ 'InstallNoError' => 'Κανένα σφάλμα',
+ 'InstallLaunch' => 'Για να χρησιμοποιήσετε την εφαρμογή, εκκινήστε ',
+ 'InstallDirectory' => 'Βασικός κατάλογος',
+ 'InstallTitle' => 'Εγκατάσταση GCstar',
+ 'InstallDependencies' => 'Εξαρτήσεις',
+ 'InstallPath' => 'Διαδρομή',
+ 'InstallOptions' => 'Ιδιότητες',
+ 'InstallSelectDirectory' => 'Επιλέξτε τον βασικό κατάλογο που θα γίνει η εγκατάσταση',
+ 'InstallWithClean' => 'Διαγραφή των αρχείων που βρίσκονται στον κατάλογο της εγκατάστασης',
+ 'InstallWithMenu' => 'Προσθήκη του GCstar στο μενού Εφαρμογές',
+ 'InstallNoPermission' => 'Σφάλμα: Δεν έχετε δικαιώματα εγγραφής στον επιλεγμένο κατάλογο',
+ 'InstallMissingMandatory' => 'Λείπουν υποχρεωτικές εξαρτήσεις. Θα πρέπει να τις προσθέσετε ώστε να εγκαταστήσετε το GCstar στο σύστημά σας.',
+ 'InstallMissingOptional' => 'Λείπουν οι παρακάτω προαιρετικές εξαρτήσεις. Το GCstar θα συνεχίσει την εγκατάσταση αλλά ίσως κάποιες από τις λειτουργίες δεν θα είναι διαθέσιμες',
+ 'InstallMissingNone' => 'Δεν λείπει καμία από τις εξαρτήσεις. Μπορείτε να συνεχίσετε κανονικά την εγκατάσταση του GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Λείπει',
+ 'InstallMissingFor' => 'Λείπει για',
+ 'InstallCleanDirectory' => 'Αφαίρεση των αρχείων του GCstar από τον κατάλογο: ',
+ 'InstallCopyDirectory' => 'Αντιγραφή αρχείων στον κατάλογο: ',
+ 'InstallCopyDesktop' => 'Αντιγραφή του εικονιδίου εκκίνησης της εφαρμογής (.desktop) στο: ',
+
+#Update
+ 'UpdateUseProxy' => 'Χρήση proxy (πατήστε απλά enter αν δεν έχετε ορίσει κάποιον): ',
+ 'UpdateNoPermission' => 'Δεν έχετε δικαιώματα εγγραφής στον κατάλογο: ',
+ 'UpdateNone' => 'Δεν βρέθηκαν νέες ενημερώσεις',
+ 'UpdateFileNotFound' => 'Το αρχείο δεν βρέθηκε',
+
+#Splash
+ 'SplashInit' => 'Αρχικοποίηση',
+ 'SplashLoad' => 'Φόρτωση συλλογής',
+ 'SplashDisplay' => 'Εμφάνιση συλλογής',
+ 'SplashSort' => 'Ταξινόμηση συλλογής',
+ 'SplashDone' => 'Έτοιμο',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Φαίνεται ότι έχετε χρησιμοποιήσει στο παρελθόν GCfilms. Τι θέλετε να κάνετε εισαγωγή από το GCfilms στο GCstar (αυτό δεν θα έχει καμία επίδραση στο GCfilms εάν συνεχίζετε την χρήση του)?',
+ 'GCfilmsImportOptions' => 'Ρυθμίσεις',
+ 'GCfilmsImportData' => 'Λίστα ταινιών',
+
+#Menus
+ 'MenuFile' => '_Αρχείο',
+ 'MenuNewList' => '_Νέα συλλογή',
+ 'MenuStats' => 'Στατιστικά',
+ 'MenuHistory' => 'Αν_οιγμένα πρόσφατα',
+ 'MenuLend' => 'Ε_μφάνιση διανεισμένων στοιχείων', # Accepts model codes
+ 'MenuImport' => 'Ει_σαγωγή',
+ 'MenuExport' => 'Εξα_γωγή',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Επεξεργασία',
+ 'MenuDuplicate' => '_Δημιουργία διπλότυπου', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Αφαίρεση στοιχείου', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => 'Α_ντικατάσταση πεδίων',
+ 'MenuEditLockItems' => '_Κλείδωμα Συλλογής',
+
+ 'MenuDisplay' => 'Φίλτρα',
+ 'MenuSavedSearches' => 'Αποθηκευμένες αναζητήσεις',
+ 'MenuSavedSearchesEdit' => 'Επεξεργασία αποθηκευμένων αναζητήσεων',
+ 'MenuSavedSearchesSave' => 'Αποθήκευση τρέχουσας αναζήτησης',
+ 'MenuAdvancedSearch' => 'Ε_ξελιγμένη αναζήτηση',
+ 'MenuViewAllItems' => 'Εμφάνιση _Όλων ', # Accepts model codes
+ 'MenuNoFilter' => '_Όλα',
+
+ 'MenuConfiguration' => '_Ρυθμίσεις',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Εμφάνιση Πληροφοριών',
+ 'MenuBorrowers' => '_Δανειολήπτες',
+ 'MenuToolbarConfiguration' => '_Κουμπιά γραμμής εργαλειών',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '_Μετατροπή είδους',
+
+ 'MenuBookmarks' => 'Οι _Συλλογές μου',
+ 'MenuBookmarksAdd' => '_Προσθηκη της συλλογής',
+ 'MenuBookmarksEdit' => '_Επεξεργασία αποθηκευμένων συλλογών',
+
+ 'MenuHelp' => '_Βοήθεια',
+ 'MenuHelpContent' => '_Περιεχόμενα',
+ 'MenuAllPlugins' => 'Εμφάνιση _plugins',
+ 'MenuBugReport' => 'Αναφορά _bug',
+ 'MenuAbout' => '_Σχετικά με το GCstar',
+
+ 'MenuNewWindow' => 'Εμφάνιση στοιχείων σε _Νέο Παράθυρο', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Εμφάνιση στοιχείων σε _Νέο Παράθυρο', # Accepts model codes
+
+ 'ContextExpandAll' => 'Επέκταση όλων',
+ 'ContextCollapseAll' => 'Σύμπτυξη όλων',
+ 'ContextChooseImage' => 'Επιλέξτε _Εικόνα',
+ 'ContextImageEditor' => 'Άνοιγμα με το πρόγραμμα επεξεργασίας εικόνας',
+ 'ContextOpenWith' => 'Άνοιγμα _με',
+ 'ContextImgFront' => 'Εξώφυλλο',
+ 'ContextImgBack' => 'Πίσω φύλλο',
+ 'ContextChooseFile' => 'Επιλογή αρχείου',
+ 'ContextChooseFolder' => 'Επιλογή φακέλου',
+
+ 'DialogEnterNumber' => 'Παρακαλώ εισάγετε τιμή',
+
+ 'RemoveConfirm' => 'Θέλετε πραγματικά να διαγραφεί το στοιχείο;', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+
+ 'DefaultNewItem' => 'Νέο στοιχείο', # Accepts model codes
+ 'NewItemTooltip' => 'Προσθήκη νέου στοιχείου', # Accepts model codes
+ 'NoItemFound' => 'Δεν βρέθηκαν αποτελέσματα. Αναζήτηση σε άλλη ιστοσελίδα;',
+ 'OpenList' => 'Παρακαλώ επιλέξτε συλλογή',
+ 'SaveList' => 'Παρακαλώ επιλέξτε που να γίνει η αποθήκευση της συλλογής',
+ 'SaveListTooltip' => 'Αποθήκευση της συλλογής',
+ 'SaveUnsavedChanges' => 'Υπάρχουν νέες εγγραφές στην συλλογή σας. Θέλετε να τις αποθηκεύσετε;',
+ 'SaveDontSave' => 'Να μην αποθηκευθούν',
+ 'PreferencesTooltip' => 'Ρύθμιση προτιμήσεων',
+ 'ViewTooltip' => 'Τρόπος εμφάνισης της συλλογής',
+ 'PlayTooltip' => 'Σχετικό Video', # Accepts model codes
+ 'PlayFileNotFound' => 'Δεν βρέθηκε το αρχείο σε αυτήν την τοποθεσία:',
+ 'PlayRetry' => 'Επανάληψη',
+
+ 'StatusSave' => 'Αποθήκευση...',
+ 'StatusLoad' => 'Φόρτωση...',
+ 'StatusSearch' => 'Αναζήτηση σε εξέλιξη...',
+ 'StatusGetInfo' => 'Λήψη στοιχείων...',
+ 'StatusGetImage' => 'Λήψη εικόνας...',
+
+ 'SaveError' => 'Δεν μπορεί να γίνει η αποθήκευση της συλλογής. Παρακαλώ ελέγξτε τα δικαιώματα εγγραφής και τον ελεύθερο χώρο στον δίσκο.',
+ 'OpenError' => 'Αδύνατο το άνοιγμα της συλλογής. Παρακαλώ ελέγξτε τα διακιώματα πρόσβασης.',
+ 'OpenFormatError' => 'Αδυνατο το άνοιγμα της συλλογής. Ο τύπος του αρχείου δεν είναι κατάλληλος.',
+ 'OpenVersionWarning' => 'Η συλλογή έχει δημιουργηθεί με μια πιο πρόσφατη έκδοση του GCstar. Εάν επιλέξετε να την αποθηκεύσετε, υπάρχει η πιθανότητα απώλειας δεδομένων.',
+ 'OpenVersionQuestion' => 'Επιθυμείτε να συνεχίσετε;',
+ 'ImageError' => 'Ο επιλεγμένος κατάλογος για την αποθήκευση των εικόνων δεν ειναι σωστος. Παρακαλώ επιλέξτε εναν άλλον.',
+ 'OptionsCreationError'=> 'Αδύνατη η δημιουργία του αρχείου ιδιοτήτων: ',
+ 'OptionsOpenError'=> 'Αδύνατο το άνοιγμα του αρχείου ιδιοτήτων: ',
+ 'OptionsSaveError'=> 'Αδύνατη η αποθήκευση του αρχείου ιδιοτήτων: ',
+ 'ErrorModelNotFound' => 'Το μοντέλο δεν βρέθηκε: ',
+ 'ErrorModelUserDir' => 'Τα καθορισμένα από τον χρήστη μοντέλα βρίσκονται μέσα στο: ',
+
+ 'RandomTooltip' => 'Τι θα δω απόψε; ',
+ 'RandomError'=> 'Δεν υπάρχει επιλέξιμο στοιχείο', # Accepts model codes
+ 'RandomEnd'=> 'Δεν υπάρχουν άλλα στοιχεία', # Accepts model codes
+ 'RandomNextTip'=> 'Επόμενη πρόταση',
+ 'RandomOkTip'=> 'Αποδοχή αυτού του στοιχείου',
+
+ 'AboutTitle' => 'Σχετικά με το GCstar',
+ 'AboutDesc' => 'Διαχείριση προσωπικών συλλογών',
+ 'AboutVersion' => 'Έκδοση',
+ 'AboutTeam' => 'Ομάδα',
+ 'AboutWho' => 'Christian Jodar (Tian): Υπεύθυνος του project, Προγραμματιστής
+Nyall Dawson (Zombiepig): Προγραμματιστής
+TPF: Προγραμματιστής
+Adolfo González: Προγραμματιστής
+',
+ 'AboutLicense' => 'Διανέμεται με την άδεια χρήσης GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Γλενταδάκης Δημήτρης dglent@gmail.com',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logo and webdesign by le Spektre',
+
+ 'ToolbarRandom' => 'Απόψε',
+
+ 'UnsavedCollection' => 'Μη αποθηκευμένη συλλογή',
+ 'ModelsSelect' => 'Επιλέξτε τον τύπο της συλλογής',
+ 'ModelsPersonal' => 'Προσωπικοί τύποι',
+ 'ModelsDefault' => 'Προεπιλεγμένοι τύποι',
+ 'ModelsList' => 'Ορισμός συλλογής',
+ 'ModelSettings' => 'Ρυθμίσεις της συλλογής',
+ 'ModelNewType' => 'Νέος τύπος συλλογής',
+ 'ModelName' => 'Όνομα του τύπου συλλογής:',
+ 'ModelFields' => 'Πεδία',
+ 'ModelOptions' => 'Ιδιότητες',
+ 'ModelFilters' => 'Φίλτρα',
+ 'ModelNewField' => 'Νέο πεδίο',
+ 'ModelFieldInformation' => 'Πληροφορίες',
+ 'ModelFieldName' => 'Όνομα:',
+ 'ModelFieldType' => 'Τύπος:',
+ 'ModelFieldGroup' => 'Ομάδα:',
+ 'ModelFieldValues' => 'Τιμές',
+ 'ModelFieldInit' => 'Προεπιλογή :',
+ 'ModelFieldMin' => 'Ελάχιστο :',
+ 'ModelFieldMax' => 'Μέγιστο :',
+ 'ModelFieldList' => 'Λίστα τιμών :',
+ 'ModelFieldListLegend' => '<i>Διαχωρισμός με κόμμα</i>',
+ 'ModelFieldDisplayAs' => 'Εμφάνιση ως:',
+ 'ModelFieldDisplayAsText' => 'Βαθμός',
+ 'ModelFieldDisplayAsGraphical' => 'Αστέρια',
+ 'ModelFieldTypeShortText' => 'Σύντομο κείμενο',
+ 'ModelFieldTypeLongText' => 'Μακρύ κείμενο',
+ 'ModelFieldTypeYesNo' => 'Ναι/Όχι',
+ 'ModelFieldTypeNumber' => 'Αριθμός',
+ 'ModelFieldTypeDate' => 'Ημερομηνία',
+ 'ModelFieldTypeOptions' => 'Λίστα προεπιλεγμένων τιμών',
+ 'ModelFieldTypeImage' => 'Εικόνα',
+ 'ModelFieldTypeSingleList' => 'Απλή λίστα',
+ 'ModelFieldTypeFile' => 'Αρχείο',
+ 'ModelFieldTypeFormatted' => 'Εξαρτάται από άλλα πεδία',
+ 'ModelFieldParameters' => 'Παράμετροι',
+ 'ModelFieldHasHistory' => 'Κρατείστε ιστορικό',
+ 'ModelFieldFlat' => 'Εμφάμιση σε μία σειρά',
+ 'ModelFieldStep' => 'Τιμή αξησης:',
+ 'ModelFieldFileFormat' => 'Τύπος αρχείου:',
+ 'ModelFieldFileFile' => 'Απλό αρχείο',
+ 'ModelFieldFileImage' => 'Εικόνα',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Ήχος',
+ 'ModelFieldFileProgram' => 'Πρόγραμμα',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Χρήση των πεδίων',
+ 'ModelOptionsFieldsAuto' => 'Αυτόματα',
+ 'ModelOptionsFieldsNone' => 'Κανένα',
+ 'ModelOptionsFieldsTitle' => 'Ως τίτλος',
+ 'ModelOptionsFieldsId' => 'Ως αναγνωριστικό',
+ 'ModelOptionsFieldsCover' => 'Ως εξώφυλλο',
+ 'ModelOptionsFieldsPlay' => 'Για το κουμπί Αναπαραγωγή',
+ 'ModelCollectionSettings' => 'Ρυθμίσεις συλλογής',
+ 'ModelCollectionSettingsLending' => 'Στοιχεία που μπορούν να δανειστούν',
+ 'ModelCollectionSettingsTagging' => 'Χρήση ως λέξεις κλειδιά',
+ 'ModelFilterActivated' => 'Εμφάνιση στο παράθυρο αναζήτησης',
+ 'ModelFilterComparison' => 'Σύγκριση',
+ 'ModelFilterContain' => 'Περιέχει',
+ 'ModelFilterDoesNotContain' => 'Να μην περιέχει',
+ 'ModelFilterRegexp' => 'Απλή έκφραση',
+ 'ModelFilterRange' => 'Εύρος',
+ 'ModelFilterNumeric' => 'Αριθμητική σύγκριση',
+ 'ModelFilterQuick' => 'Δημιουργία γρήγορου φίλτρου',
+ 'ModelTooltipName' => 'Χρησιμοποίηση ενός ονόματος το οποίο θα είναι και μοντέλο χρήσης και για άλλες συλλογές. Εάν το αφήσετε κενό, οι ρυθμίσεις θα αποθηκεύονται στην ίδια τη συλλογή',
+ 'ModelTooltipLabel' => 'Το όνομα του πεδίου όπως θα εμφανίζεται',
+ 'ModelTooltipGroup' => 'Χρησιμεύει στην ομαδοποίηση των πεδίων. Τα πεδία χωρίς ομάδα θα ταξινομούνται στην ομάδα από προεπιλογή',
+ 'ModelTooltipHistory' => 'Αν Θα αποθηκεύονται οι προηγούμενες τιμές σε μια λίστα σχετική με το πεδίο',
+ 'ModelTooltipFormat' => 'Αυτή η μορφή χρησιμεύει ώστε να οριστεί η ενέργεια πατώντας το κουμπί Αναπαραγωγή',
+ 'ModelTooltipLending' => 'Αυτό θα προσθέσει μερικά πεδία για την διαχείριση των δανεισμών',
+ 'ModelTooltipTagging' => 'Αυτό θα προσθέσει μερικά πεδία για να διαχειρίζεστε τις λέξεις κλειδιά',
+ 'ModelTooltipNumeric' => 'Θα πρέπει οι τιμές να θεωρούνται ως αριθμητικές για τις συγκρίσεις',
+ 'ModelTooltipQuick' => 'Αυτό θα προσθέσει ένα υπο-μενού στο μενού Φίλτρα',
+
+ 'ResultsTitle' => 'Επιλέξτε ένα στοιχείο', # Accepts model codes
+ 'ResultsNextTip' => 'Αναζήτηση στο επόμενο site',
+ 'ResultsPreview' => 'Προεσκόπηση',
+ 'ResultsInfo' => 'Μπορείτε να προσθέσετε περισσότερα στοιχεία στην συλλογή, επιλέγοντας τα στοιχεία κρατώντας πατημένο το πλήκτρο Ctrl ή Shift', # Accepts model codes
+
+ 'OptionsTitle' => 'Προτιμήσεις',
+ 'OptionsExpertMode' => 'Λειτουργία για προχωρημένους',
+ 'OptionsPrograms' => 'Καθορίστε τις εφαρμογές για το άνοιγμα των αρχείων, αφήστε κενό για χρήση των προεπιλογών του συστήματος',
+ 'OptionsBrowser' => 'Περιηγητής Ιστιοχώρου',
+ 'OptionsPlayer' => 'Αναπαραγωγή Video',
+ 'OptionsAudio' => 'Αναπαραγωγή ήχου',
+ 'OptionsImageEditor' => 'Πρόγραμμα επεξεργασίας εικόνας',
+ 'OptionsCdDevice' => 'Συσκευή CD',
+ 'OptionsImages' => 'Κατάλογος εικόνων',
+ 'OptionsUseRelativePaths' => 'Χρήση των σχετικών διαδρομών για τις εικόνες',
+ 'OptionsLayout' => 'Τρόπος εμφάνισης (κεντρικό παράθυρο)',
+ 'OptionsStatus' => 'Εμφάνιση status bar',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Προσοχή: Οι αλλαγές θα πραγματοποιηθούν μετά την επανεκκίνηση της εφαρμογής.',
+ 'OptionsRemoveConfirm' => 'Επιβεβαίωση πριν από τη διαγραφή',
+ 'OptionsAutoSave' => 'Αυτόματη αποθήκευση της συλλογής',
+ 'OptionsAutoLoad' => 'Φόρτωση της προηγούμενης συλλογής κατά την εκκίνηση',
+ 'OptionsSplash' => 'Εμφάνιση splash screen',
+ 'OptionsTearoffMenus' => 'Ενεργοποίηση δυνατότητας αποκόλλησης των μενού από την γραμμή εργαλειών',
+ 'OptionsSpellCheck' => 'Χρήση του ορθογραφικού ελέγχου στα μεγάλα πεδία κειμένου',
+ 'OptionsProgramTitle' => 'Επιλέξτε το πρόγραμμα που θα χρησιμοποιείται',
+ 'OptionsPlugins' => 'Ιστιοχώρος για αναζήτηση δεδωμένων',
+ 'OptionsAskPlugins' => 'Αναζήτηση (Όλα τα sites)',
+ 'OptionsPluginsMulti' => 'Πολλαπλά sites',
+ 'OptionsPluginsMultiAsk' => 'Αναζήτηση (Μερικά sites)',
+ 'OptionsPluginsMultiPerField' => 'Πολλές ιστοσελίδες (ανά πεδίο)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Πολλες ιστοσελίδες ανά σειρά επιλογής',
+ 'OptionsPluginsMultiPerFieldDesc' => 'Για κάθε πεδίο θα συμπληρώνουμε το πεδίο με την πρώτη μη κενή πληροφορία αρχίζοντας απο τ ααριστερά',
+ 'OptionsPluginsMultiPerFieldFirst' => 'Πρώτο',
+ 'OptionsPluginsMultiPerFieldLast' => 'Τελευταίο',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Αφαίρεση',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Λίστα κενών επιλεγμένων πεδίων',
+ 'OptionsPluginsList' => 'Ορισμός λίστας',
+ 'OptionsAskImport' => 'Επιλεξτε τα πεδια για εισαγωγή',
+ 'OptionsProxy' => 'Χρήση proxy',
+ 'OptionsCookieJar' => 'Χρήση αυτου του αρχείου cookie',
+ 'OptionsLang' => 'Γλώσσα',
+ 'OptionsMain' => 'Κυρίως',
+ 'OptionsPaths' => 'Διαδρομές',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Επιπρόσθετα',
+ 'OptionsDisplay' => 'Εμφάνιση',
+ 'OptionsToolbar' => 'Γραμμή εργαλειών',
+ 'OptionsToolbars' => {0 => 'Καμία', 1 => 'Μικρή', 2 => 'Μεγάλη', 3 => 'Εργαλεία συστήματος'},
+ 'OptionsToolbarPosition' => 'Θέση',
+ 'OptionsToolbarPositions' => {0 => 'Επάνω', 1 => 'Κάτω', 2 => 'Αριστερά', 3 => 'Δεξιά'},
+ 'OptionsExpandersMode' => 'Υπερβολικά μακρύ επεκτεινόμενο κείμενο',
+ 'OptionsExpandersModes' => {'asis' => 'Do nothing', 'cut' => 'Cut', 'wrap' => 'Line wrap'},
+ 'OptionsDateFormat' => 'Μορφή Ημερομηνίας',
+ 'OptionsDateFormatTooltip' => 'Η μορφή είναι αυτή που χρησιμοποιείται από strftime(3). Η προεπιλογή είναι %d/%m/%Y',
+ 'OptionsView' => 'Εμφάνιση λίστας (αριστερή στήλη)',
+ 'OptionsViews' => {0 => 'Κείμενο', 1 => 'Εικόνα', 2 => 'Λεπτομερώς'},
+ 'OptionsColumns' => 'Κολώνες',
+ 'OptionsMailer' => 'Τρόπος αποστολής e-mail',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'E-mail αποστολέα',
+ 'OptionsTransform' => 'Βάλτε τα άρθρα στο τέλος των τίτλων',
+ 'OptionsArticles' => 'Άρθρα (Χωριστά με κόμμα)',
+ 'OptionsSearchStop' => 'Επιτρέπεται η διακοπή της αναζήτησης',
+ 'OptionsBigPics' => 'Χρήση μεγάλων εικόνων όταν είναι διαθέσιμες',
+ 'OptionsAlwaysOriginal' => 'Χρήση του κυρίως τίτλου αν το πεδίο είναι κενό',
+ 'OptionsRestoreAccelerators' => 'Επαναφορά των συντομεύσεων',
+ 'OptionsHistory' => 'Μέγεθος ιστορικού',
+ 'OptionsClearHistory' => 'Καθάρισμα ιστορικού',
+ 'OptionsStyle' => 'Θέμα εμφάνισης',
+ 'OptionsDontAsk' => 'Να μην ξαναγίνει η ερώτηση',
+ 'OptionsPathProgramsGroup' => 'Εφαρμογές',
+ 'OptionsProgramsSystem' => 'Χρήση των προεπιλεγμένων εφαρμογών συστήματος',
+ 'OptionsProgramsUser' => 'Χρηση συγκεκριμένων εφαρμογών',
+ 'OptionsProgramsSet' => 'Ορισμός των εφαρμογών',
+ 'OptionsPathImagesGroup' => 'Εικόνες',
+ 'OptionsInternetDataGroup' => 'Εισαγωγή δεδομένων',
+ 'OptionsInternetSettingsGroup' => 'Ρυθμίσεις',
+ 'OptionsDisplayInformationGroup' => 'Εμφάνιση πληροφοριών',
+ 'OptionsDisplayArticlesGroup' => 'Άρθρα',
+ 'OptionsImagesDisplayGroup' => 'Εμφάνιση',
+ 'OptionsImagesStyleGroup' => 'Μορφή',
+ 'OptionsDetailedPreferencesGroup' => 'Προτιμήσεις',
+ 'OptionsFeaturesConveniencesGroup' => 'Ευκολίες',
+ 'OptionsPicturesFormat' => 'Prefix για τις εικόνες:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Τίτλος ή όνομα συσχετισμένου στοιχείου',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% ή . θα αντικατασταθεί από τον κατάλογο της συλλογής (μόνο στην αρχή της διαδρομής)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% θα αντικατασταθεί από το όνομα της συλλογής χωρίς suffix (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% μπορεί να χρησιμοποιηθεί μόνο στην αρχή της διαδρομής των εικόνων',
+ 'OptionsConfigureMailers' => 'Ρυθμίσεις προγραμμάτων ηλ.ταχυδρομείου',
+
+ 'ImagesOptionsButton' => 'Ρυθμίσεις',
+ 'ImagesOptionsTitle' => 'Ρυθμίσεις για την λίστα εικόνων',
+ 'ImagesOptionsSelectColor' => 'Επιλέξτε χρώμα',
+ 'ImagesOptionsUseOverlays' => 'Χρήση εφφέ στις εικόνες',
+ 'ImagesOptionsBg' => 'Παρασκήνιο',
+ 'ImagesOptionsBgPicture' => 'Χρήση εικόνας παρασκηνίου',
+ 'ImagesOptionsFg'=> 'Επιλογή',
+ 'ImagesOptionsBgTooltip' => 'Αλλαγή χρώματος παρασκηνίου',
+ 'ImagesOptionsFgTooltip'=> 'Αλλαγή χρώματος επιλογής',
+ 'ImagesOptionsResizeImgList' => 'Αυτόματη ρύθμιση του αριθμού των στηλών',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Μέγεθος',
+ 'ImagesOptionsSizeList' => {0 => 'Πολύ μικρό', 1 => 'Μικρό', 2 => 'Μεσαίο', 3 => 'Μεγάλο', 4 => 'Πολύ μεγάλο'},
+ 'ImagesOptionsSizeTooltip' => 'Επιλέξτε το μέγεθος της εικόνας',
+
+ 'DetailedOptionsTitle' => 'Ρυθμίσεις της λίστας',
+ 'DetailedOptionsImageSize' => 'Μέγεθος εικόνας',
+ 'DetailedOptionsGroupItems' => 'Ομαδοποίηση στοιχείων ανά',
+ 'DetailedOptionsSecondarySort' => 'Ταξινόμηση πεδίων(στοιχείων της ανωτέρω ομάδας)',
+ 'DetailedOptionsFields' => 'Επιλογή πεδίων για εμφάνιση',
+ 'DetailedOptionsGroupedFirst' => 'Ομαδοποίηση αταξινόμητων στοιχείων',
+ 'DetailedOptionsAddCount' => 'Προσθήκη του αριθμού των στοιχείων στην κατηγορία',
+
+ 'ExtractButton' => 'Πληροφορίες',
+ 'ExtractTitle' => 'Πληροφορίες του αρχείου video',
+ 'ExtractImport' => 'ΟΚ',
+
+ 'FieldsListOpen' => 'Φόρτωση λίστας πεδίων από αρχείο',
+ 'FieldsListSave' => 'Αποθήκευση της λίστας πεδίων σε αρχείο',
+ 'FieldsListError' => 'Αυτή η λίστα πεδίων δεν μπορεί να χρησιμοποιηθεί με αυτόν τον τύπο συλλογής',
+ 'FieldsListIgnore' => '--- Να αγνοηθεί',
+
+ 'ExportTitle' => 'Εξαγωγή συλλογής',
+ 'ExportFilter' => 'Εξαγωγή μόνο των εμφανιζομένων στοιχείων',
+ 'ExportFieldsTitle' => 'Εξαγωγή πεδίων',
+ 'ExportFieldsTip' => 'Επιλέξτε τα πεδία για εξαγωγή',
+ 'ExportWithPictures' => 'Αντιγραφή των εικόνων σε ύπο-κατάλογο',
+ 'ExportSortBy' => 'Ταξινόμηση ανά',
+ 'ExportOrder' => 'Σειρά',
+
+ 'ImportListTitle' => 'Εισαγωγή άλλης συλλογής',
+ 'ImportExportData' => 'Δεδομένα',
+ 'ImportExportFile' => 'Αρχείο',
+ 'ImportExportFieldsUnused' => 'Αχρησιμοποίητα πεδία',
+ 'ImportExportFieldsUsed' => 'Χρησιμοποιημένα πεδία',
+ 'ImportExportFieldsFill' => 'Όλα τα πεδία',
+ 'ImportExportFieldsClear' => 'Κανένα πεδίο',
+ 'ImportExportFieldsEmpty' => 'Πρέπει να επιλέξτε τουλάχιστον ένα πεδίο',
+ 'ImportExportFileEmpty' => 'Πρέπει να ορίσετε ένα όνομα αρχείου',
+ 'ImportFieldsTitle' => 'Εισαγωγή πεδίων',
+ 'ImportFieldsTip' => 'Επιλέξτε τα πεδία για εισαγωγή',
+ 'ImportNewList' => 'Δημιουργία νέας συλλογής',
+ 'ImportCurrentList' => 'Προσθήκη σε αυτή τη συλλογή',
+ 'ImportDropError' => 'Σφάλμα κατά το άνοιγμα τουλάχιστον ενός αρχείου. Θα γίνει επαναφόρτωση της προηγούμενης λίστας.',
+ 'ImportGenerateId' => 'Δημιουργία αναγνωριστικού για κάθε στοιχείο',
+
+ 'FileChooserOpenFile' => 'Επιλέξτε αρχείο προς χρήση',
+ 'FileChooserDirectory' => 'Κατάλογος',
+ 'FileChooserOpenDirectory' => 'Επιλέξτε έναν κατάλογο',
+ 'FileChooserOverwrite' => 'Το αρχείο υπάρχει ήδη. Θέλετε να το αντικαταστήσετε;',
+ 'FileAllFiles' => 'Όλα τα αρχεία',
+ 'FileVideoFiles' => 'Αρχεία βίντεο',
+ 'FileEbookFiles' => 'Αρχεία e-book',
+ 'FileAudioFiles' => 'Αρχεία ήχου',
+ 'FileGCstarFiles' => 'Συλλογές GCstar',
+
+ #Some default panels
+ 'PanelCompact' => 'Συγκεντρωτικά',
+ 'PanelReadOnly' => 'Μόνο ανάγνωση',
+ 'PanelForm' => 'Καρτέλες',
+
+ 'PanelSearchButton' => 'Λήψη στοιχείων',
+ 'PanelSearchTip' => 'Αναζήτηση στο Internet πληροφορίες γι\' αυτό το όνομα',
+ 'PanelSearchContextChooseOne' => 'Επιλογή ιστοσελίδας ...',
+ 'PanelSearchContextMultiSite' => 'Χρήση «πολλών ιστοσελίδων»',
+ 'PanelSearchContextMultiSitePerField' => 'Χρήση «πολλών ιστοσελίδων ανά πεδίο»',
+ 'PanelSearchContextOptions' => 'Αλλαγή επιλογών ...',
+ 'PanelImageTipOpen' => 'Πατήστε στην εικόνα για να επιλέξτε άλλη.',
+ 'PanelImageTipView' => 'Πατήστε στην εικόνα για να τη δείτε σε πραγματικό μέγεθος.',
+ 'PanelImageTipMenu' => ' Δεξί κλικ για περισσότερες επιλογές.',
+ 'PanelImageTitle' => 'Επιλέξτε μια εικόνα',
+ 'PanelImageNoImage' => 'Καμία εικόνα',
+ 'PanelSelectFileTitle' => 'Επιλέξτε ένα αρχείο',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Επαναφορά προεπιλογής',
+ 'PanelRefresh' => 'Ενημέρωση',
+ 'PanelRefreshTip' => 'Ενημέρωση πληροφοριών από το διαδίκτυο',
+
+ 'PanelFrom' =>'Από',
+ 'PanelTo' =>'Εως',
+
+ 'PanelWeb' => 'Εμφάνιση πληροφοριών από το Internet',
+ 'PanelWebTip' => 'Εμφάνιση πληροφοριών αυτού του στοιχείου στο Internet', # Accepts model codes
+ 'PanelRemoveTip' => 'Διαγραφή ανωτέρω στοιχείου', # Accepts model codes
+
+ 'PanelDateSelect' => 'Αλλαγή',
+ 'PanelNobody' => 'Κανένας',
+ 'PanelUnknown' => 'Άγνωστος',
+ 'PanelAdded' => 'Ημερομηνία προσθήκης',
+ 'PanelRating' => 'Βαθμολογία',
+ 'PanelPressRating' => 'Βαθμολόγηση ανά κλικ',
+ 'PanelLocation' => 'Τοποθεσία',
+
+ 'PanelLending' => 'Δανεισμοί',
+ 'PanelBorrower' => 'Δανειολήπτες',
+ 'PanelLendDate' => 'Ημερομηνία δανεισμού',
+ 'PanelHistory' => 'Ιστορικό δανεισμών',
+ 'PanelReturned' => 'Εχει επιστραφεί', # Accepts model codes
+ 'PanelReturnDate' => 'Ημερομηνία επιστροφής',
+ 'PanelLendedYes' => 'Δανεισμένο',
+ 'PanelLendedNo' => 'Διαθέσιμο',
+
+ 'PanelTags' => 'Λέξεις κλειδιά',
+ 'PanelFavourite' => 'Σελιδοδείκτης',
+ 'TagsAssigned' => 'Σχετικές λέξεις κλειδιά',
+
+ 'PanelUser' => 'Πεδία χρήστη',
+
+ 'CheckUndef' => 'Αδιάφορο',
+ 'CheckYes' => 'Ναι',
+ 'CheckNo' => 'Όχι',
+
+ 'ToolbarAll' => 'Εμφάνιση όλων',
+ 'ToolbarAllTooltip' => 'Εμφάνιση όλης της συλλογής',
+ 'ToolbarGroupBy' => 'Ομαδοποίηση ανά',
+ 'ToolbarGroupByTooltip' => 'Επιλέξτε με ποιο πεδίο θα γίνει η ομαδοποίηση των στοιχείων στη λίστα',
+ 'ToolbarQuickSearch' => 'Γρήγορη αναζήτηση',
+ 'ToolbarQuickSearchLabel' => 'Αναζήτηση',
+ 'ToolbarQuickSearchTooltip' => 'Επιλέξτε σε ποιο πεδίο θα γίνει η αναζήτηση. Εισάγετε τα κριτήρια αναζήτησης και πατήστε Enter',
+ 'ToolbarSeparator' => ' Διαχωριστής',
+
+ 'PluginsTitle' => 'Αναζήτηση στοιχείου',
+ 'PluginsQuery' => 'Αναζήτηση',
+ 'PluginsFrame' => 'Αναζήτηση σε ιστοσελίδα',
+ 'PluginsLogo' => 'Λογότυπο',
+ 'PluginsName' => 'Όνομα',
+ 'PluginsSearchFields' => 'Πεδία αναζήτησης',
+ 'PluginsAuthor' => 'Γράφτηκε από',
+ 'PluginsLang' => 'Γλώσσα',
+ 'PluginsUseSite' => 'Χρήση της επιλεγμένης ιστοσελίδας για τις αναζητήσεις',
+ 'PluginsPreferredTooltip' => 'Η ιστοσελίδα συνιστάται από το GCstar',
+ 'PluginDisabled' => 'Απενεργοποιημένο',
+
+ 'BorrowersTitle' => 'Διαχείριση των δανειοληπτών',
+ 'BorrowersList' => 'Δανειολήπτες',
+ 'BorrowersName' => 'Όνομα',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Προσθήκη',
+ 'BorrowersRemove' => 'Διαγραφή',
+ 'BorrowersEdit' => 'Επεξεργασία',
+ 'BorrowersTemplate' => 'Μοντέλο e-mail',
+ 'BorrowersSubject' => 'Θέμα μηνύματος',
+ 'BorrowersNotice1' => '%1 θα αντικατασταθεί από το όνομα του δανειολήπτη',
+ 'BorrowersNotice2' => '%2 Θα αντικατασταθεί από το όνομα του τίτλου',
+ 'BorrowersNotice3' => '%3 θα αντικατασταθεί από την ημερομηνία δανεισμού',
+
+ 'BorrowersImportTitle' => 'Εισάγετε τις πληροφορίες των δανειοληπτών',
+ 'BorrowersImportType' => 'Τύπος αρχείου :',
+ 'BorrowersImportFile' => 'Αρχείο:',
+
+ 'BorrowedTitle' => 'Δανεισμένα στοιχεία', # Accepts model codes
+ 'BorrowedDate' => 'Από',
+ 'BorrowedDisplayInPanel' => 'Εμφάνιση του στοιχείου στο κυρίως παράθυρο', # Accepts model codes
+
+ 'MailTitle' => 'Στείλτε e-mail',
+ 'MailFrom' => 'Αποστολέας : ',
+ 'MailTo' => 'Παραλήπτης : ',
+ 'MailSubject' => 'Θέμα : ',
+ 'MailSmtpError' => 'Πρόβλημα σύνδεσης με τον SMTP server',
+ 'MailSendmailError' => 'Πρόβλημα κατά την εκκίνηση του sendmail',
+
+ 'SearchTooltip' => 'Αναζήτηση σε όλα τα στοιχεία', # Accepts model codes
+ 'SearchTitle' => 'Αναζήτηση', # Accepts model codes
+ 'SearchNoField' => 'Δεν έχετε επιλέξει κάποιο πεδίο για το κουτί αναζήτησης.
+Προσθέστε μερικά στην καρτέλα με τα φίλτρα στις ρυθμίσεις της συλλογής.',
+
+ 'QueryReplaceField' => 'Πεδία προς επεξεργασία',
+ 'QueryReplaceOld' => 'Τρέχουσα τιμή',
+ 'QueryReplaceNew' => 'Νέα τιμή',
+ 'QueryReplaceLaunch' => 'Αντικατάσταση',
+
+ 'ImportWindowTitle' => 'Επιλέξτε τα πεδία για εισαγωγή',
+ 'ImportViewPicture' => 'Εμφάνιση εικόνας',
+ 'ImportSelectAll' => 'Επιλογή όλων',
+ 'ImportSelectNone' => 'Καμία επιλογή',
+
+ 'MultiSiteTitle' => 'Αναζήτηση στις ιστοσελίδες',
+ 'MultiSiteUnused' => 'Αχρησιμοποίητα plugins',
+ 'MultiSiteUsed' => 'Plugins προς χρήση',
+ 'MultiSiteLang' => 'Fill list with English plugins',
+ 'MultiSiteEmptyError' => 'Η λίστα με τις ιστοσελίδες είναι άδεια',
+ 'MultiSiteClear' => 'Καθαρισμός λίστας',
+
+ 'DisplayOptionsTitle' => 'Εμφάνιση των στοιχείων',
+ 'DisplayOptionsAll' => 'Επιλογή όλων',
+ 'DisplayOptionsSearch' => 'Κουμπί αναζήτησης',
+
+ 'GenresTitle' => 'Μετατροπή κατηγορίας',
+ 'GenresCategoryName' => 'Χρηση της κατηγορίας',
+ 'GenresCategoryMembers' => 'Κατηγορίες προς αντικατάσταση',
+ 'GenresLoad' => 'Φόρτωση λίστας',
+ 'GenresExport' => 'Αποθήκευση της λίστας σε αρχείο',
+ 'GenresModify' => 'Επεξεργασία μετατροπής',
+
+ 'PropertiesName' => 'Όνομα συλλογής',
+ 'PropertiesLang' => 'Κωδικός γλώσσας',
+ 'PropertiesOwner' => 'Ιδιοκτήτης',
+ 'PropertiesEmail' => 'E-mail',
+ 'PropertiesDescription' => 'Περιγραφή',
+ 'PropertiesFile' => 'Πληροφορίες αρχείου',
+ 'PropertiesFilePath' => 'Πλήρη διαδρομή',
+ 'PropertiesItemsNumber' => 'Αριθμός στοιχείων', # Accepts model codes
+ 'PropertiesFileSize' => 'Μέγεθος',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Ιδιότητες συλλογής',
+ 'PropertiesDefaultPicture' => 'Προεπιλεγμένη εικόνα',
+
+ 'MailProgramsTitle' => 'Προγράμματα αποστολής e-mail',
+ 'MailProgramsName' => 'Όνομα',
+ 'MailProgramsCommand' => 'Γραμμή εντολών',
+ 'MailProgramsRestore' => 'Προεπιλεγμένα προγράμματα',
+ 'MailProgramsAdd' => 'Προσθήκη προγράμματος',
+ 'MailProgramsInstructions' => 'Στη γραμμή εντολών, γίνονται κάποιες αντικαταστάσεις:
+ %f αντικαθίσταται από την διεύθυνση e-mail του χρήστη.
+ %t αντικαθίσταται από τον παραλήπτη.
+ %s αντικαθίσταται από το θέμα του μηνύματος
+ %b αντικαθίσταται από το κυρίως μήνυμα',
+
+ 'BookmarksBookmarks' => 'Σελιδοδείκτες',
+ 'BookmarksFolder' => 'Φάκελοι',
+ 'BookmarksLabel' => 'Όνομα',
+ 'BookmarksPath' => 'Διαδρομή',
+ 'BookmarksNewFolder' => 'Νέος κατάλογος',
+
+ 'AdvancedSearchType' => 'Τύπος αναζήτησης',
+ 'AdvancedSearchTypeAnd' => 'Στοιχεία που ταιριάζουν με όλα τα κριτήρια', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Στοιχεία που ταιριάζουν τουλάχιστον με ένα κριτήριο', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Κριτήρια',
+ 'AdvancedSearchAnyField' => 'Όλα τα πεδία',
+ 'AdvancedSearchSaveTitle' => 'Αποθήκευση αναζήτησης',
+ 'AdvancedSearchSaveName' => 'Όνομα',
+ 'AdvancedSearchSaveOverwrite' => 'Υπάρχει ήδη αποθηκευμένη αναζήτηση με αυτό το όνομα. Παρακαλώ επιλέξτε ένα άλλο.',
+ 'AdvancedSearchUseCase' => 'Ακριβές όνομα',
+ 'AdvancedSearchIgnoreDiacritics' => 'Να μην λαμβάνονται υπ\'οψη οι τονισμοί και άλλα διακριτικά',
+
+ 'BugReportSubject' => 'Δημιουργία αναφοράς bug από το GCstar',
+ 'BugReportVersion' => 'Έκδοση',
+ 'BugReportPlatform' => 'Λειτουργικό σύστημα',
+ 'BugReportMessage' => 'Μήνυμα σφάλματος',
+ 'BugReportInformation' => 'Πρόσθετες πληροφορίες',
+
+#Statistics
+ 'Stats3DPie' => 'Πίτα 3Δ',
+ 'StatsAccumulate' => 'Σύνοψη τιμών',
+ 'StatsArea' => 'Περιοχές',
+ 'StatsBars' => 'Μπάρες',
+ 'StatsDisplayNumber' => 'Εμφάνιση αριθμών',
+ 'StatsFieldToUse' => 'Πεδίο προς χρήση',
+ 'StatsFontSize' => 'Μέγεθος γραμματοσειράς',
+ 'StatsGenerate' => 'Δημιουργία',
+ 'StatsHeight' => 'Ύψος',
+ 'StatsHistory' => 'Ιστορικό',
+ 'StatsKindOfGraph' => 'Τύπος γραφήματος',
+ 'StatsPie' => 'Πίτα',
+ 'StatsSave' => 'Αποθήκευση εικόνας στατιστικων σε αρχείο',
+ 'StatsShowAllDates' => 'Εμφάνιση όλων των ημερομηνιών',
+ 'StatsSortByNumber' => 'Ταξινόμηση ανά αριθμό {lowercaseX}',
+ 'StatsWidth' => 'Πλάτος',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/EN/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/EN/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..0653a56
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::EN::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Include fields names on the top',
+ 'Separator' => 'Separator',
+ 'Replacement' => 'Replace the separator with',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/EN/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..3334ca4
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::EN::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/EN/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..a26ecba
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::EN::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Invalid template file',
+ 'UseFile' => 'Use file specified below',
+ 'WithJS' => 'Use Javascript',
+ 'FileTemplate' => 'Template',
+ 'Preview' => 'Preview',
+ 'NoPreview' => 'No preview available',
+ 'TemplateExternalFile' => 'Template file',
+ 'Title' => 'Page title',
+ 'InfoFile' => 'Movies list is in file: ',
+ 'InfoDir' => 'Images are in: ',
+ 'HeightImg' => 'Height (in pixels) of the image to be exported',
+ 'OpenFileInBrowser' => 'Open generated file in web browser',
+ 'Note' => 'List generated by <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Enter search text',
+ 'SearchType1' => 'Title only',
+ 'SearchType2' => 'Full information',
+ 'SearchButton' => 'Search',
+ 'SearchTitle' => 'Display only movies matching previous criteria',
+ 'AllButton' => 'All',
+ 'AllTitle' => 'Display all movies',
+ 'Expand' => 'Expand all',
+ 'ExpandTitle' => 'Display all movies information',
+ 'Collapse' => 'Collapse all',
+ 'CollapseTitle' => 'Collapse all movies information',
+ 'Borrowed' => 'Borrowed by: ',
+ 'NotBorrowed' => 'Available',
+ 'Top' => 'Top',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/EN/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..fdfa311
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::EN::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/EN/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..8356cd4
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::EN::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Include DROP instruction',
+ 'WithCreate' => 'Include CREATE instruction',
+ 'TableName' => 'Table Name',
+ 'InfoFile' => 'SQL file: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/EN/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..2345b0e
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::EN::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Archive is in file: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/EN/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..b68ac14
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::EN::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Template file',
+ 'ModelText' => 'Template text',
+ 'Models' => 'Template to use',
+ 'UseFile' => 'Use file',
+ 'UseModel' => 'Use text area',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/EN/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..ecdcc0d
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::EN::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Where should it search',
+ 'Default' => 'Default Alexandria\'s directory',
+ 'Specified' => 'Directory specified below',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/EN/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..9c1c731
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::EN::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Ignore first line',
+ 'Separator' => 'Separator',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/EN/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..887a205
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCImport/GCImportFolder.pm
@@ -0,0 +1,71 @@
+{
+ package GCLang::EN::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied before removing anything).\nLeave empty if not needed.\nKnown fields : $T:Title, $A:Article, $Y:Year, $S:Season, $E:Episode, $N:Serie Name'
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/EN/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..35c1fd3
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::EN::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copy pictures',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCImport/GCImportList.pm b/lib/gcstar/GCLang/EN/GCImport/GCImportList.pm
new file mode 100644
index 0000000..bb5346b
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::EN::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Names list',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'CommentAuto' => 'Item automatically imported.',
+ 'CommentSite' => 'Website: ',
+ 'CommentTitle' => 'Title: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/EN/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..4e09fa6
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::EN::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/EN/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..cb55181
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::EN::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'File is not a supported Tellico collection',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/EN/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..d4c9162
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCTVepisodes.pm
@@ -0,0 +1,51 @@
+{
+ package GCLang::EN::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => { 0 => 'Episodes',
+ 1 => 'Episode',
+ X => 'Episodes',
+ lowercase1 => 'episode',
+ lowercaseX => 'episodes'
+ },
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/EN/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..aeddfbe
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCTVseries.pm
@@ -0,0 +1,55 @@
+{
+ package GCLang::EN::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => { 0 => 'Series',
+ 1 => 'Series',
+ X => 'Series',
+ lowercase1 => 'series',
+ lowercaseX => 'series'
+ },
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/EN/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..b5727e6
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCboardgames.pm
@@ -0,0 +1,89 @@
+{
+ package GCLang::EN::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Games',
+ 1 => 'Game',
+ X => 'Games',
+ lowercase1 => 'game',
+ lowercaseX => 'games'
+ },
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCbooks.pm b/lib/gcstar/GCLang/EN/GCModels/GCbooks.pm
new file mode 100644
index 0000000..964e573
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCbooks.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::EN::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Books collection',
+ Items => {0 => 'Books',
+ 1 => 'Book',
+ X => 'Books',
+ lowercase1 => 'book',
+ lowercaseX => 'books'
+ },
+ NewItem => 'New book',
+
+ Isbn => 'ISBN',
+ Title => 'Title',
+ Cover => 'Cover',
+ Authors => 'Authors',
+ Publisher => 'Publisher',
+ Publication => 'Publication date',
+ Language => 'Language',
+ Genre => 'Genre',
+ Serie => 'Series',
+ Rank => 'Rank',
+ Bookdescription => 'Description',
+ Pages => 'Pages',
+ Read => 'Read',
+ Acquisition => 'Acquisition date',
+ Edition => 'Edition',
+ Format => 'Format',
+ Comments => 'Comments',
+ Url => 'Web page',
+ Translator => 'Translator',
+ Artist => 'Artist',
+ DigitalFile => 'Digital version',
+
+ General => 'General',
+ Details => 'Details',
+
+ ReadNo => 'Not read',
+ ReadYes => 'Read',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCcoins.pm b/lib/gcstar/GCLang/EN/GCModels/GCcoins.pm
new file mode 100644
index 0000000..f895ac2
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCcoins.pm
@@ -0,0 +1,107 @@
+{
+ package GCLang::EN::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Numismatic collection',
+ Items => {0 => 'Coins',
+ 1 => 'Coin',
+ X => 'Coins',
+ lowercase1 => 'coin',
+ lowercaseX => 'coins'
+ },
+ NewItem => 'New coin',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Currency => 'Currency',
+ Value => 'Value',
+ Picture => 'Main picture',
+ Diameter => 'Diameter',
+ Metal => 'Metal',
+ Edge => 'Edge',
+ Edge1 => 'Edge 1',
+ Edge2 => 'Edge 2',
+ Edge3 => 'Edge 3',
+ Edge4 => 'Edge 4',
+ Head => 'Head',
+ Tail => 'Tail',
+ Comments => 'Comments',
+ History => 'History',
+ Website => 'Website',
+ Estimate => 'Estimate',
+ References => 'References',
+ Type => 'Type',
+ Coin => 'Coin',
+ Banknote => 'Bank note',
+
+ Main => 'Main',
+ Description => 'Description',
+ Other => 'Other information',
+ Pictures => 'Pictures',
+
+ Condition => 'Condition (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCcomics.pm b/lib/gcstar/GCLang/EN/GCModels/GCcomics.pm
new file mode 100644
index 0000000..d3054af
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCcomics.pm
@@ -0,0 +1,76 @@
+{
+ package GCLang::EN::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics',
+ lowercase1 => 'comic',
+ lowercaseX => 'comics'
+ },
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCfilms.pm b/lib/gcstar/GCLang/EN/GCModels/GCfilms.pm
new file mode 100644
index 0000000..57d49d0
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCfilms.pm
@@ -0,0 +1,96 @@
+{
+ package GCLang::EN::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Movies collection',
+ Items => {0 => 'Movies',
+ 1 => 'Movie',
+ X => 'Movies',
+ lowercase1 => 'movie',
+ lowercaseX => 'movies'
+ },
+ NewItem => 'New movie',
+
+
+ Id => 'Id',
+ Title => 'Title',
+ Date => 'Date',
+ Time => 'Length',
+ Director => 'Director',
+ Country => 'Country',
+ MinimumAge => 'Minimum age',
+ Genre => 'Genre',
+ Image => 'Picture',
+ Original => 'Alternative titles',
+ Actors => 'Cast',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'Comments',
+ Synopsis => 'Synopsis',
+ Seen => 'Viewed',
+ Number => '# of Media',
+ Format => 'Media',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'Web page',
+ Audio => 'Audio',
+ Video => 'Video format',
+ Trailer => 'Video file',
+ Serie => 'Series',
+ Rank => 'Rank',
+ Subtitles => 'Subtitles',
+
+ SeenYes => 'Viewed',
+ SeenNo => 'Not viewed',
+
+ AgeUnrated => 'Unrated',
+ AgeAll => 'All Ages',
+ AgeParent => 'Parental Guidance',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+
+ Information => 'Information',
+ Languages => 'Languages',
+ Encoding => 'Encoding',
+
+ FilterAudienceAge => 'Audience age',
+ FilterSeenNo => '_Not Yet Viewed',
+ FilterSeenYes => '_Already Viewed',
+ FilterRatingSelect => 'Rating At _Least...',
+
+ ExtractSize => 'Size',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCgames.pm b/lib/gcstar/GCLang/EN/GCModels/GCgames.pm
new file mode 100644
index 0000000..af30095
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCgames.pm
@@ -0,0 +1,85 @@
+{
+ package GCLang::EN::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Video games collection',
+ Items => {0 => 'Games',
+ 1 => 'Game',
+ X => 'Games',
+ lowercase1 => 'game',
+ lowercaseX => 'games'
+ },
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Players => 'Number of players',
+ Released => 'Release Date',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Genre => 'Genre',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instructions manual',
+ Completion => 'Completion (%)',
+ Executable => 'Executable',
+ Description => 'Description',
+ Codes => 'Codes',
+ Code => 'Code',
+ Effect => 'Effect',
+ Secrets => 'Secrets',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ Unlockables => 'Unlockables',
+ Unlockable => 'Unlockable',
+ Howto => 'How to unlock',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'General',
+ Details => 'Details',
+ Tips => 'Tips',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/EN/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..6153bcf
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCgeneric.pm
@@ -0,0 +1,44 @@
+{
+ package GCLang::EN::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Items',
+ 1 => 'Item',
+ X => 'Items',
+ lowercase1 => 'item',
+ lowercaseX => 'items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCminicars.pm b/lib/gcstar/GCLang/EN/GCModels/GCminicars.pm
new file mode 100644
index 0000000..a672301
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::EN::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicles',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCmusics.pm b/lib/gcstar/GCLang/EN/GCModels/GCmusics.pm
new file mode 100644
index 0000000..87b1cfe
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCmusics.pm
@@ -0,0 +1,71 @@
+{
+ package GCLang::EN::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Music collection',
+ Items => {0 => 'Albums',
+ 1 => 'Album',
+ X => 'Albums',
+ lowercase1 => 'album',
+ lowercaseX => 'albums'
+ },
+ NewItem => 'New album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Title',
+ Cover => 'Cover',
+ Artist => 'Artist',
+ Format => 'Format',
+ Running => 'Running time',
+ Release => 'Release date',
+ Genre => 'Genre',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Tracks list',
+ Number => 'Number',
+ Track => 'Title',
+ Time => 'Time',
+
+ Composer => 'Composer',
+ Producer => 'Producer',
+ Playlist => 'Playlist',
+ Comments => 'Comments',
+ Label => 'Label',
+ Url => 'Web page',
+
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/EN/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..0a84b76
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCperiodicals.pm
@@ -0,0 +1,55 @@
+{
+ package GCLang::EN::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodicals',
+ 1 => 'Periodical',
+ X => 'Periodicals',
+ lowercase1 => 'periodical',
+ lowercaseX => 'periodicals'
+ },
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/EN/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..6229917
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::EN::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart cards',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/EN/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..f0a26ef
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::EN::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCstamps.pm b/lib/gcstar/GCLang/EN/GCModels/GCstamps.pm
new file mode 100644
index 0000000..a04e473
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCstamps.pm
@@ -0,0 +1,192 @@
+{
+ package GCLang::EN::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps',
+ lowercase1 => 'stamp',
+ lowercaseX => 'stamps'
+ },
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCwines.pm b/lib/gcstar/GCLang/EN/GCModels/GCwines.pm
new file mode 100644
index 0000000..57f2688
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCwines.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::EN::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Wines collection',
+ Items => { 0 => 'Wines',
+ 1 => 'Wine',
+ X => 'Wines',
+ lowercase1 => 'wine',
+ lowercaseX => 'wines'
+ },
+ NewItem => 'New wine',
+
+ Name => 'Name',
+ Designation => 'Designation',
+ Vintage => 'Vintage',
+ Vineyard => 'Vineyard',
+ Type => 'Type',
+ Grapes => 'Grapes',
+ Soil => 'Soil',
+ Producer => 'Producer',
+ Country => 'Country',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medal/Honour',
+
+ Storage => 'Storage',
+ Location => 'Location',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantity',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Purchase date',
+ PurchasePrice => 'Purchase price',
+ Gift => 'Gift',
+ BottleLabel => 'Bottle label',
+ Website => 'Reference on the web',
+
+ Tasted => 'Tasted',
+ Comments => 'Comments',
+ Serving => 'Serving',
+ TastingField => 'Testing notes',
+
+ General => 'General',
+ Details => 'Details',
+ Tasting => 'Tasting',
+
+ TastedNo => 'Non tasted',
+ TastedYes => 'Tasted',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Not yet tasted',
+ FilterTastedYes => 'Already _tasted',
+ FilterRatingSelect => 'Rating at _least...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCstar.pm b/lib/gcstar/GCLang/EN/GCstar.pm
new file mode 100644
index 0000000..a7c6486
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCstar.pm
@@ -0,0 +1,715 @@
+{
+ package GCLang::EN;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'English',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Warning</b>:
+
+Information downloaded from web sites (through the
+search plugins) is for <b>personal use only</b>.
+
+Any redistribution is forbidden without the site\'s
+<b>explicit authorization</b>.
+
+To determine which site owns the information, you
+may use the <b>button below item details</b>.',
+
+ 'AllItemsFiltered' => 'No {lowercaseX} match your filter criteria', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Installing in ',
+ 'InstallMandatory' => 'Mandatory components',
+ 'InstallOptional' => 'Optional Components',
+ 'InstallErrorMissing' => 'Error : Following Perl components have to be installed: ',
+ 'InstallPrompt' => 'Base directory for installation [/usr/local]: ',
+ 'InstallEnd' => 'End of the installation',
+ 'InstallNoError' => 'No error',
+ 'InstallLaunch' => 'To use this application you can launch ',
+ 'InstallDirectory' => 'Base directory',
+ 'InstallTitle' => 'GCstar installation',
+ 'InstallDependencies' => 'Dependencies',
+ 'InstallPath' => 'Path',
+ 'InstallOptions' => 'Options',
+ 'InstallSelectDirectory' => 'Select base directory for the installation',
+ 'InstallWithClean' => 'Remove files found in installation directory',
+ 'InstallWithMenu' => 'Add GCstar to Applications menu',
+ 'InstallNoPermission' => 'Error: You don\'t have permission to write in the selected directory',
+ 'InstallMissingMandatory' => 'Mandatory dependencies are missing. You won\'t be able to install GCstar until they have been added to your system.',
+ 'InstallMissingOptional' => 'Some optional dependencies are missing. These are listed below. GCstar can be installed but some features won\'t be available.',
+ 'InstallMissingNone' => 'There are no missing dependencies. You may continue and install GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Missing',
+ 'InstallMissingFor' => 'Missing for',
+ 'InstallCleanDirectory' => 'Removing GCstar\'s files in directory: ',
+ 'InstallCopyDirectory' => 'Copying files in directory: ',
+ 'InstallCopyDesktop' => 'Copying desktop file in: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy to use (just press enter if none): ',
+ 'UpdateNoPermission' => 'Write permission denied in this directory: ',
+ 'UpdateNone' => 'No updates have been found',
+ 'UpdateFileNotFound' => 'File not found',
+
+#Splash
+ 'SplashInit' => 'Initializing',
+ 'SplashLoad' => 'Loading Collection',
+ 'SplashDisplay' => 'Displaying Collection',
+ 'SplashSort' => 'Sorting Collection',
+ 'SplashDone' => 'Ready',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'It seems you were previously using GCfilms. What do you want to import from GCfilms to GCstar (it won\'t impact GCfilms if you still want to use it)?',
+ 'GCfilmsImportOptions' => 'Settings',
+ 'GCfilmsImportData' => 'Movies list',
+
+#Menus
+ 'MenuFile' => '_File',
+ 'MenuNewList' => '_New Collection',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_Recent Collections',
+ 'MenuLend' => 'Display _Borrowed {X}', # Accepts model codes
+ 'MenuImport' => '_Import',
+ 'MenuExport' => '_Export',
+ 'MenuAddItem' => '_Add {1}', # Accepts model codes
+
+ 'MenuEdit' => '_Edit',
+ 'MenuDuplicate' => 'Du_plicate {1}', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate {X}', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All {X}', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Remove {1}', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove {X}', # Accepts model codes
+ 'MenuEditFields' => '_Change Collection Fields',
+ 'MenuEditLockItems' => '_Lock Collection',
+
+ 'MenuDisplay' => 'F_ilter',
+ 'MenuSavedSearches' => 'Saved Searches',
+ 'MenuSavedSearchesSave' => 'Save Current Search',
+ 'MenuSavedSearchesEdit' => 'Modify Saved Searches',
+ 'MenuAdvancedSearch' => 'A_dvanced Search',
+ 'MenuViewAllItems' => 'Show _All {X}', # Accepts model codes
+ 'MenuNoFilter' => '_Any',
+
+ 'MenuConfiguration' => '_Settings',
+ 'MenuDisplayMenu' => 'Di_splay',
+ 'MenuDisplayFullScreen' => '_Full screen',
+ 'MenuDisplayMenuBar' => '_Menus',
+ 'MenuDisplayToolBar' => '_Toolbar',
+ 'MenuDisplayStatusBar' => 'B_ottom bar',
+ 'MenuDisplayOptions' => '_Displayed Information',
+ 'MenuBorrowers' => '_Borrowers',
+ 'MenuToolbarConfiguration' => '_Toolbar Controls',
+ 'MenuDefaultValues' => 'Default values for new {1}', # Accepts model codes
+ 'MenuGenresConversion' => 'Genre _Conversion',
+
+ 'MenuBookmarks' => 'My _Collections',
+ 'MenuBookmarksAdd' => '_Add Current Collection',
+ 'MenuBookmarksEdit' => '_Edit Bookmarked Collections',
+
+ 'MenuHelp' => '_Help',
+ 'MenuHelpContent' => '_Content',
+ 'MenuAllPlugins' => 'View _Plugins',
+ 'MenuBugReport' => 'Report a Problem',
+ 'MenuAbout' => '_About GCstar',
+
+ 'MenuNewWindow' => 'Show {1} in _New Window', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show {X} in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Expand All',
+ 'ContextCollapseAll' => 'Collapse All',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Please enter value',
+
+ 'RemoveConfirm' => 'Do you really want to remove this {lowercase1}?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these {lowercaseX}?', # Accepts model codes
+
+ 'DefaultNewItem' => 'New {lowercase1}', # Accepts model codes
+ 'NewItemTooltip' => 'Add a new {lowercase1}', # Accepts model codes
+ 'NoItemFound' => 'Nothing was found. Would you like to search another site?',
+ 'OpenList' => 'Please select collection',
+ 'SaveList' => 'Please choose where to save the collection',
+ 'SaveListTooltip' => 'Save current collection',
+ 'SaveUnsavedChanges' => 'There are unsaved changes in your collection. Do you want to save them?',
+ 'SaveDontSave' => 'Don\'t save',
+ 'PreferencesTooltip' => 'Set your preferences',
+ 'ViewTooltip' => 'Change collection display',
+ 'PlayTooltip' => 'Launch file associated to the {lowercase1}', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Saving...',
+ 'StatusLoad' => 'Loading...',
+ 'StatusSearch' => 'Search in progress...',
+ 'StatusGetInfo' => 'Getting information...',
+ 'StatusGetImage' => 'Getting picture...',
+
+ 'SaveError' => 'Cannot save items list. Please check access rights and disk free space.',
+ 'OpenError' => 'Cannot open items list. Please check access rights.',
+ 'OpenFormatError' => 'Cannot open items list. Format may be incorrect.',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'Selected directory to save images is not correct. Please select another one.',
+ 'OptionsCreationError'=> 'Cannot create options file: ',
+ 'OptionsOpenError'=> 'Cannot open options file: ',
+ 'OptionsSaveError'=> 'Cannot save options file: ',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'What to see this evening?',
+ 'RandomError'=> 'You have no {lowercaseX} that could be chosen', # Accepts model codes
+ 'RandomEnd'=> 'You have no more {lowercaseX} to choose from!', # Accepts model codes
+ 'RandomNextTip'=> 'Next suggestion',
+ 'RandomOkTip'=> 'Accept this suggestion',
+
+ 'AboutTitle' => 'About GCstar',
+ 'AboutDesc' => 'Personal collections manager',
+ 'AboutVersion' => 'Version',
+ 'AboutTeam' => 'Team',
+ 'AboutWho' => 'Christian Jodar (Tian): Project manager, Programmer
+Nyall Dawson (Zombiepig): Programmer
+TPF: Programmer
+Adolfo González: Programmer
+',
+ 'AboutLicense' => 'Distributed under the terms of the GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'English translation by Christian Jodar and Jason Day',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logo and webdesign by le Spektre',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+
+#Collection models
+ 'ModelsSelect' => 'Select a collection type',
+ 'ModelsPersonal' => 'Personal models',
+ 'ModelsDefault' => 'Default models',
+ 'ModelsList' => 'Collection definition',
+ 'ModelSettings' => 'Collection settings',
+ 'ModelNewType' => 'New collection type',
+ 'ModelName' => 'Name of the collection type:',
+ 'ModelFields' => 'Fields',
+ 'ModelOptions' => 'Options',
+ 'ModelFilters' => 'Filters',
+ 'ModelNewField' => 'New field',
+ 'ModelFieldInformation' => 'Information',
+ 'ModelFieldName' => 'Label:',
+ 'ModelFieldType' => 'Type:',
+ 'ModelFieldGroup' => 'Group:',
+ 'ModelFieldValues' => 'Values',
+ 'ModelFieldInit' => 'Default:',
+ 'ModelFieldMin' => 'Minimum:',
+ 'ModelFieldMax' => 'Maximum:',
+ 'ModelFieldList' => 'Values list:',
+ 'ModelFieldListLegend' => '<i>Comma separated</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Short text',
+ 'ModelFieldTypeLongText' => 'Long text',
+ 'ModelFieldTypeYesNo' => 'Yes/No',
+ 'ModelFieldTypeNumber' => 'Number',
+ 'ModelFieldTypeDate' => 'Date',
+ 'ModelFieldTypeOptions' => 'Pre-defined values list',
+ 'ModelFieldTypeImage' => 'Image',
+ 'ModelFieldTypeSingleList' => 'Simple list',
+ 'ModelFieldTypeFile' => 'File',
+ 'ModelFieldTypeFormatted' => 'Dependant on other fields',
+ 'ModelFieldParameters' => 'Parameters',
+ 'ModelFieldHasHistory' => 'Use an history',
+ 'ModelFieldFlat' => 'Display on one line',
+ 'ModelFieldStep' => 'Increment step:',
+ 'ModelFieldFileFormat' => 'File format:',
+ 'ModelFieldFileFile' => 'Simple file',
+ 'ModelFieldFileImage' => 'Image',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Fields to use',
+ 'ModelOptionsFieldsAuto' => 'Automatic',
+ 'ModelOptionsFieldsNone' => 'None',
+ 'ModelOptionsFieldsTitle' => 'As title',
+ 'ModelOptionsFieldsId' => 'As identifier',
+ 'ModelOptionsFieldsCover' => 'As cover',
+ 'ModelOptionsFieldsPlay' => 'For Play button',
+ 'ModelCollectionSettings' => 'Collection settings',
+ 'ModelCollectionSettingsLending' => 'Items can be borrowed',
+ 'ModelCollectionSettingsTagging' => 'Items can be tagged',
+ 'ModelFilterActivated' => 'Should be in search box',
+ 'ModelFilterComparison' => 'Comparison',
+ 'ModelFilterContain' => 'Contains',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Range',
+ 'ModelFilterNumeric' => 'Comparison is numeric',
+ 'ModelFilterQuick' => 'Create a quick filter',
+ 'ModelTooltipName' => 'Use a name to re-use this model for many collections. If empty, the settings will be directly stored in the collection itself',
+ 'ModelTooltipLabel' => 'The field name as it will be displayed',
+ 'ModelTooltipGroup' => 'Used to group fields. Items with no value here will be in a default group',
+ 'ModelTooltipHistory' => 'Should the previous entered values be stored in a list associated to the field',
+ 'ModelTooltipFormat' => 'This format is used to determine the action to open the file with the Play button',
+ 'ModelTooltipLending' => 'This will add some fields to manage lendings',
+ 'ModelTooltipTagging' => 'This will add some fields to manage tags',
+ 'ModelTooltipNumeric' => 'Should the values be considered as numbers for comparison',
+ 'ModelTooltipQuick' => 'This will add a submenu in the Filters one',
+
+#Web searches
+ 'PluginsTitle' => 'Search an item',
+ 'PluginsQuery' => 'Query',
+ 'PluginsFrame' => 'Search site',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Name',
+ 'PluginsSearchFields' => 'Search fields',
+ 'PluginsAuthor' => 'Author',
+ 'PluginsLang' => 'Language',
+ 'PluginsUseSite' => 'Use selected site for future searches',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'ResultsTitle' => 'Select a {lowercase1}', # Accepts model codes
+ 'ResultsNextTip' => 'Search in next site',
+ 'ResultsPreview' => 'Preview',
+ 'ResultsInfo' => 'You can add multiple {lowercaseX} to the collection by holding down the Ctrl or the Shift key and selecting them', # Accepts model codes
+
+ 'ImportWindowTitle' => 'Select Fields to be Imported',
+ 'ImportViewPicture' => 'View Picture',
+ 'ImportSelectAll' => 'Select All',
+ 'ImportSelectNone' => 'Select None',
+
+ 'MultiSiteTitle' => 'Sites to use for searches',
+ 'MultiSiteUnused' => 'Unused plugins',
+ 'MultiSiteUsed' => 'Plugins to be used',
+ 'MultiSiteLang' => 'Fill List with English Plugins',
+ 'MultiSiteEmptyError' => 'You have an empty site list',
+ 'MultiSiteClear' => 'Clear List',
+
+#Settings
+ 'OptionsTitle' => 'Preferences',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Web browser',
+ 'OptionsPlayer' => 'Video player',
+ 'OptionsAudio' => 'Audio player',
+ 'OptionsImageEditor' => 'Image editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Images directory',
+ 'OptionsUseRelativePaths' => 'Use relative paths for images',
+ 'OptionsLayout' => 'Layout',
+ 'OptionsStatus' => 'Display status bar',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Warning: Changes in this tab won\'t take effect until the application is restarted.',
+ 'OptionsRemoveConfirm' => 'Ask confirmation before item deletion',
+ 'OptionsAutoSave' => 'Automatically save collection',
+ 'OptionsAutoLoad' => 'Load previous collection on startup',
+ 'OptionsSplash' => 'Show splash screen',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Use spelling checker for long text fields',
+ 'OptionsProgramTitle' => 'Select the program to be used',
+ 'OptionsPlugins' => 'Site to retrieve data from',
+ 'OptionsAskPlugins' => 'Ask (All sites)',
+ 'OptionsPluginsMulti' => 'Many sites',
+ 'OptionsPluginsMultiAsk' => 'Ask (Many sites)',
+ 'OptionsPluginsMultiPerField' => 'Many sites (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each field we will fill the field with the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Set list',
+ 'OptionsAskImport' => 'Select fields to be imported',
+ 'OptionsProxy' => 'Use a proxy',
+ 'OptionsCookieJar' => 'Use this cookie jar file',
+ 'OptionsLang' => 'Language',
+ 'OptionsMain' => 'Main',
+ 'OptionsPaths' => 'Paths',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Features',
+ 'OptionsDisplay' => 'Display',
+ 'OptionsToolbar' => 'Toolbar',
+ 'OptionsToolbars' => {0 => 'None', 1 => 'Small', 2 => 'Large', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'Position',
+ 'OptionsToolbarPositions' => {0 => 'Top', 1 => 'Bottom', 2 => 'Left', 3 => 'Right'},
+ 'OptionsExpandersMode' => 'Expanders too long',
+ 'OptionsExpandersModes' => {'asis' => 'Do nothing', 'cut' => 'Cut', 'wrap' => 'Line wrap'},
+ 'OptionsDateFormat' => 'Date Format',
+ 'OptionsDateFormatTooltip' => 'Format is the one used by strftime(3). Default is %d/%m/%Y',
+ 'OptionsView' => 'Items list',
+ 'OptionsViews' => {0 => 'Text', 1 => 'Image', 2 => 'Detailed'},
+ 'OptionsColumns' => 'Columns',
+ 'OptionsMailer' => 'E-mailer',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'Your e-mail',
+ 'OptionsTransform' => 'Place articles at the end of titles',
+ 'OptionsArticles' => 'Articles (Comma separated)',
+ 'OptionsSearchStop' => 'Allow search to be aborted',
+ 'OptionsBigPics' => 'Download hi-res artwork when available',
+ 'OptionsAlwaysOriginal' => 'Use main title as the original title if none present',
+ 'OptionsRestoreAccelerators' => 'Restore Accelerators',
+ 'OptionsHistory' => 'Size of history',
+ 'OptionsClearHistory' => 'Clear History',
+ 'OptionsStyle' => 'Skin',
+ 'OptionsDontAsk' => 'Don\'t ask anymore',
+ 'OptionsPathProgramsGroup' => 'Applications',
+ 'OptionsProgramsSystem' => 'Use programs defined by system',
+ 'OptionsProgramsUser' => 'Override default programs',
+ 'OptionsProgramsSet' => 'Set Programs',
+ 'OptionsPathImagesGroup' => 'Images',
+ 'OptionsInternetDataGroup' => 'Data import',
+ 'OptionsInternetSettingsGroup' => 'Settings',
+ 'OptionsDisplayInformationGroup' => 'Information display',
+ 'OptionsDisplayArticlesGroup' => 'Articles',
+ 'OptionsImagesDisplayGroup' => 'Display',
+ 'OptionsImagesStyleGroup' => 'Style',
+ 'OptionsDetailedPreferencesGroup' => 'Preferences',
+ 'OptionsFeaturesConveniencesGroup' => 'Conveniences',
+ 'OptionsPicturesFormat' => 'Prefix to use for pictures:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Title or name of the associated item',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% or . will be replaced with collection directory (use only on beginning of path)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% will be replaced by collection file name without suffix (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% could only be used on the beginning of the path for pictures',
+ 'OptionsConfigureMailers' => 'Configure Mailing Programs',
+
+#Image list settings
+ 'ImagesOptionsButton' => 'Settings',
+ 'ImagesOptionsTitle' => 'Settings for images list',
+ 'ImagesOptionsSelectColor' => 'Select a color',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Background',
+ 'ImagesOptionsBgPicture' => 'Use a background picture',
+ 'ImagesOptionsFg'=> 'Selection',
+ 'ImagesOptionsBgTooltip' => 'Change background color',
+ 'ImagesOptionsFgTooltip'=> 'Change selection color',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Size',
+ 'ImagesOptionsSizeList' => {0 => 'Very Small', 1 => 'Small', 2 => 'Medium', 3 => 'Large', 4 => 'Extra Large'},
+ 'ImagesOptionsSizeTooltip' => 'Select image size',
+
+#Detailed list settings
+ 'DetailedOptionsTitle' => 'Settings for detailed list',
+ 'DetailedOptionsImageSize' => 'Images size',
+ 'DetailedOptionsGroupItems' => 'Group items by',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'Select fields to display',
+ 'DetailedOptionsGroupedFirst' => 'Keep together orphaned items',
+ 'DetailedOptionsAddCount' => 'Add number of elements on categories',
+
+#Fields to display
+ 'DisplayOptionsTitle' => 'Items to display',
+ 'DisplayOptionsAll' => 'Select all',
+ 'DisplayOptionsSearch' => 'Search button',
+
+#Extract plugins
+ 'ExtractButton' => 'Information',
+ 'ExtractTitle' => 'File information',
+ 'ExtractImport' => 'Use values',
+
+#Fields list
+ 'FieldsListOpen' => 'Load a fields list from a file',
+ 'FieldsListSave' => 'Save fields list to a file',
+ 'FieldsListError' => 'This fields list cannot be used with this kind of collection',
+ 'FieldsListIgnore' => '--- Ignore',
+
+#Export plugins
+ 'ExportTitle' => 'Export item list',
+ 'ExportFilter' => 'Export only displayed items',
+ 'ExportFieldsTitle' => 'Fields to be exported',
+ 'ExportFieldsTip' => 'Select fields you want to export',
+ 'ExportWithPictures' => 'Copy pictures in a sub-directory',
+ 'ExportSortBy' => 'Sort by',
+ 'ExportOrder' => 'Order',
+
+#Import plugins
+ 'ImportListTitle' => 'Import another items list',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'File',
+ 'ImportExportFieldsUnused' => 'Unused fields',
+ 'ImportExportFieldsUsed' => 'Used fields',
+ 'ImportExportFieldsFill' => 'Add All',
+ 'ImportExportFieldsClear' => 'Remove All',
+ 'ImportExportFieldsEmpty' => 'You must choose at least one field',
+ 'ImportExportFileEmpty' => 'You have to specify a file name',
+ 'ImportFieldsTitle' => 'Fields to be imported',
+ 'ImportFieldsTip' => 'Select fields you want to import',
+ 'ImportNewList' => 'Create a new collection',
+ 'ImportCurrentList' => 'Add to current collection',
+ 'ImportDropError' => 'There was an error opening at least one file. Previous list will be reloaded.',
+ 'ImportGenerateId' => 'Generate identifier for each item',
+
+#File chooser
+ 'FileChooserOpenFile' => 'Please select file to use',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Select a directory',
+ 'FileChooserOverwrite' => 'This file already exists. Do you want to overwrite it?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+#Some default panels
+ 'PanelCompact' => 'Compact',
+ 'PanelReadOnly' => 'Read Only',
+ 'PanelForm' => 'Tabs',
+
+#Default labels used in panels
+ 'PanelSearchButton' => 'Fetch Information',
+ 'PanelSearchTip' => 'Search web for information on this name',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Click on the picture to select different one.',
+ 'PanelImageTipView' => 'Click on the picture to view it in real size.',
+ 'PanelImageTipMenu' => ' Right click for more options.',
+ 'PanelImageTitle' => 'Select a picture',
+ 'PanelImageNoImage' => 'No image',
+ 'PanelSelectFileTitle' => 'Select File',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restore Default',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Automatically update blank fields',
+
+ 'PanelFrom' =>'From',
+ 'PanelTo' =>'To',
+
+ 'PanelWeb' => 'View Information',
+ 'PanelWebTip' => 'View information on the web about this {lowercase1}', # Accepts model codes
+ 'PanelRemoveTip' => 'Remove current {lowercase1}', # Accepts model codes
+
+ 'PanelDateSelect' => 'Select',
+ 'PanelNobody' => 'Nobody',
+ 'PanelUnknown' => 'Unknown',
+ 'PanelAdded' => 'Add date',
+ 'PanelRating' => 'Rating',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Location',
+
+ 'PanelLending' => 'Lending',
+ 'PanelBorrower' => 'Borrower',
+ 'PanelLendDate' => 'Out Since',
+ 'PanelHistory' => 'Lending History',
+ 'PanelReturned' => '{1} Returned', # Accepts model codes
+ 'PanelReturnDate' => 'Return date',
+ 'PanelLendedYes' => 'Lended',
+ 'PanelLendedNo' => 'Available',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favourite',
+ 'TagsAssigned' => 'Assigned Tags',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Either',
+ 'CheckYes' => 'Yes',
+ 'CheckNo' => 'No',
+
+#Toolbar
+ 'ToolbarRandom' => 'Tonight',
+ 'ToolbarAll' => 'View All',
+ 'ToolbarAllTooltip' => 'View all items',
+ 'ToolbarGroupBy' => 'Group by',
+ 'ToolbarGroupByTooltip' => 'Select the field to use to group items in list',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+#Borrowers
+ 'BorrowersTitle' => 'Borrower Configuration',
+ 'BorrowersList' => 'Borrowers',
+ 'BorrowersName' => 'Name',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Add',
+ 'BorrowersRemove' => 'Remove',
+ 'BorrowersEdit' => 'Edit',
+ 'BorrowersTemplate' => 'Mail template',
+ 'BorrowersSubject' => 'Mail subject',
+ 'BorrowersNotice1' => '%1 will be replaced with the borrower\'s name',
+ 'BorrowersNotice2' => '%2 will be replaced with the item title',
+ 'BorrowersNotice3' => '%3 will be replaced with the borrow date',
+
+ 'BorrowersImportTitle' => 'Import borrowers information',
+ 'BorrowersImportType' => 'File format:',
+ 'BorrowersImportFile' => 'File:',
+
+ 'BorrowedTitle' => 'Borrowed {lowercaseX}', # Accepts model codes
+ 'BorrowedDate' => 'Since',
+ 'BorrowedDisplayInPanel' => 'Show {1} in Main Window', # Accepts model codes
+
+#Mail
+ 'MailTitle' => 'Send an e-mail',
+ 'MailFrom' => 'From: ',
+ 'MailTo' => 'To: ',
+ 'MailSubject' => 'Subject: ',
+ 'MailSmtpError' => 'Problem when connecting to SMTP server',
+ 'MailSendmailError' => 'Problem when launching sendmail',
+
+#Search dialog
+ 'SearchTooltip' => 'Search all {lowercaseX}', # Accepts model codes
+ 'SearchTitle' => '{1} Search', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'AdvancedSearchType' => 'Type of search',
+ 'AdvancedSearchTypeAnd' => '{X} matching all criteria', # Accepts model codes
+ 'AdvancedSearchTypeOr' => '{X} matching at least one criterion', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criteria',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+#Query replace
+ 'QueryReplaceField' => 'Field to replace',
+ 'QueryReplaceOld' => 'Current value',
+ 'QueryReplaceNew' => 'New value',
+ 'QueryReplaceLaunch' => 'Replace',
+
+#Collection properties
+ 'PropertiesName' => 'Collection name',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Owner',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => 'Description',
+ 'PropertiesFile' => 'File Information',
+ 'PropertiesFilePath' => 'Full path',
+ 'PropertiesItemsNumber' => 'Number of {lowercaseX}', # Accepts model codes
+ 'PropertiesFileSize' => 'Size',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Collection properties',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+#Mail sending
+ 'MailProgramsTitle' => 'Programs for mail sending',
+ 'MailProgramsName' => 'Name',
+ 'MailProgramsCommand' => 'Command line',
+ 'MailProgramsRestore' => 'Restore defaults',
+ 'MailProgramsAdd' => 'Add a program',
+ 'MailProgramsInstructions' => 'In command line, some substitutions are made:
+ %f is replaced with user\'s e-mail address.
+ %t is replaced with the recipient address.
+ %s is replaced with the subject of the message.
+ %b is replaced with the body of the message.',
+
+#Bookmarks
+ 'BookmarksBookmarks' => 'Bookmarks',
+ 'BookmarksFolder' => 'Folders',
+ 'BookmarksLabel' => 'Label',
+ 'BookmarksPath' => 'Path',
+ 'BookmarksNewFolder' => 'New folder',
+
+#Bug report
+ 'BugReportSubject' => 'Bug report generated from GCstar',
+ 'BugReportVersion' => 'Version',
+ 'BugReportPlatform' => 'Operating system',
+ 'BugReportMessage' => 'Error message',
+ 'BugReportInformation' => 'Additional information',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+#Not used yet
+ 'GenresTitle' => 'Genre Conversion',
+ 'GenresCategoryName' => 'Genre to use',
+ 'GenresCategoryMembers' => 'Genre to replace',
+ 'GenresLoad' => 'Load a list',
+ 'GenresExport' => 'Save list to a file',
+ 'GenresModify' => 'Edit conversion',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/ES/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/ES/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..f0badd4
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::ES::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Añadir títulos de columnas',
+ 'Separator' => 'Delimitador',
+ 'Replacement' => 'Reemplazar delimitador con',
+ 'Charset' => 'Codificación de caracteres',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/ES/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..7c3e8c4
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::ES::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/ES/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..786d63f
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::ES::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Fichero de plantilla inválido',
+ 'UseFile' => 'Usar el fichero especificado abajo',
+ 'TemplateExternalFile' => 'Fichero de plantilla',
+ 'WithJS' => 'Utilizar Javascript',
+ 'FileTemplate' => 'Plantilla :',
+ 'Preview' => 'Vista previa',
+ 'NoPreview' => 'Vista previa no disponible',
+ 'Title' => 'Título de la página',
+ 'InfoFile' => 'El listado se encuentra en el archivo : ',
+ 'InfoDir' => 'Las imágenes se encuentran en : ',
+ 'HeightImg' => 'Altura en pixels de las imágenes a exportar : ',
+ 'OpenFileInBrowser' => 'Abrir el fichero generado en el navegador web',
+ 'Note' => 'Listado generado con <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Introduzca el texto a buscar',
+ 'SearchType1' => 'Sólo el Título',
+ 'SearchType2' => 'Toda la información',
+ 'SearchButton' => 'Buscar',
+ 'SearchTitle' => 'Mostrar sólo las películas coincidentes con los criterios anteriores',
+ 'AllButton' => 'Todas',
+ 'AllTitle' => 'Mostrar todas las películas',
+ 'Expand' => 'Todos desplegados',
+ 'ExpandTitle' => 'Mostrar la información de todas las películas',
+ 'Collapse' => 'Todos plegados',
+ 'CollapseTitle' => 'Ocultar la información de todas las películas',
+ 'Borrowed' => 'Prestatario : ',
+ 'NotBorrowed' => 'Disponible',
+ 'Top' => 'Arriba',
+ 'Bottom' => 'Abajo',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/ES/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..d2716d4
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::ES::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/ES/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..bb1c0b3
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::ES::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Incluir una instrucción DROP',
+ 'WithCreate' => 'Incluir una instrucción CREATE',
+ 'TableName' => 'Nombre de la tabla',
+ 'InfoFile' => 'Fichero SQL : ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/ES/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..5b42298
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ES::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'El archivo .tar.gz se encuentra en : ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/ES/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..f2ff186
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::ES::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Fichero modelo',
+ 'ModelText' => 'Texto de modelo',
+ 'Models' => 'Modelo a utilizar',
+ 'UseFile' => 'Especificar con un fichero',
+ 'UseModel' => 'Especificar en la zona de texto',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/ES/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..0706bb3
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::ES::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Donde se debería buscar',
+ 'Default' => 'Directorio predeterminado de Alexandria',
+ 'Specified' => 'Directorio especificado abajo',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/ES/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..72e761e
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::ES::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Codificación de caracteres',
+ 'Header' => 'Ignorar primera linea',
+ 'Separator' => 'Delimitador',
+ 'Plugin' => 'Sitio a usar',
+ 'UseFirst' => 'Seleccionar el primero si hay muchos resultados',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/ES/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..6037227
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::ES::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Carpeta',
+ 'Recursive' => 'Navegar sub-carpetas',
+ 'Suffixes' => 'Sufijos o extensiones de los ficheros',
+ 'SuffixesTooltip' => 'Una lista separada por comas de sufijos o extensiones a tener en cuenta',
+ 'Remove' => 'Para eliminar de los nombres',
+ 'RemoveTooltip' => 'Una lista separada por comas de palabras que se deberían elimnar de los nombres de los ficheros para crear los nombres nuevos',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/ES/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..9c155c5
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ES::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copiar imágenes',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCImport/GCImportList.pm b/lib/gcstar/GCLang/ES/GCImport/GCImportList.pm
new file mode 100644
index 0000000..df81bae
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::ES::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Lista de títulos',
+ 'Plugin' => 'Sitio a usar',
+ 'UseFirst' => 'Seleccionar el primero si hay muchos resultados',
+ 'CommentAuto' => 'Película importada automáticamente.',
+ 'CommentSite' => 'Sitio web : ',
+ 'CommentTitle' => 'Título : ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/ES/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..3dc9f6a
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::ES::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/ES/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..2560252
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ES::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'El fichero no es una colección de video Tellico',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/ES/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..87ed536
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCTVepisodes.pm
@@ -0,0 +1,65 @@
+{
+ package GCLang::ES::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de series de televisión (episodios)',
+ Items => {0 => 'Episodio',
+ 1 => 'Episodio',
+ lowercase1 => 'episodio',
+ X => 'Episodios',
+ lowercaseX => 'episodios',
+ P1 => 'El Episodio',
+ lowercaseP1 => 'el episodio',
+ U1 => 'Un Episodio',
+ lowercaseU1 => 'un episodio',
+ AP1 => 'Al Episodio',
+ lowercaseAP1 => 'al episodio',
+ DP1 => 'Del Episodio',
+ lowercaseDP1 => 'del episodio',
+ PX => 'Los Episodios',
+ lowercasePX => 'los episodios',
+ E1 => 'Este Episodio',
+ lowercaseE1 => 'este episodio',
+ EX => 'Estos Episodios',
+ lowercaseEX => 'estos episodios'
+ },
+ NewItem => 'Episodio nuevo',
+ NewSeries => 'Nueva serie',
+ Episode => 'Episodio',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/ES/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..f7dfd9f
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCTVseries.pm
@@ -0,0 +1,69 @@
+{
+ package GCLang::ES::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de series de television (series)',
+ Items => {0 => 'Serie',
+ 1 => 'Serie',
+ lowercase1 => 'serie',
+ X => 'Series',
+ lowercaseX => 'series',
+ P1 => 'La Serie',
+ lowercaseP1 => 'la serie',
+ U1 => 'Una Serie',
+ lowercaseU1 => 'una serie',
+ AP1 => 'A La Serie',
+ lowercaseAP1 => 'a la serie',
+ DP1 => 'De la Serie',
+ lowercaseDP1 => 'de la serie',
+ PX => 'Las Series',
+ lowercasePX => 'las series',
+ E1 => 'Esta Serie',
+ lowercaseE1 => 'esta serie',
+ EX => 'Estas Series',
+ lowercaseEX => 'estas series'
+ },
+ NewItem => 'Nueva serie',
+ Name => 'Nombre',
+ Season => 'Temporada',
+ Part => 'Parte',
+ Episodes => 'Episodios',
+ FirstAired => 'Inicio de emisión',
+ Time => 'Duración de episidio',
+ Producer => 'Productor',
+ Music => 'Música',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/ES/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..f688abb
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCboardgames.pm
@@ -0,0 +1,103 @@
+{
+ package GCLang::ES::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de juegos de mesa',
+ Items => {0 => 'Juego',
+ 1 => 'Juego',
+ lowercase1 => 'juego',
+ X => 'Juegos',
+ lowercaseX => 'juegos',
+ P1 => 'El Juego',
+ lowercaseP1 => 'el juego',
+ U1 => 'Un Juego',
+ lowercaseU1 => 'un juego',
+ AP1 => 'Al Juego',
+ lowercaseAP1 => 'al juego',
+ DP1 => 'Del Juego',
+ lowercaseDP1 => 'del juego',
+ PX => 'Los Juegos',
+ lowercasePX => 'los juegos',
+ E1 => 'Este Juego',
+ lowercaseE1 => 'este juego',
+ EX => 'Estos Juegos',
+ lowercaseEX => 'estos juegos'
+ },
+ NewItem => 'Nuevo juego',
+
+ Id => 'Id',
+ Name => 'Nombre',
+ Original => 'Nombre original',
+ Box => 'Foto de la caja',
+ DesignedBy => 'Diseñado por',
+ PublishedBy => 'Publicado por',
+ Players => 'Número de jugadores',
+ PlayingTime => 'Duración del juego',
+ SuggestedAge => 'Edades sugeridas',
+ Released => 'Fecha de publicación',
+ Description => 'Descripción',
+ Category => 'Categoría',
+ Mechanics => 'Mecánica',
+ ExpandedBy => 'Expandido por',
+ ExpansionFor => 'Expansión para',
+ GameFamily => 'Familia del juego',
+ IllustratedBy => 'Ilustrado por',
+ Url => 'Página web',
+ TimesPlayed => 'Veces jugado',
+ CompleteContents => 'Contenido completo',
+ Copies => 'Número de copias',
+ Condition => 'Condición',
+ Photos => 'Fotos',
+ Photo1 => 'Primera foto',
+ Photo2 => 'Segunda foto',
+ Photo3 => 'Tercera foto',
+ Photo4 => 'Cuarta foto',
+ Comments => 'Comentarios',
+
+ Perfect => 'Perfecto',
+ Good => 'Bien',
+ Average => 'Normal',
+ Poor => 'Mal',
+
+ CompleteYes => 'Contenido completo',
+ CompleteNo => 'Faltan piezas',
+
+ General => 'General',
+ Details => 'Detalles',
+ Personal => 'Personal',
+ Information => 'Información',
+
+ FilterRatingSelect => 'Puntuación al _menos...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCbooks.pm b/lib/gcstar/GCLang/ES/GCModels/GCbooks.pm
new file mode 100644
index 0000000..64845fa
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCbooks.pm
@@ -0,0 +1,88 @@
+{
+ package GCLang::ES::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de libros',
+ Items => {0 => 'Libro',
+ 1 => 'Libro',
+ lowercase1 => 'libro',
+ X => 'Libros',
+ lowercaseX => 'libros',
+ P1 => 'El Libro',
+ lowercaseP1 => 'el libro',
+ U1 => 'Un Libro',
+ lowercaseU1 => 'un libro',
+ AP1 => 'Al Libro',
+ lowercaseAP1 => 'al libro',
+ DP1 => 'Del Libro',
+ lowercaseDP1 => 'del libro',
+ PX => 'Los Libros',
+ lowercasePX => 'los libros',
+ E1 => 'Este Libro',
+ lowercaseE1 => 'este libro',
+ EX => 'Estos Libros',
+ lowercaseEX => 'estos libros'
+ },
+
+ NewItem => 'Nuevo libro',
+
+ Isbn => 'ISBN',
+ Title => 'Título',
+ Cover => 'Portada',
+ Authors => 'Autores',
+ Publisher => 'Editor',
+ Publication => 'Fecha de edición',
+ Language => 'Idioma',
+ Genre => 'Género',
+ Serie => 'Serie',
+ Rank => 'Capítulo',
+ Bookdescription => 'Descripción',
+ Pages => 'Páginas',
+ Read => 'Leído',
+ Acquisition => 'Fecha de adquisición',
+ Edition => 'Edición',
+ Format => 'Formato',
+ Comments => 'Comentarios',
+ Url => 'Página web',
+ Translator => 'Traductor',
+ Artist => 'Artista',
+ DigitalFile => 'Digital version',
+
+ General => 'General',
+ Details => 'Detalles',
+
+ ReadNo => 'No leído',
+ ReadYes => 'Leído',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCcoins.pm b/lib/gcstar/GCLang/ES/GCModels/GCcoins.pm
new file mode 100644
index 0000000..52a2fe4
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCcoins.pm
@@ -0,0 +1,126 @@
+{
+ package GCLang::ES::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección numismática',
+ Items => {0 => 'Moneda',
+ 1 => 'Moneda',
+ lowercase1 => 'moneda',
+ X => 'Monedas',
+ lowercaseX => 'monedas',
+ P1 => 'La Moneda',
+ lowercaseP1 => 'la moneda',
+ U1 => 'Una Moneda',
+ lowercaseU1 => 'una moneda',
+ AP1 => 'A La Moneda',
+ lowercaseAP1 => 'a la moneda',
+ DP1 => 'De La Moneda',
+ lowercaseDP1 => 'de la moneda',
+ PX => 'Las Monedas',
+ lowercasePX => 'Las Monedas',
+ E1 => 'Esta Moneda',
+ lowercaseE1 => 'esta moneda',
+ EX => 'Estas Monedas',
+ lowercaseEX => 'estas monedas'
+ },
+
+ NewItem => 'Nueva moneda',
+
+ Name => 'Nombre',
+ Country => 'País',
+ Year => 'Año',
+ Currency => 'Divisa',
+ Value => 'Valor',
+ Picture => 'Imágen principal',
+ Diameter => 'Diámetro',
+ Metal => 'Metal',
+ Edge => 'Borde',
+ Edge1 => 'Borde 1',
+ Edge2 => 'Borde 2',
+ Edge3 => 'Borde 3',
+ Edge4 => 'Borde 4',
+ Head => 'Cara',
+ Tail => 'Cruz',
+ Comments => 'Comentarios',
+ History => 'Historia',
+ Website => 'Página web',
+ Estimate => 'Estimación',
+ References => 'Referencias',
+ Type => 'Tipo',
+ Coin => 'Moneda',
+ Banknote => 'Billete',
+
+ Main => 'Principal',
+ Description => 'Descripción',
+ Other => 'Otra información',
+ Pictures => 'Imágenes',
+
+ Location => 'Localización',
+ Front => 'Delante',
+ Back => 'Detrás',
+
+ Condition => 'Condición (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCcomics.pm b/lib/gcstar/GCLang/ES/GCModels/GCcomics.pm
new file mode 100644
index 0000000..5179e57
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCcomics.pm
@@ -0,0 +1,90 @@
+{
+ package GCLang::ES::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de cómics',
+ Items => {0 => 'Cómics',
+ 1 => 'Cómic',
+ lowercase1 => 'cómic',
+ X => 'Cómics',
+ lowercaseX => 'cómics',
+ P1 => 'El Cómic',
+ lowercaseP1 => 'el cómics',
+ U1 => 'Un Cómic',
+ lowercaseU1 => 'un cómic',
+ AP1 => 'Al Cómic',
+ lowercaseAP1 => 'al cómic',
+ DP1 => 'Del Cómic',
+ lowercaseDP1 => 'del cómic',
+ PX => 'Los Cómics',
+ lowercasePX => 'los cómics',
+ E1 => 'Este Cómic',
+ lowercaseE1 => 'este cómic',
+ EX => 'Estos Cómics',
+ lowercaseEX => 'estos cómics'
+ },
+ NewItem => 'Cómic nuevo',
+
+
+ Id => 'Id',
+ Name => 'Nombre',
+ Series => 'Serie',
+ Volume => 'Volumen',
+ Title => 'Título',
+ Writer => 'Escritor',
+ Illustrator => 'Ilustrador',
+ Colourist => 'Colorista',
+ Publisher => 'Publicado por',
+ Synopsis => 'Sinopsis',
+ Collection => 'Colección',
+ PublishDate => 'Fecha de publicación',
+ PrintingDate => 'Fecha de impresión',
+ ISBN => 'ISBN',
+ Type => 'Tipo',
+ Category => 'Categoría',
+ Format => 'Formato',
+ NumberBoards => 'Número de páginas',
+ Signing => 'Dedicado',
+ Cost => 'Coste',
+ Rating => 'Puntuación',
+ Comment => 'Comentarios',
+ Url => 'Página web',
+
+ FilterRatingSelect => 'Puntuación al _menos...',
+
+ Main => 'Elementos principales',
+ General => 'General',
+ Details => 'Detalles',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCfilms.pm b/lib/gcstar/GCLang/ES/GCModels/GCfilms.pm
new file mode 100644
index 0000000..25a243c
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCfilms.pm
@@ -0,0 +1,112 @@
+{
+ package GCLang::ES::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de películas',
+ Items => {0 => 'Película',
+ 1 => 'Película',
+ lowercase1 => 'película',
+ X => 'Películas',
+ lowercaseX => 'películas',
+ P1 => 'La Película',
+ lowercaseP1 => 'la película',
+ U1 => 'Una Película',
+ lowercaseU1 => 'una película',
+ AP1 => 'A la Película',
+ lowercaseAP1 => 'a la película',
+ DP1 => 'De la Película',
+ lowercaseDP1 => 'de la película',
+ PX => 'Las Películas',
+ lowercasePX => 'las películas',
+ E1 => 'Esta Película',
+ lowercaseE1 => 'esta película',
+ EX => 'Estas Películas',
+ lowercaseEX => 'estas películas'
+ },
+
+ NewItem => 'Nueva película',
+
+
+ Id => 'Id',
+ Title => 'Título',
+ Date => 'Fecha de salida',
+ Time => 'Duración',
+ Director => 'Director',
+ Country => 'Nacionalidad',
+ MinimumAge => 'Edad mínima',
+ Genre => 'Géneros',
+ Image => 'Imagen',
+ Original => 'Título original',
+ Actors => 'Actores',
+ Actor => 'Actor',
+ Role => 'Papel',
+ Comment => 'Comentarios',
+ Synopsis => 'Sinopsis',
+ Seen => 'Ya vista',
+ Number => 'Número',
+ Format => 'Soporte',
+ Region => 'Región',
+ Identifier => 'Identificador',
+ Url => 'URL',
+ Audio => 'Audio',
+ Video => 'Formato de video',
+ Trailer => 'Fichero de video',
+ Serie => 'Serie',
+ Rank => 'Capítulo',
+ Subtitles => 'Subtítulos',
+
+ SeenYes => 'Película ya vista',
+ SeenNo => 'Película no vista',
+
+ AgeUnrated => 'Desconocida',
+ AgeAll => 'Ninguna',
+ AgeParent => 'Control paterno',
+
+ Main => 'Elementos principales',
+ General => 'Ficha de la película',
+ Details => 'Información personal',
+ Lending => 'Préstamo',
+
+ Information => 'Informacion',
+ Languages => 'Idiomas',
+ Encoding => 'Codificación',
+
+ FilterAudienceAge => 'Edad mínima',
+ FilterSeenNo => 'Películas no vistas',
+ FilterSeenYes => '_Ya vista',
+ FilterRatingSelect => 'Puntuación al _menos...',
+
+ ExtractSize => 'Tamaño',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCgames.pm b/lib/gcstar/GCLang/ES/GCModels/GCgames.pm
new file mode 100644
index 0000000..51c8485
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCgames.pm
@@ -0,0 +1,99 @@
+{
+ package GCLang::ES::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de video juegos',
+ Items => {0 => 'Juego',
+ 1 => 'Juego',
+ lowercase1 => 'juego',
+ X => 'Juegos',
+ lowercaseX => 'juegos',
+ P1 => 'El Juego',
+ lowercaseP1 => 'el juego',
+ U1 => 'Un Juego',
+ lowercaseU1 => 'un juego',
+ AP1 => 'Al Juego',
+ lowercaseAP1 => 'al juego',
+ DP1 => 'Del Juego',
+ lowercaseDP1 => 'del juego',
+ PX => 'Los Juegos',
+ lowercasePX => 'los juegos',
+ E1 => 'Este Juego',
+ lowercaseE1 => 'este juego',
+ EX => 'Estos Juegos',
+ lowercaseEX => 'estos juegos'
+ },
+ NewItem => 'Nuevo juego',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Nombre',
+ Platform => 'Plataforma',
+ Players => 'Número de jugadores',
+ Released => 'Fecha de publicación',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Genre => 'Género',
+ Box => 'Portada de la caja',
+ Case => 'Case',
+ Manual => 'Instructions manual',
+ Completion => 'Completado (%)',
+ Executable => 'Ejecutable',
+ Description => 'Descripción',
+ Codes => 'Códigos',
+ Code => 'Código',
+ Effect => 'Efecto',
+ Secrets => 'Secretos',
+ Screenshots => 'Capturas de pantallas',
+ Screenshot1 => 'Primera captura',
+ Screenshot2 => 'Seguna captura',
+ Comments => 'Comentarios',
+ Url => 'Página web',
+ Unlockables => 'Desbloqueables',
+ Unlockable => 'Desbloqueable',
+ Howto => 'Cómo desbloquear',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'General',
+ Details => 'Detalles',
+ Tips => 'Consejos',
+ Information => 'Información',
+
+ FilterRatingSelect => 'Puntuación al _menos...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/ES/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..e0519bd
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCgeneric.pm
@@ -0,0 +1,59 @@
+{
+ package GCLang::ES::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Artículo',
+ 1 => 'Artículo',
+ lowercase1 => 'artículo',
+ X => 'Artículos',
+ lowercaseX => 'artículos',
+ P1 => 'el artículo',
+ lowercaseP1 => 'el artículo',
+ U1 => 'Un Artículo',
+ lowercaseU1 => 'un artículo',
+ AP1 => 'Al Artículo',
+ lowercaseAP1 => 'al artículo',
+ DP1 => 'Del Artículo',
+ lowercaseDP1 => 'del artículo',
+ PX => 'Los Artículos',
+ lowercasePX => 'los artículos',
+ E1 => 'Este Artículos',
+ lowercaseE1 => 'este artículo',
+ EX => 'Estos Artículos',
+ lowercaseEX => 'estos artículos'
+ },
+
+ NewItem => 'Nuevo artículo',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCminicars.pm b/lib/gcstar/GCLang/ES/GCModels/GCminicars.pm
new file mode 100644
index 0000000..6d582c7
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCminicars.pm
@@ -0,0 +1,195 @@
+{
+ package GCLang::ES::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehículo',
+ 1 => 'Vehículo',
+ X => 'Vehículos',
+ lowercaseX => 'vehículos',
+ P1 => 'El Vehículo',
+ lowercaseP1 => 'el vehículo',
+ U1 => 'Un Vehículo',
+ lowercaseU1 => 'un vehículo',
+ AP1 => 'Al Vehículo',
+ lowercaseAP1 => 'al vehículo',
+ DP1 => 'Del Vehículo',
+ lowercaseDP1 => 'del vehículo',
+ PX => 'Los Vehículos',
+ lowercasePX => 'los vehículos',
+ E1 => 'Este Vehículo',
+ lowercaseE1 => 'este vehículo',
+ EX => 'Estos Vehículos',
+ lowercaseEX => 'estos vehículos'
+ },
+ NewItem => 'Nuevo vehículo',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Designe date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Réalism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Nunmber of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCmusics.pm b/lib/gcstar/GCLang/ES/GCModels/GCmusics.pm
new file mode 100644
index 0000000..184a9e9
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCmusics.pm
@@ -0,0 +1,85 @@
+{
+ package GCLang::ES::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de música',
+ Items => {0 => 'Álbum',
+ 1 => 'Álbum',
+ lowercase1 => 'Álbum',
+ X => 'Álbumes',
+ lowercaseX => 'álbumes',
+ P1 => 'El Álbum',
+ lowercaseP1 => 'el álbum',
+ U1 => 'Un Álbum',
+ lowercaseU1 => 'un álbum',
+ AP1 => 'Al Álbum',
+ lowercaseAP1 => 'al álbum',
+ DP1 => 'Del Álbum',
+ lowercaseDP1 => 'del álbum',
+ PX => 'Los Álbumes',
+ lowercasePX => 'los álbumes',
+ E1 => 'Este Álbum',
+ lowercaseE1 => 'este álbum ',
+ EX => 'Estos Álbumes',
+ lowercaseEX => 'estos álbumes'
+ },
+ NewItem => 'Álbum nuevo',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Título',
+ Cover => 'Portada',
+ Artist => 'Artista',
+ Format => 'Formato',
+ Running => 'Duración',
+ Release => 'Fecha de publicación',
+ Genre => 'Género',
+ Origin => 'Origen',
+
+#For tracks list
+ Tracks => 'Lista de canciones',
+ Number => 'Número',
+ Track => 'Título',
+ Time => 'Duración',
+
+ Composer => 'Compositor',
+ Producer => 'Productor',
+ Playlist => 'Lista de reproducción',
+ Comments => 'Comentarios',
+ Label => 'Discográfica',
+ Url => 'Página web',
+
+ General => 'General',
+ Details => 'Detalles',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/ES/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..e4684b1
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCperiodicals.pm
@@ -0,0 +1,70 @@
+{
+ package GCLang::ES::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Revista',
+ 1 => 'Revista',
+ lowercase1 => 'revista',
+ X => 'Revistas',
+ lowercaseX => 'revistas',
+ P1 => 'La Revista',
+ lowercaseP1 => 'la revista',
+ U1 => 'Una Revista',
+ lowercaseU1 => 'una revista',
+ AP1 => 'A la Revista',
+ lowercaseAP1 => 'a la revista',
+ DP1 => 'De la Revista',
+ lowercaseDP1 => 'de la revista',
+ PX => 'Las Revistas',
+ lowercasePX => 'las revistas',
+ E1 => 'Esta Revista',
+ lowercaseE1 => 'esta revista',
+ EX => 'Estas Revistas',
+ lowercaseEX => 'estas revistas'
+ },
+
+ NewItem => 'Nueva revista',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/ES/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..7026e66
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::ES::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/ES/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..0eb009e
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::ES::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCstamps.pm b/lib/gcstar/GCLang/ES/GCModels/GCstamps.pm
new file mode 100644
index 0000000..ffcb30d
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCstamps.pm
@@ -0,0 +1,206 @@
+{
+ package GCLang::ES::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Sello',
+ 1 => 'Sello',
+ lowercase1 => 'sello',
+ X => 'Sellos',
+ lowercaseX => 'sellos',
+ P1 => 'El Sello',
+ lowercaseP1 => 'el sello',
+ U1 => 'Un Sello',
+ lowercaseU1 => 'un sello',
+ AP1 => 'Al Sello',
+ lowercaseAP1 => 'al sello',
+ DP1 => 'Del Sello',
+ lowercaseDP1 => 'del sello',
+ PX => 'Los Sellos',
+ lowercasePX => 'los sellos',
+ E1 => 'Este Sello',
+ lowercaseE1 => 'este sello',
+ EX => 'Estos Sellos',
+ lowercaseEX => 'estos sellos'
+ },
+ NewItem => 'Nuevo sello',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCwines.pm b/lib/gcstar/GCLang/ES/GCModels/GCwines.pm
new file mode 100644
index 0000000..faf0002
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCwines.pm
@@ -0,0 +1,82 @@
+{
+ package GCLang::ES::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de vinos',
+ Items => {0 => 'Vino',
+ 1 => 'Vino',
+ lowercase1 => 'vino',
+ X => 'Vinos',
+ lowercaseX => 'vinos',
+ P1 => 'El Vino',
+ lowercaseP1 => 'el vino',
+ U1 => 'Un Vino',
+ lowercaseU1 => 'un vino',
+ AP1 => 'Al Vino',
+ lowercaseAP1 => 'al vino',
+ DP1 => 'Del Vino',
+ lowercaseDP1 => 'del vino',
+ PX => 'Los Vinos',
+ lowercasePX => 'los vinos',
+ E1 => 'Este Vino',
+ lowercaseE1 => 'este vino',
+ EX => 'Estos Vinos',
+ lowercaseEX => 'estos vinos'
+ },
+ NewItem => 'Nuevo vino',
+
+ Name => 'Nombre',
+ Designation => 'Designación',
+ Vintage => 'Cosecha',
+ Vineyard => 'Viñedo',
+ Type => 'Tipo',
+ Grapes => 'Uvas',
+ Soil => 'Suelo',
+ Producer => 'Productor',
+ Country => 'País',
+ Volume => 'Volumen (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medalla/Honores',
+
+ Storage => 'Almacenamiento',
+ Location => 'Localización',
+ ShelfIndex => 'Índice',
+ Quantity => 'Cantidad',
+ Acquisition => 'Adquisición',
+ PurchaseDate => 'Fecha de compra',
+ PurchasePrice => 'Precio de compra',
+ Gift => 'Regalo',
+ BottleLabel => 'Etiqueta de la botella',
+ Website => 'Referencias en la Web',
+
+ Tasted => 'Catado',
+ Comments => 'Comentarios',
+ Serving => 'Servir',
+ TastingField => 'Notas para cata',
+
+ General => 'General',
+ Details => 'Detalles',
+ Tasting => 'Cata',
+
+ TastedNo => 'No catado',
+ TastedYes => 'Catado',
+
+ FilterRange => 'Rango',
+ FilterTastedNo => '_No catado',
+ FilterTastedYes => 'Ya _catado',
+ FilterRatingSelect => 'Puntuación al _menos...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCstar.pm b/lib/gcstar/GCLang/ES/GCstar.pm
new file mode 100644
index 0000000..66966b4
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCstar.pm
@@ -0,0 +1,673 @@
+{
+ package GCLang::ES;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Español',
+
+ 'Separator' => ' : ',
+
+ 'Warning' => '<b>Aviso</b> :
+
+La información descargada desde Internet (gracias a
+los plugins de búsqueda) es sólo para <b>uso personal</b>
+
+Cualquier redistribución queda prohibida <b> sin la
+explícita autorización de las respectivas webs</b>.
+
+Para saber cual es la web a la que pertenece la información,
+puede usar <b>el botón situado debajo de los detalles de la película</b>.',
+
+ 'AllItemsFiltered' => 'Ninguna {lowercaseX} cumple con los criterios de filtrado', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Instalar en ',
+ 'InstallMandatory' => 'Componentes obligatorios',
+ 'InstallOptional' => 'Componentes opcionales',
+ 'InstallErrorMissing' => 'Error: los componentes siguientes deben instalarse: ',
+ 'InstallPrompt' => 'Directorio predeterminado para la instalación [/usr/local]: ',
+ 'InstallEnd' => 'Fin de la instalación',
+ 'InstallNoError' => 'Ningún error',
+ 'InstallLaunch' => 'Para utilizar la aplicación, ejecute ',
+ 'InstallDirectory' => 'Repertorio básico',
+ 'InstallTitle' => 'Instalación de GCstar',
+ 'InstallDependencies' => 'Dependencias',
+ 'InstallPath' => 'Ruta',
+ 'InstallOptions' => 'Opciones',
+ 'InstallSelectDirectory' => 'Elija el directorio para la instalación',
+ 'InstallWithClean' => 'Eliminar archivos del directorio de instalación.',
+ 'InstallWithMenu' => 'Añadir GCstar al menu de Aplicaciones',
+ 'InstallNoPermission' => 'Error : No tiene permisos para instalar en el directorio seleccionado!!',
+ 'InstallMissingMandatory' => 'Algunas dependencias obligatorias no están disponibles. No podrá instalar GCstar hasta que se instalen en el sistema.',
+ 'InstallMissingOptional' => 'Algunas depencias opcionales no están disponibles. Se detallan debajo. GCstar se instalará con algunas funciones deshabilitadas.',
+ 'InstallMissingNone' => 'Dependencias satisfechas. Puede continuar e instalar GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'No disponible',
+ 'InstallMissingFor' => 'No disponible por',
+ 'InstallCleanDirectory' => 'Eliminado ficheros de GCstar en el diretorio: ',
+ 'InstallCopyDirectory' => 'Copiando ficheros en el directorio: ',
+ 'InstallCopyDesktop' => 'Copiando el fichero .desktop en: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy a usar (si no usa ninguno presione Enter): ',
+ 'UpdateNoPermission' => 'Permiso de escritura denegado en este directorio: ',
+ 'UpdateNone' => 'No se ha encontrado ninguna actualización',
+ 'UpdateFileNotFound' => 'Fichero no encontrado',
+
+#Splash
+ 'SplashInit' => 'Inicialización',
+ 'SplashLoad' => 'Cargando películas',
+ 'SplashDisplay' => 'Mostrando Colección',
+ 'SplashSort' => 'Sorting Collection',
+ 'SplashDone' => 'Listo',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Parece que antes usaba GCfilms. ¿Qué quiere importar desde GCfilms a GCstar? (No afectará a GCfilms, si todavía quiere seguir usándolo)',
+ 'GCfilmsImportOptions' => 'Preferencias',
+ 'GCfilmsImportData' => 'Listado de películas',
+
+#Menus
+ 'MenuFile' => '_Archivo',
+ 'MenuNewList' => '_Nueva lista de películas',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_Ficheros abiertos recientemente',
+ 'MenuLend' => '_Ver {lowercaseX} prestadas', # Accepts model codes
+ 'MenuImport' => '_Importar',
+ 'MenuExport' => '_Exportar',
+ 'MenuAddItem' => '_Add {lowercase1}', # Accepts model codes
+
+ 'MenuEdit' => '_Editar',
+ 'MenuDuplicate' => '_Duplicar {lowercase1}', # Accepts model codes
+ 'MenuDuplicatePlural' => '_Duplicar {lowercaseX}', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _all {lowercaseX}', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Eliminar {lowercase1} actual',, # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Eliminar {lowercaseX} actual', # Accepts model codes
+ 'MenuEditFields' => '_Cambiar campos de la colección',
+ 'MenuEditLockItems' => '_Bloquear la información',
+
+ 'MenuDisplay' => '_Visualización',
+ 'MenuSavedSearches' => 'Búsquedas guardadas',
+ 'MenuSavedSearchesSave' => 'Guardar búsqueda actual',
+ 'MenuSavedSearchesEdit' => 'Modificar búsquedas guardadas',
+ 'MenuAdvancedSearch' => 'Búsqueda _avanzada',
+ 'MenuViewAllItems' => '_Ver todas {lowercasePX}', # Accepts model codes
+ 'MenuNoFilter' => '_Todas las películas',
+
+ 'MenuConfiguration' => '_Configuración',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Información a mostrar',
+ 'MenuBorrowers' => 'Pres_tatarios',
+ 'MenuToolbarConfiguration' => 'Controles de la barra de _herramientas',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Conversión de _géneros',
+
+ 'MenuBookmarks' => 'Mis _Colecciones',
+ 'MenuBookmarksAdd' => '_Añadir colección actual',
+ 'MenuBookmarksEdit' => '_Editar colecciones favoritas',
+
+ 'MenuHelp' => '_?',
+ 'MenuHelpContent' => '_?',
+ 'MenuAllPlugins' => 'Ver _complementos',
+ 'MenuBugReport' => 'Comunicar un _fallo',
+ 'MenuAbout' => 'A propósito de _GCstar',
+
+ 'MenuNewWindow' => 'Mostrar {lowercase1} en una nueva ventana', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Mostrar {lowercaseX} en una nueva ventana', # Accepts model codes
+
+ 'ContextExpandAll' => 'Expandir todo',
+ 'ContextCollapseAll' => 'Contraer todo',
+ 'ContextChooseImage' => 'Elegir _Imagen',
+ 'ContextOpenWith' => 'Abrir _Con',
+ 'ContextImageEditor' => 'Editor de Imágenes',
+ 'ContextImgFront' => 'Frontal',
+ 'ContextImgBack' => 'Trasera',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Introduzca un valor por favor',
+
+ 'RemoveConfirm' => '¿Realmente quiere eliminar {lowercaseE1}?', # Accepts model codes
+ 'RemoveConfirmPlural' => '¿Realmente quiere eliminar {lowercaseEX}?', # Accepts model codes
+
+ 'DefaultNewItem' => 'Elemento nuevo',
+ 'NewItemTooltip' => 'Añadir una nueva película',
+ 'NoItemFound' => 'Ninguna película encontrada. ¿Quiere intentar una nueva búsqueda en otro sitio?',
+ 'OpenList' => '¿Qué lista de películas abrir?',
+ 'SaveList' => '¿En qué fichero quiere guardar el listado?',
+ 'SaveListTooltip' => 'Guardar el listado actual',
+ 'SaveUnsavedChanges' => 'Hay cambios sin guardar en su colección. ¿Quiere guardarlos?',
+ 'SaveDontSave' => 'No guardar',
+ 'PreferencesTooltip' => 'Cambiar sus preferencias',
+ 'ViewTooltip' => 'Cambiar el tipo de lista',
+ 'PlayTooltip' => 'Reproducir archivo de video asociado {lowercaseAP1}', # Accepts model codes
+ 'PlayFileNotFound' => 'No se encontró el fichero a reproducir:',
+ 'PlayRetry' => 'Reintentar',
+
+ 'StatusSave' => 'Guardando...',
+ 'StatusLoad' => 'Cargando...',
+ 'StatusSearch' => 'Búsqueda en curso...',
+ 'StatusGetInfo' => 'Descargando la información...',
+ 'StatusGetImage' => 'Descarga a distancia de la imagen...',
+
+ 'SaveError' => 'Imposible guardar la lista de películas. Compruebe los permisos y el espacio disponible en el disco.',
+ 'OpenError' => 'Imposible abrir la lista de películas. Compruebe los permisos.',
+ 'OpenFormatError' => 'Imposible abrir la lista de películas.',
+ 'OpenVersionWarning' => 'La colección se creó con una versión mñas erciente de GCstar. Si la guarda, podría perder datos.',
+ 'OpenVersionQuestion' => '¿Todavía quiere continuar?',
+ 'ImageError' => 'El repertorio elegido para salvar las imágenes no es correcto.¿Quiere elegir otro?',
+ 'OptionsCreationError'=> 'Imposible crear el fichero de opciones : ',
+ 'OptionsOpenError'=> 'Imposible abrir el fichero de opciones : ',
+ 'OptionsSaveError'=> 'Imposible guardar el fichero de opciones',
+ 'ErrorModelNotFound' => 'Modelo no encontrado: ',
+ 'ErrorModelUserDir' => 'Los modelos definidos por el usuario están en: ',
+
+ 'RandomTooltip' => '¿Qué quieres ver esta noche?',
+ 'RandomError'=> 'No quedan {lowercaseX} sin ver', # Accepts model codes
+ 'RandomEnd'=> 'No hay mas {lowercaseX}', # Accepts model codes
+ 'RandomNextTip'=> 'Siguiente sugerencia',
+ 'RandomOkTip'=> 'Aceptar {lowercaseE1}',
+
+ 'AboutTitle' => 'A propósito de GCstar',
+ 'AboutDesc' => 'Gestión de Colecciones',
+ 'AboutVersion' => 'Versión',
+ 'AboutTeam' => 'Equipo',
+ 'AboutWho' => 'Christian Jodar (Tian) : Gestión del proyecto, Programación
+Nyall Dawson (Zombiepig) : Programación
+TPF : Programación
+Adolfo González Blázquez : Programación
+',
+ 'AboutLicense' => 'Distribuido según los términos de la GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Traducción : Adolfo González Blázquez',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logo y diseño web por le Spektre',
+
+ 'ToolbarRandom' => 'Esta noche',
+
+ 'UnsavedCollection' => 'Colección no guardada',
+ 'ModelsSelect' => 'Seleccionar un tipo de colección',
+ 'ModelsPersonal' => 'Modelos personales',
+ 'ModelsDefault' => 'Modelos predefinidos',
+ 'ModelsList' => 'Definición de la colección',
+ 'ModelSettings' => 'Preferencias de la colección',
+ 'ModelNewType' => 'Nuevo tipo de colección',
+ 'ModelName' => 'Nombre del tipo de colección:',
+ 'ModelFields' => 'Fields',
+ 'ModelOptions' => 'Options',
+ 'ModelFilters' => 'Filters',
+ 'ModelNewField' => 'Nuevo campo',
+ 'ModelFieldInformation' => 'Información',
+ 'ModelFieldName' => 'Etiqueta:',
+ 'ModelFieldType' => 'Tipo:',
+ 'ModelFieldGroup' => 'Grupo:',
+ 'ModelFieldValues' => 'Valores',
+ 'ModelFieldInit' => 'Predeterminado:',
+ 'ModelFieldMin' => 'Mínimo:',
+ 'ModelFieldMax' => 'Máximo:',
+ 'ModelFieldList' => 'Lista de valores:',
+ 'ModelFieldListLegend' => '<i>Separados por comas</i>',
+ 'ModelFieldDisplayAs' => 'Mostrar como:',
+ 'ModelFieldDisplayAsText' => 'Texto',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Texto corto',
+ 'ModelFieldTypeLongText' => 'Texto largo',
+ 'ModelFieldTypeYesNo' => 'Si/No',
+ 'ModelFieldTypeNumber' => 'Número',
+ 'ModelFieldTypeDate' => 'Fecha',
+ 'ModelFieldTypeOptions' => 'Lista de valores prefedinidos',
+ 'ModelFieldTypeImage' => 'Imagen',
+ 'ModelFieldTypeSingleList' => 'Lista simple',
+ 'ModelFieldTypeFile' => 'Fichero',
+ 'ModelFieldTypeFormatted' => 'Dependant on other fields',
+ 'ModelFieldParameters' => 'Parámetros',
+ 'ModelFieldHasHistory' => 'Usar historial',
+ 'ModelFieldFlat' => 'Mostrar en una línea',
+ 'ModelFieldStep' => 'Paso de incremento:',
+ 'ModelFieldFileFormat' => 'Formato de fichero:',
+ 'ModelFieldFileFile' => 'Fichero simple',
+ 'ModelFieldFileImage' => 'Imagen',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Programa',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Campos a usar',
+ 'ModelOptionsFieldsAuto' => 'Automático',
+ 'ModelOptionsFieldsNone' => 'Ninguno',
+ 'ModelOptionsFieldsTitle' => 'Como título',
+ 'ModelOptionsFieldsId' => 'Como identificador',
+ 'ModelOptionsFieldsCover' => 'Como portada',
+ 'ModelOptionsFieldsPlay' => 'Como botón de Reproducir',
+ 'ModelCollectionSettings' => 'Preferencias de la colección',
+ 'ModelCollectionSettingsLending' => 'Los elementos se pueden prestar',
+ 'ModelCollectionSettingsTagging' => 'Los elementos se pueden etiquetar',
+ 'ModelFilterActivated' => 'Debe aparecer en la caja de búsqueda',
+ 'ModelFilterComparison' => 'Comparación',
+ 'ModelFilterContain' => 'Contiene',
+ 'ModelFilterDoesNotContain' => 'No contiene',
+ 'ModelFilterRegexp' => 'Expresión regular',
+ 'ModelFilterRange' => 'Rango',
+ 'ModelFilterNumeric' => 'Comparación numérica',
+ 'ModelFilterQuick' => 'Crear un filtro rápido',
+ 'ModelTooltipName' => 'Usar un nombre para reutilizar este modelo para otras colecciones. Si lo deja vacío, las preferencias se guardatán en la propia colección',
+ 'ModelTooltipLabel' => 'El nombre del campo como será mostrado',
+ 'ModelTooltipGroup' => 'Usado para agrupar los campos. Los elementos sin calor aparecerán en el grupo por defecto',
+ 'ModelTooltipHistory' => '¿Deberían almacenarse los valores introducidos anteriormente en una lista asociada al campo?',
+ 'ModelTooltipFormat' => 'El formato se usa para determinar la acción para abrir el fichero al pulsar el botón de Reproducir',
+ 'ModelTooltipLending' => 'Se añadirán algunos campos para administrar los préstamos',
+ 'ModelTooltipTagging' => 'Se añadirán algunos campos para administrar las etiquetas',
+ 'ModelTooltipNumeric' => '¿Se deberían considerar los valores como números para las comparaciones?',
+ 'ModelTooltipQuick' => 'Esto añadirá un submenu dentro del menu de Filtros',
+
+ 'ResultsTitle' => 'Elija {lowercaseU1}', # Accepts model codes
+ 'ResultsNextTip' => 'Buscar en el siguiente sitio',
+ 'ResultsPreview' => 'Previsualizar',
+ 'ResultsInfo' => 'Puedes añadir varios elementos a la colección presionando Control ó Mayúsculas y seleccionándolos', # Accepts model codes
+
+ 'OptionsTitle' => 'Preferencias',
+ 'OptionsExpertMode' => 'Modo experto',
+ 'OptionsPrograms' => 'Especifíque que aplicaciones usar para cada tipo de medio, o déjelos en blanco para usar los predeterminados del sistema',
+ 'OptionsBrowser' => 'Navegador de Internet',
+ 'OptionsPlayer' => 'Reproductor de video',
+ 'OptionsAudio' => 'Reproductor de audio',
+ 'OptionsImageEditor' => 'Editor de imágenes',
+ 'OptionsCdDevice' => 'Dispositivo de CD',
+ 'OptionsImages' => 'Directorio de imágenes',
+ 'OptionsUseRelativePaths' => 'Usar rutas relativas para las imágenes',
+ 'OptionsLayout' => 'Disposición',
+ 'OptionsStatus' => 'Barra de estado',
+ 'OptionsUseStars' => 'Usar estrellas para mostrar las puntuaciones',
+ 'OptionsWarning' => 'Cuidado : Los cambios efectuados en este pestaña no se tendrán en cuenta hasta reiniciar la aplicación',
+ 'OptionsRemoveConfirm' => 'Pedir confirmación antes de eliminar',
+ 'OptionsAutoSave' => 'Protección automática de la lista de películas',
+ 'OptionsAutoLoad' => 'Cargar la colección anterior en el inicio',
+ 'OptionsSplash' => 'Mostrar la pantalla de arranque',
+ 'OptionsTearoffMenus' => 'Activar menus desprendibles',
+ 'OptionsSpellCheck' => 'Usar corrector de ortografía en los campos de texto largos',
+ 'OptionsProgramTitle' => 'Elija el programa que debe utilizarse',
+ 'OptionsPlugins' => 'Sitio para descargar las fichas',
+ 'OptionsAskPlugins' => 'Preguntar',
+ 'OptionsPluginsMulti' => 'Varios sitios',
+ 'OptionsPluginsMultiAsk' => 'Preguntar (Algunos sitios)',
+ 'OptionsPluginsMultiPerField' => 'Varios sitios (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Definir la lista',
+ 'OptionsAskImport' => 'Elegir los campos que deben importarse',
+ 'OptionsProxy' => 'Utilizar un proxy',
+ 'OptionsCookieJar' => 'Usar este fichero de cookie jar',
+ 'OptionsMain' => 'Principal',
+ 'OptionsLang' => 'Idioma',
+ 'OptionsPaths' => 'Directorios',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Opciones',
+ 'OptionsDisplay' => 'Visualización',
+ 'OptionsToolbar' => 'Barra de herramientas',
+ 'OptionsToolbars' => {0 => 'Ninguna', 1 => 'Pequeña', 2 => 'Grande', 3 => 'Predeterminado del sistema'},
+ 'OptionsToolbarPosition' => 'Posición',
+ 'OptionsToolbarPositions' => {0 => 'Arriba', 1 => 'Abajo', 2 => 'Izquierda', 3 => 'Derecha'},
+ 'OptionsExpandersMode' => 'Extensores demasiado largos',
+ 'OptionsExpandersModes' => {'asis' => 'No hacer nada', 'cut' => 'Cortar', 'wrap' => 'Dividir las lineas'},
+ 'OptionsDateFormat' => 'Formato de fecha',
+ 'OptionsDateFormatTooltip' => 'El formato usado es el mismo de strftime(3). El predeterminado es %d/%m/%Y',
+ 'OptionsView' => 'Visualización de las películas',
+ 'OptionsViews' => {0 => 'Texto', 1 => 'Imagen', 2 => 'Detallada'},
+ 'OptionsColumns' => 'Columnas',
+ 'OptionsMailer' => 'Método de envío de los correos electrónicos',
+ 'OptionsSMTP' => 'Servidor',
+ 'OptionsFrom' => 'Correo electrónico del remitente',
+ 'OptionsTransform' => 'Poner al final de los títulos los artículos',
+ 'OptionsArticles' => 'Artículos (separados por una coma)',
+ 'OptionsSearchStop' => 'El usuario puede parar las búsquedas',
+ 'OptionsBigPics' => 'Usar imágenes grandes cuando estén disponibles',
+ 'OptionsAlwaysOriginal' => 'Usar título principal como el original si no se encuentra ninguno',
+ 'OptionsRestoreAccelerators' => 'Restaurar aceleradores',
+ 'OptionsHistory' => 'Tamaño del historial',
+ 'OptionsClearHistory' => 'Limpiar el historial',
+ 'OptionsStyle' => 'Piel',
+ 'OptionsDontAsk' => 'No preguntar nunca más',
+ 'OptionsPathProgramsGroup' => 'Aplicaciones',
+ 'OptionsProgramsSystem' => 'Usar programas predefinidos del sistema',
+ 'OptionsProgramsUser' => 'Usar programas definidos por el usuario',
+ 'OptionsProgramsSet' => 'Establecer programas',
+ 'OptionsPathImagesGroup' => 'Imágenes',
+ 'OptionsInternetDataGroup' => 'Importar datos',
+ 'OptionsInternetSettingsGroup' => 'Preferencias',
+ 'OptionsDisplayInformationGroup' => 'Mostrar información',
+ 'OptionsDisplayArticlesGroup' => 'Artículos',
+ 'OptionsImagesDisplayGroup' => 'Mostrar',
+ 'OptionsImagesStyleGroup' => 'Estilo',
+ 'OptionsDetailedPreferencesGroup' => 'Preferencias',
+ 'OptionsFeaturesConveniencesGroup' => 'conveniencias',
+ 'OptionsPicturesFormat' => 'Prefijo para usar en las imágenes:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Título o nombre del elemento asociado',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% o . se reemplazará con el directorio de la colección (usar sólo al principio de la ruta)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% se reemplazará por el nombre de la colecciñón si el sufijo (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% sólo se puede usar al principio de la ruta para imágenes',
+ 'OptionsConfigureMailers' => 'Configurar programas de envío correo',
+
+ 'ImagesOptionsButton' => 'Preferencias',
+ 'ImagesOptionsTitle' => 'Preferencias para el listado de imágenes',
+ 'ImagesOptionsSelectColor' => 'Elija un color',
+ 'ImagesOptionsUseOverlays' => 'Utilizar superposición de imágenes',
+ 'ImagesOptionsBg' => 'Fondo',
+ 'ImagesOptionsBgPicture' => 'Usar una imagen de fondo',
+ 'ImagesOptionsFg'=> 'Selección',
+ 'ImagesOptionsBgTooltip' => 'Cambiar el color de fondo',
+ 'ImagesOptionsFgTooltip'=> 'Cambiar el color de la selección',
+ 'ImagesOptionsResizeImgList' => 'Cambiar automáticamente el número de columnas',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Tamaño',
+ 'ImagesOptionsSizeList' => {0 => 'Muy Pequeño', 1 => 'Pequeño', 2 => 'Mediano', 3 => 'Grande', 4 => 'Extra Grande'},
+ 'ImagesOptionsSizeTooltip' => 'Seleccione el tamaño de imagen',
+
+ 'DetailedOptionsTitle' => 'Preferencias del listado detallado',
+ 'DetailedOptionsImageSize' => 'Tamaño de la imagen',
+ 'DetailedOptionsGroupItems' => 'Agrupar elementos por',
+ 'DetailedOptionsSecondarySort' => 'Ordenar los campos por el hijo',
+ 'DetailedOptionsFields' => 'Seleccione los campos a mostrar',
+ 'DetailedOptionsGroupedFirst' => 'Mantener juntos los elementos huérfanos',
+ 'DetailedOptionsAddCount' => 'Añadir el número de elementos en las categorías',
+
+ 'ExtractButton' => 'Información',
+ 'ExtractTitle' => 'Información del Fichero de Video',
+ 'ExtractImport' => 'Usar valores',
+
+ 'FieldsListOpen' => 'Leer los campos de la lista desde un fichero',
+ 'FieldsListSave' => 'Guardar los campos de la lista a un fichero',
+ 'FieldsListError' => 'Estos campor no se pueden usar con este tipo de colección',
+ 'FieldsListIgnore' => '--- Ignorar',
+
+ 'ExportTitle' => 'Exportar el listado de películas',
+ 'ExportFilter' => 'Exportar sólo las películas mostradas',
+ 'ExportFieldsTitle' => 'Campos a exportar',
+ 'ExportFieldsTip' => 'Elija los campos a exportar',
+ 'ExportWithPictures' => 'Copiar las imágenes a un subdirectorio',
+ 'ExportSortBy' => 'Ordenar por',
+ 'ExportOrder' => 'Orden',
+
+ 'ImportListTitle' => 'Importar otro listado de películas',
+ 'ImportExportData' => 'Datos',
+ 'ImportExportFile' => 'Fichero',
+ 'ImportExportFieldsUnused' => 'Campos sin utilizar',
+ 'ImportExportFieldsUsed' => 'Campos utilizados',
+ 'ImportExportFieldsFill' => 'Todos los campos',
+ 'ImportExportFieldsClear' => 'Ningún campo',
+ 'ImportExportFieldsEmpty' => 'Debe señalar al menos un campo',
+ 'ImportExportFileEmpty' => 'Especifique un nombre para el fichero',
+ 'ImportFieldsTitle' => 'Campos a importar',
+ 'ImportFieldsTip' => 'Elija los campos a importar',
+ 'ImportNewList' => 'Crear un nuevo listado',
+ 'ImportCurrentList' => 'Añadir al listado actual',
+ 'ImportDropError' => 'Hubo un error abriendo al menos un fichero. Se recargará el listado anterior.',
+ 'ImportGenerateId' => 'Generate identifier for each item',
+
+ 'FileChooserOpenFile' => '¿En qué fichero guardar?',
+ 'FileChooserDirectory' => 'Directorio',
+ 'FileChooserOpenDirectory' => 'Elija un directorio',
+ 'FileChooserOverwrite' => 'Este fichero ya existe. ¿Quiere sustituirlo?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ 'PanelCompact' => 'Compacto',
+ 'PanelReadOnly' => 'Sólo Lectura',
+ 'PanelForm' => 'Pestañas',
+
+ 'PanelSearchButton' => 'Descargar',
+ 'PanelSearchTip' => 'Buscar información relativa a la película',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Pulse en la imagen para elegir otra.',
+ 'PanelImageTipView' => 'Pulse en la imagen para verla en su tamaño real...',
+ 'PanelImageTipMenu' => 'Click con el botón derecho para mas opciones.',
+ 'PanelImageTitle' => 'Seleccionar una imagen',
+ 'PanelImageNoImage' => 'Sin imagen',
+ 'PanelSelectFileTitle' => 'Seleccione un fichero',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restaurar predeterminado',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'De',
+ 'PanelTo' =>'Para',
+
+ 'PanelWeb' => 'Ver la ficha en Internet',
+ 'PanelWebTip' => 'Ver la ficha {lowercaseDP1} en Internet', # Accepts model codes
+ 'PanelRemoveTip' => 'Eliminar {lowercaseP1} anteriormente mencionada', # Accepts model codes
+
+ 'PanelDateSelect' => 'Cambiar la fecha',
+ 'PanelNobody' => 'Nadie',
+ 'PanelUnknown' => 'Desconocido',
+ 'PanelAdded' => 'Añadida el (fecha)',
+ 'PanelRating' => 'Nota',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Sitio',
+
+ 'PanelLending' => 'Préstamo',
+ 'PanelBorrower' => 'Prestatario',
+ 'PanelLendDate' => 'Fecha',
+ 'PanelHistory' => 'Historial',
+ 'PanelReturned' => '{1} devuelta', # Accepts model codes
+ 'PanelReturnDate' => 'Fecha de devolución',
+ 'PanelLendedYes' => 'Prestada',
+ 'PanelLendedNo' => 'Disponible',
+
+ 'PanelTags' => 'Etiquetas',
+ 'PanelFavourite' => 'Favorita',
+ 'TagsAssigned' => 'Etiquetas asignadas',
+
+ 'PanelUser' => 'Campos del usuario',
+
+ 'CheckUndef' => 'Cualquiera',
+ 'CheckYes' => 'Si',
+ 'CheckNo' => 'No',
+
+ 'ToolbarAll' => 'Ver todas',
+ 'ToolbarAllTooltip' => 'Ver todas las películas',
+ 'ToolbarGroupBy' => 'Agrupar por',
+ 'ToolbarGroupByTooltip' => 'Seleccionar el campo a usar para agrupos los elementos en la lista',
+ 'ToolbarQuickSearch' => 'Búsqueda rápida',
+ 'ToolbarQuickSearchLabel' => 'Buscar',
+ 'ToolbarQuickSearchTooltip' => 'Seleccione el campo en el que buscar. Introduzca los términos de búsqueda y pulse Enter',
+ 'ToolbarSeparator' => ' Separador',
+
+ 'PluginsTitle' => 'Buscar una película',
+ 'PluginsQuery' => 'Búsqueda',
+ 'PluginsFrame' => 'Sitio donde buscar ',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Nombre',
+ 'PluginsSearchFields' => 'Campos de búsqueda',
+ 'PluginsAuthor' => 'Autor',
+ 'PluginsLang' => 'Idioma',
+ 'PluginsUseSite' => 'Usar sitio seleccionado para futuras búsquedas',
+ 'PluginsPreferredTooltip' => 'Sitio recomendado por GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Configuración de los prestatarios',
+ 'BorrowersList' => 'Prestatarios',
+ 'BorrowersName' => 'Nombre',
+ 'BorrowersEmail' => 'Correo electrónico',
+ 'BorrowersAdd' => 'Añadir',
+ 'BorrowersRemove' => 'Eliminar',
+ 'BorrowersEdit' => 'Modificar',
+ 'BorrowersTemplate' => 'Modelo de correo electrónico',
+ 'BorrowersSubject' => 'Título del correo electrónico : ',
+ 'BorrowersNotice1' => '%1 se sustituirá por el nombre del prestatario',
+ 'BorrowersNotice2' => '%2 se sustituirá por el título de la película',
+ 'BorrowersNotice3' => '%3 se sustituirá por la fecha del préstamo',
+
+ 'BorrowersImportTitle' => 'Importar información de prestatarios',
+ 'BorrowersImportType' => 'Formato del fichero:',
+ 'BorrowersImportFile' => 'Fichero:',
+
+ 'BorrowedTitle' => '{X} prestadas', # Accepts model codes
+ 'BorrowedDate' => 'Desde el',
+ 'BorrowedDisplayInPanel' => 'Mostrar {lowercase1} en la ventana principal', # Accepts model codes
+
+ 'MailTitle' => 'Enviar un correo electrónico',
+ 'MailFrom' => 'De: ',
+ 'MailTo' => 'Para: ',
+ 'MailSubject' => 'Tema: ',
+ 'MailSmtpError' => 'Problema de conexión con el servidor',
+ 'MailSendmailError' => 'Problema ejecutando sendmail',
+
+ 'SearchTooltip' => 'Buscar en todas {lowercasePX}', # Accepts model codes
+ 'SearchTitle' => 'Búsqueda de {lowercasePX}', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Campo a sustituir',
+ 'QueryReplaceOld' => 'Nombre actual',
+ 'QueryReplaceNew' => 'Nuevo nombre',
+ 'QueryReplaceLaunch' => 'Sustituir',
+
+ 'ImportWindowTitle' => 'Elegir los campos que deben importarse',
+ 'ImportViewPicture' => 'Ver la imagen',
+ 'ImportSelectAll' => 'Seleccionarlo todo',
+ 'ImportSelectNone' => 'No seleccionar nada',
+
+ 'MultiSiteTitle' => 'Sitios donde buscar',
+ 'MultiSiteUnused' => 'Módulos no usados',
+ 'MultiSiteUsed' => 'Módulos a usar',
+ 'MultiSiteLang' => 'Usar todos los módulos españoles',
+ 'MultiSiteEmptyError' => 'La lista de sitios está vacía',
+ 'MultiSiteClear' => 'Vaciar la lista',
+
+ 'DisplayOptionsTitle' => 'Elementos a mostrar',
+ 'DisplayOptionsAll' => 'Seleccionarlo todo',
+ 'DisplayOptionsSearch' => 'Buscar',
+
+ 'GenresTitle' => 'Conversión de Géneros',
+ 'GenresCategoryName' => 'Género a usar',
+ 'GenresCategoryMembers' => 'Géneros a reemplazar',
+ 'GenresLoad' => 'Cargar una lista predefinida',
+ 'GenresExport' => 'Exportar listado a un fichero',
+ 'GenresModify' => 'Editar conversión',
+
+ 'PropertiesName' => 'Nombre de la colección',
+ 'PropertiesLang' => 'Código de idioma',
+ 'PropertiesOwner' => 'Dueño',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => 'Descripción',
+ 'PropertiesFile' => 'Información del fichero',
+ 'PropertiesFilePath' => 'Ruta completa',
+ 'PropertiesItemsNumber' => 'Número de {lowercaseX}', # Accepts model codes
+ 'PropertiesFileSize' => 'Tamaño',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Propiedades de la colección',
+ 'PropertiesDefaultPicture' => 'Imagen predeterminada',
+
+ 'MailProgramsTitle' => 'Programas para enviar correos',
+ 'MailProgramsName' => 'Nombre',
+ 'MailProgramsCommand' => 'Linea de comandos',
+ 'MailProgramsRestore' => 'Usar predeterminados',
+ 'MailProgramsAdd' => 'Añadir un programa',
+ 'MailProgramsInstructions' => 'En la linea de comandos se hacen algunas sustituciones:
+ %f se sustituirá por la dirección de e-mail del usuario.
+ %t se sustituirá por la dirección del destinatario.
+ %s se sustituirá por el asunto del mensaje.
+ %b se sustituirá por el cuerpo del mensaje.',
+
+ 'BookmarksBookmarks' => 'Marcadores',
+ 'BookmarksFolder' => 'Directorio',
+ 'BookmarksLabel' => 'Etiqueta',
+ 'BookmarksPath' => 'Ruta',
+ 'BookmarksNewFolder' => 'Nueva carpeta',
+
+ 'AdvancedSearchType' => 'Tipo de búsqueda',
+ 'AdvancedSearchTypeAnd' => '{X} que cumplan todos los criterios', # Accepts model codes
+ 'AdvancedSearchTypeOr' => '{X} que cunplan al menos un criterio', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Critero',
+ 'AdvancedSearchAnyField' => 'Cualquier campo',
+ 'AdvancedSearchSaveTitle' => 'Guardar búsqueda',
+ 'AdvancedSearchSaveName' => 'Nombre',
+ 'AdvancedSearchSaveOverwrite' => 'Ya esixte una búsqueda guardada con el mismo nombre. Por favor, use uno diferente.',
+ 'AdvancedSearchUseCase' => 'Sensible a mayúsculas',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignorar acentos y otros diacríticos',
+
+ 'BugReportSubject' => 'Informe de error generado por GCstar',
+ 'BugReportVersion' => 'Versión',
+ 'BugReportPlatform' => 'Sistema operativo',
+ 'BugReportMessage' => 'Mensaje de error',
+ 'BugReportInformation' => 'Información adicional',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/FR/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/FR/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..cc127ca
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::FR::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Inclure les noms des champs au début',
+ 'Separator' => 'Séparateur',
+ 'Replacement' => 'Remplacer le séparateur par',
+ 'Charset' => 'Codage',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/FR/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..5047880
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::FR::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Disque externe',
+ 'ZipAll' => 'Tout compresser dans un fichier (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/FR/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..2a0dc7d
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::FR::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Ficher de modèle invalide',
+ 'UseFile' => 'Utiliser le fichier ci-dessous',
+ 'TemplateExternalFile' => 'Fichier avec le modèle',
+ 'WithJS' => 'Utiliser du Javascript',
+ 'FileTemplate' => 'Modèle',
+ 'Preview' => 'Aperçu',
+ 'NoPreview' => 'Aucun aperçu disponible',
+ 'Title' => 'Titre de la page',
+ 'InfoFile' => 'La liste se trouve dans le fichier : ',
+ 'InfoDir' => 'Les images se trouvent dans : ',
+ 'HeightImg' => 'Hauteur en pixels des images',
+ 'OpenFileInBrowser' => 'Ouvrir le fichier généré dans le navigateur web',
+ 'Note' => 'Liste générée avec <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Entrez le texte à rechercher',
+ 'SearchType1' => 'Titre seulement',
+ 'SearchType2' => 'Toutes les informations',
+ 'SearchButton' => 'Rechercher',
+ 'SearchTitle' => 'Afficher seulement les films correspondant aux critères précédents',
+ 'AllButton' => 'Tous',
+ 'AllTitle' => 'Afficher tous les films',
+ 'Expand' => 'Tout développer',
+ 'ExpandTitle' => 'Afficher les informations de tous les films',
+ 'Collapse' => 'Tout réduire',
+ 'CollapseTitle' => 'Masquer les informations de tous les films',
+ 'Borrowed' => 'Emprunté par : ',
+ 'NotBorrowed' => 'Disponible',
+ 'Top' => 'Haut',
+ 'Bottom' => 'Bas',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/FR/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..3bd6b81
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::FR::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Nom de la base de données',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/FR/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..c8778d7
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::FR::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Inclure une instruction DROP',
+ 'WithCreate' => 'Inclure une instruction CREATE',
+ 'TableName' => 'Nom de la table',
+ 'InfoFile' => 'Fichier SQL : ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/FR/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..9ea6b9a
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::FR::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'L\'archive se trouve dans le fichier : ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/FR/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..1bf56db
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::FR::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Fichier modèle',
+ 'ModelText' => 'Texte du modèle',
+ 'Models' => 'Modèle à utiliser',
+ 'UseFile' => 'Spécifié dans un fichier',
+ 'UseModel' => 'Spécifié dans la zone texte',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/FR/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..41971e8
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::FR::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Où rechercher :',
+ 'Default' => 'Répertoire par défaut Alexandria',
+ 'Specified' => 'Répertoire indiqué ci-dessous',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/FR/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..f1d3f5d
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::FR::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Codage',
+ 'Header' => 'Ignorer la première ligne',
+ 'Separator' => 'Séparateur',
+ 'Plugin' => 'Site à utiliser',
+ 'UseFirst' => 'Choisir le 1er si plusieurs résultats',
+ 'SearchField' => 'Chercher en utilisant',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/FR/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..9c0ffc4
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::FR::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Répertoire',
+ 'Recursive' => 'Parcourir les sous-répertoires',
+ 'Suffixes' => 'Suffixes ou extensions des fichiers',
+ 'SuffixesTooltip' => 'Une liste séparée par des virgules des suffixes ou extensions des fichiers à considérer',
+ 'Remove' => 'A supprimer des noms',
+ 'RemoveTooltip' => 'Une liste séparée par des virgules des mots à supprimer des noms de fichiers pour créer le nom à rechercher',
+ 'MultipleResult'=> 'Résultats multiples',
+ 'MultipleResultTooltip'=> 'Que faire si la recherche retourne plus d\'un résultat',
+ 'Ask'=> 'Demander',
+ 'AskEnd'=> 'Demander à la fin',
+ 'AddWithoutInfo'=> 'Ajouter sans informations',
+ 'DontAdd'=> 'Ne pas ajouter',
+ 'TakeFirst' => 'Choisir le premier',
+ 'NoResult'=> 'Pas de résultat',
+ 'NoResultTooltip'=> 'Que faire si la recherche ne retourne aucun résultat',
+ 'RemoveWholeWord' => 'Retirer seulement les mots entiers',
+ 'RemoveTooltipWholeWord' => 'Ne retire que des mots entiers du nom de fichier',
+ 'RemoveRegularExpr' => 'Expression regulière',
+ 'RemoveTooltipRegularExpr' => 'Considere \'A supprimer des noms\' comme une expression regulière perl',
+ 'SkipFileAlreadyInCollection' => 'N\'ajouter que les nouveaux fichiers',
+ 'SkipFileAlreadyInCollectionTooltip' => 'N\'ajouter que les nouveaux fichiers à collection',
+ 'SkipFileNo' => 'Non',
+ 'SkipFileFullPath' => 'd\'après le chemin complet',
+ 'SkipFileFileName' => 'd\'après le nom de fichier',
+ 'SkipFileFileNameAndUpdate' => 'd\'après le nom de fichier (et mettre à jour le chemin des présents)',
+ 'InfoFromFileNameRegExp' => 'Parser nom du fichier avec cette expression régulière',
+ 'InfoFromFileNameRegExpTooltip' => 'Recupère des informations du nom de fichier (appliqué après avoir enlevé l\'extention).\nLaisser vide si inutile.\nChamps reconnus : \n$T:Titre, $A:Titre Alphabetisé, $Y:Année de sortie, $S:Saison, $E:Episode, $N:Nom de série alphabetisé, $x:numero de partie, $y:nombre total de parties',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/FR/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..6067ec8
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::FR::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copier les images',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCImport/GCImportList.pm b/lib/gcstar/GCLang/FR/GCImport/GCImportList.pm
new file mode 100644
index 0000000..2ecce7f
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::FR::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Liste de noms',
+ 'Plugin' => 'Site à utiliser',
+ 'UseFirst' => 'Choisir le 1er si plusieurs résultats',
+ 'CommentAuto' => 'Film importé automatiquement.',
+ 'CommentSite' => 'Site web : ',
+ 'CommentTitle' => 'Titre : ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/FR/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..ed0a90c
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::FR::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Lecteur de codes barres',
+ 'Type' => 'Type de lecteur',
+ 'Local' => 'Local (reconnu comme un clavier)',
+ 'Network' => 'Réseau (ex : GCstar Scanner sur Android)',
+ 'Port' => 'Port à écouter',
+ 'Plugin' => 'Site à utiliser',
+ 'UseFirst' => 'Choisir le 1er si plusieurs résultats',
+ 'Waiting' => 'En attente de code barre',
+ 'EAN' => 'Code barre',
+ 'ScanPrompt' => 'Scannez un article ou pressez sur Terminer',
+ 'ScanOtherPrompt' => 'Scannez un autre article ou pressez sur Terminer',
+ 'Previous' => '"%s" va être ajouté',
+ 'NothingFound' => 'Rien n\'a été trouvé pour "%s". Un élément vide va être ajouté.',
+ 'Terminate' => 'Terminer',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/FR/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..d0e33bb
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::FR::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Le fichier n\'est pas un type de catalogue Tellico supporté',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/FR/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..353ad6d
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCTVepisodes.pm
@@ -0,0 +1,60 @@
+{
+ package GCLang::FR::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection d\'épisodes de séries TV',
+ Items => {0 => 'Épisode',
+ 1 => 'Épisode',
+ X => 'Épisodes',
+ I1 => 'Un épisode',
+ D1 => 'L\'épisode',
+ DX => 'Les épisodes',
+ DD1 => 'De l\'épisode',
+ M1 => 'Cet épisode',
+ C1 => ' épisode',
+ DA1 => '\'épisode',
+ DAX => '\'épisodes'},
+ NewItem => 'Nouvel épisode',
+ NewSeries => 'Nouvelle série',
+ Episode => 'Épisode',
+
+ General => 'Fiche de l\'épisode',
+ Writer => 'Scénariste',
+ Seen => 'Épisode déjà vu',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/FR/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..28c37c0
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCTVseries.pm
@@ -0,0 +1,60 @@
+{
+ package GCLang::FR::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de séries TV',
+ Items => {0 => 'Série',
+ 1 => 'Série',
+ X => 'Séries',
+ I1 => 'Une série',
+ D1 => 'La série',
+ DX => 'Les séries',
+ DD1 => 'De la série',
+ M1 => 'Cette série',
+ C1 => 'e série',
+ DA1 => 'e série',
+ DAX => 'e séries'},
+ NewItem => 'Nouvelle série',
+ Name => 'Nom',
+ Season => 'Saison',
+ Part => 'Partie',
+ Episodes => 'Épisodes',
+ FirstAired => 'Première diffusion',
+ Time => 'Durée épisode',
+ Producer => 'Producteur',
+ Music => 'Musique',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/FR/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..63e27bc
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCboardgames.pm
@@ -0,0 +1,94 @@
+{
+ package GCLang::FR::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de jeux de société',
+ Items => {0 => 'Jeu',
+ 1 => 'Jeu',
+ X => 'Jeux',
+ I1 => 'Un jeu',
+ D1 => 'Le jeu',
+ DX => 'Les jeux',
+ DD1 => 'Du jeu',
+ M1 => 'Ce jeu',
+ C1 => ' jeu',
+ DA1 => 'e jeu',
+ DAX => 'e jeux'},
+ NewItem => 'Nouveau jeu',
+
+ Id => 'Id',
+ Name => 'Nom',
+ Original => 'Nom original',
+ Box => 'Image de la boîte',
+ DesignedBy => 'Auteur(s)',
+ PublishedBy => 'Éditeur',
+ Players => 'Nombre de joueurs',
+ PlayingTime => 'Durée d\'une partie',
+ SuggestedAge => 'Age suggéré',
+ Released => 'Date de sortie',
+ Description => 'Description',
+ Category => 'Thème(s)',
+ Mechanics => 'Mécanisme(s)',
+ ExpandedBy => 'Extension(s) existante(s)',
+ ExpansionFor => 'Extension de',
+ GameFamily => 'Famille du jeu',
+ IllustratedBy => 'Illustrateur(s)',
+ Url => 'Page web',
+ TimesPlayed => 'Nombre de parties jouées',
+ CompleteContents => 'Contenu complet',
+ Copies => 'Nombre d\'exemplaire(s)',
+ Condition => 'État',
+ Photos => 'Images',
+ Photo1 => 'Première image',
+ Photo2 => 'Deuxième image',
+ Photo3 => 'Troisième image',
+ Photo4 => 'Quatrième image',
+ Comments => 'Commentaires',
+
+ Perfect => 'Parfait',
+ Good => 'Bon',
+ Average => 'Moyen',
+ Poor => 'Mauvais',
+
+ CompleteYes => 'Contenu complet',
+ CompleteNo => 'Pièces manquantes',
+
+ General => 'Général',
+ Details => 'Détails',
+ Personal => 'Personnel',
+ Information => 'Informations',
+
+ FilterRatingSelect => '_Notes au moins égales à...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCbooks.pm b/lib/gcstar/GCLang/FR/GCModels/GCbooks.pm
new file mode 100644
index 0000000..33515c7
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCbooks.pm
@@ -0,0 +1,78 @@
+{
+ package GCLang::FR::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de livres',
+ Items => {0 => 'Livre',
+ 1 => 'Livre',
+ X => 'Livres',
+ I1 => 'Un livre',
+ D1 => 'Le livre',
+ DX => 'Les livres',
+ DD1 => 'Du livre',
+ M1 => 'Ce livre',
+ C1 => ' livre',
+ DA1 => 'e livre',
+ DAX => 'e livres'},
+ NewItem => 'Nouveau livre',
+
+ Isbn => 'ISBN',
+ Title => 'Titre',
+ Cover => 'Couverture',
+ Authors => 'Auteurs',
+ Publisher => 'Editeur',
+ Publication => 'Date de publication',
+ Language => 'Langue',
+ Genre => 'Genres',
+ Serie => 'Série',
+ Rank => 'Rang',
+ Bookdescription => 'Description',
+ Pages => 'Pages',
+ Read => 'Lu',
+ Acquisition => 'Date d\'acquisition',
+ Edition => 'Edition',
+ Format => 'Format',
+ Comments => 'Commentaires',
+ Url => 'Page web',
+ Translator => 'Traducteur',
+ Artist => 'Artiste',
+ DigitalFile => 'Digital version',
+
+ General => 'Fiche',
+ Details => 'Détails',
+
+ ReadNo => 'Non lu',
+ ReadYes => 'Lu',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCcoins.pm b/lib/gcstar/GCLang/FR/GCModels/GCcoins.pm
new file mode 100644
index 0000000..836318a
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCcoins.pm
@@ -0,0 +1,112 @@
+{
+ package GCLang::FR::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection numismatique',
+ Items => {0 => 'Pièce',
+ 1 => 'Pièce',
+ X => 'Pièces',
+ I1 => 'Une pièce',
+ D1 => 'La pièce',
+ DX => 'Les pièces',
+ DD1 => 'De la pièce',
+ M1 => 'Cette pièces',
+ C1 => 'e pièce',
+ DA1 => 'e pièce',
+ DAX => 'e pièces'},
+ NewItem => 'Nouvelle pièce',
+
+ Name => 'Nom de la pièce',
+ Country => 'Pays',
+ Year => 'Année',
+ Currency => 'Devise',
+ Value => 'Valeur',
+ Picture => 'Image principale',
+ Diameter => 'Diamètre (mm)',
+ Metal => 'Métal',
+ Edge => 'Tranche',
+ Edge1 => 'Tranche 1',
+ Edge2 => 'Tranche 2',
+ Edge3 => 'Tranche 3',
+ Edge4 => 'Tranche 4',
+ Head => 'Avers',
+ Tail => 'Revers',
+ Comments => 'Commentaire',
+ History => 'Historique',
+ Website => 'Site web',
+ Estimate => 'Estimation (€)',
+ References => 'Références',
+ Type => 'Type',
+ Coin => 'Pièce',
+ Banknote => 'Billet',
+
+ Main => 'Principal',
+ Description => 'Description',
+ Other => 'Infos complémentaires',
+ Pictures => 'Photos',
+
+ Condition => 'Conservation',
+ Grade1 => 'AB-1',
+ Grade2 => 'AB-2',
+ Grade3 => 'AB-3',
+ Grade4 => 'B-4',
+ Grade6 => 'B-6',
+ Grade8 => 'B-8',
+ Grade10 => 'B-10',
+ Grade12 => 'B-12',
+ Grade15 => 'B-15',
+ Grade20 => 'TB-20',
+ Grade25 => 'TB-25',
+ Grade30 => 'TB-30',
+ Grade35 => 'TB-35',
+ Grade40 => 'TTB-40',
+ Grade45 => 'TTB-45',
+ Grade50 => 'TTB-50',
+ Grade53 => 'TTB-53',
+ Grade55 => 'SUP-55',
+ Grade58 => 'SUP-58',
+ Grade60 => 'SPL-60',
+ Grade61 => 'SPL-61',
+ Grade62 => 'SPL-62',
+ Grade63 => 'SPL-63',
+ Grade64 => 'SPL-64',
+ Grade65 => 'SPL-65',
+ Grade66 => 'SPL-66',
+ Grade67 => 'SPL-67',
+ Grade68 => 'SPL-68',
+ Grade69 => 'SPL-69',
+ Grade70 => 'FDC-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCcomics.pm b/lib/gcstar/GCLang/FR/GCModels/GCcomics.pm
new file mode 100644
index 0000000..ae8d501
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCcomics.pm
@@ -0,0 +1,81 @@
+{
+ package GCLang::FR::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de Bandes Dessinées',
+ Items => {0 => 'Bandes Dessinées',
+ 1 => 'Bande Dessinée',
+ X => 'Bandes Dessinées',
+ I1 => 'Une bande dessinée',
+ D1 => 'La bande dessinée',
+ DX => 'Les bandes dessinées',
+ DD1 => 'De la bande dessinée',
+ M1 => 'Cette bande dessinée',
+ C1 => 'e bande dessinée',
+ DA1 => 'e bande dessinée',
+ DAX => 'e bandes dessinées'},
+ NewItem => 'Nouvelle BD',
+
+
+ Id => 'Id',
+ Name => 'Nom',
+ Series => 'Série',
+ Volume => 'Tome',
+ Title => 'Titre',
+ Writer => 'Scénariste',
+ Illustrator => 'Dessinateur',
+ Colourist => 'Coloriste',
+ Publisher => 'Editeur',
+ Synopsis => 'Résumé',
+ Collection => 'Collection',
+ PublishDate => 'Dépot Légal',
+ PrintingDate => 'Date d\'impression',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Catégorie',
+ Format => 'Format',
+ NumberBoards => 'Nombre de planches',
+ Signing => 'Dédicace',
+ Cost => 'Cote',
+ Rating => 'Note',
+ Comment => 'Commentaires',
+ Url => 'Page Web',
+
+ FilterRatingSelect => 'Notes au _moins egales à...',
+
+ Main => 'Principaux éléments',
+ General => 'Général',
+ Details => 'Détails',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCfilms.pm b/lib/gcstar/GCLang/FR/GCModels/GCfilms.pm
new file mode 100644
index 0000000..607b48e
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCfilms.pm
@@ -0,0 +1,101 @@
+{
+ package GCLang::FR::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de films',
+ Items => {0 => 'Film',
+ 1 => 'Film',
+ X => 'Films',
+ I1 => 'Un film',
+ D1 => 'Le film',
+ DX => 'Les films',
+ DD1 => 'Du film',
+ M1 => 'Ce film',
+ C1 => ' film',
+ DA1 => 'e film',
+ DAX => 'e films'},
+ NewItem => 'Nouveau film',
+
+
+ Id => 'Id',
+ Title => 'Titre',
+ Date => 'Date de sortie',
+ Time => 'Durée',
+ Director => 'Réalisateur',
+ Country => 'Nationalité',
+ MinimumAge => 'Age minimum',
+ Genre => 'Genres',
+ Image => 'Image',
+ Original => 'Titre original',
+ Actors => 'Acteurs',
+ Actor => 'Acteur',
+ Role => 'Rôle',
+ Comment => 'Commentaires',
+ Synopsis => 'Synopsis',
+ Seen => 'Film déjà vu',
+ Number => 'Nombre',
+ Format => 'Format',
+ Region => 'Région',
+ Identifier => 'Identifiant',
+ Url => 'Page web',
+ Audio => 'Audio',
+ Video => 'Format vidéo',
+ Trailer => 'Fichier vidéo',
+ Serie => 'Série',
+ Rank => 'Rang',
+ Subtitles => 'Sous-titres',
+
+ SeenYes => 'Vu',
+ SeenNo => 'Non vu',
+
+ AgeUnrated => 'Inconnu',
+ AgeAll => 'Aucune restriction',
+ AgeParent => 'Accord parental',
+
+ Main => 'Principaux éléments',
+ General => 'Fiche du film',
+ Details => 'Détails',
+
+ Information => 'Informations',
+ Languages => 'Langues',
+ Encoding => 'Encodage',
+
+ FilterAudienceAge => 'Age du public',
+ FilterSeenNo => 'Films _non vus',
+ FilterSeenYes => 'Films _déjà vus',
+ FilterRatingSelect => 'Notes au moins égales à...',
+
+ ExtractSize => 'Dimensions',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCgames.pm b/lib/gcstar/GCLang/FR/GCModels/GCgames.pm
new file mode 100644
index 0000000..87358cc
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCgames.pm
@@ -0,0 +1,92 @@
+{
+ package GCLang::FR::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de jeux vidéo',
+ #Items => 'Jeux',
+ Items => {0 => 'Jeu',
+ 1 => 'Jeu',
+ X => 'Jeux',
+ I1 => 'Un jeu',
+ D1 => 'Le jeu',
+ DX => 'Les jeux',
+ DD1 => 'Du jeu',
+ M1 => 'Ce jeu',
+ C1 => ' jeu',
+ DA1 => 'e jeu',
+ DAX => 'e jeux'},
+ NewItem => 'Nouveau jeu',
+
+ Id => 'Identifiant',
+ Ean => 'EAN',
+ Name => 'Nom',
+ Platform => 'Plate-forme',
+ Players => 'Nombre de joueurs',
+ Released => 'Date de sortie',
+ Editor => 'Editeur',
+ Developer => 'Développeur',
+ Genre => 'Genre',
+ Box => 'Boîtier',
+ BoxBack => 'Arrière',
+ Case => 'Boîte',
+ Manual => 'Notice',
+ Completion => 'Avancement (%)',
+ Executable => 'Exécutable',
+ Description => 'Description',
+ Codes => 'Codes',
+ Code => 'Code',
+ Effect => 'Effet',
+ Secrets => 'Secrets',
+ Screenshots => 'Captures',
+ Screenshot1 => '1ère capture',
+ Screenshot2 => '2ème capture',
+ Comments => 'Commentaires',
+ Url => 'Page Web',
+ Unlockables => 'Déblocables',
+ Unlockable => 'Déblocable',
+ Howto => 'Comment débloquer',
+ Exclusive => 'Exclusivité',
+ Resolutions => 'Résolutions',
+ InstallationSize => 'Taille',
+ Region => 'Région',
+ SerialNumber => 'Numéro de série',
+
+ General => 'Général',
+ Details => 'Détails',
+ Tips => 'Astuces',
+ Information => 'Informations',
+
+ FilterRatingSelect => 'Notes au moins égales à...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/FR/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..53a386a
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCgeneric.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::FR::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Élément',
+ 1 => 'Élément',
+ X => 'Éléments',
+ I1 => 'Un élément',
+ D1 => 'L\'élément',
+ DX => 'Les éléments',
+ DD1 => 'De l\'élément',
+ M1 => 'Cet élément',
+ C1 => ' élément',
+ DA1 => '\'élément',
+ DAX => '\'éléments',
+ },
+ NewItem => 'Nouvel élément',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCminicars.pm b/lib/gcstar/GCLang/FR/GCModels/GCminicars.pm
new file mode 100644
index 0000000..120ac81
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCminicars.pm
@@ -0,0 +1,190 @@
+{
+ package GCLang::FR::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de Véhicules Miniatures',
+ Items => {0 => 'Miniature',
+ 1 => 'Miniature',
+ X => 'Miniatures',
+ I1 => 'Une miniature',
+ D1 => 'La miniature',
+ DX => 'Les miniatures',
+ DD1 => 'De la miniature',
+ M1 => 'Cette miniature',
+ C1 => 'e miniature',
+ DA1 => 'e miniature',
+ DAX => 'e miniatures'},
+ NewItem => 'Nouvelle Miniature',
+ Currency => 'Devise',
+
+ Help => 'Aide sur les Champs à Remplir',
+ Help1 => 'Aide',
+
+# Traduction des Champs "Main"
+
+ Main => 'La Miniature en Bref ',
+
+ Name => 'Nom de la Miniature',
+ Exchange => 'Miniature à Échanger ou à Vendre',
+ Wanted => 'Miniature Recherchée',
+ Rating1 => 'Note Globale',
+ Picture1 => 'Image Principale',
+ Scale => 'Échelle',
+ Manufacturer => 'Fabricant',
+ Constructor => 'Constructeur',
+ Type1 => 'Type',
+ Modele => 'Modèle',
+ Version => 'Version',
+ Color => 'Couleur du Modèle',
+ Pub => 'Publicité',
+ Year => 'Année',
+ Reference => 'Référence',
+ Kit => 'Miniature en Kit',
+ Transformation => 'Transformation Personnelle',
+ Comments1 => 'Commentaire',
+
+# Traduction des Champs "Details"
+
+ Details => 'La Miniature en Détails ',
+ MiscCharacteristics => 'Caractéristiques Diverses de la Miniature',
+ Material => 'Matériaux',
+ Molding => 'Type du Moule',
+ Condition => 'État du Modèle',
+ Edition => 'Édition',
+ Collectiontype => 'Nom de la Collection',
+ Serial => 'Série',
+ Serialnumber => 'Numéro de Série',
+ Designed => 'Conçu en',
+ Madein => 'Fabriqué en',
+ Box1 => 'Type de Boîte',
+ Box2 => 'Descriptif de la Boîte',
+ Containbox => 'Contenu de la Boîte (ou Coffret)',
+ Rating2 => 'Réalisme',
+ Rating3 => 'Qualité de Finition',
+ Acquisition => 'Date d\'Acquisition',
+ Location => 'Lieu d\'Acquisition',
+ Buyprice => 'Prix d\'Acquisition (€)',
+ Estimate => 'Estimation (€)',
+ Comments2 => 'Commentaire',
+ Decorationset => 'Diorama',
+ Characters => 'Personnages',
+ CarFromFilm => 'Véhicule de film',
+ Filmcar => 'Film Associé à la Voiture',
+ Filmpart => 'Épisode du Film / Titre',
+ Parts => 'Nombre de Pièces',
+ VehiculeDetails => 'Détails du Véhicule',
+ Detailsparts => 'Pièces de Détaillages',
+ Detailsdecorations => 'Types de Décorations',
+ Decorations => 'Nombre de Décorations',
+ Lwh => 'Longueur / Largeur / Hauteur (cm)',
+ Weight => 'Poids (g)',
+ Framecar => 'Châssis',
+ Bodycar => 'Carrosserie',
+ Colormirror => 'Couleur du Modèle',
+ Interior => 'Intérieur du Modèle',
+ Wheels => 'Roues / Jantes / Essieux',
+ Registrationnumber1 => 'Plaque d\'Immatriculation Avant',
+ Registrationnumber2 => 'Plaque d\'Immatriculation Arrière',
+ RacingCar => 'Véhicules de Course (Rallye,F1,DTM..)',
+ Course => 'Course',
+ Courselocation => 'Lieu de la Course',
+ Courseyear => 'Date de la Course',
+ Team => 'Équipe (Écurie)',
+ Pilots => 'Pilote(s)',
+ Copilots => 'Co Pilote(s)',
+ Carnumber => 'Numéro de la Voiture',
+ Pub2 => 'Publicitaires',
+ Finishline => 'Place à l\'Arrivée',
+ Steeringwheel => 'Position du volant',
+
+
+# Traduction des Champs "Catalogs"
+
+ Catalogs => 'La Miniature Cataloguée ',
+
+ OfficialPicture => 'Photo Officielle de la Miniature',
+ Barcode => 'Code à Barres',
+ Referencemirror => 'Référence',
+ Year3 => 'Date de Sortie',
+ CatalogCoverPicture => 'Couverture',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Année du Catalogue / Fascicule',
+ Catalogedition => 'Édition du Catalogue',
+ Catalogpage => 'Page du Catalogue',
+ Catalogprice => 'Prix Catalogue / Librairie (€)',
+ Personalref => 'Référence Personnelle',
+ Websitem => 'Site Web Fabricant',
+ Websitec => 'Site Web Constructeur',
+ Websiteo => 'Lien Utile',
+ Comments3 => 'Commentaire',
+
+# Traduction des Champs "Pictures"
+
+ Pictures => 'La Miniature en Photos ',
+
+ OthersComments => 'Remarques Diverses',
+ OthersDetails => 'Autres Détails',
+ Top1 => 'Dessus',
+ Back1 => 'Dessous',
+ AVG => 'Avant Gauche',
+ AV => 'Face Avant',
+ AVD => 'Avant Droit',
+ G => 'Profil Gauche',
+ BOX => 'Boîte',
+ D => 'Profil Droit',
+ ARG => 'Arrière Gauche',
+ AR => 'Face Arrière',
+ ARD => 'Arrière Droit',
+
+
+ Others => 'Divers',
+
+# Traduction des Champs "PanelLending"
+
+ LendingExplanation => 'Permet de faire des échanges pour les expositions temporaires',
+ PanelLending => 'Emprunts (Pour Expositions) ',
+ Comments4 => 'Commentaire',
+
+# Traduction des Champs "Realmodel"
+
+ Realmodel => 'Le Modèle Réel ',
+
+ Difference => 'Différences avec la Miniature',
+ Front2 => 'Avant',
+ Back2 => 'Arrière',
+ Comments5 => 'Commentaire',
+
+ References => 'Références',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCmusics.pm b/lib/gcstar/GCLang/FR/GCModels/GCmusics.pm
new file mode 100644
index 0000000..3319d93
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCmusics.pm
@@ -0,0 +1,76 @@
+{
+ package GCLang::FR::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection musicale',
+ Items => {0 => 'Album',
+ 1 => 'Album',
+ X => 'Albums',
+ I1 => 'Un album',
+ D1 => 'L\'album',
+ DX => 'Les albums',
+ DD1 => 'De l\'album',
+ M1 => 'Cet album',
+ C1 => ' album',
+ DA1 => '\'album',
+ DAX => '\'albums'},
+ NewItem => 'Nouvel album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Titre',
+ Cover => 'Pochette',
+ Artist => 'Artiste',
+ Format => 'Format',
+ Running => 'Durée',
+ Release => 'Date de sortie',
+ Genre => 'Genre',
+ Origin => 'Origine',
+
+#For tracks list
+ Tracks => 'Pistes',
+ Number => 'Numéro',
+ Track => 'Titre',
+ Time => 'Durée',
+
+ Composer => 'Compositeur',
+ Producer => 'Producteur',
+ Playlist => 'Liste de lecture',
+ Comments => 'Commentaires',
+ Label => 'Label',
+ Url => 'Page web',
+
+ General => 'Géneral',
+ Details => 'Détails',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/FR/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..f03001e
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCperiodicals.pm
@@ -0,0 +1,60 @@
+{
+ package GCLang::FR::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de périodiques / magazines',
+ Items => {0 => 'Périodique',
+ 1 => 'Périodique',
+ X => 'Périodique',
+ I1 => 'Un périodique',
+ D1 => 'Le périodique',
+ DX => 'Les périodiques',
+ DD1 => 'Du périodique',
+ M1 => 'Ce périodique',
+ C1 => ' périodique',
+ DA1 => 'e périodique',
+ DAX => 'e périodiques'},
+ NewItem => 'Nouveau périodique',
+
+ Title => 'Titre',
+ Cover => 'Couverture',
+ Periodical => 'Périodique',
+ Number => 'Numéro',
+ Date => 'Date',
+ Subject => 'Sujet',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/FR/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..7ad1cd4
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::FR::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de Cartes à Puce',
+ Items => {0 => 'Carte',
+ 1 => 'Carte',
+ X => 'Cartes'},
+ NewItem => 'Nouvelle Carte à Puce',
+ Currency => 'Devise',
+
+ Help => 'Aide sur les Champs à Remplir',
+ Help1 => 'Aide',
+
+# Traduction des Champs "Main"
+
+ Main => 'La Carte à Puce en Bref ',
+
+ Cover => 'Image',
+
+ Name => 'Nom de la Carte à Puce',
+ Exchange => 'Carte à Échanger ou à Vendre',
+ Wanted => 'Carte Recherchée',
+ Rating1 => 'Qualité Globale',
+ TheSmartCard => 'La Carte à Puce Recto / Verso',
+
+ Country => 'Pays',
+ Color => 'Couleur de la Carte',
+ Type1 => 'Type de Carte',
+ Type2 => 'Type de Puce',
+ Dimension => 'Longueur / Largeur / Épaisseur (cm)',
+
+ Box => 'Emballage',
+ Chip => 'Puce',
+ Year1 => 'Date d\'Edition',
+ Year2 => 'Date de Validité',
+ Condition => 'Carte Neuve',
+ Charge => 'Carte Rechargeable',
+ Variety => 'Variété',
+
+ Edition => 'Tirage (Exemplaires)',
+ Serial => 'Numéro de Série',
+ Theme => 'Thème',
+
+ Acquisition => 'Carte Acquise le',
+
+ Catalog0 => 'Catalogue',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Référence',
+ Reference1 => 'Référence Phonecote / Infopuce (YT)',
+ Reference2 => 'Référence La Cote en Poche',
+ Reference3 => 'Référence Autre',
+
+ Quotationnew00 => 'Cotation Carte Neuve (en €)',
+ Quotationnew10 => 'Cotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Cotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Cotation Carte Utilisée (en €)',
+ Quotationold10 => 'Cotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Cotation La Cote en Poche',
+ Quotationold30 => 'Cotation Autre',
+
+ Title1 => 'Titre',
+
+ Unit => 'Nombre d\'Unités / Minutes',
+
+ Pressed => 'Type d\'Impression',
+ Location => 'Lieu d\'Impression',
+
+ Comments1 => 'Observations',
+
+ Others => 'Divers',
+ Weight => 'Poids',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/FR/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..c1e2568
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::FR::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de logiciels',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'Nouvelle application',
+
+ Id => 'Identifian',
+ Ean => 'EAN',
+ Name => 'Nom',
+ Platform => 'Plate-forme',
+ Released => 'Date de sortie',
+ Homepage => 'Site web',
+ Editor => 'Editeur',
+ Developer => 'Développeur',
+ Category => 'Catégorie',
+ NumberOfCopies => 'Copies',
+ Price => 'Prix',
+ Box => 'Photo de la boîte',
+ Case => 'Boîtier',
+ Manual => 'Notice',
+ Executable => 'Exécutable',
+ Description => 'Description',
+ License => 'Licence',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (en usage non-commercial)',
+ OtherOpenSource => 'Autre licence Open Source',
+ PublicDomain => 'Domaine public',
+ OtherLicense => 'Autre',
+ Registration => 'Enregistrement',
+ RegistrationInfo => 'Informations d\'enregistrement',
+ RegInfo => 'Informations',
+ RegistrationName => 'Nom d\'utilisateur',
+ RegistrationNumber => 'Numéro d\'enregistrement',
+ PanelRegistration => 'Informations d\'enregistrement',
+ RegistrationComments => 'Informations supplémentaires',
+ Screenshots => 'Captures d\'écran',
+ Screenshot1 => '1ère capture',
+ Screenshot2 => '2ème capture',
+ Comments => 'Commentaires',
+ Url => 'Page web',
+ General => 'Général',
+ Details => 'Détails',
+ Information => 'Informations',
+
+ FilterRatingSelect => 'Notes au moins égales à...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCstamps.pm b/lib/gcstar/GCLang/FR/GCModels/GCstamps.pm
new file mode 100644
index 0000000..0ddc193
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCstamps.pm
@@ -0,0 +1,198 @@
+{
+ package GCLang::FR::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de timbres',
+ Items => {0 => 'Timbres',
+ 1 => 'Timbre',
+ X => 'Timbres',
+ I1 => 'Un timbre',
+ D1 => 'Le timbre',
+ DX => 'Les timbres',
+ DD1 => 'Du timbre',
+ M1 => 'Ce timbre',
+ C1 => ' timbre',
+ DA1 => 'e timbre',
+ DAX => 'e timbres'},
+ NewItem => 'Nouveau timbre',
+
+ General => 'Général',
+ Detail => 'Détail',
+ Value => 'Valeur',
+ Notes => 'Notes',
+ Views => 'Vues',
+
+ Name => 'Nom',
+ Country => 'Pays',
+ Year => 'Année',
+ DateIssue => 'Date d\'émission',
+ Catalog => 'Catalogue',
+ Number => 'Numéro',
+ Topic => 'Thématique',
+ Serie => 'Série',
+ Designer => 'Dessinateur',
+ Engraver => 'Graveur',
+ Type => 'Genre',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Couleur',
+ Gum => 'Gomme',
+ Paper => 'Papier',
+ Perforation => 'Dentelure',
+ PerforationSize => 'Taille de la dentelure',
+ CancellationType => 'Type d\'oblitération',
+ Comments => 'Commentaires',
+ PrintingVariety => 'Type d\'impression',
+ IssueDate => 'Date d\'émission',
+ EndOfIssue => 'Fin d\'émission',
+ Issue => 'Quantité émise',
+ Grade => 'Qualité',
+ Status => 'Statut',
+ Adjusted => 'Centrage',
+ Cancellation => 'Oblitération',
+ CancellationCondition => 'Condition d\'oblitération',
+ GumCondition => 'Etat de la gomme',
+ PerforationCondition => 'Etat de la dentelure',
+ ConditionNotes => 'Notes sur la condition',
+ Error => 'Erreur',
+ ErrorNotes => 'Notes d\'erreur',
+ FaceValue => 'Valeur faciale',
+ MintValue => 'Valeur neuve',
+ UsedValue => 'Valeur oblitérée',
+ PurchasedDate => 'Date d\'achat',
+ Quantity => 'Quantité',
+ History => 'Historique',
+ Picture1 => 'Image 1',
+ Picture2 => 'Image 2',
+ Picture3 => 'Image 3',
+
+ AirMail => 'Poste aérienne',
+ MilitaryStamp => 'Timbre de franchise militaire',
+ Official => 'Timbre de service',
+ PostageDue => 'Timbre taxe',
+ Regular => 'Timbre ordinaire',
+ Revenue => 'Timbre fiscal',
+ SpecialDelivery => 'Exprès',
+ StrikeStamp => 'Timbre de grève',
+ TelegraphStamp => 'Timbre télégraphe',
+ WarStamp => 'Timbre de guerre',
+ WarTaxStamp => 'Timbre d\'impôt de guerre',
+
+ Booklet => 'Carnet',
+ BookletPane => 'Bande de carnet',
+ Card => 'Carte',
+ Coil => 'Timbre de roulette',
+ Envelope => 'Enveloppe',
+ FirstDayCover => 'Lettre premier jour',
+ Sheet => 'Bloc feuillet',
+ Single => 'Timbre seul',
+
+ OriginalGum => 'Gomme d\'origine',
+ Ungummed => 'Non gommé',
+ Regummed => 'Regommé',
+
+ Chalky => 'Papier couché',
+ ChinaPaper => 'Papier de Chine',
+ Coarsed => 'Papier rugueux',
+ Glossy => 'Papier glacé',
+ Granite => 'Papier granite',
+ Laid => 'Papier vergé',
+ Manila => 'Papier bulle',
+ Native => 'Papier d\'origine',
+ Pelure => 'Papier pelure',
+ Quadrille => 'Papier quadrillé',
+ Ribbed => 'Papier côtelé',
+ Rice => 'Papier de riz',
+ Silk => 'Papier de soie',
+ Smoothed => 'Papier souple',
+ Thick => 'Papier épais',
+ Thin => 'Papier mince',
+ Wove => 'Papier vélin',
+
+ Heliogravure => 'Héliogravure',
+ Lithography => 'Lithographie',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Taille douce',
+ Typography => 'Typographie',
+
+ CoarsedPerforation => 'Dentelure grossière',
+ CombPerforation => 'Dentelure en peigne',
+ CompoundPerforation => 'Dentelure mixte',
+ DamagedPerforation => 'Dentelure endommagée',
+ DoublePerforation => 'Dentelure double',
+ HarrowPerforation => 'Dentelure à la herse',
+ LinePerforation => 'Dentelure linéaire',
+ NoPerforation => 'Aucune dentelure',
+
+ CancellationToOrder => 'Oblitération de complaisance',
+ FancyCancellation => 'Oblitération fantaisie',
+ FirstDayCancellation => 'Oblitération premier jour',
+ NumeralCancellation => 'Oblitération numérique',
+ PenMarked => 'Oblitération à la plume',
+ RailroadCancellation => 'Oblitération ferroviaire',
+ SpecialCancellation => 'Oblitération spéciale',
+
+ Superb => 'Superbe',
+ ExtraFine => 'Premier choix',
+ VeryFine => 'Très beau',
+ FineVeryFine => 'Beau/Très beau',
+ Fine => 'Beau',
+ Average => 'Moyen',
+ Poor => 'Mauvais',
+
+ Owned => 'Possédé',
+ Ordered => 'Commandé',
+ Sold => 'Vendu',
+ ToSell => 'A vendre',
+ Wanted => 'Souhaité',
+
+ LightCancellation => 'Légère oblitération',
+ HeavyCancellation => 'Forte oblitération',
+ ModerateCancellation => 'Oblitération modérée',
+
+ MintNeverHinged => 'Intacte',
+ MintLightHinged => 'Légère trace de charnière',
+ HingedRemnant => 'Marque de charnière',
+ HeavilyHinged => 'Grande trace de charnière',
+ LargePartOriginalGum => 'Gomme originale sur grande surface',
+ SmallPartOriginalGum => 'Gomme originale sur petite surface',
+ NoGum => 'Dégommé',
+
+ Perfect => 'Parfaite',
+ VeryNice => 'Très belle',
+ Nice => 'Belle',
+ Incomplete => 'Incomplète',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCwines.pm b/lib/gcstar/GCLang/FR/GCModels/GCwines.pm
new file mode 100644
index 0000000..1b2305e
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCwines.pm
@@ -0,0 +1,72 @@
+{
+ package GCLang::FR::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de vins',
+ Items => {0 => 'Vin',
+ 1 => 'Vin',
+ X => 'Vins',
+ I1 => 'Un vin',
+ D1 => 'Le vin',
+ DX => 'Les vins',
+ DD1 => 'Du vin',
+ M1 => 'Ce vin',
+ C1 => ' vin',
+ DA1 => 'e vin',
+ DAX => 'e vins'},
+ NewItem => 'Nouvelle bouteille',
+
+ Name => 'Nom',
+ Designation => 'Appellation',
+ Vintage => 'Millésime',
+ Vineyard => 'Nom du cru',
+ Type => 'Catégorie',
+ Grapes => 'Cépages',
+ Soil => 'Terroir',
+ Producer => 'Producteur',
+ Country => 'Pays',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcool (%)',
+ Medal => 'Distinction',
+
+ Storage => 'Entreposage',
+ Location => 'Lieu',
+ ShelfIndex => 'Position',
+ Quantity => 'Quantité',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Date d\'acquisition',
+ PurchasePrice => 'Prix d\'achat',
+ Gift => 'Offert',
+ BottleLabel => 'Etiquette de la bouteille',
+ Website => 'Référence sur internet',
+
+ Tasted => 'Testé',
+ Comments => 'Appréciation',
+ Serving => 'Service',
+ TastingField => 'Caractère',
+
+ General => 'Fiche',
+ Details => 'Détails',
+ Tasting => 'Dégustation',
+
+ TastedNo => 'Non testé',
+ TastedYes => 'Testé',
+
+ FilterRange => 'Intervalle',
+ FilterTastedNo => '_Non testés',
+ FilterTastedYes => '_Déjà testés',
+ FilterRatingSelect => 'Notes au _moins égales à...'
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCstar.pm b/lib/gcstar/GCLang/FR/GCstar.pm
new file mode 100644
index 0000000..3c30226
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCstar.pm
@@ -0,0 +1,673 @@
+{
+ package GCLang::FR;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Français',
+
+ 'Separator' => ' : ',
+
+ 'Warning' => '<b>Attention</b> :
+
+Les informations récupérées depuis des sites Internet
+(grâce aux modules de recherche) ne peuvent servir que
+pour une <b>utilisation personnelle</b> dans un cadre privé.
+
+Vous ne pouvez en aucune manière les redistribuer sans
+l\'<b>accord préalable</b> des sites concernés.
+
+Vous pourrez à tout instant connaître le site d\'où
+proviennent les informations d\'un élément en cliquant sur
+le <b>bouton situé en dessous de sa fiche</b>.',
+
+ 'AllItemsFiltered' => 'Aucun{lowercaseC1} ne correspond aux critères de filtrage', # Accepts model codes
+
+ 'InstallDirInfo' => 'Installation dans ',
+ 'InstallMandatory' => 'Composants obligatoires',
+ 'InstallOptional' => 'Composants optionnels',
+ 'InstallErrorMissing' => 'Erreur : Les composants Perl suivants doivent être installés : ',
+ 'InstallPrompt' => 'Répertoire de base pour l\'installation [/usr/local] : ',
+ 'InstallEnd' => 'Fin de l\'installation',
+ 'InstallNoError' => 'Aucune erreur',
+ 'InstallLaunch' => 'Pour utiliser l\'application, lancez ',
+ 'InstallDirectory' => 'Répertoire de base',
+ 'InstallTitle' => 'Installation de GCstar',
+ 'InstallDependencies' => 'Dépendances',
+ 'InstallPath' => 'Chemin',
+ 'InstallOptions' => 'Options',
+ 'InstallSelectDirectory' => 'Choisissez le répertoire de base pour l\'installation',
+ 'InstallWithClean' => 'Effacer précédents fichiers situés au même emplacement',
+ 'InstallWithMenu' => 'Ajouter GCstar au menu des applications',
+ 'InstallNoPermission' => 'Erreur: Vous n\'avez pas la permission d\'écrire dans le répertoire sélectionné',
+ 'InstallMissingMandatory' => 'Des dépendances obligatoires sont manquantes. Vous ne pourrez pas installer GCstar tant qu\'elles ne seront pas installées.',
+ 'InstallMissingOptional' => 'Quelques dépendances facultatives sont manquantes. Elles sont listées ci-dessous. GCstar peut être installé mais certaines fonctionnalités ne seront pas présentes.',
+ 'InstallMissingNone' => 'Aucune dépendance n\'est manquante. Vous pouvez poursuivre l\'installation de GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Manquant',
+ 'InstallMissingFor' => 'Manquant pour',
+ 'InstallCleanDirectory' => 'Suppression des fichiers GCstar dans le répertoire : ',
+ 'InstallCopyDirectory' => 'Copie des fichiers dans le répertoire : ',
+ 'InstallCopyDesktop' => 'Copie du fichier de lancement (.desktop) dans le répertoire : ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy à utiliser (appuyer simplement sur Entrée s\'il n\'y en a pas): ',
+ 'UpdateNoPermission' => 'Pas de permissions d\'écriture dans ce répertoire : ',
+ 'UpdateNone' => 'Aucune mise à jour trouvée',
+ 'UpdateFileNotFound' => 'Fichier non trouvé',
+
+#Splash
+ 'SplashInit' => 'Initialisation',
+ 'SplashLoad' => 'Chargement de la collection',
+ 'SplashDisplay' => 'Affichage de la collection',
+ 'SplashSort' => 'Tri de la collection',
+ 'SplashDone' => 'Prêt',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Il semblerait que vous utilisiez GCfilms. Que voulez vous importer de GCfilms vers GCstar (Cela n\'affectera pas GCfilms si vous continuez de l\'utiliser)?',
+ 'GCfilmsImportOptions' => 'Préférences',
+ 'GCfilmsImportData' => 'Liste de films',
+
+#Menus
+ 'MenuFile' => '_Fichier',
+ 'MenuNewList' => '_Nouvelle collection',
+ 'MenuStats' => 'Statistiques',
+ 'MenuHistory' => 'Fichiers récemment ouverts',
+ 'MenuLend' => 'Voir les {lowercaseX} empruntés', # Accepts model codes
+ 'MenuImport' => '_Importer',
+ 'MenuExport' => '_Exporter',
+ 'MenuAddItem' => '_Ajouter {lowercaseI1}', # Accepts model codes
+
+ 'MenuEdit' => '_Édition',
+ 'MenuDuplicate' => '_Dupliquer {lowercaseD1}', # Accepts model codes
+ 'MenuDuplicatePlural' => '_Dupliquer {lowercaseDX}', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Selectionner tous {lowercaseDX}', # Accepts model codes
+ 'MenuEditDeleteCurrent' => 'Su_pprimer {lowercaseD1} courant', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => 'Su_pprimer {lowercaseDX}', # Accepts model codes
+ 'MenuEditFields' => '_Changer les champs de la collection',
+ 'MenuEditLockItems' => 'Verroui_ller les informations',
+
+ 'MenuDisplay' => 'Fil_tres',
+ 'MenuSavedSearches' => 'Recherches sauvegardées',
+ 'MenuSavedSearchesSave' => 'Sauvegarder la recherche courante',
+ 'MenuSavedSearchesEdit' => 'Modifier les recherches sauvegardées',
+ 'MenuAdvancedSearch' => 'Recherche _Avancée',
+ 'MenuViewAllItems' => 'Voir _tous {lowercaseDX}', # Accepts model codes
+ 'MenuNoFilter' => '_Tous',
+
+ 'MenuConfiguration' => '_Configuration',
+ 'MenuDisplayMenu' => '_Affichage',
+ 'MenuDisplayFullScreen' => '_Plein écran',
+ 'MenuDisplayMenuBar' => '_Menus',
+ 'MenuDisplayToolBar' => 'Barre d\'_outils',
+ 'MenuDisplayStatusBar' => 'Barre d\'é_tat',
+ 'MenuDisplayOptions' => '_Informations à afficher',
+ 'MenuBorrowers' => '_Emprunteurs',
+ 'MenuToolbarConfiguration' => '_Boutons de la barre d\'outils',
+ 'MenuDefaultValues' => 'Valeurs par défaut lors de l\'ajout d{lowercaseDAX}', # Accepts model codes
+ 'MenuGenresConversion' => 'Conversions de _genres',
+
+ 'MenuBookmarks' => 'Mes _collections',
+ 'MenuBookmarksAdd' => '_Ajouter la collection courante',
+ 'MenuBookmarksEdit' => '_Éditer les collections sauvegardées',
+
+ 'MenuHelp' => '_Aide',
+ 'MenuHelpContent' => '_Contenu',
+ 'MenuAllPlugins' => 'Voir les _modules',
+ 'MenuBugReport' => 'Signaler un _dysfonctionnement',
+ 'MenuAbout' => 'À _propos de GCstar',
+
+ 'MenuNewWindow' => 'Afficher {lowercaseD1} dans une nouvelle fenêtre', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Afficher {lowercaseDX} dans une nouvelle fenêtre', # Accepts model codes
+
+ 'ContextExpandAll' => 'Tout développer',
+ 'ContextCollapseAll' => 'Tout réduire',
+ 'ContextChooseImage' => 'Changer l\'_image',
+ 'ContextOpenWith' => '_Envoyer à',
+ 'ContextImageEditor' => 'Éditeur d\'images',
+ 'ContextImgFront' => 'Recto',
+ 'ContextImgBack' => 'Verso',
+ 'ContextChooseFile' => 'Sélectionner un fichier',
+ 'ContextChooseFolder' => 'Sélectionner un répertoire',
+
+ 'DialogEnterNumber' => 'Veuillez entrer une valeur',
+
+ 'RemoveConfirm' => 'Voulez-vous vraiment supprimer {lowercaseM1} ?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Voulez-vous vraiment supprimer ces {lowercaseX} ?', # Accepts model codes
+
+ 'DefaultNewItem' => 'Nouvel élément', # Accepts model codes
+ 'NewItemTooltip' => 'Ajouter {lowercaseI1}', # Accepts model codes
+ 'NoItemFound' => 'Aucun{lowercaseC1} ne correspond. Voulez-vous tenter une recherche sur un autre site ?', # Accepts model codes
+ 'OpenList' => 'Quelle collection ouvrir ?',
+ 'SaveList' => 'Dans quel fichier enregistrer ?',
+ 'SaveListTooltip' => 'Enregistrer la liste courante',
+ 'SaveUnsavedChanges' => 'Vous avez des changements non sauvegardés dans votre collection. Voulez-vous les sauvegarder ?',
+ 'SaveDontSave' => 'Ne pas enregistrer',
+ 'PreferencesTooltip' => 'Changer vos préférences',
+ 'ViewTooltip' => 'Changer le type de liste',
+ 'PlayTooltip' => 'Lancer le fichier associé', # Accepts model codes
+ 'PlayFileNotFound' => 'Le fichier à lancer n\'a pas été trouvé dans cet emplacement :',
+ 'PlayRetry' => 'Réessayer',
+
+ 'StatusSave' => 'Sauvegarde...',
+ 'StatusLoad' => 'Chargement...',
+ 'StatusSearch' => 'Recherche en cours...',
+ 'StatusGetInfo' => 'Récupération des informations...',
+ 'StatusGetImage' => 'Téléchargement de l\'image...',
+
+ 'SaveError' => 'Impossible de sauver la collection. Vérifiez les permissions et la place disponible sur le disque.',
+ 'OpenError' => 'Impossible d\'ouvrir la collection. Vérifiez les permissions.',
+ 'OpenFormatError' => 'Impossible d\'ouvrir la collection. Le format semble ne pas être bon.',
+ 'OpenVersionWarning' => 'La collection a été créée avec une version plus récente de GCstar. Si vous la sauvegardez, vous pourriez perdre des données.',
+ 'OpenVersionQuestion' => 'Voulez-vous tout de même continuer ?',
+ 'ImageError' => 'Le répertoire choisi pour stocker les images n\'est pas correct. Veuillez en choisir un autre.',
+ 'OptionsCreationError'=> 'Impossible de créer le fichier d\'options : ',
+ 'OptionsOpenError'=> 'Impossible d\'ouvrir le fichier d\'options : ',
+ 'OptionsSaveError'=> 'Impossible d\'enregistrer le fichier d\'options : ',
+ 'ErrorModelNotFound' => 'Modèle non trouvé : ',
+ 'ErrorModelUserDir' => 'Les modèles créés par l\'utilisateur sont dans : ',
+
+ 'RandomTooltip' => 'Que vais-je regarder ce soir ?',
+ 'RandomError'=> 'Vous n\'avez pas d{lowercaseDA1} pouvant être sélectionné', # Accepts model codes
+ 'RandomEnd'=> 'Il n\'y a plus d\'autre {lowercase1}', # Accepts model codes
+ 'RandomNextTip'=> 'Proposition suivante',
+ 'RandomOkTip'=> 'Accepter cet élément',
+
+ 'AboutTitle' => 'À propos de GCstar',
+ 'AboutDesc' => 'Gestionnaire de collections personnelles',
+ 'AboutVersion' => 'Version',
+ 'AboutTeam' => 'Équipe',
+ 'AboutWho' => 'Christian Jodar (Tian) : Gestionnaire du projet, Programmeur
+Nyall Dawson (Zombiepig) : Programmeur
+TPF : Programmeur
+Adolfo González : Programmeur
+',
+ 'AboutLicense' => 'Distribué selon les termes de la GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Traduction française par Christian Jodar',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logo et webdesign par le Spektre',
+
+ 'UnsavedCollection' => 'Collection non sauvegardée',
+ 'ModelsSelect' => 'Choisissez un type de collection',
+ 'ModelsPersonal' => 'Types personnels',
+ 'ModelsDefault' => 'Types par défaut',
+ 'ModelsList' => 'Définition de la collection',
+ 'ModelSettings' => 'Réglages de la collection',
+ 'ModelNewType' => 'Nouveau type de collection',
+ 'ModelName' => 'Description du type de collection:',
+ 'ModelFields' => 'Champs',
+ 'ModelOptions' => 'Options',
+ 'ModelFilters' => 'Filtres',
+ 'ModelNewField' => 'Nouveau champ',
+ 'ModelFieldInformation' => 'Informations',
+ 'ModelFieldName' => 'Nom :',
+ 'ModelFieldType' => 'Type de champ :',
+ 'ModelFieldGroup' => 'Groupe :',
+ 'ModelFieldValues' => 'Valeurs',
+ 'ModelFieldInit' => 'Défaut :',
+ 'ModelFieldMin' => 'Minimum :',
+ 'ModelFieldMax' => 'Maximum :',
+ 'ModelFieldList' => 'Liste des valeurs :',
+ 'ModelFieldListLegend' => '<i>Séparées par des virgules</i>',
+ 'ModelFieldDisplayAs' => 'Afficher comme :',
+ 'ModelFieldDisplayAsText' => 'Texte',
+ 'ModelFieldDisplayAsGraphical' => 'Notation',
+ 'ModelFieldTypeShortText' => 'Texte court',
+ 'ModelFieldTypeLongText' => 'Texte long',
+ 'ModelFieldTypeYesNo' => 'Oui/Non',
+ 'ModelFieldTypeNumber' => 'Nombre',
+ 'ModelFieldTypeDate' => 'Date',
+ 'ModelFieldTypeOptions' => 'Liste de valeurs prédéfinies',
+ 'ModelFieldTypeImage' => 'Image',
+ 'ModelFieldTypeSingleList' => 'Liste simple',
+ 'ModelFieldTypeFile' => 'Fichier',
+ 'ModelFieldTypeFormatted' => 'Dépendant d\'autres champs',
+ 'ModelFieldParameters' => 'Paramètres',
+ 'ModelFieldHasHistory' => 'Garder un historique',
+ 'ModelFieldFlat' => 'Afficher sur une seule ligne',
+ 'ModelFieldStep' => 'Valeur d\'incrément :',
+ 'ModelFieldFileFormat' => 'Format du fichier :',
+ 'ModelFieldFileFile' => 'Simple fichier',
+ 'ModelFieldFileImage' => 'Image',
+ 'ModelFieldFileVideo' => 'Vidéo',
+ 'ModelFieldFileAudio' => 'Son',
+ 'ModelFieldFileProgram' => 'Programme',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Champs à utiliser',
+ 'ModelOptionsFieldsAuto' => 'Automatique',
+ 'ModelOptionsFieldsNone' => 'Aucun',
+ 'ModelOptionsFieldsTitle' => 'En tant que titre',
+ 'ModelOptionsFieldsId' => 'En tant qu\'identifiant',
+ 'ModelOptionsFieldsCover' => 'En tant que couverture',
+ 'ModelOptionsFieldsPlay' => 'Pour le bouton Lecture',
+ 'ModelCollectionSettings' => 'Réglages de la collection',
+ 'ModelCollectionSettingsLending' => 'Les éléments peuvent être empruntés',
+ 'ModelCollectionSettingsTagging' => 'Les éléments peuvent être marqués',
+ 'ModelFilterActivated' => 'Présent dans la fenêtre de recherche',
+ 'ModelFilterComparison' => 'Comparaison',
+ 'ModelFilterContain' => 'Contient',
+ 'ModelFilterDoesNotContain' => 'Ne contient pas',
+ 'ModelFilterRegexp' => 'Expression régulière',
+ 'ModelFilterRange' => 'Intervalle',
+ 'ModelFilterNumeric' => 'La comparaison est numérique',
+ 'ModelFilterQuick' => 'Créer un filtre rapide',
+ 'ModelTooltipName' => 'Utiliser un nom pour ré-utiliser ce modèle pour plusieurs collections. S\'il est vide, les réglages seront stockées dans la collection elle-même.',
+ 'ModelTooltipLabel' => 'Le nom du champ tel qu\'il sera affiché.',
+ 'ModelTooltipGroup' => 'Utilisé pour grouper les champs. Les champs sans groupe seront mis dans un groupe par défaut.',
+ 'ModelTooltipHistory' => 'Est-ce qu\'un historique des valeurs entrées doit être conservé dans une liste.',
+ 'ModelTooltipFormat' => 'Ce format sert à déterminer l\'action à effectuer lors de l\'appui sur le bouton de lecture.',
+ 'ModelTooltipLending' => 'Cela va ajouter des champs pour gérer les emprunts.',
+ 'ModelTooltipTagging' => 'Cela va ajouter des champs pour gérer les marques et mots-clés',
+ 'ModelTooltipNumeric' => 'Indique que les valeurs doivent être considérées comme des nombres pour les comparaisons.',
+ 'ModelTooltipQuick' => 'Ajoutera un sous-menu dans le menu Filtres',
+
+ 'ResultsTitle' => 'Choisissez {lowercaseI1}', # Accepts model codes
+ 'ResultsNextTip' => 'Rechercher sur le site suivant',
+ 'ResultsPreview' => 'Aperçu',
+ 'ResultsInfo' => 'Vous pouvez ajouter plusieurs {lowercaseX} à la collection en maintenant la touche Shift ou Ctrl et en les sélectionnant', # Accepts model codes
+
+ 'OptionsTitle' => 'Préférences',
+ 'OptionsExpertMode' => 'Mode expert',
+ 'OptionsPrograms' => 'Indiquez les applications à utiliser, ou laissez vide pour utiliser celles par défaut',
+ 'OptionsBrowser' => 'Navigateur web',
+ 'OptionsPlayer' => 'Lecteur de vidéos',
+ 'OptionsAudio' => 'Lecteur audio',
+ 'OptionsImageEditor' => 'Éditeur d\'images',
+ 'OptionsCdDevice' => 'Périphérique CD',
+ 'OptionsImages' => 'Répertoire images',
+ 'OptionsUseRelativePaths' => 'Utiliser des chemins relatifs pour les images',
+ 'OptionsLayout' => 'Disposition',
+ 'OptionsStatus' => 'Afficher la barre d\'état en bas de la fenêtre',
+ 'OptionsUseStars' => 'Afficher les notes avec des étoiles',
+ 'OptionsWarning' => 'Attention : Les changements effectués dans cet onglet ne seront pris en compte qu\'après un redémarrage de l\'application',
+ 'OptionsRemoveConfirm' => 'Demander confirmation avant la suppression',
+ 'OptionsAutoSave' => 'Sauvegarde automatique de la collection',
+ 'OptionsAutoLoad' => 'Ouvrir la collection précédente au démarrage',
+ 'OptionsSplash' => 'Afficher l\'écran de démarrage',
+ 'OptionsTearoffMenus' => 'Activer les menus détachables',
+ 'OptionsSpellCheck' => 'Utiliser le vérificateur orthographique pour les champs texte longs',
+ 'OptionsProgramTitle' => 'Choisissez le programme à utiliser',
+ 'OptionsPlugins' => 'Site où récupérer les fiches',
+ 'OptionsAskPlugins' => 'Demander (Tous les sites)',
+ 'OptionsPluginsMulti' => 'Plusieurs sites',
+ 'OptionsPluginsMultiAsk' => 'Demander (Certains sites)',
+ 'OptionsPluginsMultiPerField' => 'Plusieurs sites (par champs)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Choix de l\'ordre pour plusieurs sites par champs',
+ 'OptionsPluginsMultiPerFieldDesc' => 'Pour chaque champs sélectionné, on remplira avec la première information non vide trouvée, en partant de gauche.',
+ 'OptionsPluginsMultiPerFieldFirst' => 'En premier',
+ 'OptionsPluginsMultiPerFieldLast' => 'En dernier',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Supprimer',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Vider les listes sélectionnées',
+ 'OptionsPluginsList' => 'Définir la liste',
+ 'OptionsAskImport' => 'Choisir les champs à importer',
+ 'OptionsProxy' => 'Utiliser un proxy',
+ 'OptionsCookieJar' => 'Utiliser ce fichier de cookies',
+ 'OptionsMain' => 'Principal',
+ 'OptionsLang' => 'Langue',
+ 'OptionsPaths' => 'Chemins',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Options',
+ 'OptionsDisplay' => 'Affichage',
+ 'OptionsToolbar' => 'Barre d\'outils',
+ 'OptionsToolbars' => {0 => 'Aucune', 1 => 'Petite', 2 => 'Grande', 3 => 'Réglage système'},
+ 'OptionsToolbarPosition' => 'Position',
+ 'OptionsToolbarPositions' => {0 => 'Haut', 1 => 'Bas', 2 => 'Gauche', 3 => 'Droite'},
+ 'OptionsExpandersMode' => 'Texte replié trop long',
+ 'OptionsExpandersModes' => {'asis' => 'Ne rien faire', 'cut' => 'Couper', 'wrap' => 'Aller à la ligne'},
+ 'OptionsDateFormat' => 'Format des dates',
+ 'OptionsDateFormatTooltip' => 'Le format est celui utilisé par strftime(3). La valeur par défaut est %d/%m/%Y',
+ 'OptionsView' => 'Type de liste',
+ 'OptionsViews' => {0 => 'Texte', 1 => 'Image', 2 => 'Détaillée'},
+ 'OptionsColumns' => 'Colonnes',
+ 'OptionsMailer' => 'Méthode d\'envoi d\'e-mails',
+ 'OptionsSMTP' => 'Serveur',
+ 'OptionsFrom' => 'E-mail expéditeur',
+ 'OptionsTransform' => 'Mettre à la fin des titres les articles',
+ 'OptionsArticles' => 'Articles (Séparés par des virgules)',
+ 'OptionsSearchStop' => 'Une recherche peut être arrêtée',
+ 'OptionsBigPics' => 'Utiliser les grandes images quand disponibles',
+ 'OptionsAlwaysOriginal' => 'Utiliser le titre principal comme titre original si non présent',
+ 'OptionsRestoreAccelerators' => 'Rétablir raccourcis',
+ 'OptionsHistory' => 'Taille de l\'historique',
+ 'OptionsClearHistory' => 'Purger l\'historique',
+ 'OptionsStyle' => 'Thème',
+ 'OptionsDontAsk' => 'Ne plus demander',
+ 'OptionsPathProgramsGroup' => 'Applications',
+ 'OptionsProgramsSystem' => 'Utiliser les programmes définis par le système',
+ 'OptionsProgramsUser' => 'Utiliser les programmes spécifiés',
+ 'OptionsProgramsSet' => 'Régler les programmes',
+ 'OptionsPathImagesGroup' => 'Images',
+ 'OptionsInternetDataGroup' => 'Récupération des données',
+ 'OptionsInternetSettingsGroup' => 'Réglages',
+ 'OptionsDisplayInformationGroup' => 'Affichage des informations',
+ 'OptionsDisplayArticlesGroup' => 'Articles',
+ 'OptionsImagesDisplayGroup' => 'Affichage',
+ 'OptionsImagesStyleGroup' => 'Style',
+ 'OptionsDetailedPreferencesGroup' => 'Préférences',
+ 'OptionsFeaturesConveniencesGroup' => 'Commodités',
+ 'OptionsPicturesFormat' => 'Préfixe à utiliser pour les images :',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Le titre ou le nom de l\'élément associé',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% ou . sera remplacé par le répertoire de la collection (seulement utilisable en début)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% sera remplacé par le fichier contenant la collection sans son suffixe (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% peut seulement être utilisé au début du chemin pour les images',
+ 'OptionsConfigureMailers' => 'Configurer les clients mail',
+
+ 'ImagesOptionsButton' => 'Réglages',
+ 'ImagesOptionsTitle' => 'Réglages pour la liste d\'images',
+ 'ImagesOptionsSelectColor' => 'Choisissez une couleur',
+ 'ImagesOptionsUseOverlays' => 'Effet brillant',
+ 'ImagesOptionsBg' => 'Fond',
+ 'ImagesOptionsBgPicture' => 'Utiliser une image de fond',
+ 'ImagesOptionsFg'=> 'Sélection',
+ 'ImagesOptionsBgTooltip' => 'Changer la couleur de fond',
+ 'ImagesOptionsFgTooltip'=> 'Changer la couleur de la sélection',
+ 'ImagesOptionsResizeImgList' => 'Changer dynamiquement le nombre de colonnes',
+ 'ImagesOptionsAnimateImgList' => 'Utiliser des animations',
+ 'ImagesOptionsSizeLabel' => 'Taille',
+ 'ImagesOptionsSizeList' => {0 => 'Minuscule', 1 => 'Petit', 2 => 'Moyen', 3 => 'Grand', 4 => 'Énorme'},
+ 'ImagesOptionsSizeTooltip' => 'Sélectionnez la taille pour les images',
+
+ 'DetailedOptionsTitle' => 'Réglages pour la liste détaillée',
+ 'DetailedOptionsImageSize' => 'Taille des images',
+ 'DetailedOptionsGroupItems' => 'Grouper les éléments par',
+ 'DetailedOptionsSecondarySort' => 'Trier les enfants par',
+ 'DetailedOptionsFields' => 'Choisir les champs à afficher',
+ 'DetailedOptionsGroupedFirst' => 'Garder ensemble les éléments orphelins',
+ 'DetailedOptionsAddCount' => 'Ajouter le nombre d\'éléments sur les catégories',
+
+ 'ExtractButton' => 'Informations',
+ 'ExtractTitle' => 'Informations du fichier vidéo',
+ 'ExtractImport' => 'Utiliser les valeurs',
+
+ 'FieldsListOpen' => 'Charger une liste de champs depuis un fichier',
+ 'FieldsListSave' => 'Sauvegarder la liste des champs dans un fichier',
+ 'FieldsListError' => 'Cette liste de champs ne peut pas être utilisée avec ce type de collection',
+ 'FieldsListIgnore' => '--- Ignorer',
+
+ 'ExportTitle' => 'Exporter la collection',
+ 'ExportFilter' => 'Exporter seulement les éléments affichés',
+ 'ExportFieldsTitle' => 'Champs à exporter',
+ 'ExportFieldsTip' => 'Choisir les champs devant être exportés',
+ 'ExportWithPictures' => 'Copier les images dans un sous-répertoire',
+ 'ExportSortBy' => 'Trier selon',
+ 'ExportOrder' => 'Ordre',
+
+ 'ImportListTitle' => 'Importer une autre collection',
+ 'ImportExportData' => 'Données',
+ 'ImportExportFile' => 'Fichier',
+ 'ImportExportFieldsUnused' => 'Champs inutilisés',
+ 'ImportExportFieldsUsed' => 'Champs utilisés',
+ 'ImportExportFieldsFill' => 'Tous les champs',
+ 'ImportExportFieldsClear' => 'Aucun champ',
+ 'ImportExportFieldsEmpty' => 'Au moins un champ doit être spécifié',
+ 'ImportExportFileEmpty' => 'Un nom de fichier doit être spécifié',
+ 'ImportFieldsTitle' => 'Champs à importer',
+ 'ImportFieldsTip' => 'Choisir les champs devant être importés',
+ 'ImportNewList' => 'Créer une nouvelle liste',
+ 'ImportCurrentList' => 'Ajouter à la liste courante',
+ 'ImportDropError' => 'Il y a eu une erreur dans l\'ouverture d\'au moins un fichier. La liste précédente va être rechargée.',
+ 'ImportGenerateId' => 'Générer l\'identifiant de chaque élément',
+
+ 'FileChooserOpenFile' => 'Choisissez le fichier à utiliser',
+ 'FileChooserDirectory' => 'Répertoire',
+ 'FileChooserOpenDirectory' => 'Choisissez un répertoire',
+ 'FileChooserOverwrite' => 'Ce fichier existe. Voulez vous le remplacer ?',
+ 'FileAllFiles' => 'Tous les fichiers',
+ 'FileVideoFiles' => 'Fichier vidéos',
+ 'FileEbookFiles' => 'Fichiers ebook (livres électroniques)',
+ 'FileAudioFiles' => 'Fichiers sons',
+ 'FileGCstarFiles' => 'Collections GCstar',
+
+ 'PanelCompact' => 'Compact',
+ 'PanelReadOnly' => 'Lecture seule',
+ 'PanelForm' => 'Onglets',
+
+ 'PanelSearchButton' => 'Télécharger',
+ 'PanelSearchTip' => 'Rechercher les informations concernant l\'élément dont le nom a été saisi',
+ 'PanelSearchContextChooseOne' => 'Choisir un site ...',
+ 'PanelSearchContextMultiSite' => 'Utiliser "plusieurs sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Utiliser "plusieurs sites par champs"',
+ 'PanelSearchContextOptions' => 'Changer les options ...',
+ 'PanelImageTipOpen' => 'Cliquez sur l\'image pour en choisir une autre.',
+ 'PanelImageTipView' => 'Cliquez sur l\'image pour la voir en taille réelle.',
+ 'PanelImageTipMenu' => ' Clic droit pour plus d\'options.',
+ 'PanelImageTitle' => 'Sélectionnez une image',
+ 'PanelImageNoImage' => 'Pas d\'image',
+ 'PanelSelectFileTitle' => 'Sélectionnez un fichier',
+ 'PanelLaunch' => 'Démarrer',
+ 'PanelRestoreDefault' => 'Rétablir défaut',
+ 'PanelRefresh' => 'Rafraîchir',
+ 'PanelRefreshTip' => 'Mettre à jour les informations depuis Internet',
+
+ 'PanelFrom' =>'Entre',
+ 'PanelTo' =>'et',
+
+ 'PanelWeb' => 'Voir la fiche Internet',
+ 'PanelWebTip' => 'Voir la fiche {lowercaseDD1} sur Internet', # Accepts model codes
+ 'PanelRemoveTip' => 'Supprimer {lowercaseD1} affiché ci-dessus', # Accepts model codes
+
+ 'PanelDateSelect' => 'Changer',
+ 'PanelNobody' => 'Personne',
+ 'PanelUnknown' => 'Inconnu',
+ 'PanelAdded' => 'Date d\'ajout',
+ 'PanelRating' => 'Note',
+ 'PanelPressRating' => 'Note Presse',
+ 'PanelLocation' => 'Emplacement',
+
+ 'PanelLending' => 'Emprunts',
+ 'PanelBorrower' => 'Emprunteur',
+ 'PanelLendDate' => 'Date d\'emprunt',
+ 'PanelHistory' => 'Historique des emprunts',
+ 'PanelReturned' => '{1} _Rendu', # Accepts model codes
+ 'PanelReturnDate' => 'Date de retour',
+ 'PanelLendedYes' => 'Prêté',
+ 'PanelLendedNo' => 'Disponible',
+
+ 'PanelTags' => 'Étiquettes',
+ 'PanelFavourite' => 'Favori',
+ 'TagsAssigned' => 'Mots-clés associés',
+
+ 'PanelUser' => 'Champs utilisateur',
+
+ 'CheckUndef' => 'Sans importance',
+ 'CheckYes' => 'Oui',
+ 'CheckNo' => 'Non',
+
+ 'ToolbarRandom' => 'Ce soir',
+ 'ToolbarAll' => 'Voir tous',
+ 'ToolbarAllTooltip' => 'Afficher toute la collection',
+ 'ToolbarGroupBy' => 'Grouper par',
+ 'ToolbarGroupByTooltip' => 'Choisir le champ à utiliser pour regrouper les éléments dans la liste',
+ 'ToolbarQuickSearch' => 'Recherche rapide',
+ 'ToolbarQuickSearchLabel' => 'Rechercher',
+ 'ToolbarQuickSearchTooltip' => 'Choisissez le champ dans lequel rechercher, entrez le texte de la recherche et pressez Entréé',
+ 'ToolbarSeparator' => ' Séparateur',
+
+ 'PluginsTitle' => 'Chercher un élément',
+ 'PluginsQuery' => 'Recherche',
+ 'PluginsFrame' => 'Site où rechercher',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Nom',
+ 'PluginsSearchFields' => 'Champs de recherche',
+ 'PluginsAuthor' => 'Auteur',
+ 'PluginsLang' => 'Langue',
+ 'PluginsUseSite' => 'Utiliser le site sélectionné pour les futures recherches',
+ 'PluginsPreferredTooltip' => 'Site recommandé par GCstar',
+ 'PluginDisabled' => 'Désactivé',
+
+ 'BorrowersTitle' => 'Configuration des emprunteurs',
+ 'BorrowersList' => 'Emprunteurs',
+ 'BorrowersName' => 'Nom',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Ajouter',
+ 'BorrowersRemove' => '_Supprimer',
+ 'BorrowersEdit' => '_Modifier',
+ 'BorrowersTemplate' => 'Modèle d\'e-mail',
+ 'BorrowersSubject' => 'Titre du mail : ',
+ 'BorrowersNotice1' => '%1 sera remplacé par le nom de l\'emprunteur',
+ 'BorrowersNotice2' => '%2 sera remplacé par le nom de l\'élément',
+ 'BorrowersNotice3' => '%3 sera remplacé par la date de l\'emprunt',
+
+ 'BorrowersImportTitle' => 'Importer les informations d\'emprunteurs',
+ 'BorrowersImportType' => 'Format du fichier :',
+ 'BorrowersImportFile' => 'Fichier :',
+
+ 'BorrowedTitle' => '{X} empruntés', # Accepts model codes
+ 'BorrowedDate' => 'Depuis le',
+ 'BorrowedDisplayInPanel' => 'Voir {lowercaseD1} dans la fenêtre principale', # Accepts model codes
+
+ 'MailTitle' => '_Envoyer un e-mail',
+ 'MailFrom' => 'De : ',
+ 'MailTo' => 'A : ',
+ 'MailSubject' => 'Objet : ',
+ 'MailSmtpError' => 'Problème de connexion au serveur SMTP',
+ 'MailSendmailError' => 'Problème au lancement de sendmail',
+
+ 'SearchTooltip' => 'Rechercher dans tous {lowercaseDX}', # Accepts model codes
+ 'SearchTitle' => 'Recherche d{lowercaseDAX}', # Accepts model codes
+ 'SearchNoField' => 'Aucun champ n\'a été sélectionné pour la fenêtre de recherche.
+Ils peuvent être ajoutés dans l\'onglet Filtres des réglages de la collection.',
+
+ 'QueryReplaceField' => 'Champs à modifier',
+ 'QueryReplaceOld' => 'Valeur actuelle',
+ 'QueryReplaceNew' => 'Nouvelle valeur',
+ 'QueryReplaceLaunch' => 'Remplacer',
+
+ 'ImportWindowTitle' => 'Choisir les champs à importer',
+ 'ImportViewPicture' => 'Voir l\'image',
+ 'ImportSelectAll' => 'Tout sélectionner',
+ 'ImportSelectNone' => 'Ne rien sélectionner',
+
+ 'MultiSiteTitle' => 'Sites où rechercher',
+ 'MultiSiteUnused' => 'Modules non utilisés',
+ 'MultiSiteUsed' => 'Modules à utiliser',
+ 'MultiSiteLang' => 'Remplir la liste avec les modules français',
+ 'MultiSiteEmptyError' => 'Vous avez une liste de sites vide',
+ 'MultiSiteClear' => 'Vider la liste',
+
+ 'DisplayOptionsTitle' => 'Éléments à afficher',
+ 'DisplayOptionsAll' => 'Tout sélectionner',
+ 'DisplayOptionsSearch' => 'Bouton recherche',
+
+ 'GenresTitle' => 'Conversions de genres',
+ 'GenresCategoryName' => 'Genre à utiliser',
+ 'GenresCategoryMembers' => 'Genres à remplacer',
+ 'GenresLoad' => 'Charger une liste prédéfinie',
+ 'GenresExport' => 'Exporter la liste dans un fichier',
+ 'GenresModify' => 'Changer la conversion',
+
+ 'PropertiesName' => 'Nom de la collection',
+ 'PropertiesLang' => 'Code langue',
+ 'PropertiesOwner' => 'Propriétaire',
+ 'PropertiesEmail' => 'Adresse e-mail',
+ 'PropertiesDescription' => 'Description',
+ 'PropertiesFile' => 'Informations sur le fichier',
+ 'PropertiesFilePath' => 'Chemin complet',
+ 'PropertiesItemsNumber' => 'Nombre d{lowercaseDAX}', # Accepts model codes
+ 'PropertiesFileSize' => 'Taille',
+ 'PropertiesFileSizeSymbols' => ['octets', 'Ko', 'Mo', 'Go', 'To', 'Po', 'Eo', 'Zo', 'Yo'],
+ 'PropertiesCollection' => 'Propriétés de la collection',
+ 'PropertiesDefaultPicture' => 'Image par défaut',
+
+ 'MailProgramsTitle' => 'Programmes pour envoyer des emails',
+ 'MailProgramsName' => 'Nom',
+ 'MailProgramsCommand' => 'Ligne de commande',
+ 'MailProgramsRestore' => 'Programmes par défaut',
+ 'MailProgramsAdd' => 'Ajouter un programme',
+ 'MailProgramsInstructions' => 'Dans la ligne de commande des substitutions seront effectuées :
+ %f sera remplacé par l\'adresse email de l\'utilisateur.
+ %t sera remplacé par le destinataire.
+ %s sera remplacé par le sujet du message.
+ %b sera remplacé par le contenu du message.',
+
+ 'BookmarksBookmarks' => 'Collections',
+ 'BookmarksFolder' => 'Répertoire',
+ 'BookmarksLabel' => 'Nom',
+ 'BookmarksPath' => 'Chemin',
+ 'BookmarksNewFolder' => 'Nouveau répertoire',
+
+ 'AdvancedSearchType' => 'Type de recherche',
+ 'AdvancedSearchTypeAnd' => '{X} correspondants à tous les critères', # Accepts model codes
+ 'AdvancedSearchTypeOr' => '{X} correspondants à au moins un critère', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Critères',
+ 'AdvancedSearchAnyField' => 'N\'importe quel champ',
+ 'AdvancedSearchSaveTitle' => 'Sauvegarder la recherche',
+ 'AdvancedSearchSaveName' => 'Nom',
+ 'AdvancedSearchSaveOverwrite' => 'Il y a déjà une recherche sauvegardée avec ce nom. Veuillez en choisir un autre.',
+ 'AdvancedSearchUseCase' => 'Différencier majuscules et minuscules',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignorer les accents et autres diacritiques',
+
+ 'BugReportSubject' => 'Rapport d\'erreur généré depuis GCstar',
+ 'BugReportVersion' => 'Version',
+ 'BugReportPlatform' => 'Système d\'exploitation',
+ 'BugReportMessage' => 'Message d\'erreur',
+ 'BugReportInformation' => 'Informations complémentaires',
+
+#Statistics
+ 'StatsFieldToUse' => 'Champ à utiliser',
+ 'StatsSortByNumber' => 'Trier par nombre de {lowercaseX}',
+ 'StatsGenerate' => 'Générer',
+ 'StatsKindOfGraph' => 'Type de représentation',
+ 'StatsBars' => 'Barres',
+ 'StatsPie' => 'Camembert',
+ 'Stats3DPie' => 'Camembert 3D',
+ 'StatsArea' => 'Zones',
+ 'StatsHistory' => 'Historique',
+ 'StatsWidth' => 'Largeur',
+ 'StatsHeight' => 'Hauteur',
+ 'StatsFontSize' => 'Taille de la police',
+ 'StatsDisplayNumber' => 'Montrer les valeurs',
+ 'StatsSave' => 'Sauvegarder les statistiques dans un fichier',
+ 'StatsAccumulate' => 'Accumuler les valeurs',
+ 'StatsShowAllDates' => 'Montrer toutes les dates',
+
+ 'DefaultValuesTip' => 'Les valeurs définies dans cette fenêtre seront utilisées lors de l\'ajout d\'{lowercaseI1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/GCLangUtils.pm b/lib/gcstar/GCLang/GCLangUtils.pm
new file mode 100644
index 0000000..3094b27
--- /dev/null
+++ b/lib/gcstar/GCLang/GCLangUtils.pm
@@ -0,0 +1,56 @@
+{
+ package GCLang::GCLangUtils;
+
+
+###################################################
+#
+# Copyright 2005-2008 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use utf8;
+use strict;
+use Exporter;
+use base 'Exporter';
+our @EXPORT = qw(importTranslation);
+
+sub importTranslation
+{
+ my ($replace) = @_;
+ my ($pack) = caller(0);
+ my (undef, undef, undef, $subroutine) = caller(2);
+ # Avoid recursion as it could lead to some problems
+ return if $subroutine =~ /importTranslation/;
+ #Create the new package name. It supposes the module are in the same subfolders
+ (my $newPack = $pack) =~ s/(GC(Import|Export)?)(\w*)$/$1$replace/;
+ (my $newModule = $newPack) =~ s|::|/|g;
+ require "$newModule.pm";
+ my %tmpLang;
+ eval "%tmpLang = %".$newPack."::lang";
+ foreach my $translation(keys %tmpLang)
+ {
+ # Add it only if it was not defined previously
+ eval '$'.$pack.'::lang{'.$translation."} = \$tmpLang{$translation} if ! exists \$".$pack.'::lang{'.$translation.'}';
+ }
+
+}
+
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/GL/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..71e9b3f
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::GL::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Incluír os campos dos nomes na parte de arriba',
+ 'Separator' => 'Separador',
+ 'Replacement' => 'Reemprazar o separador con',
+ 'Charset' => 'Conxunto de caracteres',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/GL/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..93066e2
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::GL::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/GL/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..5e99774
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::GL::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'O ficheiro de modelo non é válido',
+ 'UseFile' => 'Usar o ficheiro seguinte',
+ 'WithJS' => 'Usar Javascript',
+ 'FileTemplate' => 'Modelo',
+ 'Preview' => 'Previsualización',
+ 'NoPreview' => 'Non hai unha previsualización dispoñible',
+ 'TemplateExternalFile' => 'Ficheiro de modelo',
+ 'Title' => 'Título da páxina',
+ 'InfoFile' => 'A listaxe de Filmes está neste ficheiro: ',
+ 'InfoDir' => 'As imaxes están en: ',
+ 'HeightImg' => 'Altura (en pixels) da imaxe a exportar',
+ 'OpenFileInBrowser' => 'Abrir o ficheiro xerado no navegador',
+ 'Note' => 'Listaxe xerada por <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Introduza o texto da busca',
+ 'SearchType1' => 'Só o título',
+ 'SearchType2' => 'Información completa',
+ 'SearchButton' => 'Procura',
+ 'SearchTitle' => 'Amosar só os filmes que cumpren os criterior previos',
+ 'AllButton' => 'Todos',
+ 'AllTitle' => 'Amosar todos os filmes',
+ 'Expand' => 'Expandir todo',
+ 'ExpandTitle' => 'Amosar información de todos os filmes',
+ 'Collapse' => 'Contraer todo',
+ 'CollapseTitle' => 'Contraer a información de todas os filmes',
+ 'Borrowed' => 'Prestado por: ',
+ 'NotBorrowed' => 'Dispoñible',
+ 'Top' => 'Arriba',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/GL/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..97770d5
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::GL::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/GL/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..1bffe98
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::GL::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Incluír instrucción DROP',
+ 'WithCreate' => 'Incluír instrucción CREATE',
+ 'TableName' => 'Nome da táboa',
+ 'InfoFile' => 'Ficheiro SQL: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/GL/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..4613d9e
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::GL::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'O archivo está no ficheiro: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/GL/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..5381c5e
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::GL::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Ficheiro do modelo',
+ 'ModelText' => 'Texto do modelo',
+ 'Models' => 'Modelo a utilizar',
+ 'UseFile' => 'Usar ficheiro',
+ 'UseModel' => 'Usar area de texto',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/GL/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..4faa4f8
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::GL::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Onde debería buscarse',
+ 'Default' => 'Directorio predeterminado de Alexandria',
+ 'Specified' => 'Directorio especificado a continuación',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/GL/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..d0adab7
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::GL::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Conxunto de caracteres',
+ 'Header' => 'Ignorar a primeira liña',
+ 'Separator' => 'Separador',
+ 'Plugin' => 'Utilizar o sitio web',
+ 'UseFirst' => 'Seleccionar o primeiro dos resultados',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/GL/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..6578395
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::GL::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/GL/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..1a2c163
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::GL::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copiar imaxes',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCImport/GCImportList.pm b/lib/gcstar/GCLang/GL/GCImport/GCImportList.pm
new file mode 100644
index 0000000..912879e
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::GL::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Listaxe de nomes',
+ 'Plugin' => 'Utilizar o sitio web',
+ 'UseFirst' => 'Seleccionar o primeiro dos resultados',
+ 'CommentAuto' => 'Elemento importado automáticamente.',
+ 'CommentSite' => 'Sitio web: ',
+ 'CommentTitle' => 'Título: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/GL/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..20c3eef
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::GL::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/GL/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..dc625c9
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::GL::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'O ficheiro non é unha colección Tellico soportada',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/GL/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..a6f7316
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::GL::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/GL/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..16a0ccb
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::GL::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/GL/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..c061c0c
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::GL::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de Xogos de Mesa',
+ Items => {0 => 'Xogo',
+ 1 => 'Xogo',
+ X => 'Xogos'},
+ NewItem => 'Novo xogo',
+
+ Id => 'Id',
+ Name => 'Nome',
+ Original => 'Nome Orixinal',
+ Box => 'Imaxe da caixa',
+ DesignedBy => 'Deseñado por',
+ PublishedBy => 'Publicado por',
+ Players => 'Número de xogadores',
+ PlayingTime => 'Tempo de xogo',
+ SuggestedAge => 'Idade suxerida',
+ Released => 'Publicado',
+ Description => 'Descripción',
+ Category => 'Categoría',
+ Mechanics => 'Mecanismos',
+ ExpandedBy => 'Expandido por',
+ ExpansionFor => 'Expandido para',
+ GameFamily => 'Familia do xogo',
+ IllustratedBy => 'Ilustrado por',
+ Url => 'Páxina web',
+ TimesPlayed => 'Veces xogado',
+ CompleteContents => 'Contidos completos',
+ Copies => 'Nº de copias',
+ Condition => 'Condición',
+ Photos => 'Fotos',
+ Photo1 => 'Primeira imaxe',
+ Photo2 => 'Segunda imaxe',
+ Photo3 => 'Terceira imaxe',
+ Photo4 => 'Cuarta imaxe',
+ Comments => 'Comentarios',
+
+ Perfect => 'Perfecto',
+ Good => 'Bo',
+ Average => 'Avanzado',
+ Poor => 'Pobre',
+
+ CompleteYes => 'Contidos completos',
+ CompleteNo => 'Pezas perdidas',
+
+ General => 'Xeral',
+ Details => 'Detalles',
+ Personal => 'Persoal',
+ Information => 'Información',
+
+ FilterRatingSelect => 'Puntuado polo menos...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCbooks.pm b/lib/gcstar/GCLang/GL/GCModels/GCbooks.pm
new file mode 100644
index 0000000..78f9e28
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCbooks.pm
@@ -0,0 +1,70 @@
+{
+ package GCLang::GL::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de libros',
+ Items => {0 => 'Libro',
+ 1 => 'Libro',
+ X => 'Libros'},
+ NewItem => 'Novo libro',
+
+ Isbn => 'ISBN',
+ Title => 'Título',
+ Cover => 'Cuberta',
+ Authors => 'Autores',
+ Publisher => 'Editorial',
+ Publication => 'Data de publicación',
+ Language => 'Lingua',
+ Genre => 'Xénero',
+ Serie => 'Serie',
+ Rank => 'Puntuación',
+ Bookdescription => 'Descripción',
+ Pages => 'Páxinas',
+ Read => 'Lido',
+ Acquisition => 'Data de adquisición',
+ Edition => 'Edición',
+ Format => 'Formato',
+ Comments => 'Comentarios',
+ Url => 'Páxina web',
+ Translator => 'Traductor/a',
+ Artist => 'Artista',
+ DigitalFile => 'Digital version',
+
+ General => 'Xeral',
+ Details => 'Detalles',
+
+ ReadNo => 'Non lido',
+ ReadYes => 'Lido',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCcoins.pm b/lib/gcstar/GCLang/GL/GCModels/GCcoins.pm
new file mode 100644
index 0000000..66f5d4a
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCcoins.pm
@@ -0,0 +1,104 @@
+{
+ package GCLang::GL::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección numismática',
+ Items => {0 => 'Moeda',
+ 1 => 'Moeda',
+ X => 'Moedas'},
+ NewItem => 'Nova moeda',
+
+ Name => 'Nome',
+ Country => 'País',
+ Year => 'Ano',
+ Currency => 'Divisa',
+ Value => 'Valor',
+ Picture => 'Imaxe principal',
+ Diameter => 'Diametro',
+ Metal => 'Metal',
+ Edge => 'Borde',
+ Edge1 => 'Borde 1',
+ Edge2 => 'Borde 2',
+ Edge3 => 'Borde 3',
+ Edge4 => 'Borde 4',
+ Head => 'Cara',
+ Tail => 'Cruz',
+ Comments => 'Comentarios',
+ History => 'Historia',
+ Website => 'Sitio web',
+ Estimate => 'Estimación',
+ References => 'Referencias',
+ Type => 'Tipo',
+ Coin => 'Moeda',
+ Banknote => 'Billete',
+
+ Main => 'Principal',
+ Description => 'Descripción',
+ Other => 'Outra información',
+ Pictures => 'Imaxes',
+
+ Condition => 'Condición (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCcomics.pm b/lib/gcstar/GCLang/GL/GCModels/GCcomics.pm
new file mode 100644
index 0000000..757df7a
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::GL::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de Comics',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'Novo comic',
+
+
+ Id => 'Id',
+ Name => 'Nome',
+ Series => 'Serie',
+ Volume => 'Volume',
+ Title => 'Título',
+ Writer => 'Guión',
+ Illustrator => 'Ilustracións',
+ Colourist => 'Cor',
+ Publisher => 'Editorial',
+ Synopsis => 'Resumo',
+ Collection => 'Colección',
+ PublishDate => 'Data de publicación',
+ PrintingDate => 'Data de impresión',
+ ISBN => 'ISBN',
+ Type => 'Tipo',
+ Category => 'Category',
+ Format => 'Formato',
+ NumberBoards => 'Número de planchas',
+ Signing => 'Signing',
+ Cost => 'Prezo',
+ Rating => 'Puntuación',
+ Comment => 'Comentarios',
+ Url => 'Sitio web',
+
+ FilterRatingSelect => 'Puntuado polo menos...',
+
+ Main => 'Elementos principais',
+ General => 'Xeral',
+ Details => 'Detalles',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCfilms.pm b/lib/gcstar/GCLang/GL/GCModels/GCfilms.pm
new file mode 100644
index 0000000..7c40ab0
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCfilms.pm
@@ -0,0 +1,93 @@
+{
+ package GCLang::GL::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de filmes',
+ Items => {0 => 'Filme',
+ 1 => 'Filme',
+ X => 'Filmes'},
+ NewItem => 'Novo filme',
+
+
+ Id => 'Id',
+ Title => 'Título',
+ Date => 'Data',
+ Time => 'Duración',
+ Director => 'Dirección',
+ Country => 'País',
+ MinimumAge => 'Idade mínima',
+ Genre => 'Xénero',
+ Image => 'Imaxe',
+ Original => 'Título orixinal',
+ Actors => 'Reparto',
+ Actor => 'Actor/Actriz',
+ Role => 'Papel',
+ Comment => 'Comentarios',
+ Synopsis => 'Resumo',
+ Seen => 'Vista',
+ Number => '# de media',
+ Format => 'Medio',
+ Region => 'Region',
+ Identifier => 'Identificador',
+ Url => 'Páxina web',
+ Audio => 'Audio',
+ Video => 'Formato de Video',
+ Trailer => 'Ficheiro de video',
+ Serie => 'Serie',
+ Rank => 'Puntuación',
+ Subtitles => 'Subtítulos',
+
+ SeenYes => 'Visto',
+ SeenNo => 'Non visto',
+
+ AgeUnrated => 'Sen puntuación',
+ AgeAll => 'Para todas as idades',
+ AgeParent => 'Guía adulta',
+
+ Main => 'Elementos principais',
+ General => 'Xeral',
+ Details => 'Detalles',
+
+ Information => 'Información',
+ Languages => 'Linguas',
+ Encoding => 'Codificación',
+
+ FilterAudienceAge => 'Idade da audiencia',
+ FilterSeenNo => '_Non vista polo momento',
+ FilterSeenYes => 'X_a vista',
+ FilterRatingSelect => 'Puntuada polo menos...',
+
+ ExtractSize => 'Tamaño',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCgames.pm b/lib/gcstar/GCLang/GL/GCModels/GCgames.pm
new file mode 100644
index 0000000..b5a84ca
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCgames.pm
@@ -0,0 +1,82 @@
+{
+ package GCLang::GL::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de Videoxogos',
+ Items => {0 => 'Xogo',
+ 1 => 'Xogo',
+ X => 'Xogos'},
+ NewItem => 'Novo Xogo',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Nome',
+ Platform => 'Plataforma',
+ Players => 'Numero de xogadores',
+ Released => 'Data de lanzamento',
+ Editor => 'Editora',
+ Developer => 'Desenvolvemento',
+ Genre => 'Xénero',
+ Box => 'Imaxe da caixa',
+ Case => 'Caso',
+ Manual => 'Manual de instruccións',
+ Completion => 'Completo (%)',
+ Executable => 'Executable',
+ Description => 'Descrición',
+ Codes => 'Códigos',
+ Code => 'Código',
+ Effect => 'Efecto',
+ Secrets => 'Segredos',
+ Screenshots => 'Capturas de pantalla',
+ Screenshot1 => 'Primeira captura',
+ Screenshot2 => 'Segunda captura',
+ Comments => 'Comentarios',
+ Url => 'Páxina web',
+ Unlockables => 'Non bloqueables',
+ Unlockable => 'Non bloqueable',
+ Howto => 'Como desbloquear',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Xeral',
+ Details => 'Detalles',
+ Tips => 'Consello',
+ Information => 'Información',
+
+ FilterRatingSelect => 'Puntuado polo menos...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/GL/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..4ea1535
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::GL::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCminicars.pm b/lib/gcstar/GCLang/GL/GCModels/GCminicars.pm
new file mode 100644
index 0000000..0f7c128
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::GL::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCmusics.pm b/lib/gcstar/GCLang/GL/GCModels/GCmusics.pm
new file mode 100644
index 0000000..f8d1ce8
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCmusics.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::GL::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de música',
+ Items => {0 => 'Album',
+ 1 => 'Album',
+ X => 'Albumes'},
+ NewItem => 'Novo album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Título',
+ Cover => 'Cuberta',
+ Artist => 'Artista',
+ Format => 'Formato',
+ Running => 'Duración',
+ Release => 'Data de lanzamento',
+ Genre => 'Xénero',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Lista de pistas',
+ Number => 'Número',
+ Track => 'Título',
+ Time => 'Tempo',
+
+ Composer => 'Composición',
+ Producer => 'Producción',
+ Playlist => 'Lista de reproducción',
+ Comments => 'Comentarios',
+ Label => 'Etiqueta',
+ Url => 'Páxina web',
+
+ General => 'Xeral',
+ Details => 'Detalles',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/GL/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..f3bd3df
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::GL::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/GL/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..2e8f73b
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::GL::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/GL/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..4be564e
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::GL::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCstamps.pm b/lib/gcstar/GCLang/GL/GCModels/GCstamps.pm
new file mode 100644
index 0000000..b492568
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::GL::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCwines.pm b/lib/gcstar/GCLang/GL/GCModels/GCwines.pm
new file mode 100644
index 0000000..03a36f7
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCwines.pm
@@ -0,0 +1,65 @@
+{
+ package GCLang::GL::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de viños',
+ Items => {0 => 'Viño',
+ 1 => 'Viño',
+ X => 'Viños'},
+ NewItem => 'Novo Viño',
+
+ Name => 'Nome',
+ Designation => 'Denominación',
+ Vintage => 'Colleita',
+ Vineyard => 'Viñedo',
+ Type => 'Tipo',
+ Grapes => 'Uva',
+ Soil => 'Terra',
+ Producer => 'Producción',
+ Country => 'País',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcol (%)',
+ Medal => 'Medalla',
+
+ Storage => 'Almacenamento',
+ Location => 'Localización',
+ ShelfIndex => 'Índice',
+ Quantity => 'Cantidade',
+ Acquisition => 'Adquisición',
+ PurchaseDate => 'Data de compra',
+ PurchasePrice => 'Prezo de compra',
+ Gift => 'Regalo',
+ BottleLabel => 'Etiqueta da botella',
+ Website => 'Referencias na web',
+
+ Tasted => 'Catado',
+ Comments => 'Comentarios',
+ Serving => 'Dose',
+ TastingField => 'Notas da cata',
+
+ General => 'Xeral',
+ Details => 'Detalles',
+ Tasting => 'Cata',
+
+ TastedNo => 'Sen catar',
+ TastedYes => 'Catado',
+
+ FilterRange => 'Rango',
+ FilterTastedNo => '_Non foi catado',
+ FilterTastedYes => 'Xa foi catado',
+ FilterRatingSelect => 'Puntuado polo menos...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCstar.pm b/lib/gcstar/GCLang/GL/GCstar.pm
new file mode 100644
index 0000000..8f76d22
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCstar.pm
@@ -0,0 +1,674 @@
+{
+ package GCLang::GL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Galego',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Aviso</b>:
+
+A información descargada de sitios web (a través dos
+complementos de procura) é só para <b>uso persoal</b>.
+
+Calquera redistribución está prohibida sen a
+<b>autorización explícita</b> do sitio.
+
+Para determinar a que web pertence a información, debe
+utilizar <b>o botón situado debaixo dos detalles do elemento</b>.',
+
+ 'AllItemsFiltered' => 'Non hai elementos cumpran os criterios de filtrado', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Instalar en ',
+ 'InstallMandatory' => 'Compoñentes obrigatorios',
+ 'InstallOptional' => 'Compoñentes opcionais',
+ 'InstallErrorMissing' => 'Erro : ten que instalar os seguintes compoñentes Perl: ',
+ 'InstallPrompt' => 'Directorio base para a instalación [/usr/local]: ',
+ 'InstallEnd' => 'Fin da instalación',
+ 'InstallNoError' => 'Ningún erro',
+ 'InstallLaunch' => 'Para usar a aplicación, execútea ',
+ 'InstallDirectory' => 'Directorio Base',
+ 'InstallTitle' => 'Instalación de GCstar',
+ 'InstallDependencies' => 'Dependencias',
+ 'InstallPath' => 'Ruta',
+ 'InstallOptions' => 'Opcións',
+ 'InstallSelectDirectory' => 'Seleccionar o directorio base para a instalación',
+ 'InstallWithClean' => 'Eliminar ficheiros que se atopen no directorio de instalación',
+ 'InstallWithMenu' => 'Engadir GCstar ao menú de Aplicacións',
+ 'InstallNoPermission' => 'Erro: Non ten permiso para escribir no directorio seleccionado',
+ 'InstallMissingMandatory' => 'Non se cumpren algunhas dependencias obrigatorias-. Non pode instalar GCstar até que se cumpran as dependencias.',
+ 'InstallMissingOptional' => 'Algunhas dependencias opcionais non se cumpren. Pode ver unha listaxe máis abaixo. GCstar pode instalarse pero algunhas características non estarán dispoñibles.',
+ 'InstallMissingNone' => 'Cúmprense todas as dependencias. Pode continuar a instalación de GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Non dispoñible',
+ 'InstallMissingFor' => 'Non dispoñible por',
+ 'InstallCleanDirectory' => 'Eliminando ficheiros de GCstar no directorio: ',
+ 'InstallCopyDirectory' => 'A copiar ficheiros no directorio: ',
+ 'InstallCopyDesktop' => 'A copiar o ficheiro de escritorio en: ',
+
+#Update
+ 'UpdateUseProxy' => 'Usar Proxy (premer enter se non se usa ningún): ',
+ 'UpdateNoPermission' => 'Denegouse o permiso de escritura neste directorio: ',
+ 'UpdateNone' => 'Non se atoparon actualizacións',
+ 'UpdateFileNotFound' => 'Non se atopou o ficheiro',
+
+#Splash
+ 'SplashInit' => 'Inicialización',
+ 'SplashLoad' => 'A cargar a colección',
+ 'SplashDisplay' => 'A mostrar a colección',
+ 'SplashSort' => 'A ordear a colección',
+ 'SplashDone' => 'Listo',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Semella que estivo a utilizar GCfilms con anterioridade. Que quere importar desde GCfilms para GCstar (isto non afectará aos ficheiros de GCfilms se quere seguilos usando)?',
+ 'GCfilmsImportOptions' => 'Preferencias',
+ 'GCfilmsImportData' => 'Listaxe de Filmes',
+
+#Menus
+ 'MenuFile' => '_Ficheiro',
+ 'MenuNewList' => '_Nova Colección',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => 'Coleccións _Recentes',
+ 'MenuLend' => 'Amosar Elementos _Prestados', # Accepts model codes
+ 'MenuImport' => '_Importar',
+ 'MenuExport' => '_Exportar',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Editar',
+ 'MenuDuplicate' => 'Du_plicar elemento', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => 'Elimina_r Elemento', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Cambiar campos da colección',
+ 'MenuEditLockItems' => '_Bloquear Colección',
+
+ 'MenuDisplay' => 'F_iltros',
+ 'MenuSavedSearches' => 'Saved searches',
+ 'MenuSavedSearchesSave' => 'Save current search',
+ 'MenuSavedSearchesEdit' => 'Modify saved searches',
+ 'MenuAdvancedSearch' => 'Procura A_vanzada ',
+ 'MenuViewAllItems' => '_Amosar todos os elementos', # Accepts model codes
+ 'MenuNoFilter' => '_Calquera',
+
+ 'MenuConfiguration' => '_Configuración',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Información amosada',
+ 'MenuBorrowers' => '_Prestatarios',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '_Conversión de Xéneros',
+
+ 'MenuBookmarks' => 'As miñas _Coleccións',
+ 'MenuBookmarksAdd' => 'Engadir colección _actual',
+ 'MenuBookmarksEdit' => '_Editar coleccións favoritas',
+
+ 'MenuHelp' => '_Axuda',
+ 'MenuHelpContent' => '_Contido',
+ 'MenuAllPlugins' => 'Ver com_plementos',
+ 'MenuBugReport' => 'Comunicar un problema',
+ 'MenuAbout' => '_Acerca de GCstar',
+
+ 'MenuNewWindow' => 'Amosar elemento nunha _Nova Xanela', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Expandir todo',
+ 'ContextCollapseAll' => 'Contraer todo',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Introduza un valor',
+
+ 'RemoveConfirm' => 'Está seguro de que quere eliminar este elemento?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+
+ 'DefaultNewItem' => 'Novo elemento', # Accepts model codes
+ 'NewItemTooltip' => 'Engadir un novo elemento', # Accepts model codes
+ 'NoItemFound' => 'Non se atopou nada. Gustaríalle buscar en outra páxina web?',
+ 'OpenList' => 'Seleccine unha colección',
+ 'SaveList' => 'Escolla onde gardar a colección',
+ 'SaveListTooltip' => 'Gardar a colección actual',
+ 'SaveUnsavedChanges' => 'Hai cambios na colección que non se gardaron todavía. Quere gardalos?',
+ 'SaveDontSave' => 'Non gardar',
+ 'PreferencesTooltip' => 'Aplicar as súas configuracións',
+ 'ViewTooltip' => 'Cambiar o tipo de visualización',
+ 'PlayTooltip' => 'Reproducir un video asociado ao elemento', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Gardando...',
+ 'StatusLoad' => 'Cargando...',
+ 'StatusSearch' => 'Procurando...',
+ 'StatusGetInfo' => 'Obtendo información...',
+ 'StatusGetImage' => 'Obtendo a imaxe...',
+
+ 'SaveError' => 'Non se pode gardar a listaxe. Comprobe os permisos de acceso e se hai suficiente espazo libre en disco..',
+ 'OpenError' => 'Non se pode abrir a listaxe. Comprobe os permisos de acceso.',
+ 'OpenFormatError' => 'Non se pode abrir a listaxe. Pode que o formato sexa incorrecto.',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'O directorio seleccionado para gardar as imaxes non é correcto. Seleccione outro..',
+ 'OptionsCreationError'=> 'Non se pode crear o ficheiro de opcións: ',
+ 'OptionsOpenError'=> 'Non se pode abrir o ficheiro de opcións: ',
+ 'OptionsSaveError'=> 'Non se pode gardar o ficheiro de opcións: ',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'Que pode ver esta noite ?',
+ 'RandomError'=> 'Non pode seleccionar ningún elemento', # Accepts model codes
+ 'RandomEnd'=> 'Non hai máis elementos', # Accepts model codes
+ 'RandomNextTip'=> 'Seguinte suxerencia',
+ 'RandomOkTip'=> 'Aceptar este elemento',
+
+ 'AboutTitle' => 'Acerca de GCstar',
+ 'AboutDesc' => 'Xestor Persoal de coleccións',
+ 'AboutVersion' => 'Versión',
+ 'AboutTeam' => 'Equipo',
+ 'AboutWho' => 'Christian Jodar (Tian): Gestión do proxecto, Programador
+Nyall Dawson (Zombiepig): Programador
+TPF: Programador
+Adolfo González: Programador
+',
+ 'AboutLicense' => 'Distribuido baixo os termos de GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Traducción ao Galego por Daniel Espiñeira',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logo e deseño web por le Spektre',
+
+ 'ToolbarRandom' => 'Esta noite',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+ 'ModelsSelect' => 'Seleccionar un tipo de colección',
+ 'ModelsPersonal' => 'Modelos persoais',
+ 'ModelsDefault' => 'Modelos predeterminados',
+ 'ModelsList' => 'Definición da colección',
+ 'ModelSettings' => 'Preferencias da colección',
+ 'ModelNewType' => 'Novo tipo de colección',
+ 'ModelName' => 'Nome do tipo de colección:',
+ 'ModelFields' => 'Campos',
+ 'ModelOptions' => 'Opcións',
+ 'ModelFilters' => 'Filtros',
+ 'ModelNewField' => 'Novo campo',
+ 'ModelFieldInformation' => 'Información',
+ 'ModelFieldName' => 'Etiqueta:',
+ 'ModelFieldType' => 'Tipo:',
+ 'ModelFieldGroup' => 'Grupo:',
+ 'ModelFieldValues' => 'Valores',
+ 'ModelFieldInit' => 'Predeterminado:',
+ 'ModelFieldMin' => 'Mínimo:',
+ 'ModelFieldMax' => 'Máximo:',
+ 'ModelFieldList' => 'Listaxe de valores:',
+ 'ModelFieldListLegend' => '<i>Separado por comas</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Texto curto',
+ 'ModelFieldTypeLongText' => 'Texto longo',
+ 'ModelFieldTypeYesNo' => 'Si/Non',
+ 'ModelFieldTypeNumber' => 'Número',
+ 'ModelFieldTypeDate' => 'Data',
+ 'ModelFieldTypeOptions' => 'Listaxe de valores predefinidos',
+ 'ModelFieldTypeImage' => 'Imaxe',
+ 'ModelFieldTypeSingleList' => 'Listaxe simple',
+ 'ModelFieldTypeFile' => 'Campo',
+ 'ModelFieldTypeFormatted' => 'Dependente doutros campos',
+ 'ModelFieldParameters' => 'Parámetros',
+ 'ModelFieldHasHistory' => 'Usar un historial',
+ 'ModelFieldFlat' => 'Amosar nunha sóa liña',
+ 'ModelFieldStep' => 'Paso incremental:',
+ 'ModelFieldFileFormat' => 'Formato do ficheiro:',
+ 'ModelFieldFileFile' => 'Ficheiro simple',
+ 'ModelFieldFileImage' => 'Imaxe',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Programa',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Usar campos',
+ 'ModelOptionsFieldsAuto' => 'Automático',
+ 'ModelOptionsFieldsNone' => 'Ningún',
+ 'ModelOptionsFieldsTitle' => 'Como título',
+ 'ModelOptionsFieldsId' => 'Como identificador',
+ 'ModelOptionsFieldsCover' => 'Como cuberta',
+ 'ModelOptionsFieldsPlay' => 'Para botón Play',
+ 'ModelCollectionSettings' => 'Preferencias da colección',
+ 'ModelCollectionSettingsLending' => 'Os elementos pódense prestar',
+ 'ModelCollectionSettingsTagging' => 'Os elementos pódense etiquetar',
+ 'ModelFilterActivated' => 'Debería ser nunha caixa de procura',
+ 'ModelFilterComparison' => 'Comparación',
+ 'ModelFilterContain' => 'Contén',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Rango',
+ 'ModelFilterNumeric' => 'Comparación numérica',
+ 'ModelFilterQuick' => 'Crear un filtro rápido',
+ 'ModelTooltipName' => 'Utilice un nome para reutilizar este modelo para outras coleccións. Se o deixa baleiro, as preferencias gardaranse directamente na propia colección.',
+ 'ModelTooltipLabel' => 'O nome do campo tal e como será amosado',
+ 'ModelTooltipGroup' => 'Usado para agrupar campos. Os elementos sen valor aquí estarán en un grupo predeterminado',
+ 'ModelTooltipHistory' => 'Deben gardarse os valores introducidos nunha lista asociada ao campo?',
+ 'ModelTooltipFormat' => 'Este formato úsase para determinar a acción que ten o botón Play ao abrir o ficheiro',
+ 'ModelTooltipLending' => 'Isto engadirá algúns campos para manexar os préstamos',
+ 'ModelTooltipTagging' => 'Isto engadirá algúns campos para manexar as etiquetas',
+ 'ModelTooltipNumeric' => 'Deben considerarse os valores como número na comparación?',
+ 'ModelTooltipQuick' => 'Isto engadirá un submenú no menú de Filtros',
+
+ 'ResultsTitle' => 'Seleccionar un elemento', # Accepts model codes
+ 'ResultsNextTip' => 'Procurarr na seguinte Web',
+ 'ResultsPreview' => 'Previsualizar',
+ 'ResultsInfo' => 'Pode engadir varios elementos á colección seleccionandoos mentres preme Ctrl ou Shift', # Accepts model codes
+
+ 'OptionsTitle' => 'Preferencias',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Navegador Web',
+ 'OptionsPlayer' => 'Reprodutor de Video',
+ 'OptionsAudio' => 'Reprodutor de Audio',
+ 'OptionsImageEditor' => 'Image editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Directorio de Imaxes',
+ 'OptionsUseRelativePaths' => 'Utilizar rutas relativas para as imaxes',
+ 'OptionsLayout' => 'Disposición',
+ 'OptionsStatus' => 'Amosar barra de estado',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Atención: Os cambios nesta pestana non terán efecto até que reinicie a aplicación.',
+ 'OptionsRemoveConfirm' => 'Pedir confirmación antes de eliminar un elemento',
+ 'OptionsAutoSave' => 'Gardar automáticamente a colección',
+ 'OptionsAutoLoad' => 'Cargar a colección anterior ao inicio',
+ 'OptionsSplash' => 'Amosar pantalla de inicio',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Utilizar corrector ortográfico para os campos de texto longos',
+ 'OptionsProgramTitle' => 'Seleccione que programa se utilizará',
+ 'OptionsPlugins' => 'Sitio web do que recuperar os datos',
+ 'OptionsAskPlugins' => 'Preguntar (Todos os sitios web)',
+ 'OptionsPluginsMulti' => 'Algúns sitios',
+ 'OptionsPluginsMultiAsk' => 'Preguntar (Algúns sitios web)',
+ 'OptionsPluginsMultiPerField' => 'Algúns sitios (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Definir a listaxe',
+ 'OptionsAskImport' => 'Seleccione os campos para importar',
+ 'OptionsProxy' => 'Usar un proxy',
+ 'OptionsCookieJar' => 'Utilizar este ficheiro cookie jar',
+ 'OptionsLang' => 'Linguaxe',
+ 'OptionsMain' => 'Principal',
+ 'OptionsPaths' => 'Rutas',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Características',
+ 'OptionsDisplay' => 'Visualización',
+ 'OptionsToolbar' => 'Barra de ferramentas',
+ 'OptionsToolbars' => {0 => 'Ningún', 1 => 'Pequeno', 2 => 'Grande', 3 => 'Predeterminado do Sistema'},
+ 'OptionsToolbarPosition' => 'Posición',
+ 'OptionsToolbarPositions' => {0 => 'Arriba', 1 => 'Abaixo', 2 => 'Esquerda', 3 => 'Derecha'},
+ 'OptionsExpandersMode' => 'Extensores demasiado longos',
+ 'OptionsExpandersModes' => {'asis' => 'Non facer nada', 'cut' => 'Cortar', 'wrap' => 'Axuste de liña'},
+ 'OptionsDateFormat' => 'Formato da data',
+ 'OptionsDateFormatTooltip' => 'O formato é o utilizado por strftime(3). Por defecto é %d/%m/%Y',
+ 'OptionsView' => 'Listaxe de elementos',
+ 'OptionsViews' => {0 => 'Texto', 1 => 'Imaxe', 2 => 'Detallado'},
+ 'OptionsColumns' => 'Columnas',
+ 'OptionsMailer' => 'Método de envío',
+ 'OptionsSMTP' => 'Servidor',
+ 'OptionsFrom' => 'O seu enderezo de correo electrónico',
+ 'OptionsTransform' => 'Poñer os artigos ao final dos títulos',
+ 'OptionsArticles' => 'Artigos (Separados por comas)',
+ 'OptionsSearchStop' => 'Permitir cancelar a procura',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'Utilizar título principal se non está o título orixinal',
+ 'OptionsRestoreAccelerators' => 'Restaurar aceleradores',
+ 'OptionsHistory' => 'Tamaño do historial',
+ 'OptionsClearHistory' => 'Limpar historial',
+ 'OptionsStyle' => 'Pel',
+ 'OptionsDontAsk' => 'Non preguntar de novo',
+ 'OptionsPathProgramsGroup' => 'Aplicacións',
+ 'OptionsProgramsSystem' => 'Utilizar programas definidos polo sistema',
+ 'OptionsProgramsUser' => 'Utilizar programas especificados',
+ 'OptionsProgramsSet' => 'Definir programas',
+ 'OptionsPathImagesGroup' => 'Imaxes',
+ 'OptionsInternetDataGroup' => 'Importar datos',
+ 'OptionsInternetSettingsGroup' => 'Preferencias',
+ 'OptionsDisplayInformationGroup' => 'Amosar información',
+ 'OptionsDisplayArticlesGroup' => 'Artigos',
+ 'OptionsImagesDisplayGroup' => 'Visualización',
+ 'OptionsImagesStyleGroup' => 'Estilo',
+ 'OptionsDetailedPreferencesGroup' => 'Preferencias',
+ 'OptionsFeaturesConveniencesGroup' => 'Conveniencias',
+ 'OptionsPicturesFormat' => 'Prefixo para utilizar coas imaxes:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Título ou nome do elemento asociado',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% ou . reemprazarase có directorio da colección (utilizar só ao comezo da ruta)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% reemprazarase polo nome do ficheiro da colección sen o sufixo (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% debería ser utilizado só ao inicio da ruta para as imaxes',
+ 'OptionsConfigureMailers' => 'Configurar programas de correo',
+
+ 'ImagesOptionsButton' => 'Preferencias',
+ 'ImagesOptionsTitle' => 'Preferencias para a listaxe de imaxes',
+ 'ImagesOptionsSelectColor' => 'Seleccionar unha cor',
+ 'ImagesOptionsUseOverlays' => 'Usar superposición de imaxes',
+ 'ImagesOptionsBg' => 'Fondo',
+ 'ImagesOptionsBgPicture' => 'Utilizar unha imaxe de fondo',
+ 'ImagesOptionsFg'=> 'Selección',
+ 'ImagesOptionsBgTooltip' => 'Cambiar a cor de fondo',
+ 'ImagesOptionsFgTooltip'=> 'Cambiar a selección de cor',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Tamaño',
+ 'ImagesOptionsSizeList' => {0 => 'Moi pequeno', 1 => 'Pequeno', 2 => 'Medio', 3 => 'Grande', 4 => 'Moi grande'},
+ 'ImagesOptionsSizeTooltip' => 'Seleccionar o tamaño da imaxe',
+
+ 'DetailedOptionsTitle' => 'Preferencias para a listaxe detallada',
+ 'DetailedOptionsImageSize' => 'Tamaño das imaxes',
+ 'DetailedOptionsGroupItems' => 'Agrupar elementos por',
+ 'DetailedOptionsSecondarySort' => 'Ordenar campos segundo descendencia',
+ 'DetailedOptionsFields' => 'Seleccionar campos a amosar',
+ 'DetailedOptionsGroupedFirst' => 'Manter xuntos elementos orfos',
+ 'DetailedOptionsAddCount' => 'Engadir número de elementos ás categorías',
+
+ 'ExtractButton' => 'Información',
+ 'ExtractTitle' => 'Información do ficheiro',
+ 'ExtractImport' => 'Utilizar valores',
+
+ 'FieldsListOpen' => 'Cargar unha listaxe de ficheiros desde un ficheiro',
+ 'FieldsListSave' => 'Gardar listaxe de cmapos a un ficheiro',
+ 'FieldsListError' => 'Esta listaxe de ficheiros non pode utilizase con este tipo de colección',
+ 'FieldsListIgnore' => '--- Ignorar',
+
+ 'ExportTitle' => 'Exportar listaxe de elementos',
+ 'ExportFilter' => 'Exportar só os elementos amosados',
+ 'ExportFieldsTitle' => 'Ficheiros a exportar',
+ 'ExportFieldsTip' => 'Seleccione os ficheiros que quere exportar',
+ 'ExportWithPictures' => 'Copiar imaxes nun sub-directorio',
+ 'ExportSortBy' => 'Ordear por',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Importar outra listaxe de elementos',
+ 'ImportExportData' => 'Datos',
+ 'ImportExportFile' => 'Ficheiro',
+ 'ImportExportFieldsUnused' => 'Campos sen utilizar',
+ 'ImportExportFieldsUsed' => 'Campos utilizados',
+ 'ImportExportFieldsFill' => 'Engadir todo',
+ 'ImportExportFieldsClear' => 'Eliminar todos',
+ 'ImportExportFieldsEmpty' => 'Ten que escolles polo menos un campo',
+ 'ImportExportFileEmpty' => 'Ten que especificar un nome de campo',
+ 'ImportFieldsTitle' => 'Campos a importar',
+ 'ImportFieldsTip' => 'Seleccione os campos que quere importar',
+ 'ImportNewList' => 'Crear unha nova colección',
+ 'ImportCurrentList' => 'Engadir á colección actual',
+ 'ImportDropError' => 'Houbo un erro abrindo algúns dos ficheiros. Cargarase a listaxe anterior.',
+ 'ImportGenerateId' => 'Xerar identificador para cada elemento',
+
+ 'FileChooserOpenFile' => 'Selecione o ficheiro',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Seleccione un directorio',
+ 'FileChooserOverwrite' => 'Este ficheiro xa existe. Quere sobreescribilo?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ #Some default panels
+ 'PanelCompact' => 'Compacto',
+ 'PanelReadOnly' => 'Só Lectura',
+ 'PanelForm' => 'Pestanas',
+
+ 'PanelSearchButton' => 'Buscar información',
+ 'PanelSearchTip' => 'Buscar na web información sobre este nome',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Preme na imaxe para seleccionar unha diferente.',
+ 'PanelImageTipView' => 'Preme na imaxe para vela no seu tamaño real.',
+ 'PanelImageTipMenu' => ' Botón dereito para máis opcións.',
+ 'PanelImageTitle' => 'Seleccione una imaxe',
+ 'PanelImageNoImage' => 'Sen imaxe',
+ 'PanelSelectFileTitle' => 'Seleccione un ficheiro',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restaurar predeterminado',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'Desde',
+ 'PanelTo' =>'A',
+
+ 'PanelWeb' => 'Ver información',
+ 'PanelWebTip' => 'Ver información na web acerca deste elemento', # Accepts model codes
+ 'PanelRemoveTip' => 'Eliminar elemento actual', # Accepts model codes
+
+ 'PanelDateSelect' => 'Seleccionar',
+ 'PanelNobody' => 'Ninguén',
+ 'PanelUnknown' => 'Descoñecido',
+ 'PanelAdded' => 'Engadir data',
+ 'PanelRating' => 'Puntuación',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Localidade',
+
+ 'PanelLending' => 'Prestamo',
+ 'PanelBorrower' => 'Prestatario',
+ 'PanelLendDate' => 'Fora desde',
+ 'PanelHistory' => 'Historial de préstamo',
+ 'PanelReturned' => 'Elemento devolto', # Accepts model codes
+ 'PanelReturnDate' => 'Data de devolución',
+ 'PanelLendedYes' => 'Prestado',
+ 'PanelLendedNo' => 'Dispoñible',
+
+ 'PanelTags' => 'Etiquetas',
+ 'PanelFavourite' => 'Favorito',
+ 'TagsAssigned' => 'Etiquetas asignadas',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Calquera',
+ 'CheckYes' => 'Si',
+ 'CheckNo' => 'Non',
+
+ 'ToolbarAll' => 'Ver todo',
+ 'ToolbarAllTooltip' => 'Ver todos os elementos',
+ 'ToolbarGroupBy' => 'Agrupar por',
+ 'ToolbarGroupByTooltip' => 'Seleccionar o campo para agrupar os elementos da lista',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Procurar un elemento',
+ 'PluginsQuery' => 'Procura',
+ 'PluginsFrame' => 'Sitio Web de búsqueda',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Nome',
+ 'PluginsSearchFields' => 'Campos de búsqueda',
+ 'PluginsAuthor' => 'Autor',
+ 'PluginsLang' => 'Linguaxe',
+ 'PluginsUseSite' => 'Utilizar sitio web seleccionado para outras procuras no futuro',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Configuración do prestatario',
+ 'BorrowersList' => 'Prestatarios',
+ 'BorrowersName' => 'Nome',
+ 'BorrowersEmail' => 'e-mail',
+ 'BorrowersAdd' => 'Engadir',
+ 'BorrowersRemove' => 'Eliminar',
+ 'BorrowersEdit' => 'Editar',
+ 'BorrowersTemplate' => 'Plantilla de correo',
+ 'BorrowersSubject' => 'Asunto do correo',
+ 'BorrowersNotice1' => '%1 reemprazarase có nome do prestatario/a',
+ 'BorrowersNotice2' => '%2 reemprazarase có título do elemento',
+ 'BorrowersNotice3' => '%3 reemprazarase coa data do préstamo',
+
+ 'BorrowersImportTitle' => 'Importar información dos prestatarios',
+ 'BorrowersImportType' => 'Formato do ficheiro:',
+ 'BorrowersImportFile' => 'Ficheiro:',
+
+ 'BorrowedTitle' => 'Elementos prestados', # Accepts model codes
+ 'BorrowedDate' => 'Desde',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'Enviar un correo electrónico',
+ 'MailFrom' => 'Desde: ',
+ 'MailTo' => 'A: ',
+ 'MailSubject' => 'Asunto: ',
+ 'MailSmtpError' => 'Houbo un problema conectando có servidor SMTP',
+ 'MailSendmailError' => 'Houbo un problema ao lanzar sendmail',
+
+ 'SearchTooltip' => 'Procurar todos os elementos', # Accepts model codes
+ 'SearchTitle' => 'Procura de elementos', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Campo a reemprazar',
+ 'QueryReplaceOld' => 'Valor actual',
+ 'QueryReplaceNew' => 'Novo valor',
+ 'QueryReplaceLaunch' => 'Reemprazar',
+
+ 'ImportWindowTitle' => 'Seleccione os campos para importar',
+ 'ImportViewPicture' => 'Ver imaxe',
+ 'ImportSelectAll' => 'Seleccionar todo',
+ 'ImportSelectNone' => 'Non seleccionar ningún',
+
+ 'MultiSiteTitle' => 'Sitios web para as procuras',
+ 'MultiSiteUnused' => 'Complementos sen usar',
+ 'MultiSiteUsed' => 'Complementos para usar',
+ 'MultiSiteLang' => 'Encher a listaxe con plugins en galego',
+ 'MultiSiteEmptyError' => 'Ten una listaxe de sitios baleira',
+ 'MultiSiteClear' => 'Limpar listaxe',
+
+ 'DisplayOptionsTitle' => 'Elementos para amosar',
+ 'DisplayOptionsAll' => 'Seleccionar todos',
+ 'DisplayOptionsSearch' => 'Botón de procura',
+
+ 'GenresTitle' => 'Conversión de xénero',
+ 'GenresCategoryName' => 'Xénero a utilizar',
+ 'GenresCategoryMembers' => 'Xérnero para reemprazar',
+ 'GenresLoad' => 'Cargar unha listaxe',
+ 'GenresExport' => 'Gardar listaxe a un ficheiro',
+ 'GenresModify' => 'Editar conversión',
+
+ 'PropertiesName' => 'Nome da colección',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Propietario/a',
+ 'PropertiesEmail' => 'Correo electrónico',
+ 'PropertiesDescription' => 'Descripción',
+ 'PropertiesFile' => 'Información de ficheiro',
+ 'PropertiesFilePath' => 'Ruta completa',
+ 'PropertiesItemsNumber' => 'Número de elementos', # Accepts model codes
+ 'PropertiesFileSize' => 'Tamaño',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Propiedades da colección',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Programas de envío de correo',
+ 'MailProgramsName' => 'Nome',
+ 'MailProgramsCommand' => 'Liña de comandos',
+ 'MailProgramsRestore' => 'Restaurar valores predeterminados',
+ 'MailProgramsAdd' => 'Engadir un programa',
+ 'MailProgramsInstructions' => 'Na liña de comandos, fanse algunhas substitucións:
+ %f reemprázase có enderezo de correo electrónico do/a usuario/a.
+ %t reemprázase có enderezo do destinatario/a.
+ %s reemprázase có asunto da mensaxe.
+ %b reemprázase có corpo da mensaxe.',
+
+ 'BookmarksBookmarks' => 'Favoritos',
+ 'BookmarksFolder' => 'Cartafois',
+ 'BookmarksLabel' => 'Etiqueta',
+ 'BookmarksPath' => 'Ruta',
+ 'BookmarksNewFolder' => 'Novo cartafol',
+
+ 'AdvancedSearchType' => 'Tipo de procura',
+ 'AdvancedSearchTypeAnd' => 'Elementos que cumpren todos os criterios de procura', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Elementos que cumpren polo menos un criterio', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criterios',
+ 'AdvancedSearchAnyField' => 'Calquer campo',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Reporte de erro xerado por GCstar',
+ 'BugReportVersion' => 'Versión',
+ 'BugReportPlatform' => 'Sistema Operativo',
+ 'BugReportMessage' => 'Mensaxe de erro',
+ 'BugReportInformation' => 'Información adicional',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/HU/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/HU/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..0e08963
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::HU::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Mezőnevek beszúrása a fejlécbe',
+ 'Separator' => 'Elválasztó',
+ 'Replacement' => 'Az elválasztó cseréje erre',
+ 'Charset' => 'Karakterkódolás',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/HU/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..89afafe
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::HU::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/HU/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..7cc28be
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::HU::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Érvénytelen sablonfájl',
+ 'UseFile' => 'Alább megadott fájl használata',
+ 'WithJS' => 'Javascript használata',
+ 'FileTemplate' => 'Sablon',
+ 'Preview' => 'Előnézet',
+ 'NoPreview' => 'Előnézet nem elérhető',
+ 'TemplateExternalFile' => 'Sablonfájl',
+ 'Title' => 'Oldal címe',
+ 'InfoFile' => 'Filmlista ebben a fájlban: ',
+ 'InfoDir' => 'Képek itt: ',
+ 'HeightImg' => 'Az exportálandó képek magassága (pixelekben)',
+ 'OpenFileInBrowser' => 'A létrehozott fájl megnyitása webböngészőben',
+ 'Note' => 'A lista létrehozva a következővel <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Szöveg keresése',
+ 'SearchType1' => 'Csak cím',
+ 'SearchType2' => 'Teljes információ',
+ 'SearchButton' => 'Keresés',
+ 'SearchTitle' => 'Csak a kritériumoknak megfelelő filmek mutatása',
+ 'AllButton' => 'Mind',
+ 'AllTitle' => 'Minden film mutatása',
+ 'Expand' => 'Több',
+ 'ExpandTitle' => 'Bővített filminformációk mutatása',
+ 'Collapse' => 'Kevesebb',
+ 'CollapseTitle' => 'Összevont filminformációk mutatása',
+ 'Borrowed' => 'Kölcsönvéve: ',
+ 'NotBorrowed' => 'Elérhető',
+ 'Top' => 'Fennt',
+ 'Bottom' => 'Lennt',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/HU/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..84003b2
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::HU::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/HU/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..8f60cb8
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::HU::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'DROP utasítás beszúrása',
+ 'WithCreate' => 'CREATE utasítás beszúrása',
+ 'TableName' => 'Tábla név',
+ 'InfoFile' => 'SQL fájl: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/HU/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..0000c41
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::HU::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Archivum a fájban: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/HU/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..44007b3
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::HU::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Sablon fájl',
+ 'ModelText' => 'Sablon szöveg',
+ 'Models' => 'Használandó sablon',
+ 'UseFile' => 'Fájl használata',
+ 'UseModel' => 'Szöveges terület használata',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/HU/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..9a54275
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::HU::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Hol keressen',
+ 'Default' => 'Alapértelmezett Alexandria könyvtár',
+ 'Specified' => 'Alábbi meghatározott könyvtár',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/HU/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..6394977
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::HU::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Karakterkódolás',
+ 'Header' => 'Az első sor mellőzése',
+ 'Separator' => 'Elválasztó',
+ 'Plugin' => 'Használandó oldal',
+ 'UseFirst' => 'Az első kijelölése több talál esetén',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/HU/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..b89ca00
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::HU::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Mappa',
+ 'Recursive' => 'Almappák böngészése',
+ 'Suffixes' => 'A fájlok toldalékai, vagy kiterjesztései',
+ 'SuffixesTooltip' => 'A fájlok toldalékainak, vagy kiterjesztéseinek vesszővel elválasztott listájának megtekintése',
+ 'Remove' => 'Eltávolítva a nevekből',
+ 'RemoveTooltip' => 'A vesszővel elválasztott szavak listája, amiket el kellett távolítani a fájlnevekből a rövidített nevekhez',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/HU/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..a5e43f3
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::HU::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Képek másolása',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCImport/GCImportList.pm b/lib/gcstar/GCLang/HU/GCImport/GCImportList.pm
new file mode 100644
index 0000000..31786de
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::HU::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Nevek listája',
+ 'Plugin' => 'Használandó oldal',
+ 'UseFirst' => 'Az első kijelölése több talál esetén',
+ 'CommentAuto' => 'Elem automatikus importálása.',
+ 'CommentSite' => 'Weboldal: ',
+ 'CommentTitle' => 'Cím: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/HU/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..1b070eb
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::HU::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/HU/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..a985c9f
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::HU::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'A fájl nem Tellico gyűjtemény',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/HU/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..d3af82a
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::HU::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Show-k (epizódok) gyűjteménye',
+ Items => 'Epizódok',
+ NewItem => 'Új epizód',
+ NewSeries => 'Új sorozatok',
+ Episode => 'Epizód',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/HU/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..99f3e2c
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::HU::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Show-k (sorozatok) gyűjteménye',
+ Items => 'Sorozatok',
+ NewItem => 'Új sorozatok',
+ Name => 'Név',
+ Season => 'Évad',
+ Part => 'Rész',
+ Episodes => 'Epizódok',
+ FirstAired => 'First Aired',
+ Time => 'Ep. hossza',
+ Producer => 'Producer',
+ Music => 'Zene',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/HU/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..464ee91
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::HU::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Táblajáték gyűjtemény',
+ Items => {0 => 'Játék',
+ 1 => 'Játék',
+ X => 'Játékok'},
+ NewItem => 'Új játék',
+
+ Id => 'Azonosító',
+ Name => 'Név',
+ Original => 'Eredeti név',
+ Box => 'Borító kép',
+ DesignedBy => 'Tervezte',
+ PublishedBy => 'Kiadta',
+ Players => 'Játékosok száma',
+ PlayingTime => 'Játékidő',
+ SuggestedAge => 'Ajánlott kor',
+ Released => 'Kiadás',
+ Description => 'Leírás',
+ Category => 'Kategória',
+ Mechanics => 'Mechanizmusok',
+ ExpandedBy => 'Fejlesztő',
+ ExpansionFor => 'Fejlesztés',
+ GameFamily => 'Játékcsalád',
+ IllustratedBy => 'Illusztráló',
+ Url => 'Weboldal',
+ TimesPlayed => 'Játékok száma',
+ CompleteContents => 'Teljes részek',
+ Copies => 'Másolatok száma',
+ Condition => 'Állapot',
+ Photos => 'Fényképek',
+ Photo1 => 'Első kép',
+ Photo2 => 'Második kép',
+ Photo3 => 'Harmadik kép',
+ Photo4 => 'Negyedik kép',
+ Comments => 'Megjegyzések',
+
+ Perfect => 'Kiváló',
+ Good => 'Jó',
+ Average => 'Átlagos',
+ Poor => 'Szegényes',
+
+ CompleteYes => 'Teljes részek',
+ CompleteNo => 'Hiányzó részek',
+
+ General => 'Általános',
+ Details => 'Részletek',
+ Personal => 'Személyes',
+ Information => 'Információ',
+
+ FilterRatingSelect => 'Értékelés _legalább...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCbooks.pm b/lib/gcstar/GCLang/HU/GCModels/GCbooks.pm
new file mode 100644
index 0000000..1225acb
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCbooks.pm
@@ -0,0 +1,70 @@
+{
+ package GCLang::HU::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Könyvgyűjtemény',
+ Items => {0 => 'Könyv',
+ 1 => 'Könyv',
+ X => 'Könyvek'},
+ NewItem => 'Új könyv',
+
+ Isbn => 'ISBN',
+ Title => 'Cím',
+ Cover => 'Borító',
+ Authors => 'Szerzők',
+ Publisher => 'Kiadó',
+ Publication => 'Kiadás dátuma',
+ Language => 'Nyelv',
+ Genre => 'Jellemzők',
+ Serie => 'Sorozatok',
+ Rank => 'Értékelés',
+ Bookdescription => 'Leírás',
+ Pages => 'Oldalak',
+ Read => 'Olvasva',
+ Acquisition => 'Bekerülés dátuma',
+ Edition => 'Kiadás',
+ Format => 'Formátum',
+ Comments => 'Megjegyzések',
+ Url => 'Weboldal',
+ Translator => 'Fordító',
+ Artist => 'Illusztrátor',
+ DigitalFile => 'Digital version',
+
+ General => 'Általános',
+ Details => 'Részletek',
+
+ ReadNo => 'Nem olvasott',
+ ReadYes => 'Olvasott',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCcoins.pm b/lib/gcstar/GCLang/HU/GCModels/GCcoins.pm
new file mode 100644
index 0000000..094fa5a
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCcoins.pm
@@ -0,0 +1,104 @@
+{
+ package GCLang::HU::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Érmegyűjtemény',
+ Items => {0 => 'Érme',
+ 1 => 'Érme',
+ X => 'Érmék'},
+ NewItem => 'Új érme',
+
+ Name => 'Név',
+ Country => 'Ország',
+ Year => 'Év',
+ Currency => 'Pénznem',
+ Value => 'Érték',
+ Picture => 'Kép',
+ Diameter => 'Átmérő',
+ Metal => 'Fém',
+ Edge => 'Szegély',
+ Edge1 => 'Szegély 1',
+ Edge2 => 'Szegély 2',
+ Edge3 => 'Szegély 3',
+ Edge4 => 'Szegély 4',
+ Head => 'Fej',
+ Tail => 'Írás',
+ Comments => 'Megjegyzések',
+ History => 'Történelem',
+ Website => 'Weboldal',
+ Estimate => 'Becslés',
+ References => 'Referenciák',
+ Type => 'Típus',
+ Coin => 'Érme',
+ Banknote => 'Bankjegy',
+
+ Main => 'Általános',
+ Description => 'Leírás',
+ Other => 'Egyéb információk',
+ Pictures => 'Képek',
+
+ Condition => 'Minőség (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCcomics.pm b/lib/gcstar/GCLang/HU/GCModels/GCcomics.pm
new file mode 100644
index 0000000..d64f233
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::HU::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Képregénygyűjtemény',
+ Items => {0 => 'Képregények',
+ 1 => 'Képregény',
+ X => 'Képregények'},
+ NewItem => 'Új képregény',
+
+
+ Id => 'Id',
+ Name => 'Név',
+ Series => 'Sorozatok',
+ Volume => 'Kötet',
+ Title => 'Cím',
+ Writer => 'Író',
+ Illustrator => 'Illusztátor',
+ Colourist => 'Szinező',
+ Publisher => 'Kiadó',
+ Synopsis => 'Összegzés',
+ Collection => 'Gyűjtemény',
+ PublishDate => 'Kiadás dátuma',
+ PrintingDate => 'Nyomtatás dátuma',
+ ISBN => 'ISBN',
+ Type => 'Típus',
+ Category => 'Kategória',
+ Format => 'Formátum',
+ NumberBoards => 'Táblák száma',
+ Signing => 'Jelölés',
+ Cost => 'Ár',
+ Rating => 'Értékelés',
+ Comment => 'Megjegyzések',
+ Url => 'Weboldal',
+
+ FilterRatingSelect => 'Értékelés _legalább...',
+
+ Main => 'Fő elemek',
+ General => 'Általános',
+ Details => 'Részletek',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCfilms.pm b/lib/gcstar/GCLang/HU/GCModels/GCfilms.pm
new file mode 100644
index 0000000..674e1a0
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCfilms.pm
@@ -0,0 +1,93 @@
+{
+ package GCLang::HU::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Filmgyűjtemény',
+ Items => {0 => 'Film',
+ 1 => 'Film',
+ X => 'Filmek'},
+ NewItem => 'Új film',
+
+
+ Id => 'Azonosító',
+ Title => 'Cím',
+ Date => 'Dátum',
+ Time => 'Hossz',
+ Director => 'Rendező',
+ Country => 'Ország',
+ MinimumAge => 'Ajánlott kor',
+ Genre => 'Jellemzők',
+ Image => 'Kép',
+ Original => 'Eredeti cím',
+ Actors => 'Szereposztás',
+ Actor => 'Színész',
+ Role => 'Szerep',
+ Comment => 'Megjegyzések',
+ Synopsis => 'Összegzés',
+ Seen => 'Megnézve',
+ Number => '# Média',
+ Format => 'Média',
+ Region => 'Régió',
+ Identifier => 'Azonosító',
+ Url => 'Weboldal',
+ Audio => 'Hang',
+ Video => 'Videó formátum',
+ Trailer => 'Videó fájl',
+ Serie => 'Sorozatok',
+ Rank => 'Értékelés',
+ Subtitles => 'Alcímek',
+
+ SeenYes => 'Megnézve',
+ SeenNo => 'Nincs megnézve',
+
+ AgeUnrated => 'Nem értékelt',
+ AgeAll => 'Korhatár nélkül',
+ AgeParent => 'Szülői felügyelettel',
+
+ Main => 'Fő elemek',
+ General => 'Általános',
+ Details => 'Részletek',
+
+ Information => 'Információ',
+ Languages => 'Nyelvek',
+ Encoding => 'Kódolás',
+
+ FilterAudienceAge => 'Néző életkora',
+ FilterSeenNo => '_Még nem látott',
+ FilterSeenYes => '_Már látott',
+ FilterRatingSelect => 'Értékelés _legalább...',
+
+ ExtractSize => 'Méret',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCgames.pm b/lib/gcstar/GCLang/HU/GCModels/GCgames.pm
new file mode 100644
index 0000000..99138ed
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCgames.pm
@@ -0,0 +1,82 @@
+{
+ package GCLang::HU::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Videójáték gyűjtemény',
+ Items => {0 => 'Játék',
+ 1 => 'Játék',
+ X => 'Játékok'},
+ NewItem => 'Új játék',
+
+ Id => 'Azonosító',
+ Ean => 'EAN',
+ Name => 'Név',
+ Platform => 'Platform',
+ Players => 'Játékosok száma',
+ Released => 'Kiadás dátuma',
+ Editor => 'Kiadó',
+ Developer => 'Fejlesztő',
+ Genre => 'Jellemzők',
+ Box => 'Doboz képe',
+ Case => 'Eredeti tok',
+ Manual => 'Kézikönyv',
+ Completion => 'Befejezés (%)',
+ Executable => 'Játszhatóság',
+ Description => 'Leírás',
+ Codes => 'Kódok',
+ Code => 'Kód',
+ Effect => 'Efektek',
+ Secrets => 'Titkok',
+ Screenshots => 'Képernyőképek',
+ Screenshot1 => 'Első képernyőkép',
+ Screenshot2 => 'Második képernyőkép',
+ Comments => 'Megjegyzések',
+ Url => 'Weboldal',
+ Unlockables => 'Megoldások',
+ Unlockable => 'Cél',
+ Howto => 'Megoldás módja',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Általános',
+ Details => 'Összetevők',
+ Tips => 'Tippek',
+ Information => 'Információ',
+
+ FilterRatingSelect => 'Értékelés _Legalább...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/HU/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..f2ebc83
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::HU::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCminicars.pm b/lib/gcstar/GCLang/HU/GCModels/GCminicars.pm
new file mode 100644
index 0000000..971e64c
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::HU::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCmusics.pm b/lib/gcstar/GCLang/HU/GCModels/GCmusics.pm
new file mode 100644
index 0000000..abf9999
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCmusics.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::HU::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Zenegyűjtemény',
+ Items => {0 => 'Album',
+ 1 => 'Album',
+ X => 'Albumok'},
+ NewItem => 'Új album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Cím',
+ Cover => 'Borító',
+ Artist => 'Előadók',
+ Format => 'Formátum',
+ Running => 'Hossz',
+ Release => 'Kiadás dátuma',
+ Genre => 'Jellemzők',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Track lista',
+ Number => 'Szám',
+ Track => 'Cím',
+ Time => 'Idő',
+
+ Composer => 'Zeneszerző',
+ Producer => 'Gyártásvezető',
+ Playlist => 'Lejátszólista',
+ Comments => 'Megjegyzések',
+ Label => 'Cimke',
+ Url => 'Weboldal',
+
+ General => 'Általános',
+ Details => 'Összetevők',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/HU/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..aba734d
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::HU::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/HU/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..b3864cf
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::HU::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/HU/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..ab59a34
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::HU::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCstamps.pm b/lib/gcstar/GCLang/HU/GCModels/GCstamps.pm
new file mode 100644
index 0000000..eb0a9bd
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::HU::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCwines.pm b/lib/gcstar/GCLang/HU/GCModels/GCwines.pm
new file mode 100644
index 0000000..2c1cc56
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCwines.pm
@@ -0,0 +1,65 @@
+{
+ package GCLang::HU::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Borgyűjtemény',
+ Items => {0 => 'Bor',
+ 1 => 'Bor',
+ X => 'Borok'},
+ NewItem => 'Új bor',
+
+ Name => 'Név',
+ Designation => 'Megnevezés',
+ Vintage => 'Évjárat',
+ Vineyard => 'Pincészet',
+ Type => 'Típus',
+ Grapes => 'Szőlők',
+ Soil => 'Talaj',
+ Producer => 'Termelő',
+ Country => 'Ország',
+ Volume => 'Űrtartalom (ml)',
+ Alcohol => 'Alkohol (%)',
+ Medal => 'Díjak és elismerések',
+
+ Storage => 'Tárolás',
+ Location => 'Hely',
+ ShelfIndex => 'Mutató',
+ Quantity => 'Mennyiség',
+ Acquisition => 'Beszerzés',
+ PurchaseDate => 'Beszerzés dátuma',
+ PurchasePrice => 'Beszerzési ár',
+ Gift => 'Ajándék',
+ BottleLabel => 'Palack címke',
+ Website => 'Referenciák a weben',
+
+ Tasted => 'Megízlelve',
+ Comments => 'Megjegyzések',
+ Serving => 'Kínálás',
+ TastingField => 'Bírálati megjegyzések',
+
+ General => 'Általános',
+ Details => 'Összetevők',
+ Tasting => 'Ízlelés',
+
+ TastedNo => 'Nincs megízlelve',
+ TastedYes => 'Megízlelve',
+
+ FilterRange => 'Érték',
+ FilterTastedNo => '_Még nem ízlelt',
+ FilterTastedYes => 'Már _ízlelt',
+ FilterRatingSelect => 'Értékelés _legalább...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCstar.pm b/lib/gcstar/GCLang/HU/GCstar.pm
new file mode 100644
index 0000000..51b0c3e
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCstar.pm
@@ -0,0 +1,673 @@
+{
+ package GCLang::HU;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Magyar',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Figyelmeztetés</b>:
+
+A weboldalakról letöltött információk (a bővítményeken keresztül)
+<b>csak személyes használatra engedélyezettek</b>.
+
+Bármilyen újraközlés az oldal
+<b>külön engedélye</b> nélkül tilos.
+
+<b>Az elemek alatti gomb</b> megnyomásával nyomonkövethetjük,
+hogy melyik oldalról valók az információk.',
+
+ 'AllItemsFiltered' => 'Nincs megfelelő elem a keresési feltételeidhez', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Telepítés ide',
+ 'InstallMandatory' => 'Szükséges összetevők',
+ 'InstallOptional' => 'Választható összetevők',
+ 'InstallErrorMissing' => 'Hiba : A következő Perl összetevőket telepíteni kell: ',
+ 'InstallPrompt' => 'A telepítés alapkönyvtára [/usr/local]: ',
+ 'InstallEnd' => 'A telepítés befejeződött',
+ 'InstallNoError' => 'Nincs hiba',
+ 'InstallLaunch' => 'Az alkalmazás használatához indítsd ',
+ 'InstallDirectory' => 'Alapkönyvtár',
+ 'InstallTitle' => 'GCstar telepítése',
+ 'InstallDependencies' => 'Függőségek',
+ 'InstallPath' => 'Elérési út',
+ 'InstallOptions' => 'Beállítások',
+ 'InstallSelectDirectory' => 'Válassz ki egy alapkönyvtárat a telepítéshez',
+ 'InstallWithClean' => 'A telepítőkönyvtár fájlainak törlése',
+ 'InstallWithMenu' => 'A GCstar hozzáadása az Alkalmazások menühöz',
+ 'InstallNoPermission' => 'Hiba: Nincs írásjogod a kiválasztott könyvtárra',
+ 'InstallMissingMandatory' => 'Szükséges összetevők hiányoznak. Amíg nem telepíted őket, a GCstar nem telepíthető.',
+ 'InstallMissingOptional' => 'Néhány, alul listázott választható összetevő hiányzik. A GCstar telepíthető, de néhány funkció nem lesz elérhető.',
+ 'InstallMissingNone' => 'Nincs hiányzó függőség. Folytathatod a GCstar telepítését.',
+ 'InstallOK' => 'Rendben',
+ 'InstallMissing' => 'Hiányzik',
+ 'InstallMissingFor' => 'Hiányzó',
+ 'InstallCleanDirectory' => 'Eltávolítható GCstar-fájlok ebben a könyvtárban: ',
+ 'InstallCopyDirectory' => 'Fájlok másolása: ',
+ 'InstallCopyDesktop' => 'A desktopfájlok másolása ide: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy használata (üss Entert, ha mégsem): ',
+ 'UpdateNoPermission' => 'Írási engedély megtagadva a könyvtárban: ',
+ 'UpdateNone' => 'Nem található frissítés',
+ 'UpdateFileNotFound' => 'A fájl nem található',
+
+#Splash
+ 'SplashInit' => 'Inicializáció',
+ 'SplashLoad' => 'Gyűjtemény betöltése',
+ 'SplashDisplay' => 'Gyűjtemény megjelenítése',
+ 'SplashSort' => 'Gyűjtemény rendezése',
+ 'SplashDone' => 'Kész',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Úgy tűnik, hogy korábban használtad a GCfilms-t. Mit szeretnél a GCfilms-ből a GCstar-ba importálni (ez nem befolyásolja a GCfilms-t, ha használni akarod)?',
+ 'GCfilmsImportOptions' => 'Beállítások',
+ 'GCfilmsImportData' => 'Filmlisták',
+
+#Menus
+ 'MenuFile' => '_Fájl',
+ 'MenuNewList' => '_Új gyűjtemény',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => 'K_orábbi gyűjtemények',
+ 'MenuLend' => 'Kölcsönadott _elemek megjelenítése', # Accepts model codes
+ 'MenuImport' => '_Importálás',
+ 'MenuExport' => 'E_xportálás',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Szerkesztés',
+ 'MenuDuplicate' => 'Elem _kettőzése', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Elem eltávolítása', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Gyűjtemény mezőinek megváltoztatása',
+ 'MenuEditLockItems' => 'Gyűjtemény _zárolása',
+
+ 'MenuDisplay' => 'S_zűrő',
+ 'MenuSavedSearches' => 'Elmentett keresések',
+ 'MenuSavedSearchesSave' => 'A jelenlegi keresés elmentése',
+ 'MenuSavedSearchesEdit' => 'Elmentett keresések módosítása',
+ 'MenuAdvancedSearch' => 'Haladó keresés',
+ 'MenuViewAllItems' => '_Elemek mutatása', # Accepts model codes
+ 'MenuNoFilter' => '_Minden',
+
+ 'MenuConfiguration' => '_Beállítások',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Megjelenítendő elemek',
+ 'MenuBorrowers' => '_Kölcsönvevők',
+ 'MenuToolbarConfiguration' => '_Eszköztár beállítása',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '_Jellemzők konvertálása',
+
+ 'MenuBookmarks' => 'S_aját gyűjtemények',
+ 'MenuBookmarksAdd' => '_Jelenlegi gyűjtemény hozzáadása',
+ 'MenuBookmarksEdit' => 'Gyűjtemények _szerkesztése',
+
+ 'MenuHelp' => 'S_úgó',
+ 'MenuHelpContent' => '_Tartalom',
+ 'MenuAllPlugins' => 'Bővítmények _megtekintése',
+ 'MenuBugReport' => 'Hibajelentés _küldése',
+ 'MenuAbout' => '_A GCstar-ról',
+
+ 'MenuNewWindow' => 'Megjelenítés új _ablakban', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Szálak kibontása',
+ 'ContextCollapseAll' => 'Szálak összecsukása',
+ 'ContextChooseImage' => 'Válassz _Képet',
+ 'ContextOpenWith' => 'Megnyitás ezze_l',
+ 'ContextImageEditor' => 'Képszerkesztő',
+ 'ContextImgFront' => 'Borító',
+ 'ContextImgBack' => 'Hátlap',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Addj meg egy értéket',
+
+ 'RemoveConfirm' => 'Valóban el akarod távolítani az elemet?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'Új elem', # Accepts model codes
+ 'NewItemTooltip' => 'Új elem hozzáadása', # Accepts model codes
+ 'NoItemFound' => 'Nincs találat. Akarsz egy másik oldalon keresni?',
+ 'OpenList' => 'Jelölj ki egy gyűjteményt',
+ 'SaveList' => 'Válaszd ki, hogy hova legyen mentve a gyűjtemény!',
+ 'SaveListTooltip' => 'Jelenlegi gyűjtemény mentése',
+ 'SaveUnsavedChanges' => 'Nem mentett változások vannak a gyűjteményedben. Akarod őket menteni?',
+ 'SaveDontSave' => 'Ne mentse',
+ 'PreferencesTooltip' => 'Beállítások',
+ 'ViewTooltip' => 'A gyűjtemény megjelenítésének változtatása',
+ 'PlayTooltip' => 'Az elemhez kapcsolódó videó lejátszása', # Accepts model codes
+ 'PlayFileNotFound' => 'Ezen a helyen nem található az indítandó fájl:',
+ 'PlayRetry' => 'Újra',
+
+ 'StatusSave' => 'Mentés...',
+ 'StatusLoad' => 'Betöltés...',
+ 'StatusSearch' => 'Haladó keresés...',
+ 'StatusGetInfo' => 'Információk betöltése...',
+ 'StatusGetImage' => 'Képek betöltése...',
+
+ 'SaveError' => 'Nem lehet menteni a listát. Ellenőrízd a jogokat és a szabad tárhelyet.',
+ 'OpenError' => 'Nem lehet megnyitni a listát. Ellenőrízd a jogokat.',
+ 'OpenFormatError' => 'Nem lehet megnyitni a listát. Hibás formátum.',
+ 'OpenVersionWarning' => 'A gyűjtemény egy újabb verziójú GCstar-ral készült. Ha elmented, elveszthetsz néhány adatot.',
+ 'OpenVersionQuestion' => 'Biztosan folytatni akarod?',
+ 'ImageError' => 'A képek mentéséhez kiválasztott könyvtár helytelen. Válassz egy másikat.',
+ 'OptionsCreationError'=> 'Nem lehet létrehozni a beállítás-fájlt: ',
+ 'OptionsOpenError'=> 'Nem lehet megnyitni a beállítás-fájlt: ',
+ 'OptionsSaveError'=> 'Nem lehet menteni a beállítás-fájlt: ',
+ 'ErrorModelNotFound' => 'Sablon nem található: ',
+ 'ErrorModelUserDir' => 'A felhasználó által meghatározott sablonok: ',
+
+ 'RandomTooltip' => 'Mit nézünk ma este ?',
+ 'RandomError'=> 'Nincs kijelölhető elem', # Accepts model codes
+ 'RandomEnd'=> 'Nincs több elem', # Accepts model codes
+ 'RandomNextTip'=> 'Következő javaslat',
+ 'RandomOkTip'=> 'Elem elfogadása',
+
+ 'AboutTitle' => 'A GCstar-ról',
+ 'AboutDesc' => 'Személyes gyűjteménykezelő',
+ 'AboutVersion' => 'Verzió',
+ 'AboutTeam' => 'Csapat',
+ 'AboutWho' => 'Christian Jodar (Tian): Project menedzser, Programozó
+Nyall Dawson (Zombiepig): Programozó
+TPF: Programozó
+Adolfo González: Programozó
+',
+ 'AboutLicense' => 'Készült a GNU GPL licensz alapján
+Logók Copyright le Spektre',
+ 'AboutTranslation' => 'Magyar fordítás: Takács László Krisztián tlk at t-online dot hu',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logó és webdizájn: le Spektre',
+
+ 'ToolbarRandom' => 'Ma este',
+
+ 'UnsavedCollection' => 'Nem mentett Gyűjtemény',
+ 'ModelsSelect' => 'A gyűjtemény típusának kiválasztása',
+ 'ModelsPersonal' => 'Személyes sablonok',
+ 'ModelsDefault' => 'Alapértelmezett sablonok',
+ 'ModelsList' => 'Gyűjteménysablon',
+ 'ModelSettings' => 'Gyűjtemény beállítások',
+ 'ModelNewType' => 'Új gyűjteménytípus',
+ 'ModelName' => 'A gyűjteménytípus neve:',
+ 'ModelFields' => 'Mezők',
+ 'ModelOptions' => 'Beállítások',
+ 'ModelFilters' => 'Szűrők',
+ 'ModelNewField' => 'Új mező',
+ 'ModelFieldInformation' => 'Információ',
+ 'ModelFieldName' => 'Címke:',
+ 'ModelFieldType' => 'Típus:',
+ 'ModelFieldGroup' => 'Csoport:',
+ 'ModelFieldValues' => 'Értékek',
+ 'ModelFieldInit' => 'Alapértelmezett:',
+ 'ModelFieldMin' => 'Minimális:',
+ 'ModelFieldMax' => 'Maximális:',
+ 'ModelFieldList' => 'Értékek listája:',
+ 'ModelFieldListLegend' => '<i>Vesszővel elválasztva</i>',
+ 'ModelFieldDisplayAs' => 'Megjelenik mint:',
+ 'ModelFieldDisplayAsText' => 'Szöveg',
+ 'ModelFieldDisplayAsGraphical' => 'Kategória Beállítás',
+ 'ModelFieldTypeShortText' => 'Rövid szöveg',
+ 'ModelFieldTypeLongText' => 'Hosszú szöveg',
+ 'ModelFieldTypeYesNo' => 'Igen/Nem',
+ 'ModelFieldTypeNumber' => 'Szám',
+ 'ModelFieldTypeDate' => 'Dátum',
+ 'ModelFieldTypeOptions' => 'Előredefiniált lista',
+ 'ModelFieldTypeImage' => 'Kép',
+ 'ModelFieldTypeSingleList' => 'Egyszerű lista',
+ 'ModelFieldTypeFile' => 'Fájl',
+ 'ModelFieldTypeFormatted' => 'Más mezőknek alárendelve',
+ 'ModelFieldParameters' => 'Parametéterek',
+ 'ModelFieldHasHistory' => 'Előzmények használata',
+ 'ModelFieldFlat' => 'Kijelzés egy sorban',
+ 'ModelFieldStep' => 'Növekvő lépés:',
+ 'ModelFieldFileFormat' => 'Fájl formátum:',
+ 'ModelFieldFileFile' => 'Egyszerű fájl',
+ 'ModelFieldFileImage' => 'Kép',
+ 'ModelFieldFileVideo' => 'Videó',
+ 'ModelFieldFileAudio' => 'Hang',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Mezők használata',
+ 'ModelOptionsFieldsAuto' => 'Automatikus',
+ 'ModelOptionsFieldsNone' => 'Semmi',
+ 'ModelOptionsFieldsTitle' => 'Címként',
+ 'ModelOptionsFieldsId' => 'Azonosítóként',
+ 'ModelOptionsFieldsCover' => 'Borítóként',
+ 'ModelOptionsFieldsPlay' => 'Lejátszógomb',
+ 'ModelCollectionSettings' => 'Gyűjtemény beállítások',
+ 'ModelCollectionSettingsLending' => 'Kölcsönadható elemek',
+ 'ModelCollectionSettingsTagging' => 'Cimkézhető elemek',
+ 'ModelFilterActivated' => 'A keresősávban kell legyen',
+ 'ModelFilterComparison' => 'Összehasonlítás',
+ 'ModelFilterContain' => 'Tartalmazza',
+ 'ModelFilterDoesNotContain' => 'Nem tartalmazza',
+ 'ModelFilterRegexp' => 'Pontos kifejezés',
+ 'ModelFilterRange' => 'Sorozat',
+ 'ModelFilterNumeric' => 'Számalapú összehasonlítás',
+ 'ModelFilterQuick' => 'Gyorsszűrő létrehozása',
+ 'ModelTooltipName' => 'Név a modell használatához a további gyűjteményekben. Ha üresen marad, akkor a beállítások közvetlenül a gyűjteményen belül tárolódnak',
+ 'ModelTooltipLabel' => 'A mező neve, ahogy az meg fog jelenni',
+ 'ModelTooltipGroup' => 'Mezők csoportosítása. Az érték nélküli elemek az alapértelmezett csoportba kerülnek',
+ 'ModelTooltipHistory' => 'Az itt megadott értékek a mezőhöz kapcsolt listába kerülnek elmentésre',
+ 'ModelTooltipFormat' => 'Ez a formátum használatos a megnyitógomb által elindított eseményhez',
+ 'ModelTooltipLending' => 'Mezők hozzáadása a kölcsönzés-kezelőhöz',
+ 'ModelTooltipTagging' => 'Mezők hozzáadása a cimke-kezelőhöz',
+ 'ModelTooltipNumeric' => 'Az értékek az összehasonlításban számként lesznek jelölve',
+ 'ModelTooltipQuick' => 'Almenü hozzáadása a szűrőkhöz',
+
+ 'ResultsTitle' => 'Elem kijelölése', # Accepts model codes
+ 'ResultsNextTip' => 'Keresés a következő oldalon',
+ 'ResultsPreview' => 'Előnézet',
+ 'ResultsInfo' => 'Több elem hozzáadása lehetséges a gyűjteményhez. Nyomd le a Crtl vagy a Shift gombot, és válassz', # Accepts model codes
+
+ 'OptionsTitle' => 'Beállítások',
+ 'OptionsExpertMode' => 'Haladó mód',
+ 'OptionsPrograms' => 'Bizonyos alkalmazások használata különböző médiákhoz, hagyd üresen az alapbeállítások használatához',
+ 'OptionsBrowser' => 'Böngésző',
+ 'OptionsPlayer' => 'Videólejátszó',
+ 'OptionsAudio' => 'Hanglejátszó',
+ 'OptionsImageEditor' => 'Képszerkesztő',
+ 'OptionsCdDevice' => 'CD-eszköz',
+ 'OptionsImages' => 'Képek',
+ 'OptionsUseRelativePaths' => 'Relatív elérési utak használata a képekhez',
+ 'OptionsLayout' => 'Elrendezés',
+ 'OptionsStatus' => 'Állapotjelző mutatása',
+ 'OptionsUseStars' => 'Csillagok használata az értékelések kijelzéséhez',
+ 'OptionsWarning' => 'Figyelem: A beállítások csak a program újraindítása után lépnek életbe.',
+ 'OptionsRemoveConfirm' => 'Kérjen megerősítést az elem törlése előtt',
+ 'OptionsAutoSave' => 'Gyűjtemény automatikus mentése',
+ 'OptionsAutoLoad' => 'Előző gyűjtemény betöltése induláskor',
+ 'OptionsSplash' => 'Bejelentkező képernyő mutatása',
+ 'OptionsTearoffMenus' => 'Előjegyzési menük engedélyezése',
+ 'OptionsSpellCheck' => 'Helyesírásellenőrző használata a hosszú, szöveges mezőkhöz',
+ 'OptionsProgramTitle' => 'Használandó program kiválasztása',
+ 'OptionsPlugins' => 'Oldal, ahol adatot keres',
+ 'OptionsAskPlugins' => 'Keres (Minden oldalon)',
+ 'OptionsPluginsMulti' => 'Több oldalon',
+ 'OptionsPluginsMultiAsk' => 'Keres (Több oldalon)',
+ 'OptionsPluginsMultiPerField' => 'Több oldalon (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Lista beállítása',
+ 'OptionsAskImport' => 'Importálandó mezők kiválasztása',
+ 'OptionsProxy' => 'Proxy használata',
+ 'OptionsCookieJar' => 'Használja ezt a jar-fájlt a cookie-khoz',
+ 'OptionsLang' => 'Nyelv',
+ 'OptionsMain' => 'Általános',
+ 'OptionsPaths' => 'Útvonalak',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Tulajdonságok',
+ 'OptionsDisplay' => 'Megjelenítés',
+ 'OptionsToolbar' => 'Eszköztár',
+ 'OptionsToolbars' => {0 => 'Semmi', 1 => 'Kicsi', 2 => 'Nagy', 3 => 'Rendszer beállítás'},
+ 'OptionsToolbarPosition' => 'Pozíció',
+ 'OptionsToolbarPositions' => {0 => 'Fennt', 1 => 'Lennt', 2 => 'Balra', 3 => 'Jobbra'},
+ 'OptionsExpandersMode' => 'Túl hosszú kiterjesztések',
+ 'OptionsExpandersModes' => {'asis' => 'Úgy hagy', 'cut' => 'Kivág', 'wrap' => 'Tördel'},
+ 'OptionsDateFormat' => 'Dátum formátuma',
+ 'OptionsDateFormatTooltip' => 'A strftime(3) által használt dátum. Alapértelmezett %d/%m/%Y',
+ 'OptionsView' => 'Elemek listája',
+ 'OptionsViews' => {0 => 'Szöveg', 1 => 'Kép', 2 => 'Részletes'},
+ 'OptionsColumns' => 'Oszlopok',
+ 'OptionsMailer' => 'E-mail kliens',
+ 'OptionsSMTP' => 'Szerver',
+ 'OptionsFrom' => 'E-mail cím',
+ 'OptionsTransform' => 'Névelők helye a címek végén',
+ 'OptionsArticles' => 'Névelők (vesszővel elválasztva)',
+ 'OptionsSearchStop' => 'A keresés leállítható',
+ 'OptionsBigPics' => 'Nagy képek használata, ha lehetséges',
+ 'OptionsAlwaysOriginal' => 'A fő cím használata eredeti címként, ha az nem elérhető',
+ 'OptionsRestoreAccelerators' => 'Gyorsítók visszaállítása',
+ 'OptionsHistory' => 'Előzmények mérete',
+ 'OptionsClearHistory' => 'Előzmények törlése',
+ 'OptionsStyle' => 'Felület',
+ 'OptionsDontAsk' => 'Ne kérdezzen rá többet',
+ 'OptionsPathProgramsGroup' => 'Alkalmazások',
+ 'OptionsProgramsSystem' => 'Rendszer által kínált programok használata',
+ 'OptionsProgramsUser' => 'Egyéni programok használata',
+ 'OptionsProgramsSet' => 'Programok beállítása',
+ 'OptionsPathImagesGroup' => 'Képek',
+ 'OptionsInternetDataGroup' => 'Adat importálás',
+ 'OptionsInternetSettingsGroup' => 'Beállítások',
+ 'OptionsDisplayInformationGroup' => 'Információ megjelenítése',
+ 'OptionsDisplayArticlesGroup' => 'Névelők',
+ 'OptionsImagesDisplayGroup' => 'Kijelző',
+ 'OptionsImagesStyleGroup' => 'Stílus',
+ 'OptionsDetailedPreferencesGroup' => 'Beállítások',
+ 'OptionsFeaturesConveniencesGroup' => 'Kényelem',
+ 'OptionsPicturesFormat' => 'Előtag használata képekhez:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Az összekapcsolt elemek címe vagy neve',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% vagy . lecserélődik a gyűjtemény könyvtárára (csak az elérési út megadásánál használandó)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% lecserélődik a gyűjtemény nevére kiterjesztés nélkül (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% csak a képek elérési útjának megadásánál használható',
+ 'OptionsConfigureMailers' => 'Levelezőprogramok beállítása',
+
+ 'ImagesOptionsButton' => 'Beállítások',
+ 'ImagesOptionsTitle' => 'Képek listájának beállításai',
+ 'ImagesOptionsSelectColor' => 'Szín kijelölése',
+ 'ImagesOptionsUseOverlays' => 'Képrátétek használata',
+ 'ImagesOptionsBg' => 'Háttér',
+ 'ImagesOptionsBgPicture' => 'Háttérkép használata',
+ 'ImagesOptionsFg'=> 'Kiválasztás',
+ 'ImagesOptionsBgTooltip' => 'Háttérszín változtatása',
+ 'ImagesOptionsFgTooltip'=> 'Kijelölés színének változtatása',
+ 'ImagesOptionsResizeImgList' => 'Az oszlopok számának automatikus változtatása',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Méret',
+ 'ImagesOptionsSizeList' => {0 => 'Nagyon kicsi', 1 => 'Kicsi', 2 => 'Közepes', 3 => 'Nagy', 4 => 'Nagyon nagy'},
+ 'ImagesOptionsSizeTooltip' => 'Képméret kiválasztása',
+
+ 'DetailedOptionsTitle' => 'A részletes lista beállításai',
+ 'DetailedOptionsImageSize' => 'Képek mérete',
+ 'DetailedOptionsGroupItems' => 'Elemek csoportosítása',
+ 'DetailedOptionsSecondarySort' => 'Mezők csoportosítása gyerekeknek',
+ 'DetailedOptionsFields' => 'A megjelenítendő mezők kiválasztása',
+ 'DetailedOptionsGroupedFirst' => 'Árva sorok együttartása',
+ 'DetailedOptionsAddCount' => 'Elemek számának hozzáadása a kategóriákhoz',
+
+ 'ExtractButton' => 'Információ',
+ 'ExtractTitle' => 'Fájl információ',
+ 'ExtractImport' => 'Értékek használata',
+
+ 'FieldsListOpen' => 'Mezők listájának betöltése fájlból',
+ 'FieldsListSave' => 'Mezők listájának mentése fájlba',
+ 'FieldsListError' => 'A gyűjtemény ezen típusához ez a mezőlista nem használható',
+ 'FieldsListIgnore' => '--- Mellőz',
+
+ 'ExportTitle' => 'Elemlista exportálása',
+ 'ExportFilter' => 'Csak a kijelzett elemek exportálása',
+ 'ExportFieldsTitle' => 'Mezők exportálva',
+ 'ExportFieldsTip' => 'Válaszd ki az exportálandó elemeket',
+ 'ExportWithPictures' => 'Képek másolása az alkönyvtárba',
+ 'ExportSortBy' => 'Rendezés',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Egyéb elemlista importálása',
+ 'ImportExportData' => 'Adat',
+ 'ImportExportFile' => 'Fájl',
+ 'ImportExportFieldsUnused' => 'Nem használt mezők',
+ 'ImportExportFieldsUsed' => 'Használt mezők',
+ 'ImportExportFieldsFill' => 'Mindet hozzáad',
+ 'ImportExportFieldsClear' => 'Mindet eltávolít',
+ 'ImportExportFieldsEmpty' => 'Legalább egy mezőt kell választanod',
+ 'ImportExportFileEmpty' => 'Legalább egy fájlnevet meg kell adnod',
+ 'ImportFieldsTitle' => 'Mezők importálva',
+ 'ImportFieldsTip' => 'Jelöld ki az importálandó mezőket',
+ 'ImportNewList' => 'Új gyűjtemény létrehozása',
+ 'ImportCurrentList' => 'Hozzáadás a jelenlegi gyűjteményhez',
+ 'ImportDropError' => 'A fájl betöltésekor hiba történt. Az előző lista vissza lesz töltve.',
+ 'ImportGenerateId' => 'Azonosító létrehozása minden elemhez',
+
+ 'FileChooserOpenFile' => 'Válaszd ki a használandó fájlt!',
+ 'FileChooserDirectory' => 'Könyvtár',
+ 'FileChooserOpenDirectory' => 'Könyvtár kiválasztása',
+ 'FileChooserOverwrite' => 'A fájl már létezik. Felül akarod írni?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ #Some default panels
+ 'PanelCompact' => 'Egyszerű',
+ 'PanelReadOnly' => 'Csak olvasható',
+ 'PanelForm' => 'Cimkék',
+
+ 'PanelSearchButton' => 'Internetes keresés',
+ 'PanelSearchTip' => 'Keresés az interneten erre a névre',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Kattins a képre a változtatáshoz.',
+ 'PanelImageTipView' => 'Eredeti mérethez kattints a képre.',
+ 'PanelImageTipMenu' => ' Jobb klikk a további beállításokhoz.',
+ 'PanelImageTitle' => 'Kép kiválasztása',
+ 'PanelImageNoImage' => 'Nincs kép',
+ 'PanelSelectFileTitle' => 'Fájl kiválasztása',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Visszaállítás',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'Feladó',
+ 'PanelTo' =>'Címzett',
+
+ 'PanelWeb' => 'Információk megtekintése',
+ 'PanelWebTip' => 'Információ megtekintése az interneten erről az elemről', # Accepts model codes
+ 'PanelRemoveTip' => 'Jelenlegi elem eltávolítása', # Accepts model codes
+
+ 'PanelDateSelect' => 'Kijelöl',
+ 'PanelNobody' => 'Senki',
+ 'PanelUnknown' => 'Ismeretlen',
+ 'PanelAdded' => 'Dátum hozzáadása',
+ 'PanelRating' => 'Értékelés',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Hely',
+
+ 'PanelLending' => 'Kölcsönzés',
+ 'PanelBorrower' => 'Kölcsönvevő',
+ 'PanelLendDate' => 'Kölcsönadás ideje',
+ 'PanelHistory' => 'Kölcsönzési előzmények',
+ 'PanelReturned' => 'Visszaadva', # Accepts model codes
+ 'PanelReturnDate' => 'Visszaadás dátuma',
+ 'PanelLendedYes' => 'Kölcsönadva',
+ 'PanelLendedNo' => 'Elérhető',
+
+ 'PanelTags' => 'Cimkék',
+ 'PanelFavourite' => 'Kedvencek',
+ 'TagsAssigned' => 'Kijelölt cimkék',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Bármelyik',
+ 'CheckYes' => 'Igen',
+ 'CheckNo' => 'Nem',
+
+ 'ToolbarAll' => 'Mindent megtekint',
+ 'ToolbarAllTooltip' => 'Elemek mutatása',
+ 'ToolbarGroupBy' => 'Csoportosítás',
+ 'ToolbarGroupByTooltip' => 'Jelöld ki a lista elemeinek csoportosításához használni kívánt mezőt',
+ 'ToolbarQuickSearch' => 'Gyorskeresés',
+ 'ToolbarQuickSearchLabel' => 'Keresés',
+ 'ToolbarQuickSearchTooltip' => 'Válaszd ki azt a mezőt, amiben keresnél. Üsd be a kifejezéseket és nyomj Entert',
+ 'ToolbarSeparator' => ' Elválasztó',
+
+ 'PluginsTitle' => 'Elem keresése',
+ 'PluginsQuery' => 'Kérdés',
+ 'PluginsFrame' => 'Oldal keresése',
+ 'PluginsLogo' => 'Logó',
+ 'PluginsName' => 'Név',
+ 'PluginsSearchFields' => 'Keresési mezők',
+ 'PluginsAuthor' => 'Szerző',
+ 'PluginsLang' => 'Nyelv',
+ 'PluginsUseSite' => 'A kiválasztott oldal használata további keresésekhez',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Kölcsönvevők beállításai',
+ 'BorrowersList' => 'Kölcsönvevők',
+ 'BorrowersName' => 'Név',
+ 'BorrowersEmail' => 'E-mail cím',
+ 'BorrowersAdd' => 'Hozzáadás',
+ 'BorrowersRemove' => 'Eltávolítás',
+ 'BorrowersEdit' => 'Szerkesztés',
+ 'BorrowersTemplate' => 'Levélsablon',
+ 'BorrowersSubject' => 'Levél tárgya',
+ 'BorrowersNotice1' => '%1 a kölcsönvevő nevére lesz cserélve',
+ 'BorrowersNotice2' => '%2 az elem címére lesz cserélve',
+ 'BorrowersNotice3' => '%3 a kölcsönzés dátumára lesz cserélve',
+
+ 'BorrowersImportTitle' => 'Információk importálása a kölcsönvevőkről',
+ 'BorrowersImportType' => 'Fájlformátum:',
+ 'BorrowersImportFile' => 'Fájl:',
+
+ 'BorrowedTitle' => 'Kölcsönadott elemek', # Accepts model codes
+ 'BorrowedDate' => 'Kölcsönadás ideje',
+ 'BorrowedDisplayInPanel' => 'Elemek megjelenítése a fő ablakban', # Accepts model codes
+
+ 'MailTitle' => 'E-mail küldése',
+ 'MailFrom' => 'Feladó: ',
+ 'MailTo' => 'Címzett: ',
+ 'MailSubject' => 'Tárgy: ',
+ 'MailSmtpError' => 'Hiba az SMTP szerverhez való kapcsolódáskor',
+ 'MailSendmailError' => 'Hiba a sendmail futtatásakor',
+
+ 'SearchTooltip' => 'Elemek keresése', # Accepts model codes
+ 'SearchTitle' => 'Elem keresése', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Mezőcsere',
+ 'QueryReplaceOld' => 'Jelenlegi érték',
+ 'QueryReplaceNew' => 'Új érték',
+ 'QueryReplaceLaunch' => 'Csere',
+
+ 'ImportWindowTitle' => 'Importálandó mezők kiválasztása',
+ 'ImportViewPicture' => 'Kép megtekintése',
+ 'ImportSelectAll' => 'Mindent kijelöl',
+ 'ImportSelectNone' => 'Kijelölés megszüntetése',
+
+ 'MultiSiteTitle' => 'A kereséshez használt oldalak',
+ 'MultiSiteUnused' => 'Nem használt bővítmények',
+ 'MultiSiteUsed' => 'Használt bővítmények',
+ 'MultiSiteLang' => 'Töltse fel a listát a magyar bővítményekkel',
+ 'MultiSiteEmptyError' => 'A lista üres',
+ 'MultiSiteClear' => 'Lista törlése',
+
+ 'DisplayOptionsTitle' => 'Megjelenítendő elemek',
+ 'DisplayOptionsAll' => 'Mindent kijelöl',
+ 'DisplayOptionsSearch' => 'Keresőgomb',
+
+ 'GenresTitle' => 'Jellemzők konvertálása',
+ 'GenresCategoryName' => 'Jellemzők használata',
+ 'GenresCategoryMembers' => 'Jellemzők cseréje',
+ 'GenresLoad' => 'Lista betöltése',
+ 'GenresExport' => 'Lista mentése fájlba',
+ 'GenresModify' => 'Változások szerkesztése',
+
+ 'PropertiesName' => 'Gyűjtemény neve',
+ 'PropertiesLang' => 'Nyelv kód',
+ 'PropertiesOwner' => 'Tulajdonos',
+ 'PropertiesEmail' => 'E-mail cím',
+ 'PropertiesDescription' => 'Leírás',
+ 'PropertiesFile' => 'Fájlinformáció',
+ 'PropertiesFilePath' => 'Elérési út',
+ 'PropertiesItemsNumber' => 'Elemek száma', # Accepts model codes
+ 'PropertiesFileSize' => 'Méret',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Gyűjtemény tulajdonságai',
+ 'PropertiesDefaultPicture' => 'Alapértelmezett kép',
+
+ 'MailProgramsTitle' => 'Levelezőprogramok',
+ 'MailProgramsName' => 'Név',
+ 'MailProgramsCommand' => 'Parancssor',
+ 'MailProgramsRestore' => 'Visszaállítás',
+ 'MailProgramsAdd' => 'Program hozzáadása',
+ 'MailProgramsInstructions' => 'A parancssorban néhány csere történt:
+ %f kicserélve a felhasználó e-mail címére.
+ %t kicserélve a címzett e-mail címére.
+ %s kicserélve az üzenet tárgyára.
+ %b kicserélve az üzenet tartalmára.',
+
+ 'BookmarksBookmarks' => 'Könyvjelzők',
+ 'BookmarksFolder' => 'Könyvtárak',
+ 'BookmarksLabel' => 'Cimke',
+ 'BookmarksPath' => 'Elérési út',
+ 'BookmarksNewFolder' => 'Új könyvtár',
+
+ 'AdvancedSearchType' => 'Keresés típusa',
+ 'AdvancedSearchTypeAnd' => 'Minden kritériumnak megfelelő elemek', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Legalább egy kritériumnak megfelelő elemek', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Kritérium',
+ 'AdvancedSearchAnyField' => 'Bármely mező',
+ 'AdvancedSearchSaveTitle' => 'Keresés elmentése',
+ 'AdvancedSearchSaveName' => 'Név',
+ 'AdvancedSearchSaveOverwrite' => 'Ezzel a névvel már létezik elmentett keresés. Válassz egy másikat.',
+ 'AdvancedSearchUseCase' => 'Ügyel a nagybetűs írásmódra',
+ 'AdvancedSearchIgnoreDiacritics' => 'Különleges karakterek mellőzése',
+
+ 'BugReportSubject' => 'Hibajelentés a GCstar-tól',
+ 'BugReportVersion' => 'Verzió',
+ 'BugReportPlatform' => 'Operációsrendszer',
+ 'BugReportMessage' => 'Hibaüzenet',
+ 'BugReportInformation' => 'További információk',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/ID/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/ID/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..a86dea8
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::ID::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Masukkan nama field di atas',
+ 'Separator' => 'Separator',
+ 'Replacement' => 'Ganti separator dengan',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/ID/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..736693c
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::ID::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/ID/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..3a06db5
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::ID::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'File Template keliru',
+ 'UseFile' => 'Gunakan file yang seperti dibawah',
+ 'TemplateExternalFile' => 'File template',
+ 'WithJS' => 'Gunakan Javascript',
+ 'FileTemplate' => 'Template:',
+ 'Preview' => 'Pratayang',
+ 'NoPreview' => 'Tidak ada pratayang',
+ 'Title' => 'Judul halaman',
+ 'InfoFile' => 'Daftar film ada di file: ',
+ 'InfoDir' => 'Gambar ada di: ',
+ 'HeightImg' => 'Panjang (dalam pixel) dari gambar yang akan di ekspor: ',
+ 'OpenFileInBrowser' => 'Buka file di penjelajah web',
+ 'Note' => 'Daftar dibuat oleh <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Masukkan teks pencarian',
+ 'SearchType1' => 'Hanya judul',
+ 'SearchType2' => 'Informasi lengkap',
+ 'SearchButton' => 'Cari',
+ 'SearchTitle' => 'Tampilkan semua film yang cocok dengan kriteria sebelumnya',
+ 'AllButton' => 'Semua',
+ 'AllTitle' => 'Tampilkan semua film',
+ 'Expand' => 'Expand all',
+ 'ExpandTitle' => 'Tampilkan semua informasi film',
+ 'Collapse' => 'Collapse all',
+ 'CollapseTitle' => 'Collapse all movies information',
+ 'Borrowed' => 'Dipinjam oleh: ',
+ 'NotBorrowed' => 'Tersedia',
+ 'Top' => 'Kembali ke atas',
+ 'Bottom' => 'Bawah',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/ID/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..b3dc005
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::ID::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/ID/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..d39f96d
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::ID::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Masukkan instruksi DROP',
+ 'WithCreate' => 'Masukkan instruksi CREATE',
+ 'TableName' => 'Nama Tabel',
+ 'InfoFile' => 'File SQL: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/ID/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..c71b12e
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ID::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Archive ada di file: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/ID/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..eef4ed5
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::ID::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Template file',
+ 'ModelText' => 'Template teks',
+ 'Models' => 'Template yang akan digunakan',
+ 'UseFile' => 'Gunakan file',
+ 'UseModel' => 'Gunakan text area',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/ID/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..8ac0b6b
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::ID::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Dimana sebaiknya mencari',
+ 'Default' => 'Default Alexandria\'s directory',
+ 'Specified' => 'Directory specified below',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/ID/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..d489326
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::ID::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Abaikan baris pertama',
+ 'Separator' => 'Pemisah',
+ 'Plugin' => 'Situs yang akan digunakan',
+ 'UseFirst' => 'Pilih yang paling pertama jika hasilnya banyak',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/ID/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..cc6976f
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::ID::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Jelajah sub-folders',
+ 'Suffixes' => 'Awalan atau ekstensi berkas',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'Nama yang akan dihilangkan',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/ID/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..edeb112
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ID::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Salin gambar',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCImport/GCImportList.pm b/lib/gcstar/GCLang/ID/GCImport/GCImportList.pm
new file mode 100644
index 0000000..9dec196
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::ID::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Daftar nama',
+ 'Plugin' => 'Situs yang akan digunakan',
+ 'UseFirst' => 'Pilih yang paling pertama jika hasilnya banyak',
+ 'CommentAuto' => 'Barang secara otomatis di-impor.',
+ 'CommentSite' => 'Situs: ',
+ 'CommentTitle' => 'Judul: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/ID/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..ce446e8
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::ID::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/ID/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..92ca138
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ID::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Bukan merupakan file yang didukung oleh Tellico',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/ID/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..fa2b0e4
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::ID::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/ID/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..89c9a14
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::ID::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/ID/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..565adab
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::ID::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCbooks.pm b/lib/gcstar/GCLang/ID/GCModels/GCbooks.pm
new file mode 100644
index 0000000..589a6cf
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCbooks.pm
@@ -0,0 +1,69 @@
+{
+ package GCLang::ID::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Koleksi buku',
+ Items => 'Buku',
+ NewItem => 'Buku baru',
+
+ Isbn => 'ISBN',
+ Title => 'Judul',
+ Cover => 'Sampul',
+ Authors => 'Pengarang',
+ Publisher => 'Penerbit',
+ Publication => 'Tanggal diterbitkan',
+ Language => 'Bahasa',
+ Genre => 'Genre',
+ Serie => 'Seri',
+ Rank => 'Ranking',
+ Bookdescription => 'Deskripsi',
+ Pages => 'Halaman',
+ Read => 'Baca',
+ Acquisition => 'Acquisition date',
+ Location => 'Lokasi',
+ Edition => 'Edisi',
+ Format => 'Format',
+ Comments => 'Komentar',
+ Url => 'Halaman web',
+ Translator => 'Translator',
+ Artist => 'Artist',
+ DigitalFile => 'Digital version',
+
+ General => 'General',
+ Details => 'Detail',
+
+ ReadNo => 'Belum dibaca',
+ ReadYes => 'Sudah dibaca',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCcoins.pm b/lib/gcstar/GCLang/ID/GCModels/GCcoins.pm
new file mode 100644
index 0000000..c01c835
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCcoins.pm
@@ -0,0 +1,104 @@
+{
+ package GCLang::ID::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Numismatic collection',
+ Items => {0 => 'Coin',
+ 1 => 'Coin',
+ X => 'Coins'},
+ NewItem => 'New coin',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Currency => 'Currency',
+ Value => 'Value',
+ Picture => 'Main picture',
+ Diameter => 'Diameter',
+ Metal => 'Metal',
+ Edge => 'Edge',
+ Edge1 => 'Edge 1',
+ Edge2 => 'Edge 2',
+ Edge3 => 'Edge 3',
+ Edge4 => 'Edge 4',
+ Head => 'Head',
+ Tail => 'Tail',
+ Comments => 'Comments',
+ History => 'History',
+ Website => 'Website',
+ Estimate => 'Estimate',
+ References => 'References',
+ Type => 'Type',
+ Coin => 'Coin',
+ Banknote => 'Bank note',
+
+ Main => 'Main',
+ Description => 'Description',
+ Other => 'Other information',
+ Pictures => 'Pictures',
+
+ Condition => 'Condition (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCcomics.pm b/lib/gcstar/GCLang/ID/GCModels/GCcomics.pm
new file mode 100644
index 0000000..f7d9d09
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::ID::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCfilms.pm b/lib/gcstar/GCLang/ID/GCModels/GCfilms.pm
new file mode 100644
index 0000000..b020acd
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCfilms.pm
@@ -0,0 +1,93 @@
+{
+ package GCLang::ID::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Koleksi film',
+ Items => 'Film',
+ NewItem => 'Film Baru',
+
+
+ Id => 'Id',
+ Title => 'Judul',
+ Date => 'Tanggal',
+ Time => 'Durasi',
+ Director => 'Sutradara',
+ Country => 'Negara',
+ MinimumAge => 'Minimum age',
+ Genre => 'Genre',
+ Image => 'Gambar',
+ Original => 'Judul asli',
+ Actors => 'Pemeran',
+ Actor => 'Aktor',
+ Role => 'Peran',
+ Comment => 'Komentar',
+ Synopsis => 'Sinopsis',
+ Seen => 'Sudah dilihat',
+ Number => '# of Media',
+ Format => 'Media',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'Halaman web',
+ Place => 'Lokasi',
+ Audio => 'Audio',
+ Video => 'Format video',
+ Trailer => 'File video',
+ Serie => 'Seri',
+ Rank => 'Ranking',
+ Subtitles => 'Subtitles',
+ Added => 'Add date',
+
+ SeenYes => 'Sudah dilihat',
+ SeenNo => 'Belum dilihat',
+
+ AgeUnrated => 'Unrated',
+ AgeAll => 'Semua Umur',
+ AgeParent => 'Bimbingan Orangtua',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Detail',
+
+ Information => 'Informasi',
+ Languages => 'Bahasa',
+ Encoding => 'Encoding',
+
+ FilterAudienceAge => 'Umur penonton',
+ FilterSeenNo => '_Not Yet Viewed',
+ FilterSeenYes => '_Already Viewed',
+ FilterRatingSelect => 'Rating At _Least...',
+
+ ExtractSize => 'Ukuran',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCgames.pm b/lib/gcstar/GCLang/ID/GCModels/GCgames.pm
new file mode 100644
index 0000000..81209e5
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCgames.pm
@@ -0,0 +1,81 @@
+{
+ package GCLang::ID::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Koleksi Game',
+ Items => 'Game',
+ NewItem => 'Game baru',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Nama',
+ Platform => 'Platform',
+ Players => 'Banyaknya pemain',
+ Released => 'Tanggal dirilis',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Genre => 'Genre',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instructions manual',
+ Completion => 'Completion (%)',
+ Executable => 'Executable',
+ Description => 'Deskripsi',
+ Codes => 'Kode',
+ Code => 'Kode',
+ Effect => 'Efek',
+ Secrets => 'Rahasia',
+ Location => 'Lokasi',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Komentar',
+ Url => 'Halaman web',
+ Unlockables => 'Tidak dapat di buka',
+ Unlockable => 'Tidak dapat di buka',
+ Howto => 'Bagaimana cara membuka',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'General',
+ Details => 'Detail',
+ Tips => 'Tips',
+ Information => 'Informasi',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/ID/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..b4f360b
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::ID::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCminicars.pm b/lib/gcstar/GCLang/ID/GCModels/GCminicars.pm
new file mode 100644
index 0000000..1955da4
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::ID::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCmusics.pm b/lib/gcstar/GCLang/ID/GCModels/GCmusics.pm
new file mode 100644
index 0000000..4e323c4
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCmusics.pm
@@ -0,0 +1,67 @@
+{
+ package GCLang::ID::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Koleksi musik',
+ Items => 'Album',
+ NewItem => 'Album baru',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Judul',
+ Cover => 'Sampul',
+ Artist => 'Artis',
+ Format => 'Format',
+ Running => 'Durasi',
+ Release => 'Tanggal rilis',
+ Genre => 'Genre',
+ Origin => 'Asal',
+
+#For tracks list
+ Tracks => 'Daftar track',
+ Number => 'Nomor',
+ Track => 'Judul',
+ Time => 'Waktu',
+
+ Composer => 'Komposer',
+ Producer => 'Produser',
+ Playlist => 'Playlist',
+ Comments => 'Komentar',
+ Label => 'Label',
+ Location => 'Lokasi',
+ Url => 'Halaman web',
+
+ General => 'General',
+ Details => 'Detail',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/ID/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..ba9e50c
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::ID::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/ID/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..796e9cf
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::ID::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/ID/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..1794245
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::ID::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCstamps.pm b/lib/gcstar/GCLang/ID/GCModels/GCstamps.pm
new file mode 100644
index 0000000..bc8cc9e
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::ID::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCwines.pm b/lib/gcstar/GCLang/ID/GCModels/GCwines.pm
new file mode 100644
index 0000000..fb8cc3c
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::ID::GCModels::GCwines;
+
+ use utf8;
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Wines collection',
+ Items => {0 => 'Wine',
+ 1 => 'Wine',
+ X => 'Wines'},
+ NewItem => 'New wine',
+
+ Name => 'Name',
+ Designation => 'Designation',
+ Vintage => 'Vintage',
+ Vineyard => 'Vineyard',
+ Type => 'Type',
+ Grapes => 'Grapes',
+ Soil => 'Soil',
+ Producer => 'Producer',
+ Country => 'Country',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medal/Honour',
+
+ Storage => 'Storage',
+ Location => 'Location',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantity',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Purchase date',
+ PurchasePrice => 'Purchase price',
+ Gift => 'Gift',
+ BottleLabel => 'Bottle label',
+ Website => 'Reference on the web',
+
+ Tasted => 'Tasted',
+ Comments => 'Comments',
+ Serving => 'Serving',
+ TastingField => 'Testing notes',
+
+ General => 'General',
+ Details => 'Details',
+ Tasting => 'Tasting',
+
+ TastedNo => 'Non tasted',
+ TastedYes => 'Tasted',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Not yet tasted',
+ FilterTastedYes => 'Already _tasted',
+ FilterRatingSelect => 'Rating at _least...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCstar.pm b/lib/gcstar/GCLang/ID/GCstar.pm
new file mode 100644
index 0000000..6861440
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCstar.pm
@@ -0,0 +1,673 @@
+{
+ package GCLang::ID;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Indonesia',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Hati-hati</b>:
+
+Information downloaded from web sites (through the
+search plugins) is for <b>personal use only</b>.
+
+Any redistribution is forbidden without the site\'s
+<b>explicit authorization</b>.
+
+To determine which site owns the information, you
+may use the <b>button below item details</b>.',
+
+ 'AllItemsFiltered' => 'Tidak ada yang cocok dengan kriteria pemilahan', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Di install di ',
+ 'InstallMandatory' => 'Mandatory components',
+ 'InstallOptional' => 'Komponen Tambahan',
+ 'InstallErrorMissing' => 'Error : Komponen Perl berikut harus sudah terinstall: ',
+ 'InstallPrompt' => 'Direktori untuk instalasi [/usr/local]: ',
+ 'InstallEnd' => 'Akhir instalasi',
+ 'InstallNoError' => 'Tidak ada error',
+ 'InstallLaunch' => 'To use this application, one can launch ',
+ 'InstallDirectory' => 'Base direktori',
+ 'InstallTitle' => 'Instalasi GCstar',
+ 'InstallDependencies' => 'Dependencies',
+ 'InstallPath' => 'Path',
+ 'InstallOptions' => 'Opsi',
+ 'InstallSelectDirectory' => 'Select base directory for the installation',
+ 'InstallWithClean' => 'Remove files found in installation directory',
+ 'InstallWithMenu' => 'Add GCstar to Applications menu',
+ 'InstallNoPermission' => 'Error: You don\'t have permission to write in the selected directory',
+ 'InstallMissingMandatory' => 'Mandatory dependencies are missing. You won\'t be able to install GCstar until they have been added to your system.',
+ 'InstallMissingOptional' => 'Some optional dependencies are missing. There are listed under. GCstar may be installed but some features won\'t be available.',
+ 'InstallMissingNone' => 'There are no missing dependency. You may continue and install GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Hilang',
+ 'InstallMissingFor' => 'Missing for',
+ 'InstallCleanDirectory' => 'Removing GCstar\'s files in directory: ',
+ 'InstallCopyDirectory' => 'Mennyalin file di direktori: ',
+ 'InstallCopyDesktop' => 'Copying desktop file in: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy yang digunakan (tekan enter jika tidak ada): ',
+ 'UpdateNoPermission' => 'Write permission denied in this directory: ',
+ 'UpdateNone' => 'Tidak ada update yang ditemukan',
+ 'UpdateFileNotFound' => 'File tidak ditemukan',
+
+#Splash
+ 'SplashInit' => 'Initialization',
+ 'SplashLoad' => 'Loading Collection',
+ 'SplashDisplay' => 'Memperlihatkan Koleksi',
+ 'SplashSort' => 'Mengurutkan Koleksi',
+ 'SplashDone' => 'Siap',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Sepertinya anda sebelumnya menggunakan GCfilms. Apakah anda mau mengimpor dari GCfilms ke GCstar (tidak akan mempengaruhi GCfilms jika anda masih ingin menggunakannya)?',
+ 'GCfilmsImportOptions' => 'Pengaturan',
+ 'GCfilmsImportData' => 'Daftar Film',
+
+#Menus
+ 'MenuFile' => '_File',
+ 'MenuNewList' => '_Koleksi Baru',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_Recent Collections',
+ 'MenuLend' => 'Tampilkan _Item yang dipinjam', # Accepts model codes
+ 'MenuImport' => '_Import',
+ 'MenuExport' => '_Export',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Ubah',
+ 'MenuDuplicate' => 'Du_plicate item', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Remove item', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Change collection fields',
+ 'MenuEditLockItems' => '_Lock Collection',
+
+ 'MenuDisplay' => 'F_ilter',
+ 'MenuSavedSearches' => 'Simpan pencarian',
+ 'MenuSavedSearchesSave' => 'Simpan pencarian yang sekarang',
+ 'MenuSavedSearchesEdit' => 'Ubah simpanan pencarian',
+ 'MenuAdvancedSearch' => 'A_dvanced Search',
+ 'MenuViewAllItems' => 'Show _All items', # Accepts model codes
+ 'MenuNoFilter' => '_Any',
+
+ 'MenuConfiguration' => '_Settings',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Displayed Information',
+ 'MenuBorrowers' => '_Borrowers',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Genre _Conversion',
+
+ 'MenuBookmarks' => 'My _Collections',
+ 'MenuBookmarksAdd' => '_Add current collection',
+ 'MenuBookmarksEdit' => '_Edit bookmarked collections',
+
+ 'MenuHelp' => '_Help',
+ 'MenuHelpContent' => '_Content',
+ 'MenuAllPlugins' => 'Lihat _plugin',
+ 'MenuBugReport' => 'Report a _bug',
+ 'MenuAbout' => '_About GCstar',
+
+ 'MenuNewWindow' => 'Show item in _New Window', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Expand all',
+ 'ContextCollapseAll' => 'Collapse all',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Buka dengan pengedit gambar',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Please enter value',
+
+ 'RemoveConfirm' => 'Do you really want to remove this item?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'New item', # Accepts model codes
+ 'NewItemTooltip' => 'Add a new item', # Accepts model codes
+ 'NoItemFound' => 'Tidak menemukan apapun. Apa anda mau mencari di situs yang lain?',
+ 'OpenList' => 'Harap pilih koleksi',
+ 'SaveList' => 'Harap pilih lokasi penyimpanan koleksi',
+ 'SaveListTooltip' => 'Save current collection',
+ 'SaveUnsavedChanges' => 'There are unsaved changes in your collection. Do you want to save them?',
+ 'SaveDontSave' => 'Jangan disimpan',
+ 'PreferencesTooltip' => 'Set your preferences',
+ 'ViewTooltip' => 'Change collection display',
+ 'PlayTooltip' => 'Play video associated to the item', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Menyimpan...',
+ 'StatusLoad' => 'Membuka...',
+ 'StatusSearch' => 'Sedang mencari...',
+ 'StatusGetInfo' => 'Mengambil informasi...',
+ 'StatusGetImage' => 'Mengambil gambar...',
+
+ 'SaveError' => 'Cannot save items list. Please check access rights and disk free space.',
+ 'OpenError' => 'Cannot open items list. Please check access rights.',
+ 'OpenFormatError' => 'Cannot open items list. Format may be incorrect.',
+ 'OpenVersionWarning' => 'Koleksi dibuat menggunakan versi terbaru GCstar. Mungkin akan terjadi kerusakan data jika disimpan.',
+ 'OpenVersionQuestion' => 'Masih ingin melanjutkan ??',
+ 'ImageError' => 'Selected directory to save images is not correct. Please select another one.',
+ 'OptionsCreationError'=> 'Cannot create options file: ',
+ 'OptionsOpenError'=> 'Cannot open options file: ',
+ 'OptionsSaveError'=> 'Cannot save options file: ',
+ 'ErrorModelNotFound' => 'Model tidak ditemukan: ',
+ 'ErrorModelUserDir' => 'Model buatan pengguna ada di: ',
+
+ 'RandomTooltip' => 'What to see this evening ?',
+ 'RandomError'=> 'You have no item that could be selected', # Accepts model codes
+ 'RandomEnd'=> 'There are no more items', # Accepts model codes
+ 'RandomNextTip'=> 'Next suggestion',
+ 'RandomOkTip'=> 'Accept this item',
+
+ 'AboutTitle' => 'Tentang GCstar',
+ 'AboutDesc' => 'Collection manager',
+ 'AboutVersion' => 'Versi',
+ 'AboutTeam' => 'Tim',
+ 'AboutWho' => 'Christian Jodar (Tian): Manajer Proyek, Programmer
+Nyall Dawson (Zombiepig): Programmer
+TPF: Programmer
+Adolfo González: Programmer
+',
+ 'AboutLicense' => 'Distributed under the terms of the GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Terjemahan bahasa Ingrris oleh Yuda Nugrahadi',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logo dan desain web oleh le Spektre',
+
+ 'ToolbarRandom' => 'Malam ini',
+
+ 'UnsavedCollection' => 'Koleksi yang belum disimpan',
+ 'ModelsSelect' => 'Pilih tipe koleksi',
+ 'ModelsPersonal' => 'Personal models',
+ 'ModelsDefault' => 'Default models',
+ 'ModelsList' => 'Collection definition',
+ 'ModelSettings' => 'Collection settings',
+ 'ModelNewType' => 'Tipe koleksi baru',
+ 'ModelName' => 'Name of the collection type:',
+ 'ModelFields' => 'Fields',
+ 'ModelOptions' => 'Options',
+ 'ModelFilters' => 'Filters',
+ 'ModelNewField' => 'New field',
+ 'ModelFieldInformation' => 'Informasi',
+ 'ModelFieldName' => 'Label:',
+ 'ModelFieldType' => 'Tipe:',
+ 'ModelFieldGroup' => 'Grup:',
+ 'ModelFieldValues' => 'Values',
+ 'ModelFieldInit' => 'Default:',
+ 'ModelFieldMin' => 'Minimum:',
+ 'ModelFieldMax' => 'Maksimum:',
+ 'ModelFieldList' => 'Values list:',
+ 'ModelFieldListLegend' => '<i>Comma separated</i>',
+ 'ModelFieldDisplayAs' => 'Ditampilkan sebagai:',
+ 'ModelFieldDisplayAsText' => 'Teks',
+ 'ModelFieldDisplayAsGraphical' => 'Pengendali Rating',
+ 'ModelFieldTypeShortText' => 'Text pendek',
+ 'ModelFieldTypeLongText' => 'Text panjang',
+ 'ModelFieldTypeYesNo' => 'Ya/Tidak',
+ 'ModelFieldTypeNumber' => 'Nomor',
+ 'ModelFieldTypeDate' => 'Tanggal',
+ 'ModelFieldTypeOptions' => 'Pre-defined values list',
+ 'ModelFieldTypeImage' => 'Gambar',
+ 'ModelFieldTypeSingleList' => 'Daftar sederhana',
+ 'ModelFieldTypeFile' => 'File',
+ 'ModelFieldTypeFormatted' => 'Dependant on other fields',
+ 'ModelFieldParameters' => 'Parameter',
+ 'ModelFieldHasHistory' => 'Use an history',
+ 'ModelFieldFlat' => 'Tampilkan dalam satu baris',
+ 'ModelFieldStep' => 'Increment step:',
+ 'ModelFieldFileFormat' => 'Format file:',
+ 'ModelFieldFileFile' => 'File sederhana',
+ 'ModelFieldFileImage' => 'Gambar',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Fields to use',
+ 'ModelOptionsFieldsAuto' => 'Otomatis',
+ 'ModelOptionsFieldsNone' => 'Tidak ada',
+ 'ModelOptionsFieldsTitle' => 'Sebagai judul',
+ 'ModelOptionsFieldsId' => 'Sebagai identifikasi',
+ 'ModelOptionsFieldsCover' => 'Sebagai cover',
+ 'ModelOptionsFieldsPlay' => 'For Play button',
+ 'ModelCollectionSettings' => 'Collection settings',
+ 'ModelCollectionSettingsLending' => 'Items could be borrowed',
+ 'ModelCollectionSettingsTagging' => 'Barang dapat diberi tag',
+ 'ModelFilterActivated' => 'Should be in search box',
+ 'ModelFilterComparison' => 'Perbandingan',
+ 'ModelFilterContain' => 'Berisi',
+ 'ModelFilterDoesNotContain' => 'Tidak mengandung kata',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Range',
+ 'ModelFilterNumeric' => 'Comparison is numeric',
+ 'ModelFilterQuick' => 'Create a quick filter',
+ 'ModelTooltipName' => 'Use a name to re-use this model for many collections. If empty, the settings will be directly stored in the collection itself',
+ 'ModelTooltipLabel' => 'The field name as it will be displayed',
+ 'ModelTooltipGroup' => 'Used to group fields. Items with no value here will be in a default group',
+ 'ModelTooltipHistory' => 'Should the previous entered values be stored in a list associated to the field',
+ 'ModelTooltipFormat' => 'This format is used to determine the action to open the file with the Play button',
+ 'ModelTooltipLending' => 'This will add some fields to manage lendings',
+ 'ModelTooltipTagging' => 'Ini akan menambah tempat untu mengatur tag',
+ 'ModelTooltipNumeric' => 'Should the values be consider as numbers for comparison',
+ 'ModelTooltipQuick' => 'This will add a submenu in the Filters one',
+
+ 'ResultsTitle' => 'Select an item', # Accepts model codes
+ 'ResultsNextTip' => 'Cari di situs berikutnya',
+ 'ResultsPreview' => 'Pratayang',
+ 'ResultsInfo' => 'Anda dapat menambah barang lebih dari satu ke koleksi dengan menekan+tahan tombol Ctrl atau Shift dan pilih barang yang akan dimasukkan', # Accepts model codes
+
+ 'OptionsTitle' => 'Preferences',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Tetapkan jenis aplikasi untuk digunakan oleh media yang berbeda, tinggalkan kosong untuk menggunakan konfigurasi dasar sistem',
+ 'OptionsBrowser' => 'Penjelajah web',
+ 'OptionsPlayer' => 'Video player',
+ 'OptionsAudio' => 'Audio player',
+ 'OptionsImageEditor' => 'Pengedit gambar',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Direktori gambar',
+ 'OptionsUseRelativePaths' => 'Use relative paths for images',
+ 'OptionsLayout' => 'Layout',
+ 'OptionsStatus' => 'Tampilkan status bar',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Peringatan: Perubahan pada tab ini tidak akan berpengaruh sampai aplikasi ini ditutup kemudian dibuka kembali.',
+ 'OptionsRemoveConfirm' => 'Ask confirmation before item deletion',
+ 'OptionsAutoSave' => 'Otomatis menyimpan koleksi',
+ 'OptionsAutoLoad' => 'Load previous collection on startup',
+ 'OptionsSplash' => 'Perlihatkan splash screen',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Gunakan pemeriksa bahasa untuk teks yang panjang',
+ 'OptionsProgramTitle' => 'Pilih program yang akan digunakan',
+ 'OptionsPlugins' => 'Situs untuk pengambilan data',
+ 'OptionsAskPlugins' => 'Tanya (Semua situs)',
+ 'OptionsPluginsMulti' => 'Banyak situs',
+ 'OptionsPluginsMultiAsk' => 'Tanya (Banyak situs)',
+ 'OptionsPluginsMultiPerField' => 'Banyak situs (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Set daftar',
+ 'OptionsAskImport' => 'Select fields to be imported',
+ 'OptionsProxy' => 'Menggunakan proxy',
+ 'OptionsCookieJar' => 'Use this cookie jar file',
+ 'OptionsLang' => 'Bahasa',
+ 'OptionsMain' => 'Utama',
+ 'OptionsPaths' => 'Lokasi',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Fitur',
+ 'OptionsDisplay' => 'Tampilan',
+ 'OptionsToolbar' => 'Toolbar',
+ 'OptionsToolbars' => {0 => 'Tidak ada', 1 => 'Kecil', 2 => 'Besar', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'Posisi',
+ 'OptionsToolbarPositions' => {0 => 'Atas', 1 => 'Bawah', 2 => 'Kiri', 3 => 'Kanan'},
+ 'OptionsExpandersMode' => 'Expanders too long',
+ 'OptionsExpandersModes' => {'asis' => 'Do nothing', 'cut' => 'Cut', 'wrap' => 'Line wrap'},
+ 'OptionsDateFormat' => 'Date Format',
+ 'OptionsDateFormatTooltip' => 'Format is the one used by strftime(3). Default is %d/%m/%Y',
+ 'OptionsView' => 'Items list',
+ 'OptionsViews' => {0 => 'Teks', 1 => 'Gambar', 2 => 'Detail'},
+ 'OptionsColumns' => 'Kolom',
+ 'OptionsMailer' => 'E-mailer',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'e-mail anda',
+ 'OptionsTransform' => 'Place articles at the end of titles',
+ 'OptionsArticles' => 'Artikel (Dipisahkan koma)',
+ 'OptionsSearchStop' => 'Allow search to be aborted',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'Use main title as the original title if none present',
+ 'OptionsRestoreAccelerators' => 'Mengembalikan accelerators',
+ 'OptionsHistory' => 'Size of history',
+ 'OptionsClearHistory' => 'Clear history',
+ 'OptionsStyle' => 'Skin',
+ 'OptionsDontAsk' => 'Jangan bertanya lagi',
+ 'OptionsPathProgramsGroup' => 'Aplikasi',
+ 'OptionsProgramsSystem' => 'Use programs defined by system',
+ 'OptionsProgramsUser' => 'Use specified programs',
+ 'OptionsProgramsSet' => 'Set programs',
+ 'OptionsPathImagesGroup' => 'Gambar',
+ 'OptionsInternetDataGroup' => 'Data import',
+ 'OptionsInternetSettingsGroup' => 'Settings',
+ 'OptionsDisplayInformationGroup' => 'Information display',
+ 'OptionsDisplayArticlesGroup' => 'Artikel',
+ 'OptionsImagesDisplayGroup' => 'Display',
+ 'OptionsImagesStyleGroup' => 'Gaya',
+ 'OptionsDetailedPreferencesGroup' => 'Preferences',
+ 'OptionsFeaturesConveniencesGroup' => 'Kenyamanan',
+ 'OptionsPicturesFormat' => 'Prefiks yang digunakan untuk gambar:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Title or name of the associated item',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% or . will be replaced with collection directory (use only on beginning of path)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% will be replaced by collection file name without suffix (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% could only be used on the beginning of the path for pictures',
+ 'OptionsConfigureMailers' => 'Configure mailing programs',
+
+ 'ImagesOptionsButton' => 'Seting',
+ 'ImagesOptionsTitle' => 'Settings for images list',
+ 'ImagesOptionsSelectColor' => 'Pilih warna',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Background',
+ 'ImagesOptionsBgPicture' => 'Use a background picture',
+ 'ImagesOptionsFg'=> 'Selection',
+ 'ImagesOptionsBgTooltip' => 'Change background color',
+ 'ImagesOptionsFgTooltip'=> 'Change selection color',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Ukuran',
+ 'ImagesOptionsSizeList' => {0 => 'Sangat Kecil', 1 => 'Kecil', 2 => 'Medium', 3 => 'Besar', 4 => 'Sangat besar'},
+ 'ImagesOptionsSizeTooltip' => 'Pilih ukuran gambar',
+
+ 'DetailedOptionsTitle' => 'Settings for detailed list',
+ 'DetailedOptionsImageSize' => 'Ukuran gambar',
+ 'DetailedOptionsGroupItems' => 'Group items by',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'Select fields to display',
+ 'DetailedOptionsGroupedFirst' => 'Keep together orphaned items',
+ 'DetailedOptionsAddCount' => 'Add number of elements on categories',
+
+ 'ExtractButton' => 'Informasi',
+ 'ExtractTitle' => 'Informasi file',
+ 'ExtractImport' => 'Use values',
+
+ 'FieldsListOpen' => 'Load a fields list from a file',
+ 'FieldsListSave' => 'Save fields list to a file',
+ 'FieldsListError' => 'This fields list cannot be used with this kind of collection',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Export item list',
+ 'ExportFilter' => 'Export only displayed items',
+ 'ExportFieldsTitle' => 'Fields to be exported',
+ 'ExportFieldsTip' => 'Select fields you want to export',
+ 'ExportWithPictures' => 'Copy pictures in a sub-directory',
+ 'ExportSortBy' => 'Sort by',
+ 'ExportOrder' => 'Urutan',
+
+ 'ImportListTitle' => 'Import another items list',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'File',
+ 'ImportExportFieldsUnused' => 'Unused fields',
+ 'ImportExportFieldsUsed' => 'Used fields',
+ 'ImportExportFieldsFill' => 'Tambahkan Semua',
+ 'ImportExportFieldsClear' => 'Hapus Semua',
+ 'ImportExportFieldsEmpty' => 'You must choose at least one field',
+ 'ImportExportFileEmpty' => 'You have to specify a file name',
+ 'ImportFieldsTitle' => 'Fields to be imported',
+ 'ImportFieldsTip' => 'Select fields you want to import',
+ 'ImportNewList' => 'Create a new collection',
+ 'ImportCurrentList' => 'Add to current collection',
+ 'ImportDropError' => 'There was an error opening at least one file. Previous list will be reloaded.',
+ 'ImportGenerateId' => 'Generate identifier for each item',
+
+ 'FileChooserOpenFile' => 'Please select file to use',
+ 'FileChooserDirectory' => 'Direktori',
+ 'FileChooserOpenDirectory' => 'Pilih direktori',
+ 'FileChooserOverwrite' => 'This file already exists. Do you want to overwrite it?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ #Some default panels
+ 'PanelCompact' => 'Compact',
+ 'PanelReadOnly' => 'Read Only',
+ 'PanelForm' => 'Tab',
+
+ 'PanelSearchButton' => 'Fetch Information',
+ 'PanelSearchTip' => 'Search web for information on this name',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Click on the picture to select different one.',
+ 'PanelImageTipView' => 'Click on the picture to view it in real size.',
+ 'PanelImageTipMenu' => ' Right click for more options.',
+ 'PanelImageTitle' => 'Pilih gambar',
+ 'PanelImageNoImage' => 'Tidak ada gambar',
+ 'PanelSelectFileTitle' => 'Pilih sebuah file',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restore default',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'Dari',
+ 'PanelTo' =>'Ke',
+
+ 'PanelWeb' => 'View Information',
+ 'PanelWebTip' => 'View information on the web about this item', # Accepts model codes
+ 'PanelRemoveTip' => 'Remove current item', # Accepts model codes
+
+ 'PanelDateSelect' => 'Select a Date',
+ 'PanelNobody' => 'Nobody',
+ 'PanelUnknown' => 'Tidak diketahui',
+ 'PanelAdded' => 'Add date',
+ 'PanelRating' => 'Rating',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Location',
+
+ 'PanelLending' => 'Lending',
+ 'PanelBorrower' => 'Peminjam',
+ 'PanelLendDate' => 'Keluar sejak',
+ 'PanelHistory' => 'Sejarah peminjaman',
+ 'PanelReturned' => 'Barang dikembalikan', # Accepts model codes
+ 'PanelReturnDate' => 'Tanggal pengembalian',
+ 'PanelLendedYes' => 'Lended',
+ 'PanelLendedNo' => 'Tersedia',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favorit',
+ 'TagsAssigned' => 'Assigned Tags',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Either',
+ 'CheckYes' => 'Ya',
+ 'CheckNo' => 'Tidak',
+
+ 'ToolbarAll' => 'Lihat Semua',
+ 'ToolbarAllTooltip' => 'View all items',
+ 'ToolbarGroupBy' => 'Group by',
+ 'ToolbarGroupByTooltip' => 'Select the field to use to group items in list',
+ 'ToolbarQuickSearch' => 'Pencarian cepat',
+ 'ToolbarQuickSearchLabel' => 'Pencarian',
+ 'ToolbarQuickSearchTooltip' => 'Pilih bagian yang akan dicari. masukkan kata yang dicari kemudian tekan enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Search an item',
+ 'PluginsQuery' => 'Query',
+ 'PluginsFrame' => 'Search site',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Nama',
+ 'PluginsSearchFields' => 'Search fields',
+ 'PluginsAuthor' => 'Author',
+ 'PluginsLang' => 'Bahasa',
+ 'PluginsUseSite' => 'Gunakan situs yang dipilih untuk pencarian seterusnya',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Borrower Configuration',
+ 'BorrowersList' => 'Peminjam',
+ 'BorrowersName' => 'Nama',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Tambah',
+ 'BorrowersRemove' => 'Mengurangi',
+ 'BorrowersEdit' => 'Edit',
+ 'BorrowersTemplate' => 'Mail template',
+ 'BorrowersSubject' => 'Mail subject',
+ 'BorrowersNotice1' => '%1 will be replaced with the borrower\'s name',
+ 'BorrowersNotice2' => '%2 will be replaced with the item title',
+ 'BorrowersNotice3' => '%3 will be replaced with the borrow date',
+
+ 'BorrowersImportTitle' => 'Import borrowers information',
+ 'BorrowersImportType' => 'Format file:',
+ 'BorrowersImportFile' => 'File:',
+
+ 'BorrowedTitle' => 'Barang yang dipinjam', # Accepts model codes
+ 'BorrowedDate' => 'Sejak',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'Send an e-mail',
+ 'MailFrom' => 'Dari: ',
+ 'MailTo' => 'Kepada: ',
+ 'MailSubject' => 'Subjek: ',
+ 'MailSmtpError' => 'Problem when connecting to SMTP server',
+ 'MailSendmailError' => 'Problem when launching sendmail',
+
+ 'SearchTooltip' => 'Search all items', # Accepts model codes
+ 'SearchTitle' => 'Item Search', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Field to replace',
+ 'QueryReplaceOld' => 'Current value',
+ 'QueryReplaceNew' => 'New value',
+ 'QueryReplaceLaunch' => 'Replace',
+
+ 'ImportWindowTitle' => 'Select Fields to be Imported',
+ 'ImportViewPicture' => 'View picture',
+ 'ImportSelectAll' => 'Select all',
+ 'ImportSelectNone' => 'Select none',
+
+ 'MultiSiteTitle' => 'Sites to use for searches',
+ 'MultiSiteUnused' => 'Unused plugins',
+ 'MultiSiteUsed' => 'Plugins to be used',
+ 'MultiSiteLang' => 'Fill list with English plugins',
+ 'MultiSiteEmptyError' => 'You have an empty site list',
+ 'MultiSiteClear' => 'Clear list',
+
+ 'DisplayOptionsTitle' => 'Items to display',
+ 'DisplayOptionsAll' => 'Select all',
+ 'DisplayOptionsSearch' => 'Search button',
+
+ 'GenresTitle' => 'Genre Conversion',
+ 'GenresCategoryName' => 'Genre to use',
+ 'GenresCategoryMembers' => 'Genre to replace',
+ 'GenresLoad' => 'Load a list',
+ 'GenresExport' => 'Save list to a file',
+ 'GenresModify' => 'Edit conversion',
+
+ 'PropertiesName' => 'Collection name',
+ 'PropertiesLang' => 'Kode bahasa',
+ 'PropertiesOwner' => 'Owner',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => 'Description',
+ 'PropertiesFile' => 'File Information',
+ 'PropertiesFilePath' => 'Full path',
+ 'PropertiesItemsNumber' => 'Number of items', # Accepts model codes
+ 'PropertiesFileSize' => 'Size',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Collection properties',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Programs for mail sending',
+ 'MailProgramsName' => 'Name',
+ 'MailProgramsCommand' => 'Command line',
+ 'MailProgramsRestore' => 'Restore defaults',
+ 'MailProgramsAdd' => 'Add a program',
+ 'MailProgramsInstructions' => 'In command line, some substitutions are made:
+ %f is replaced with user\'s e-mail address.
+ %t is replaced with the recipient address.
+ %s is replaced with the subject of the message.
+ %b is replaced with the body of the message.',
+
+ 'BookmarksBookmarks' => 'Bookmarks',
+ 'BookmarksFolder' => 'Folders',
+ 'BookmarksLabel' => 'Label',
+ 'BookmarksPath' => 'Path',
+ 'BookmarksNewFolder' => 'New folder',
+
+ 'AdvancedSearchType' => 'Type of search',
+ 'AdvancedSearchTypeAnd' => 'Items matching all criteria', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Items matching at least one criterion', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criteria',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Simpan pencarian',
+ 'AdvancedSearchSaveName' => 'Nama',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Laporan kerusakan dibuat dari GCstar',
+ 'BugReportVersion' => 'Versi',
+ 'BugReportPlatform' => 'Sistem operasi',
+ 'BugReportMessage' => 'Pesan error',
+ 'BugReportInformation' => 'Informasi tambahan',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/IT/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/IT/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..2bc1adb
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCExport/GCExportCSV.pm
@@ -0,0 +1,47 @@
+{
+ package GCLang::IT::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Aggiungere colonna',
+ 'Separator' => 'Delimitatore',
+ 'Replacement' => 'Ripeti delimitazione con',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/IT/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..47a2867
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::IT::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/IT/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..3045fa7
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCExport/GCExportHTML.pm
@@ -0,0 +1,71 @@
+{
+ package GCLang::IT::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Invalid template file',
+ 'UseFile' => 'Use file specified below',
+ 'TemplateExternalFile' => 'Template file',
+ 'WithJS' => 'Usa Javascript',
+ 'FileTemplate' => 'Modello:',
+ 'Preview' => 'Anteprima',
+ 'NoPreview' => 'Anteprima non disponibilee',
+ 'Title' => 'Titolo pagina',
+ 'InfoFile' => 'La lista dei film è nel file : ',
+ 'InfoDir' => 'Immagini sono in : ',
+ 'HeightImg' => 'Altezza in pixel dell\'immagine da esportare :',
+ 'OpenFileInBrowser' => 'Apri il file generato nel web browser',
+ 'Note' => 'Lista generata con <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Immetti testo da cercare',
+ 'SearchType1' => 'Solo il titolo',
+ 'SearchType2' => 'Informazioni complete',
+ 'SearchButton' => 'Cerca',
+ 'SearchTitle' => 'Visualizza solo i film trovati con il criterio precedente',
+ 'AllButton' => 'Tutto',
+ 'AllTitle' => 'Visualizza tutti i film',
+ 'Expand' => 'Espandi tutto',
+ 'ExpandTitle' => 'Visualizza tutte le informazioni dei film',
+ 'Collapse' => 'Comprimi tutto',
+ 'CollapseTitle' => 'Comprimi tutte le informazioni dei film',
+ 'Borrowed' => 'Preso in prestito da: ',
+ 'NotBorrowed' => 'Disponibile',
+ 'Top' => 'In alto',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/IT/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..7b70074
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::IT::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/IT/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..808a587
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCExport/GCExportSQL.pm
@@ -0,0 +1,47 @@
+{
+ package GCLang::IT::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Includi istruzione DROP',
+ 'WithCreate' => 'Includi istruzione CREATE',
+ 'TableName' => 'Nome tabella',
+ 'InfoFile' => 'File SQL: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/IT/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..2aaf1f4
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCExport/GCExportTarGz.pm
@@ -0,0 +1,44 @@
+{
+ package GCLang::IT::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'L\'archivio e\' in questo file: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/IT/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..979b15e
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCExport/GCExportXML.pm
@@ -0,0 +1,48 @@
+{
+ package GCLang::IT::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Modello file',
+ 'ModelText' => 'Modello testo',
+ 'Models' => 'Modello da usare',
+ 'UseFile' => 'Usa file',
+ 'UseModel' => 'Usa area di testo',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/IT/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..1d5f17d
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::IT::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Dove cercare',
+ 'Default' => 'Directory di Alexandria',
+ 'Specified' => 'Directory specificata piu\' sotto',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/IT/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..fb76914
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCImport/GCImportCSV.pm
@@ -0,0 +1,49 @@
+{
+ package GCLang::IT::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Ignora la prima linea',
+ 'Separator' => 'Delimitatore',
+ 'Plugin' => 'Lato da utilizzare',
+ 'UseFirst' => 'In caso di piu\' risultati utilizza il primo',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/IT/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..614da49
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::IT::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/IT/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..8cd35fb
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCImport/GCImportGCstar.pm
@@ -0,0 +1,44 @@
+{
+ package GCLang::IT::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copia immagini',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCImport/GCImportList.pm b/lib/gcstar/GCLang/IT/GCImport/GCImportList.pm
new file mode 100644
index 0000000..ec2da7a
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCImport/GCImportList.pm
@@ -0,0 +1,49 @@
+{
+ package GCLang::IT::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Elenco dei titoli',
+ 'Plugin' => 'Lato da utilizzare',
+ 'UseFirst' => 'In caso di piu\' risultati utilizza il primo',
+ 'CommentAuto' => 'Articolo importato automaticamente.',
+ 'CommentSite' => 'Sito web: ',
+ 'CommentTitle' => 'Titolo: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/IT/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..f7e6343
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::IT::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/IT/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..d20b7c3
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCImport/GCImportTellico.pm
@@ -0,0 +1,44 @@
+{
+ package GCLang::IT::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Il file non contiene una collezione valida Tellico',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/IT/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..cc546b1
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCTVepisodes.pm
@@ -0,0 +1,48 @@
+{
+ package GCLang::IT::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => {0 => 'Episode',
+ 1 => 'Episode',
+ X => 'Episodes'},
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/IT/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..1932fa5
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCTVseries.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::IT::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => {0 => 'Series',
+ 1 => 'Series',
+ X => 'Series'},
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/IT/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..1200981
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::IT::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCbooks.pm b/lib/gcstar/GCLang/IT/GCModels/GCbooks.pm
new file mode 100644
index 0000000..b846c6f
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCbooks.pm
@@ -0,0 +1,77 @@
+{
+ package GCLang::IT::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Biblioteca',
+ Items => {0 => 'Libri',
+ 1 => 'Libri',
+ X => 'Libris'},
+ NewItem => 'Libro nuovo',
+
+ Isbn => 'ISBN',
+ Title => 'Titolo',
+ Cover => 'Copertina',
+ Authors => 'Autore(i)',
+ Publisher => 'Editore',
+ Publication => 'Data di pubblicazione',
+ Language => 'Lingua',
+ Genre => 'Genere',
+ Serie => 'Serie',
+ Rank => 'Rank',
+ Bookdescription => 'Descrizione',
+ Pages => 'Pagine',
+ Read => 'Letto',
+ Acquisition => 'Acquisito il',
+ Edition => 'Edizione',
+ Format => 'Formato',
+ Comments => 'Commenti',
+ Url => 'Pagina web',
+ Translator => 'Traduttore',
+ Artist => 'Scrittore',
+ DigitalFile => 'Digital version',
+
+ General => 'Generale',
+ Details => 'Dettagli',
+
+ ReadNo => 'Non letto',
+ ReadYes => 'Letto',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCcoins.pm b/lib/gcstar/GCLang/IT/GCModels/GCcoins.pm
new file mode 100644
index 0000000..0f0d79d
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCcoins.pm
@@ -0,0 +1,110 @@
+{
+ package GCLang::IT::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Numismatica',
+ Items => {0 => 'Monete',
+ 1 => 'Monete',
+ X => 'Monete'},
+ NewItem => 'Moneta nuova',
+
+ Name => 'Nome',
+ Country => 'Stato',
+ Year => 'Anno',
+ Currency => 'Valuta',
+ Value => 'Valore',
+ Picture => 'Immagine',
+ Diameter => 'Diametro',
+ Metal => 'Metallo',
+ Edge => 'Profilo',
+ Edge1 => 'Profilo 1',
+ Edge2 => 'Profilo 2',
+ Edge3 => 'Profilo 3',
+ Edge4 => 'Profilo 4',
+ Head => 'Fronte',
+ Tail => 'Retro',
+ Comments => 'Commenti',
+ History => 'Storia',
+ Website => 'Sito Web',
+ Estimate => 'Stima',
+ References => 'Riferimenti',
+ Type => 'Tipo',
+ Coin => 'Moneta',
+ Banknote => 'Banconota',
+
+ Main => 'Principale',
+ Description => 'Descrizione',
+ Other => 'Altre informazioni',
+ Pictures => 'Immagini',
+
+ Condition => 'Condizioni (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCcomics.pm b/lib/gcstar/GCLang/IT/GCModels/GCcomics.pm
new file mode 100644
index 0000000..821debb
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::IT::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCfilms.pm b/lib/gcstar/GCLang/IT/GCModels/GCfilms.pm
new file mode 100644
index 0000000..b77dab7
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCfilms.pm
@@ -0,0 +1,99 @@
+{
+ package GCLang::IT::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Filmoteca',
+ Items => {0 => 'Film',
+ 1 => 'Film',
+ X => 'Film'},
+ NewItem => 'Nuovo film',
+
+ Id => 'Id',
+ Title => 'Titolo',
+ Date => 'Data',
+ Time => 'Durata',
+ Director => 'Regista',
+ Country => 'Nazione',
+ MinimumAge => 'Eta\' minima',
+ Genre => 'Genere',
+ Image => 'Immagine',
+ Original => 'Titolo originale',
+ Actors => 'Cast',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'Commento',
+ Synopsis => 'Trama',
+ Seen => 'Gia\' visto',
+ Number => 'Numero',
+ Format => 'Tipo',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'URL',
+ Audio => 'Audio',
+ Video => 'Video',
+ Trailer => 'Trailer',
+ Serie => 'Serie',
+ Rank => 'Rank',
+ Subtitles => 'Sottotitoli',
+
+ SeenYes => 'Gia\' visto',
+ SeenNo => 'Non visto',
+
+ AgeUnrated => 'Sconosciuta',
+ AgeAll => 'Nessuna',
+ AgeParent => 'V.m.',
+
+ Main => 'Oggetti principali',
+ General => 'Informazioni film',
+ Details => 'Dettagli',
+
+ Information => 'Informazioni',
+ Languages => 'Lingua',
+ Encoding => 'Codifica',
+
+ FilterAudienceAge => 'Eta\' pubblico',
+ FilterSeenNo => '_Non visto',
+ FilterSeenYes => '_Gia\' visto',
+ FilterRatingSelect => 'Valutazione maggiore di...',
+
+ ExtractSize => 'Dimensione',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCgames.pm b/lib/gcstar/GCLang/IT/GCModels/GCgames.pm
new file mode 100644
index 0000000..d005508
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCgames.pm
@@ -0,0 +1,89 @@
+{
+ package GCLang::IT::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Videogiochi',
+ Items => {0 => 'Giochi',
+ 1 => 'Giochi',
+ X => 'Giochi'},
+ NewItem => 'Nuovo gioco',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Titolo',
+ Platform => 'Piattaforma',
+ Players => 'Numero giocatori',
+ Released => 'Data rilascio',
+ Editor => 'Editore',
+ Developer => 'Sviluppatore',
+ Genre => 'Genere',
+ Box => 'Scatola',
+ Case => 'Contenitore',
+ Manual => 'Manuale d\'istruzioni',
+ Completion => 'Completato (%)',
+ Executable => 'Executable',
+ Description => 'Descrizione',
+ Codes => 'Codici',
+ Code => 'Codice',
+ Effect => 'Effetto',
+ Secrets => 'Segreti',
+ Screenshots => 'Vista',
+ Screenshot1 => 'Prima vista',
+ Screenshot2 => 'Seconda vista',
+ Comments => 'Commenti',
+ Url => 'Pagina web',
+ Unlockables => 'Non bloccabili',
+ Unlockable => 'Bloccabile',
+ Howto => 'Come sbloccare',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Generale',
+ Details => 'Dettagli',
+ Tips => 'Suggerimenti',
+ Information => 'Informatzioni',
+
+ FilterRatingSelect => 'Valutazioni, almeno...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/IT/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..6550088
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::IT::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCminicars.pm b/lib/gcstar/GCLang/IT/GCModels/GCminicars.pm
new file mode 100644
index 0000000..f635c44
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::IT::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCmusics.pm b/lib/gcstar/GCLang/IT/GCModels/GCmusics.pm
new file mode 100644
index 0000000..8a1a13f
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCmusics.pm
@@ -0,0 +1,75 @@
+{
+ package GCLang::IT::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Musicoteca',
+ Items => {0 => 'Album',
+ 1 => 'Album',
+ X => 'Album'},
+ NewItem => 'Nuovo album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Titolo',
+ Cover => 'Copertina',
+ Artist => 'Artista',
+ Format => 'Formato',
+ Running => 'Durata',
+ Release => 'Data pubblicazione',
+ Genre => 'Genere',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Lista tracce',
+ Number => 'Numero',
+ Track => 'Titolo',
+ Time => 'Tempo',
+
+ Composer => 'Compositore',
+ Producer => 'Produttore',
+ Playlist => 'Playlist',
+ Comments => 'Commenti',
+ Label => 'Etichetta',
+ Url => 'WPagina web',
+
+ General => 'Generale',
+ Details => 'Dettagli',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/IT/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..d5d1446
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::IT::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/IT/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..ad7d61b
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::IT::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/IT/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..335390d
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::IT::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCstamps.pm b/lib/gcstar/GCLang/IT/GCModels/GCstamps.pm
new file mode 100644
index 0000000..bec04a6
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::IT::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCwines.pm b/lib/gcstar/GCLang/IT/GCModels/GCwines.pm
new file mode 100644
index 0000000..ced6664
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCwines.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::IT::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+#######################################################
+#
+# v2.0.12 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Enoteca',
+ Items => {0 => 'Vini',
+ 1 => 'Vini',
+ X => 'Vini'},
+ NewItem => 'Nuovo vino',
+
+ Name => 'Nome',
+ Designation => 'Designazione',
+ Vintage => 'Annata',
+ Vineyard => 'Vigna',
+ Type => 'Tipo',
+ Grapes => 'Uve',
+ Soil => 'Suolo',
+ Producer => 'Produttore',
+ Country => 'Nazione',
+ Volume => 'Capacita\' (ml)',
+ Alcohol => 'Gradazione alc. (%)',
+ Medal => 'Premi',
+
+ Storage => 'Conservazione',
+ Location => 'Localizzazione',
+ ShelfIndex => 'Indice',
+ Quantity => 'Quantita\'',
+ Acquisition => 'Acquisizione',
+ PurchaseDate => 'Data acquisto',
+ PurchasePrice => 'Prezzo',
+ Gift => 'Omaggio',
+ BottleLabel => 'Etichetta',
+ Website => 'Riferimento sul web',
+
+ Tasted => 'Assaggiato',
+ Comments => 'Commenti',
+ Serving => 'Da servire',
+ TastingField => 'Note',
+
+ General => 'Generali',
+ Details => 'Detttagli',
+ Tasting => 'Assaggio',
+
+ TastedNo => 'Non assaggiato',
+ TastedYes => 'Assaggiato',
+
+ FilterRange => 'Campo',
+ FilterTastedNo => '_Non ancora assaggiato',
+ FilterTastedYes => 'Gia\' assaggia_to',
+ FilterRatingSelect => 'Valutato a_lmeno...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCstar.pm b/lib/gcstar/GCLang/IT/GCstar.pm
new file mode 100644
index 0000000..fade2d1
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCstar.pm
@@ -0,0 +1,678 @@
+{
+ package GCLang::IT;
+
+ use utf8;
+######################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Italiano',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Attenzione</b>:
+
+Le informazioni scaricate dai siti Internet (con i plugin di ricerca) sono previste
+<b>esclusivamente per l\'uso personale</b>.
+
+La loro redistributione senza l\'esplicita autorizzazione scritta dei siti web e\'
+<b>severamente vietata!</b> e viene penalmente perseguita!
+
+Per determinare il sito web proprietario delle informazioni consultare l\'etichetta <b>[dettagli]</b>.',
+
+ 'AllItemsFiltered' => 'Nessun articolo soddisfa ai criteri di filtro selezionati', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Installazione in ',
+ 'InstallMandatory' => 'Componenti obbligatorie',
+ 'InstallOptional' => 'Componenti opzionali',
+ 'InstallErrorMissing' => 'Errore : Occorre installare le seguenti componenti Perl: ',
+ 'InstallPrompt' => 'Directory radice d\'installazione [es. /usr/local]: ',
+ 'InstallEnd' => 'Installazione terminata',
+ 'InstallNoError' => 'Nessun errore',
+ 'InstallLaunch' => 'Per utilizzare questa applicazione si puo\' lanciare ',
+ 'InstallDirectory' => 'Directory radice',
+ 'InstallTitle' => 'Installazione di GCstar',
+ 'InstallDependencies' => 'Dipendenze',
+ 'InstallPath' => 'Percorso',
+ 'InstallOptions' => 'Opzioni',
+ 'InstallSelectDirectory' => 'Selezionare la directory radice per l\'installazione',
+ 'InstallWithClean' => 'Rimuovere i file trovati nella directory di installazione',
+ 'InstallWithMenu' => 'Aggiungere GCstar al menu\' Applicazioni',
+ 'InstallNoPermission' => 'Errore: Diritti di scrittura mancanti per la directory selezionata',
+ 'InstallMissingMandatory' => 'Alcune dipendenze necessarie sono mancanti. Non e\' possibile installare GCstar sinche\' esse non sono presenti nel sistema.',
+ 'InstallMissingOptional' => 'Mancano alcune dipendenze opzionali, elencate qui sotto. GCstar verra\' installato ma alcune funzioni non saranno disponibili.',
+ 'InstallMissingNone' => 'Tutte le dipendenze sono soddisfatte. Continuare con l\'installazione di GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Mancante',
+ 'InstallMissingFor' => 'Mancante per',
+ 'InstallCleanDirectory' => 'Rimozione dei file di GCStar dalla directory: ',
+ 'InstallCopyDirectory' => 'Copia dei file nella directory: ',
+ 'InstallCopyDesktop' => 'Copia dei file di desktop in: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy (premere Invio se nessuno): ',
+ 'UpdateNoPermission' => 'Diritti di scrittura negati per questa directory: ',
+ 'UpdateNone' => 'Non e\' stato trovato alcun aggiornamento',
+ 'UpdateFileNotFound' => 'File non trovato',
+
+#Splash
+ 'SplashInit' => 'Inizializzazione',
+ 'SplashLoad' => 'Caricamento Collezione',
+ 'SplashDisplay' => 'Visualizzazione Collezione',
+ 'SplashSort' => 'Ordinamento Collezione',
+ 'SplashDone' => 'Finito!',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Sono stati individuati elementi di GCfilms. Cosa si vuole importare di GCfilms in GCstar? (e\' comunque possibile continuare ad utilizzare GCfilms in parallelo)',
+ 'GCfilmsImportOptions' => 'Impostazioni',
+ 'GCfilmsImportData' => 'Collezione film',
+
+#Menus
+ 'MenuFile' => 'File',
+ 'MenuNewList' => '_Nuova collezione',
+ 'MenuStats' => 'Statistiche',
+ 'MenuHistory' => 'Ultime collezioni aperte',
+ 'MenuLend' => 'Visualizza articoli prestati', # Accepts model codes
+ 'MenuImport' => '_Importa',
+ 'MenuExport' => '_Esporta',
+ 'MenuAddItem' => '_Aggiungi articolo', # Accepts model codes
+
+ 'MenuEdit' => 'Modifica',
+ 'MenuDuplicate' => '_Duplica articolo', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plica articoli', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Seleziona tutti gli articoli', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Rimuovi articolo corrente',, # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Rimuovi articolo', # Accepts model codes
+ 'MenuEditFields' => '_Cambia campi della collezione',
+ 'MenuEditLockItems' => 'B_locca la collezione',
+
+ 'MenuDisplay' => 'F_iltri',
+ 'MenuSavedSearches' => 'Ricerche salvate',
+ 'MenuSavedSearchesSave' => 'Salva ricerca corrente',
+ 'MenuSavedSearchesEdit' => 'Modifica ricerche salvate',
+ 'MenuAdvancedSearch' => 'Ricerca Avanzata',
+ 'MenuViewAllItems' => 'Mostr_a tutti gli articoli', # Accepts model codes
+ 'MenuNoFilter' => 'Tutti',
+
+ 'MenuConfiguration' => 'Configurazione',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => 'Visualizzazione articoli',
+ 'MenuBorrowers' => 'Gestione prestiti',
+ 'MenuToolbarConfiguration' => 'Configura _Toolbar',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '_Conversione di Genere',
+
+ 'MenuBookmarks' => '_Collezioni',
+ 'MenuBookmarksAdd' => '_Aggiungi collezione corrente',
+ 'MenuBookmarksEdit' => '_Edita collezioni selezionate',
+
+ 'MenuHelp' => '?',
+ 'MenuHelpContent' => 'Contenuti',
+ 'MenuAllPlugins' => 'Mostra _plugin',
+ 'MenuBugReport' => 'Segnala un _bug',
+ 'MenuAbout' => 'Su GCstar',
+
+ 'MenuNewWindow' => 'Visulizza articoli in una nuova finestra', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Visulizza articoli in una nuova finestra', # Accepts model codes
+
+ 'ContextExpandAll' => 'Espandi tutti',
+ 'ContextCollapseAll' => 'Collassa tutti',
+ 'ContextChooseImage' => 'Scegli _Immagine',
+ 'ContextOpenWith' => 'Apri con ...',
+ 'ContextImageEditor' => 'Modifica Immagine',
+ 'ContextImgFront' => 'Fronte',
+ 'ContextImgBack' => 'Retro',
+ 'ContextChooseFile' => 'Scegli file',
+ 'ContextChooseFolder' => 'Scegli cartella',
+
+ 'DialogEnterNumber' => 'Immettere valore',
+
+ 'RemoveConfirm' => 'Desideri davvero rimuovere questo articolo?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Desideri davvero rimuovere questi articoli?', # Accepts model codes
+ 'DefaultNewItem' => 'Nuovo articolo', # Accepts model codes
+ 'NewItemTooltip' => 'Aggiungi un nuovo articolo', # Accepts model codes
+ 'NoItemFound' => 'Nessun articolo trovato. Effettuare una ricerca su un altro sito?',
+ 'OpenList' => 'Scegliere collezione',
+ 'SaveList' => 'Scegli il nome e dove salvare la collezione',
+ 'SaveListTooltip' => 'Salva collezione corrente',
+ 'SaveUnsavedChanges' => 'Ci sono modifiche alla collezione non ancora salvate. Salvarle?',
+ 'SaveDontSave' => 'Non salvare',
+ 'PreferencesTooltip' => 'Impostazione preferenze',
+ 'ViewTooltip' => 'Cambia visualizzazione',
+ 'PlayTooltip' => 'Mostra il video associato all\'articolo', # Accepts model codes
+ 'PlayFileNotFound' => 'Il file da riprodurre non è stato trovato nella posizione:',
+ 'PlayRetry' => 'Riprova',
+
+ 'StatusSave' => 'Salvataggio...',
+ 'StatusLoad' => 'Caricamento...',
+ 'StatusSearch' => 'Ricerca in atto...',
+ 'StatusGetInfo' => 'Recupero informazioni...',
+ 'StatusGetImage' => 'Recupero immagine...',
+
+ 'SaveError' => 'Impossibile salvare la collezione! Controllare i diritti di accesso e lo spazio libero sul disco.',
+ 'OpenError' => 'Impossibile caricare la collezione! Controllare i diritti di accesso.',
+ 'OpenFormatError' => 'Impossibile interpretare la collezione! Formato probabilmente scorretto.',
+ 'OpenVersionWarning' => 'La collezione e\' stata creata con una versione piu\' recente di GCStar. Salvandola, potresti perdere dei dati.',
+ 'OpenVersionQuestion' => 'Sei sicuro di voler continuare?',
+ 'ImageError' => 'Directory non corretta! Selezionarne un\'altra.',
+ 'OptionsCreationError'=> 'Generazione file opzioni impossibile: ',
+ 'OptionsOpenError'=> 'Caricamento file opzioni impossibile: ',
+ 'OptionsSaveError'=> 'Salvataggio file opzioni impossibile: ',
+ 'ErrorModelNotFound' => 'Modello non trovato: ',
+ 'ErrorModelUserDir' => 'I modelli definiti dagli utenti sono in: ',
+
+ 'RandomTooltip' => 'Articoli non visti',
+ 'RandomError'=> 'Non ci sono articoli non visti', # Accepts model codes
+ 'RandomEnd'=> 'Non ci sono piu\' articoli', # Accepts model codes
+ 'RandomNextTip'=> 'Prossimo suggerimento',
+ 'RandomOkTip'=> 'Accetto questo articolo',
+
+ 'AboutTitle' => 'Su GCstar',
+ 'AboutDesc' => 'Manager di collezioni',
+ 'AboutVersion' => 'Versione',
+ 'AboutTeam' => 'Team',
+ 'AboutWho' => 'Christian Jodar (Tian) : Project Manager, Programmatore
+Nyall Dawson (Zombiepig) : Programmatore
+TPF : Programmatore
+Adolfo González : Programmatore
+',
+ 'AboutLicense' => 'Distribuito nei i termini della GNU GPL
+Logo Copyright le Spektre',
+ 'AboutTranslation' => 'Traduzione italiana v1.0.2 - 2006-05-04 di:
+Andreas Troschka - <swsolutions@om.it.eu.org>',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logo e webdesign di le Spektre',
+
+ 'ToolbarRandom' => 'Non visti',
+
+ 'UnsavedCollection' => 'Collezione non salvata',
+ 'ModelsSelect' => 'Selezionare un modello/collezione',
+ 'ModelsPersonal' => 'Personali',
+ 'ModelsDefault' => 'Predefiniti',
+ 'ModelsList' => 'Definizione collezione',
+ 'ModelSettings' => 'Impostazioni della collezione',
+ 'ModelNewType' => 'Nuovo modello di collezione',
+ 'ModelName' => 'Nome modello di collezione:',
+ 'ModelFields' => 'Campi',
+ 'ModelOptions' => 'Opzioni',
+ 'ModelFilters' => 'Filtri',
+ 'ModelNewField' => 'Nuovo campo',
+ 'ModelFieldInformation' => 'Informazioni',
+ 'ModelFieldName' => 'Etichetta:',
+ 'ModelFieldType' => 'Tipo:',
+ 'ModelFieldGroup' => 'Gruppo:',
+ 'ModelFieldValues' => 'Valori',
+ 'ModelFieldInit' => 'Predefiniti:',
+ 'ModelFieldMin' => 'Minimo:',
+ 'ModelFieldMax' => 'Massimo:',
+ 'ModelFieldList' => 'Lista valori:',
+ 'ModelFieldListLegend' => '<i>separati da virgole</i>',
+ 'ModelFieldDisplayAs' => 'Mostra come:',
+ 'ModelFieldDisplayAsText' => 'Testo',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Testo corto',
+ 'ModelFieldTypeLongText' => 'Testo lungo',
+ 'ModelFieldTypeYesNo' => 'Si/No',
+ 'ModelFieldTypeNumber' => 'Numero',
+ 'ModelFieldTypeDate' => 'Data',
+ 'ModelFieldTypeOptions' => 'Lista valori predefiniti',
+ 'ModelFieldTypeImage' => 'Immagine',
+ 'ModelFieldTypeSingleList' => 'Lista semplice',
+ 'ModelFieldTypeFile' => 'File',
+ 'ModelFieldTypeFormatted' => 'Dipendente da altri campi',
+ 'ModelFieldParameters' => 'Parametri',
+ 'ModelFieldHasHistory' => 'Utilizza la cronologia',
+ 'ModelFieldFlat' => 'Visualizza su una riga',
+ 'ModelFieldStep' => 'Passi di incremento:',
+ 'ModelFieldFileFormat' => 'Formato file:',
+ 'ModelFieldFileFile' => 'File semplice',
+ 'ModelFieldFileImage' => 'Immagine',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Programma',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Campi da utilizzare',
+ 'ModelOptionsFieldsAuto' => 'Automatico',
+ 'ModelOptionsFieldsNone' => 'Nessuno',
+ 'ModelOptionsFieldsTitle' => 'Come titolo',
+ 'ModelOptionsFieldsId' => 'Come identificatore',
+ 'ModelOptionsFieldsCover' => 'Come copertina',
+ 'ModelOptionsFieldsPlay' => 'Per pulsante Play',
+ 'ModelCollectionSettings' => 'Impostazioni collezione',
+ 'ModelCollectionSettingsLending' => 'Prestabile',
+ 'ModelCollectionSettingsTagging' => 'Etichettabile',
+ 'ModelFilterActivated' => 'Nel box di ricerca',
+ 'ModelFilterComparison' => 'Comparazione',
+ 'ModelFilterContain' => 'Contiene',
+ 'ModelFilterDoesNotContain' => 'Non contiene',
+ 'ModelFilterRegexp' => 'Espressione regolare',
+ 'ModelFilterRange' => 'Campo',
+ 'ModelFilterNumeric' => 'Comparazione numerica',
+ 'ModelFilterQuick' => 'Creazione filtro veloce',
+ 'ModelTooltipName' => 'Specifica un nome per riutilizzare questo modello in altre collezioni. In caso di nome nullo le impostazioni verranno registrate dentro il file della collezione stessa, ma non saranno piu\' disponibili per altre collezioni.',
+ 'ModelTooltipLabel' => 'Il nome del campo cosi\' come deve essere visualizzato',
+ 'ModelTooltipGroup' => 'Utilizzato per raggruppare campi. Articoli con valore nullo verranno inseriti in un gruppo predefinito',
+ 'ModelTooltipHistory' => 'I valori precedentemente inseriti devono essere salvati in una lista associata al campo?',
+ 'ModelTooltipFormat' => 'Questo formato viene utilizzato per determinare l\'azione necessaria per aprire il file mediante il tasto Play',
+ 'ModelTooltipLending' => 'Aggiunge alcuni campi per la gestione dei prestiti',
+ 'ModelTooltipTagging' => 'Aggiunge alcuni campi per la gestione delle etichette (tags)',
+ 'ModelTooltipNumeric' => 'Nella comparazione i valori sono considerati numeri',
+ 'ModelTooltipQuick' => 'Aggiunge una voce di submenu\' nel menu\' filtri',
+
+ 'ResultsTitle' => 'Seleziona un articolo', # Accepts model codes
+ 'ResultsNextTip' => 'Cerca nel prossimo sito',
+ 'ResultsPreview' => 'Anteprima',
+ 'ResultsInfo' => 'Puoi utilizzare più risultati selezionandoli, tenendo premuto il tasto Ctrl o Shift', # Accepts model codes
+
+ 'OptionsTitle' => 'Preferenze',
+ 'OptionsExpertMode' => 'Modalita\' per esperti',
+ 'OptionsPrograms' => 'Specifica le applicazioni da utilizzare per i differenti media, lasciare vuoto per utilizzare quelle di sistema',
+ 'OptionsBrowser' => 'Web browser',
+ 'OptionsPlayer' => 'Video player',
+ 'OptionsAudio' => 'Audio player',
+ 'OptionsImageEditor' => 'Editor di immagini',
+ 'OptionsCdDevice' => 'Unita\' CD',
+ 'OptionsImages' => 'Indice di immagini',
+ 'OptionsUseRelativePaths' => 'Utilizza percorsi relativi per le immagini',
+ 'OptionsLayout' => 'Maschera',
+ 'OptionsStatus' => 'Visualizza la barra di stato in fondo alla finestra',
+ 'OptionsUseStars' => 'Usa stelle per mostrare l\'indice di gradimento',
+ 'OptionsWarning' => 'Attenzione: Le modifiche eventualmente appportate in questo pannello avranno effetto solo dopo il riavvio dell\' applicazione GCstar!!!',
+ 'OptionsRemoveConfirm' => 'Chiedi conferma prima di rimuovere un articolo dalla collezione',
+ 'OptionsAutoSave' => 'Salva automaticamente la collezione',
+ 'OptionsAutoLoad' => 'All\'avvio carica l\'ultima collezione trattata',
+ 'OptionsSplash' => 'Mostra splashscreen',
+ 'OptionsTearoffMenus' => 'Abilita il tear-off menu\'',
+ 'OptionsSpellCheck' => 'Use spelling checker for long text fields',
+ 'OptionsProgramTitle' => 'Seleziona il programma per essere usato',
+ 'OptionsPlugins' => 'Siti da utilizzare per le informazioni degli articoli',
+ 'OptionsAskPlugins' => 'Chiedi (Tutti i siti)',
+ 'OptionsPluginsMulti' => 'Diversi siti',
+ 'OptionsPluginsMultiAsk' => 'Chiedi (Diversi siti)',
+ 'OptionsPluginsMultiPerField' => 'Diversi siti (configurazione campi)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Diversi siti (configurazione campi)',
+ 'OptionsPluginsMultiPerFieldDesc' => 'Per ciascun campo selezionato verra\' ritornata la prima informazione non vuota partendo da sinistra',
+ 'OptionsPluginsMultiPerFieldFirst' => 'Primo',
+ 'OptionsPluginsMultiPerFieldLast' => 'Ultimo',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Rimuovi',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Pulisci campi selezionati',
+ 'OptionsPluginsList' => 'Configura la lista',
+ 'OptionsAskImport' => 'Seleziona i campi da importare',
+ 'OptionsProxy' => 'Usa un proxy',
+ 'OptionsCookieJar' => 'Use questo cookie jar file',
+ 'OptionsLang' => 'Lingua',
+ 'OptionsMain' => 'Principale',
+ 'OptionsPaths' => 'Percorsi',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' =>'Strumenti',
+ 'OptionsDisplay' => 'Visualizzazione',
+ 'OptionsToolbar' => 'Toolbar',
+ 'OptionsToolbars' => {0 => 'Nessuno', 1 => 'Piccolo', 2 => 'Grande', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'Posizione',
+ 'OptionsToolbarPositions' => {0 => 'In alto', 1 => 'In basso', 2 => 'A sinistra', 3 => 'A destra'},
+ 'OptionsExpandersMode' => 'Informazioni troppo lunghe',
+ 'OptionsExpandersModes' => {'asis' => 'Non fare niente', 'cut' => 'Taglia', 'wrap' => 'A capo automatico'},
+ 'OptionsDateFormat' => 'Date Format',
+ 'OptionsDateFormatTooltip' => 'Il formato è quello utilizzato dalla funzione strftime(3). Il valore di default è %d/%m/%Y',
+ 'OptionsView' => 'Visualizzazione articoli',
+ 'OptionsViews' => {0 => 'Testo', 1 => 'Immagine', 2 => 'Dettagli'},
+ 'OptionsColumns' => 'Colonne',
+ 'OptionsMailer' => 'Metodo di invio',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'Mittente e-mail',
+ 'OptionsTransform' => 'Mettere gli articoli alla fine dei titoli',
+ 'OptionsArticles' => 'Articoli (separare mediante virgola)',
+ 'OptionsSearchStop' => 'L\'utente può arrestare una ricerca',
+ 'OptionsBigPics' => 'Usa immagini grandi quando disponibili',
+ 'OptionsAlwaysOriginal' => 'Utilizza il titolo principale come originale in mancanza di uno specificato',
+ 'OptionsRestoreAccelerators' => 'Abilita combinazioni di tasti',
+ 'OptionsHistory' => 'Dimensione della cronologia',
+ 'OptionsClearHistory' => 'Cancella cronologia',
+ 'OptionsStyle' => 'Skin',
+ 'OptionsDontAsk' => 'Non chiedere piu\'',
+ 'OptionsPathProgramsGroup' => 'Applicazioni',
+ 'OptionsProgramsSystem' => 'Utilizza i programmi definiti dal sistema',
+ 'OptionsProgramsUser' => 'Utilizza i programmi specificati',
+ 'OptionsProgramsSet' => 'Impostazione programmi',
+ 'OptionsPathImagesGroup' => 'Immagini',
+ 'OptionsInternetDataGroup' => 'Importazione dati',
+ 'OptionsInternetSettingsGroup' => 'Impostazioni',
+ 'OptionsDisplayInformationGroup' => 'Informazioni',
+ 'OptionsDisplayArticlesGroup' => 'Articoli',
+ 'OptionsImagesDisplayGroup' => 'Display',
+ 'OptionsImagesStyleGroup' => 'Stile',
+ 'OptionsDetailedPreferencesGroup' => 'Preferenze',
+ 'OptionsFeaturesConveniencesGroup' => 'Conveniences',
+ 'OptionsPicturesFormat' => 'Prefisso per le immagini:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Titolo o nome dell\'articolo associato',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% o . verra\' rimpiazzato dal nome della directory della collezione (utilizza solo all\'inizio del percorso)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% verra\' rimpiazzato dal nome della collezione senza il suffisso (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% puo\' essere utilizzato solo all\'inizio del percorso che punta alle immagini',
+ 'OptionsConfigureMailers' => 'Configura programmi di posta',
+
+ 'ImagesOptionsButton' => 'Impostazioni',
+ 'ImagesOptionsTitle' => 'Impostazioni della lista delle immagini',
+ 'ImagesOptionsSelectColor' => 'Seleziona un colore',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Sfondo',
+ 'ImagesOptionsBgPicture' => 'Usa un\'immagine come sfondo',
+ 'ImagesOptionsFg'=> 'Selezione',
+ 'ImagesOptionsBgTooltip' => 'Cambia colore di sfondo',
+ 'ImagesOptionsFgTooltip'=> 'Cambia il colore di selezione',
+ 'ImagesOptionsResizeImgList' => 'Cambia automaticamente il numero di colonne',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Dimensione',
+ 'ImagesOptionsSizeList' => {0 => 'Ultra piccola', 1 => 'Piccola', 2 => 'Media', 3 => 'Grande', 4 => 'Extra Grande'},
+ 'ImagesOptionsSizeTooltip' => 'Seleziona dimensioni immagine',
+
+ 'DetailedOptionsTitle' => 'Impostazioni lista dettagliata',
+ 'DetailedOptionsImageSize' => 'Dimensioni immagine',
+ 'DetailedOptionsGroupItems' => 'Raggruppa gli articoli per',
+ 'DetailedOptionsSecondarySort' => 'Ordina gli articoli per',
+ 'DetailedOptionsFields' => 'Scegli i campi da visualizzare',
+ 'DetailedOptionsGroupedFirst' => 'Raggruppa insieme gli articoli orfani',
+ 'DetailedOptionsAddCount' => 'Aggiungi il numero di elementi alle categorie',
+
+ 'ExtractButton' => 'Informazioni',
+ 'ExtractTitle' => 'Informazioni file',
+ 'ExtractImport' => 'Utilizza i valori',
+
+ 'FieldsListOpen' => 'Caricare un elenco di campi da un file',
+ 'FieldsListSave' => 'Salvare un elenco di campi in un file',
+ 'FieldsListError' => 'L\'elenco di campi non puo\' essere utilizzato con questo modello di collezione',
+ 'FieldsListIgnore' => '--- Ignora',
+
+ 'ExportTitle' => 'Gestione elenco campi da esportare',
+ 'ExportFilter' => 'Esportare solo i campi visualizzati',
+ 'ExportFieldsTitle' => 'Campi da esportare',
+ 'ExportFieldsTip' => 'Campi prescelti per l\'esportazione',
+ 'ExportWithPictures' => 'Copiare le immagini in una sottodirectory',
+ 'ExportSortBy' => 'Ordina per',
+ 'ExportOrder' => 'Ordine',
+
+ 'ImportListTitle' => 'Importazione della collezione:',
+ 'ImportExportData' => 'Dati',
+ 'ImportExportFile' => 'Elenco',
+ 'ImportExportFieldsUnused' => 'Campi non selezionati',
+ 'ImportExportFieldsUsed' => 'Campi selezionati',
+ 'ImportExportFieldsFill' => 'Tutti i campi',
+ 'ImportExportFieldsClear' => 'Nessun campo',
+ 'ImportExportFieldsEmpty' => 'Occorre selezionare almeno un campo',
+ 'ImportExportFileEmpty' => 'Specificare un nome per il file',
+ 'ImportFieldsTitle' => 'Campi da importare',
+ 'ImportFieldsTip' => 'Scegliere i campi da importare',
+ 'ImportNewList' => 'Creare una nuova collezione',
+ 'ImportCurrentList' => 'Aggiungere alla collezione corrente',
+ 'ImportDropError' => 'Si e\' verificato un errore durante l\'apertura di almeno un file. Viene ricaricata la precedente collezione!',
+ 'ImportGenerateId' => 'Generare identificatore per ogni articolo',
+
+ 'FileChooserOpenFile' => 'Selezionare l\'elenco',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Seleziona un indice',
+ 'FileChooserOverwrite' => 'Questa collezione esiste gia\', sovrascriverla?',
+ 'FileAllFiles' => 'Tutti i file',
+ 'FileVideoFiles' => 'Video File',
+ 'FileEbookFiles' => 'Ebook File',
+ 'FileAudioFiles' => 'Audio File',
+ 'FileGCstarFiles' => 'Collezioni GCStar',
+
+ 'PanelCompact' => 'Compattare',
+ 'PanelReadOnly' => 'Sola lettura',
+ 'PanelForm' => 'Etichette',
+
+ 'PanelSearchButton' => 'Recupera informazioni',
+ 'PanelSearchTip' => 'Cerca informazioni secondo il titolo dell\'articolo inserito',
+ 'PanelSearchContextChooseOne' => 'Scegli un sito ...',
+ 'PanelSearchContextMultiSite' => 'Use "Diversi siti"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Diversi siti (configurazione campi)"',
+ 'PanelSearchContextOptions' => 'Cambia opzioni ...',
+ 'PanelImageTipOpen' => 'Clicca sull\'immagine per sceglierne un\'altra.',
+ 'PanelImageTipView' => 'Clicca sull\'immagine per visualizzare in grandezza naturale.',
+ 'PanelImageTipMenu' => 'Clicca tasto destro per piu\' opzioni.',
+ 'PanelImageTitle' => 'Scegliere un\'immagine',
+ 'PanelImageNoImage' => 'Nessuna immagine',
+ 'PanelSelectFileTitle' => 'Seleziona un file',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Ripristina predefiniti',
+ 'PanelRefresh' => 'Aggiorna',
+ 'PanelRefreshTip' => 'Aggiorna le informazioni dal web',
+
+ 'PanelFrom' =>'Da',
+ 'PanelTo' =>'A',
+
+ 'PanelWeb' => 'Leggi informazioni dell\'articolo',
+ 'PanelWebTip' => 'Leggi informazioni su questo articolo e disponibili sul web', # Accepts model codes
+ 'PanelRemoveTip' => 'Rimuovi l\'articolo corrente', # Accepts model codes
+
+ 'PanelDateSelect' => 'Scegli una data',
+ 'PanelNobody' => 'Nessuno',
+ 'PanelUnknown' => 'Sconosciuta',
+ 'PanelAdded' => 'Aggiungi data',
+ 'PanelRating' => 'Valutazione',
+ 'PanelPressRating' => 'Press ratings',
+ 'PanelLocation' => 'Luogo',
+
+ 'PanelLending' => 'Prestiti',
+ 'PanelBorrower' => 'Prestiti',
+ 'PanelLendDate' => 'Data',
+ 'PanelHistory' => 'Cronologia',
+ 'PanelReturned' => 'Articolo restituito', # Accepts model codes
+ 'PanelReturnDate' => 'Data restituzione',
+ 'PanelLendedYes' => 'Prestato',
+ 'PanelLendedNo' => 'Disponibile',
+
+ 'PanelTags' => 'Etichette (Tags)',
+ 'PanelFavourite' => 'Preferiti',
+ 'TagsAssigned' => 'Etichette assegnate',
+
+ 'PanelUser' => 'Campi utente',
+
+ 'CheckUndef' => 'Nessun problema',
+ 'CheckYes' => 'Sì',
+ 'CheckNo' => 'No',
+
+ 'ToolbarAll' => 'Mostra tutto',
+ 'ToolbarAllTooltip' => 'Visualizza tutti gli articoli',
+ 'ToolbarGroupBy' => 'Raggruppa per',
+ 'ToolbarGroupByTooltip' => 'Selezionare il campo da utilizzare per raggruppare gli articoli della collezione',
+ 'ToolbarQuickSearch' => 'Ricerca rapida',
+ 'ToolbarQuickSearchLabel' => 'Ricerca',
+ 'ToolbarQuickSearchTooltip' => 'Seleziona il campo in cui ricercare. Inserisci le parole da ricercare e premi Invio',
+ 'ToolbarSeparator' => ' Separatore',
+
+ 'PluginsTitle' => 'Cerca un articolo',
+ 'PluginsQuery' => 'Query',
+ 'PluginsFrame' => 'Cerca un sito',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Nome',
+ 'PluginsSearchFields' => 'Cerca campi',
+ 'PluginsAuthor' => 'Autore',
+ 'PluginsLang' => 'Lingua',
+ 'PluginsUseSite' => 'Utilizza il sito selezionato per ricerche future',
+ 'PluginsPreferredTooltip' => 'Sito raccomandato da GCstar',
+ 'PluginDisabled' => 'Disabilitato',
+
+ 'BorrowersTitle' => 'Configurazione prestiti',
+ 'BorrowersList' => 'Beneficiari dei prestiti',
+ 'BorrowersName' => 'Nome',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Aggiungi',
+ 'BorrowersRemove' => 'Elimina',
+ 'BorrowersEdit' => 'Modifica',
+ 'BorrowersTemplate' => 'Modello mail',
+ 'BorrowersSubject' => 'Oggetto',
+ 'BorrowersNotice1' => '%1 inserisce il nome di chi beneficia del prestito',
+ 'BorrowersNotice2' => '%2 inserisce il nome dell\'articolo',
+ 'BorrowersNotice3' => '%3 inserisce la data del prestito',
+
+ 'BorrowersImportTitle' => 'Importa informazioni beneficiari di prestito',
+ 'BorrowersImportType' => 'Formato file:',
+ 'BorrowersImportFile' => 'File:',
+
+ 'BorrowedTitle' => 'Articoli prestati', # Accepts model codes
+ 'BorrowedDate' => 'Il',
+ 'BorrowedDisplayInPanel' => 'Mostra articolo nella schermata principale', # Accepts model codes
+
+ 'MailTitle' => 'Manda una e-mail',
+ 'MailFrom' => 'Da: ',
+ 'MailTo' => 'A: ',
+ 'MailSubject' => 'Oggetto: ',
+ 'MailSmtpError' => 'Problema di connessione al server SMTP',
+ 'MailSendmailError' => 'Problema nell\'inviare l\'e-mail',
+
+ 'SearchTooltip' => 'Cerca nella collezione', # Accepts model codes
+ 'SearchTitle' => 'Cerca', # Accepts model codes
+ 'SearchNoField' => 'Nessun campo è stato selezionato nel box di ricerca.
+Aggiungine uno o più nella scheda Filtri, nelle impostazioni per la collezione.',
+
+ 'QueryReplaceField' => 'Campo da sostituire',
+ 'QueryReplaceOld' => 'Nome corrente',
+ 'QueryReplaceNew' => 'Nuovo nome',
+ 'QueryReplaceLaunch' => 'Sostituisci',
+
+ 'ImportWindowTitle' => 'Scegli i campi da importare',
+ 'ImportViewPicture' => 'Visualizza immagine',
+ 'ImportSelectAll' => 'Aggiungi tutti',
+ 'ImportSelectNone' => 'Rimuovi tutti',
+
+ 'MultiSiteTitle' => 'Siti da interrogare per le ricerche',
+ 'MultiSiteUnused' => 'Plugin inutilizzati',
+ 'MultiSiteUsed' => 'Plugin da utilizzare',
+ 'MultiSiteLang' => 'Riempi la lista con il plugin inglese',
+ 'MultiSiteEmptyError' => 'Hai una lista di siti vuota',
+ 'MultiSiteClear' => 'Pulisci la lista',
+
+ 'DisplayOptionsTitle' => 'Articoli da visualizzare',
+ 'DisplayOptionsAll' => 'Scegli tutto',
+ 'DisplayOptionsSearch' => 'Pulsante ricerche',
+
+ 'GenresTitle' => 'Conversione di genere',
+ 'GenresCategoryName' => 'Genere da utilizzare',
+ 'GenresCategoryMembers' => 'Genere da sostituire',
+ 'GenresLoad' => 'Carica lista',
+ 'GenresExport' => 'Salva lista in un file',
+ 'GenresModify' => 'Modifica conversione',
+
+ 'PropertiesName' => 'Nome collezione',
+ 'PropertiesLang' => 'Codice lingua',
+ 'PropertiesOwner' => 'Proprietario',
+ 'PropertiesEmail' => 'e-mail',
+ 'PropertiesDescription' => 'Descrizione',
+ 'PropertiesFile' => 'Informazione file',
+ 'PropertiesFilePath' => 'Percorso completo',
+ 'PropertiesItemsNumber' => 'Numero di articoli', # Accepts model codes
+ 'PropertiesFileSize' => 'Dimensione',
+ 'PropertiesFileSizeSymbols' => ['Byte', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Proprieta\' collezione',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Programmi per spedizione e-mail',
+ 'MailProgramsName' => 'Nome',
+ 'MailProgramsCommand' => 'Linea di comando',
+ 'MailProgramsRestore' => 'Riproponi predefiniti',
+ 'MailProgramsAdd' => 'Aggiungi programma',
+ 'MailProgramsInstructions' => 'Nella command-line:
+ %f inserisce l\'indirizzo di e-mail del mittente.
+ %t inserisce l\'indirizzo di e-mail del destinatario.
+ %s inserisce il soggetto del messaggio.
+ %b inserisce il testo del messaggio.',
+
+ 'BookmarksBookmarks' => 'Bookmarks',
+ 'BookmarksFolder' => 'Directory',
+ 'BookmarksLabel' => 'Etichetta',
+ 'BookmarksPath' => 'Percorso',
+ 'BookmarksNewFolder' => 'Nuova cartella',
+
+ 'AdvancedSearchType' => 'Tipo di ricerca',
+ 'AdvancedSearchTypeAnd' => 'Articoli soddisfacenti tutti i criteri (AND)', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Articoli soddisfacenti almeno un criterio (OR)', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criteri',
+ 'AdvancedSearchAnyField' => 'Qualsiasi campo',
+ 'AdvancedSearchSaveTitle' => 'Salva ricerca',
+ 'AdvancedSearchSaveName' => 'Nome',
+ 'AdvancedSearchSaveOverwrite' => 'Una ricerca salvata esiste già con questo nome. Utilizzare un nome differente.',
+ 'AdvancedSearchUseCase' => 'Distinzione maiuscole/minuscole',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignora accenti ed altri caratteri speciali',
+
+ 'BugReportSubject' => 'Bug report generato da GCstar',
+ 'BugReportVersion' => 'Versione',
+ 'BugReportPlatform' => 'Sistema operativo',
+ 'BugReportMessage' => 'Messaggio d\'errore',
+ 'BugReportInformation' => 'Informazioni addizionali',
+
+#Statistics
+ 'StatsFieldToUse' => 'Campi da usare',
+ 'StatsSortByNumber' => 'Ordina per numero di {lowercaseX}',
+ 'StatsGenerate' => 'Genera',
+ 'StatsKindOfGraph' => 'Tipo di grafico',
+ 'StatsBars' => 'Barre',
+ 'StatsPie' => 'Torta',
+ 'Stats3DPie' => 'Torta 3D',
+ 'StatsArea' => 'Aree',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Lunghezza',
+ 'StatsHeight' => 'Altezza',
+ 'StatsFontSize' => 'Dimensione carattere',
+ 'StatsDisplayNumber' => 'Mostra numeri',
+ 'StatsSave' => 'Salva statistiche su file',
+ 'StatsAccumulate' => 'Accumula valori',
+ 'StatsShowAllDates' => 'Mostra tutte le date',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/IT/README.txt b/lib/gcstar/GCLang/IT/README.txt
new file mode 100644
index 0000000..0679b6d
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/README.txt
@@ -0,0 +1,9 @@
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
diff --git a/lib/gcstar/GCLang/NL/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/NL/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..b72eb0d
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::NL::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Inclusief veldnamen aan de bovenkant',
+ 'Separator' => 'Scheidingsteken',
+ 'Replacement' => 'Vervang het scheidingsteken door',
+ 'Charset' => 'Tekenset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/NL/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..2c2bf1c
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::NL::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/NL/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..dbad849
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::NL::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Ongeldig sjabloonbestand',
+ 'UseFile' => 'Gebruik het hieronder gespecificeerde bestand',
+ 'WithJS' => 'Gebruik Javascript',
+ 'FileTemplate' => 'Sjabloon',
+ 'Preview' => 'Voorbeeld',
+ 'NoPreview' => 'Geen voorbeeld beschikbaar',
+ 'TemplateExternalFile' => 'Sjabloonbestand',
+ 'Title' => 'Paginatitel',
+ 'InfoFile' => 'Filmlijst staat in het bestand: ',
+ 'InfoDir' => 'Afbeeldingen staan in: ',
+ 'HeightImg' => 'Hoogte (in pixels) van het uit te voeren beeld',
+ 'OpenFileInBrowser' => 'Open gegenereerd bestand in de webbrowser',
+ 'Note' => 'Lijst gegenereerd door <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Geef de gezochte tekst',
+ 'SearchType1' => 'Titel alleen',
+ 'SearchType2' => 'Volledige informatie',
+ 'SearchButton' => 'Zoek',
+ 'SearchTitle' => 'Toon enkel films overeenstemmend met voorgaande criteria',
+ 'AllButton' => 'Alle',
+ 'AllTitle' => 'Toon alle films',
+ 'Expand' => 'Alles uitvouwen',
+ 'ExpandTitle' => 'Toon alle informatie van de films',
+ 'Collapse' => 'Alles dichtvouwen',
+ 'CollapseTitle' => 'Verberg alle informatie van de films',
+ 'Borrowed' => 'Geleend door: ',
+ 'NotBorrowed' => 'Beschikbaar',
+ 'Top' => 'Bovenaan',
+ 'Bottom' => 'Onderaan',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/NL/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..7371152
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::NL::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/NL/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..f59a75a
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::NL::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Inclusief DROP instructie',
+ 'WithCreate' => 'Inclusief CREATE instructie',
+ 'TableName' => 'Tabel Naam',
+ 'InfoFile' => 'SQL bestand: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/NL/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..cbfeb73
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::NL::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Archief staat in bestand: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/NL/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..031b08e
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::NL::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Sjabloon bestand',
+ 'ModelText' => 'Sjabloon tekst',
+ 'Models' => 'Te gebruiken sjabloon',
+ 'UseFile' => 'Gebruik bestand',
+ 'UseModel' => 'Gebruik tekst zone',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/NL/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..9029b3b
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::NL::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Waar moet ik zoeken',
+ 'Default' => 'Standaard Alexandria\'s map',
+ 'Specified' => 'Map hieronder aangegeven',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/NL/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..9d4a1a9
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::NL::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Tekenset',
+ 'Header' => 'Negeer eerste lijn',
+ 'Separator' => 'Separator',
+ 'Plugin' => 'Webpagina te gebruiken',
+ 'UseFirst' => 'Selecteer de eerste bij een groot aantal resultaten',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/NL/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..ddf445e
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::NL::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Map',
+ 'Recursive' => 'Doorblader sub-mappen',
+ 'Suffixes' => 'Achtervoegsels of extensies van de bestanden',
+ 'SuffixesTooltip' => 'Een door komma\'s gescheiden lijst van achtervoegsels of extensies van de te overwegen bestanden',
+ 'Remove' => 'Om te worden verwijderd uit de namen',
+ 'RemoveTooltip' => 'Een door komma\'s gescheiden lijst van woorden dat uit de bestandsnamen verwijderd moeten worden om de opgehaalde namen aan te maken',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # Deze plug-in deelt enkele waarden met ImportList, het voegt hen van het toe
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/NL/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..7793d13
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::NL::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Kopieer afbeeldingen',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCImport/GCImportList.pm b/lib/gcstar/GCLang/NL/GCImport/GCImportList.pm
new file mode 100644
index 0000000..fe9fff6
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::NL::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Namenlijst',
+ 'Plugin' => 'Webpagina te gebruiken',
+ 'UseFirst' => 'Selecteer de eerste bij een groot aantal resultaten',
+ 'CommentAuto' => 'Item automatisch geïmporteerd.',
+ 'CommentSite' => 'Webpagina: ',
+ 'CommentTitle' => 'Titel: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/NL/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..6663e3e
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::NL::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/NL/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..455af81
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::NL::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Bestand is een niet ondersteunde Tellico collectie',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/NL/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..cc3812f
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::NL::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collectie TV-serie (afleveringen)',
+ Items => 'Afleveringen',
+ NewItem => 'Nieuwe aflevering',
+ NewSeries => 'Nieuwe serie',
+ Episode => 'Aflevering',
+ );
+ # Beiden zijn nodig als importTranslation niet voorvalt
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/NL/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..45679d4
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::NL::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collectie TV-series',
+ Items => 'Series',
+ NewItem => 'Nieuwe serie',
+ Name => 'Naam',
+ Season => 'Seizoen',
+ Part => 'Deel',
+ Episodes => 'Afleveringen',
+ FirstAired => 'Eerste keer uitgezonden',
+ Time => 'Speelduur',
+ Producer => 'Producent',
+ Music => 'Muziek',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/NL/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..885b0e7
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::NL::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collectie gezelschapsspellen',
+ Items => {0 => 'Spel',
+ 1 => 'Spel',
+ X => 'Spellen'},
+ NewItem => 'Nieuw spel',
+
+ Id => 'Id',
+ Name => 'Naam',
+ Original => 'Oorspronkelijke naam',
+ Box => 'Afbeelding van de doos',
+ DesignedBy => 'Ontworpen door',
+ PublishedBy => 'Gepubliceerd door',
+ Players => 'Aantal spelers',
+ PlayingTime => 'Speelduur',
+ SuggestedAge => 'Voorgestelde leeftijd',
+ Released => 'Uitgegeven',
+ Description => 'Beschrijving',
+ Category => 'Categorie',
+ Mechanics => 'Mechanisme(s)',
+ ExpandedBy => 'Uitgebreid door',
+ ExpansionFor => 'Uitbreiding voor',
+ GameFamily => 'Spelgenre',
+ IllustratedBy => 'Geïllustreerd door',
+ Url => 'Webpagina',
+ TimesPlayed => 'Aantal keer gespeeld',
+ CompleteContents => 'Volledige inhoud',
+ Copies => 'Aantal exemplaren',
+ Condition => 'Staat',
+ Photos => 'Foto\'s',
+ Photo1 => 'Eerste foto',
+ Photo2 => 'Tweede foto',
+ Photo3 => 'Derde foto',
+ Photo4 => 'Vierde foto',
+ Comments => 'Opmerkingen',
+
+ Perfect => 'Perfect',
+ Good => 'Goed',
+ Average => 'Gemiddeld',
+ Poor => 'Slecht',
+
+ CompleteYes => 'Volledige inhoud',
+ CompleteNo => 'Ontbrekende stukjes',
+
+ General => 'Algemeen',
+ Details => 'Details',
+ Personal => 'Persoonlijk',
+ Information => 'Informatie',
+
+ FilterRatingSelect => 'Minimum waardering...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCbooks.pm b/lib/gcstar/GCLang/NL/GCModels/GCbooks.pm
new file mode 100644
index 0000000..f193ee8
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCbooks.pm
@@ -0,0 +1,70 @@
+{
+ package GCLang::NL::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collectie boeken',
+ Items => {0 => 'Boek',
+ 1 => 'Boek',
+ X => 'Boeken'},
+ NewItem => 'Nieuw boek',
+
+ Isbn => 'ISBN',
+ Title => 'Titel',
+ Cover => 'Cover',
+ Authors => 'Auteurs',
+ Publisher => 'Uitgever',
+ Publication => 'Publicatiedatum',
+ Language => 'Taal',
+ Genre => 'Genre',
+ Serie => 'Serie',
+ Rank => 'Rank',
+ Bookdescription => 'Beschrijving',
+ Pages => 'Pagina\'s',
+ Read => 'Lees',
+ Acquisition => 'Verkregen op',
+ Edition => 'Uitgave',
+ Format => 'Formaat',
+ Comments => 'Opmerkingen',
+ Url => 'Webpagina',
+ Translator => 'Vertaler',
+ Artist => 'Illustrator',
+ DigitalFile => 'Digital version',
+
+ General => 'Algemeen',
+ Details => 'Details',
+
+ ReadNo => 'Niet gelezen',
+ ReadYes => 'Gelezen',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCcoins.pm b/lib/gcstar/GCLang/NL/GCModels/GCcoins.pm
new file mode 100644
index 0000000..0a43a56
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCcoins.pm
@@ -0,0 +1,104 @@
+{
+ package GCLang::NL::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Numismatische collectie',
+ Items => {0 => 'Muntstuk',
+ 1 => 'Muntstuk',
+ X => 'Muntstukken'},
+ NewItem => 'Nieuw muntstuk',
+
+ Name => 'Naam',
+ Country => 'Land',
+ Year => 'Jaar',
+ Currency => 'Valuta',
+ Value => 'Waarde',
+ Picture => 'Hoofdafbeelding',
+ Diameter => 'Diameter',
+ Metal => 'Metaal',
+ Edge => 'Rand',
+ Edge1 => 'Rand 1',
+ Edge2 => 'Rand 2',
+ Edge3 => 'Rand 3',
+ Edge4 => 'Rand 4',
+ Head => 'Kop',
+ Tail => 'Munt',
+ Comments => 'Opmerkingen',
+ History => 'Geschiedenis',
+ Website => 'Webpagina',
+ Estimate => 'Raming',
+ References => 'Referenties',
+ Type => 'Type',
+ Coin => 'Muntstuk',
+ Banknote => 'Bankbiljet',
+
+ Main => 'Hoofd',
+ Description => 'Beschrijving',
+ Other => 'Overige informatie',
+ Pictures => 'Afbeeldingen',
+
+ Condition => 'Toestand (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCcomics.pm b/lib/gcstar/GCLang/NL/GCModels/GCcomics.pm
new file mode 100644
index 0000000..e3105cc
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::NL::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collectie strips',
+ Items => {0 => 'Strips',
+ 1 => 'Strip',
+ X => 'Strips'},
+ NewItem => 'Nieuwe strip',
+
+
+ Id => 'Id',
+ Name => 'Naam',
+ Series => 'Series',
+ Volume => 'Deel',
+ Title => 'Titel',
+ Writer => 'Schrijver',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colorist',
+ Publisher => 'Uitgever',
+ Synopsis => 'Synopsis',
+ Collection => 'Collectie',
+ PublishDate => 'Publicatiedatum',
+ PrintingDate => 'Afdrukdatum',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Categorie',
+ Format => 'Formaat',
+ NumberBoards => 'Aantal',
+ Signing => 'Ondertekening',
+ Cost => 'Kost',
+ Rating => 'Waardering',
+ Comment => 'Opmerkingen',
+ Url => 'Webpagina',
+
+ FilterRatingSelect => 'Minimum waardering...',
+
+ Main => 'Belangrijkste punten',
+ General => 'Algemeen',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCfilms.pm b/lib/gcstar/GCLang/NL/GCModels/GCfilms.pm
new file mode 100644
index 0000000..2e2c09a
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCfilms.pm
@@ -0,0 +1,93 @@
+{
+ package GCLang::NL::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collectie films',
+ Items => {0 => 'Film',
+ 1 => 'Film',
+ X => 'Films'},
+ NewItem => 'Nieuwe film',
+
+
+ Id => 'Id',
+ Title => 'Titel',
+ Date => 'Datum',
+ Time => 'Speelduur',
+ Director => 'Director',
+ Country => 'Land',
+ MinimumAge => 'Minimum leeftijd',
+ Genre => 'Genre',
+ Image => 'Afbeelding',
+ Original => 'Originele titel',
+ Actors => 'Acteurs',
+ Actor => 'Acteur',
+ Role => 'Rol',
+ Comment => 'Opmerkingen',
+ Synopsis => 'Synopsis',
+ Seen => 'Gezien',
+ Number => '# van de Media',
+ Format => 'Media',
+ Region => 'Regio',
+ Identifier => 'Identificatie',
+ Url => 'Webpagina',
+ Audio => 'Geluid',
+ Video => 'Videoformaat',
+ Trailer => 'Videobestand',
+ Serie => 'Serie',
+ Rank => 'Rank',
+ Subtitles => 'Ondertitels',
+
+ SeenYes => 'Gezien',
+ SeenNo => 'Niet Gezien',
+
+ AgeUnrated => 'Niet geschat',
+ AgeAll => 'Alle leeftijden',
+ AgeParent => 'Begeleiding ouders',
+
+ Main => 'Hoofditems',
+ General => 'Algemeen',
+ Details => 'Details',
+
+ Information => 'Informatie',
+ Languages => 'Talen',
+ Encoding => 'Codering',
+
+ FilterAudienceAge => 'Leeftijdcategorie',
+ FilterSeenNo => '_Nog niet gezien',
+ FilterSeenYes => '_Al gezien',
+ FilterRatingSelect => 'Minimum waardering...',
+
+ ExtractSize => 'Grootte',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCgames.pm b/lib/gcstar/GCLang/NL/GCModels/GCgames.pm
new file mode 100644
index 0000000..2ee1a84
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCgames.pm
@@ -0,0 +1,82 @@
+{
+ package GCLang::NL::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collectie computerspellen',
+ Items => {0 => 'Spel',
+ 1 => 'Spel',
+ X => 'Spellen'},
+ NewItem => 'Nieuw spel',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Naam',
+ Platform => 'Platform',
+ Players => 'Aantal spelers',
+ Released => 'Uitgegeven',
+ Editor => 'Montage',
+ Developer => 'Ontwikkelaar',
+ Genre => 'Genre',
+ Box => 'Afbeelding van de doos',
+ Case => 'Zaak',
+ Manual => 'Handleiding',
+ Completion => 'Voltooid (%)',
+ Executable => 'Uitvoerbaar bestand',
+ Description => 'Beschrijving',
+ Codes => 'Codes',
+ Code => 'Code',
+ Effect => 'Effect',
+ Secrets => 'Geheimen',
+ Screenshots => 'Schermafdrukken',
+ Screenshot1 => 'Eerste schermafdruk',
+ Screenshot2 => 'Tweede schermafdruk',
+ Comments => 'Opmerkingen',
+ Url => 'Webpagina',
+ Unlockables => 'ontgrendelbare',
+ Unlockable => 'ontgrendelbaar',
+ Howto => 'Hoe te ontgrendelen',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Algemeen',
+ Details => 'Details',
+ Tips => 'Tips',
+ Information => 'Informatie',
+
+ FilterRatingSelect => 'Minimum waardering...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/NL/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..f12b436
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::NL::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCminicars.pm b/lib/gcstar/GCLang/NL/GCModels/GCminicars.pm
new file mode 100644
index 0000000..57b2bd3
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::NL::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCmusics.pm b/lib/gcstar/GCLang/NL/GCModels/GCmusics.pm
new file mode 100644
index 0000000..f1eff76
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCmusics.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::NL::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Muziekcollectie',
+ Items => {0 => 'Album',
+ 1 => 'Album',
+ X => 'Albums'},
+ NewItem => 'Nieuw album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Titel',
+ Cover => 'Hoes',
+ Artist => 'Artiest',
+ Format => 'Formaat',
+ Running => 'Speelduur',
+ Release => 'Datum uitgave',
+ Genre => 'Genre',
+ Origin => 'Oorsprong',
+
+#voor tracks lijst
+ Tracks => 'Trackslijst',
+ Number => 'Nummer',
+ Track => 'Titel',
+ Time => 'Duur',
+
+ Composer => 'Componist',
+ Producer => 'Producent',
+ Playlist => 'Afspeellijst',
+ Comments => 'Opmerkingen',
+ Label => 'Label',
+ Url => 'Webpagina',
+
+ General => 'Algemeen',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/NL/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..433ccaa
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::NL::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/NL/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..179b1b4
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::NL::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/NL/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..330b3fc
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::NL::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCstamps.pm b/lib/gcstar/GCLang/NL/GCModels/GCstamps.pm
new file mode 100644
index 0000000..1f70d68
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::NL::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCwines.pm b/lib/gcstar/GCLang/NL/GCModels/GCwines.pm
new file mode 100644
index 0000000..035a6fb
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCwines.pm
@@ -0,0 +1,65 @@
+{
+ package GCLang::NL::GCModels::GCwines;
+
+ use utf8;
+
+# Auteursrecht 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collectie wijn',
+ Items => {0 => 'Wijn',
+ 1 => 'Wijn',
+ X => 'Wijn'},
+ NewItem => 'Nieuwe wijn',
+
+ Name => 'Naam',
+ Designation => 'Benoeming',
+ Vintage => 'Wijnoogst',
+ Vineyard => 'Wijngaard',
+ Type => 'Type',
+ Grapes => 'Druiven',
+ Soil => 'Bodem',
+ Producer => 'Producent',
+ Country => 'Land',
+ Volume => 'Inhoud (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medaille',
+
+ Storage => 'Opslag',
+ Location => 'Locatie',
+ ShelfIndex => 'Index',
+ Quantity => 'Hoeveelheid',
+ Acquisition => 'Verwerving',
+ PurchaseDate => 'Aankoopdatum',
+ PurchasePrice => 'Aankoopprijs',
+ Gift => 'Geschenk',
+ BottleLabel => 'Label van de fles',
+ Website => 'Referentie op het web',
+
+ Tasted => 'Geproefd',
+ Comments => 'Opmerkingen',
+ Serving => 'Serveren',
+ TastingField => 'Nota\'s van het proeven',
+
+ General => 'Algemeen',
+ Details => 'Details',
+ Tasting => 'Proeven',
+
+ TastedNo => 'Niet geproefd',
+ TastedYes => 'Geproefd',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Nog niet geproefd',
+ FilterTastedYes => 'Al geproefd',
+ FilterRatingSelect => 'Minimum waardering...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCstar.pm b/lib/gcstar/GCLang/NL/GCstar.pm
new file mode 100644
index 0000000..7a88d8e
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCstar.pm
@@ -0,0 +1,671 @@
+{
+ package GCLang::NL;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Nederlands',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Waarschuwing</b>:
+
+Informatie gedownload van websites (via de zoekplugins) is <b>enkel voor persoonlijk gebruik</b>.
+
+Elke herverdeling is verboden zonder <b>uitdrukkelijke toestemming</b> van de website.
+
+Om te bepalen welke site eigenaar van de informatie is,
+
+kunt u gebruik maken van de <b>onderstaande knop item details</b>.',
+
+ 'AllItemsFiltered' => 'Geen item komt overeen met je filtercriteria', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Installeren in ',
+ 'InstallMandatory' => 'Verplichte onderdelen',
+ 'InstallOptional' => 'Optionele onderdelen',
+ 'InstallErrorMissing' => 'Fout: de volgende onderdelen van Perl moeten geïnstalleerd worden: ',
+ 'InstallPrompt' => 'Basismap voor installatie [/usr/local]: ',
+ 'InstallEnd' => 'Einde van de installatie',
+ 'InstallNoError' => 'Geen fouten',
+ 'InstallLaunch' => 'Om gebruik te maken van deze toepassing, kun je starten ',
+ 'InstallDirectory' => 'Basismap',
+ 'InstallTitle' => 'GCstar installatie',
+ 'InstallDependencies' => 'Afhankelijkheden',
+ 'InstallPath' => 'Doel',
+ 'InstallOptions' => 'Opties',
+ 'InstallSelectDirectory' => 'Kies basismap voor de installatie',
+ 'InstallWithClean' => 'Verwijder bestanden die in de installatiemap gevonden zijn',
+ 'InstallWithMenu' => 'Voeg GCstar toe aan het menu Toepassingen',
+ 'InstallNoPermission' => 'Fout: geen schrijfrechten in de gekozen map',
+ 'InstallMissingMandatory' => 'Verplichte onderdelen ontbreken. Zolang deze niet geïnstalleerd zijn, kun je GCstar niet installeren.',
+ 'InstallMissingOptional' => 'Enkele optionele afhankelijkheden ontbreken. Deze zijn opgesomd in de lijst hieronder. GCstar zal geïnstalleerd worden, maar enkele mogelijkheden zullen niet werken.',
+ 'InstallMissingNone' => 'Alle afhankelijkheden zijn in orde. Je kunt doorgaan met de installatie.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Ontbreekt',
+ 'InstallMissingFor' => 'Ontbreekt voor',
+ 'InstallCleanDirectory' => 'Verwijderen van GCstar\'s bestanden in de map: ',
+ 'InstallCopyDirectory' => 'Bestanden kopiëren naar map: ',
+ 'InstallCopyDesktop' => 'Kopieer desktopbestand in: ',
+
+#Update
+ 'UpdateUseProxy' => 'Gebruik een proxy (druk op enter om zonder proxy door te gaan): ',
+ 'UpdateNoPermission' => 'Geen schrijfrechten in deze map: ',
+ 'UpdateNone' => 'Geen update gevonden',
+ 'UpdateFileNotFound' => 'Bestand niet gevonden',
+
+#Splash
+ 'SplashInit' => 'Initialisatie',
+ 'SplashLoad' => 'Collectie wordt geladen',
+ 'SplashDisplay' => 'Collectie weergeven',
+ 'SplashSort' => 'Collectie sorteren',
+ 'SplashDone' => 'Klaar',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Waarschijnlijk gebruikte je GCfilms eerder. Wat wil je importeren van GCfilms naar GCstar? (Dit heeft geen invloed op GCfilms als je die nog wilt gebruiken.)',
+ 'GCfilmsImportOptions' => 'Instellingen',
+ 'GCfilmsImportData' => 'Filmlijst',
+
+#Menus
+ 'MenuFile' => '_Bestand',
+ 'MenuNewList' => '_Nieuwe collectie',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_Recente collecties',
+ 'MenuLend' => 'Toon _Uitgeleende items', # Accepts model codes
+ 'MenuImport' => '_Importeer',
+ 'MenuExport' => '_Exporteer',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Bewerken',
+ 'MenuDuplicate' => 'Du_pliceer item', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_pliceer items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Verwijder item', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove items', # Accepts model codes
+ 'MenuEditFields' => 'Ve_rander collectievelden',
+ 'MenuEditLockItems' => '_Blokkeer collectie',
+
+ 'MenuDisplay' => 'F_ilter',
+ 'MenuSavedSearches' => 'Bewaarde zoekopdrachten',
+ 'MenuSavedSearchesSave' => 'Bewaar huidige zoekopdracht',
+ 'MenuSavedSearchesEdit' => 'Modificeer opgeslagen zoekopdrachten',
+ 'MenuAdvancedSearch' => 'Geavanceer_de zoekopdracht',
+ 'MenuViewAllItems' => 'Toon _Alle items', # Accepts model codes
+ 'MenuNoFilter' => '_Om het even welk',
+
+ 'MenuConfiguration' => 'In_stellingen',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => 'Getoon_de informatie',
+ 'MenuBorrowers' => '_Leners',
+ 'MenuToolbarConfiguration' => '_Werkbalk aanpassen',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Genre om_zetting',
+
+ 'MenuBookmarks' => 'Mijn _Collecties',
+ 'MenuBookmarksAdd' => '_Huidige collectie toevoegen',
+ 'MenuBookmarksEdit' => '_Bewerk opgeslagen collecties',
+
+ 'MenuHelp' => '_Help',
+ 'MenuHelpContent' => '_Inhoud',
+ 'MenuAllPlugins' => 'Bekijk _Plug-ins',
+ 'MenuBugReport' => 'Rappor_teer een probleem',
+ 'MenuAbout' => '_Over GCstar',
+
+ 'MenuNewWindow' => 'Toon item in _Nieuw Venster', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Toon items in _Nieuw Venster', # Accepts model codes
+
+ 'ContextExpandAll' => 'Alles _uitvouwen',
+ 'ContextCollapseAll' => 'Alles _samenvouwen',
+ 'ContextChooseImage' => '_Kies afbeelding',
+ 'ContextOpenWith' => 'Openen _met',
+ 'ContextImageEditor' => 'Afbeeldingsbewerker',
+ 'ContextImgFront' => 'Voorkant',
+ 'ContextImgBack' => 'Achterkant',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Voer een waarde in',
+
+ 'RemoveConfirm' => 'Ben je zeker dat je dit item wilt verwijderen?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'Nieuw item', # Accepts model codes
+ 'NewItemTooltip' => 'Voeg een nieuw item toe', # Accepts model codes
+ 'NoItemFound' => 'Niets gevonden. Wil je in een andere website zoeken?',
+ 'OpenList' => 'Kies collectie',
+ 'SaveList' => 'Kies waar je de collectie wilt opslaan',
+ 'SaveListTooltip' => 'Bewaar huidige collectie',
+ 'SaveUnsavedChanges' => 'Er zijn niet opgeslagen wijzigingen in je collectie. Wil je die opslaan?',
+ 'SaveDontSave' => 'Niet opslaan',
+ 'PreferencesTooltip' => 'Instellingen',
+ 'ViewTooltip' => 'Verander collectiebeeld',
+ 'PlayTooltip' => 'Open bestand geassocieerd met dit item', # Accepts model codes
+ 'PlayFileNotFound' => 'Bestand niet gevonden op deze plaats:',
+ 'PlayRetry' => 'Opnieuw',
+
+ 'StatusSave' => 'Opslaan...',
+ 'StatusLoad' => 'Laden...',
+ 'StatusSearch' => 'Bezig met zoeken...',
+ 'StatusGetInfo' => 'Informatie ophalen...',
+ 'StatusGetImage' => 'Afbeelding ophalen...',
+
+ 'SaveError' => 'Kan de itemlijst niet opslaan. Controleer schijfruimte en schrijfrechten.',
+ 'OpenError' => 'Kan de itemlijst niet openen. Controleer leesrechten.',
+ 'OpenFormatError' => 'Kan de itemlijst niet openen. Formaat is misschien foutief.',
+ 'OpenVersionWarning' => 'Collectie was aangemaakt met een nieuwere versie van GCstar. Als je het toch opslaat kun je data verliezen.',
+ 'OpenVersionQuestion' => 'Wil je toch doorgaan?',
+ 'ImageError' => 'Gekozen map om afbeeldingen in op te slaan is niet juist. Kies een andere map.',
+ 'OptionsCreationError'=> 'Kan geen optiebestand maken: ',
+ 'OptionsOpenError'=> 'Kan optiebestand niet openen: ',
+ 'OptionsSaveError'=> 'Kan optiebestand niet opslaan: ',
+ 'ErrorModelNotFound' => 'Model niet gevonden: ',
+ 'ErrorModelUserDir' => 'Door gebruiker gedefinieerde modellen staan in: ',
+
+ 'RandomTooltip' => 'Wat te bekijken deze avond?',
+ 'RandomError'=> 'Je hebt geen selecteerbare items', # Accepts model codes
+ 'RandomEnd'=> 'Er zijn geen items meer', # Accepts model codes
+ 'RandomNextTip'=> 'Volgende suggestie',
+ 'RandomOkTip'=> 'Accepteer dit item',
+
+ 'AboutTitle' => 'Over GCstar',
+ 'AboutDesc' => 'Persoonlijke collectiebeheerder',
+ 'AboutVersion' => 'Versie',
+ 'AboutTeam' => 'Team',
+ 'AboutWho' => 'Christian Jodar (Tian): projectbeheerder, programmeur
+Nyall Dawson (Zombiepig): programmeur
+TPF: programmeur
+Adolfo González: programmeur
+',
+ 'AboutLicense' => 'verspreid onder GNU GPL termen
+Logo Copyright le Spektre',
+ 'AboutTranslation' => 'Engelse vertaling door Kim',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logo en webdesign door le Spektre',
+
+ 'UnsavedCollection' => 'Niet opgeslagen collectie',
+ 'ModelsSelect' => 'Kies een collectietype',
+ 'ModelsPersonal' => 'Persoonlijke modellen',
+ 'ModelsDefault' => 'Standaardmodellen',
+ 'ModelsList' => 'Collectiedefinitie',
+ 'ModelSettings' => 'Collectieinstellingen',
+ 'ModelNewType' => 'Nieuw collectietype',
+ 'ModelName' => 'Naam van het collectietype:',
+ 'ModelFields' => 'Velden',
+ 'ModelOptions' => 'Opties',
+ 'ModelFilters' => 'Filters',
+ 'ModelNewField' => 'Nieuw veld',
+ 'ModelFieldInformation' => 'Informatie',
+ 'ModelFieldName' => 'Label:',
+ 'ModelFieldType' => 'Type:',
+ 'ModelFieldGroup' => 'Groep:',
+ 'ModelFieldValues' => 'Waarden',
+ 'ModelFieldInit' => 'Standaard:',
+ 'ModelFieldMin' => 'Minimum:',
+ 'ModelFieldMax' => 'Maximum:',
+ 'ModelFieldList' => 'Waardenlijst:',
+ 'ModelFieldListLegend' => '<i>door komma\'s gescheiden</i>',
+ 'ModelFieldDisplayAs' => 'Geef weer als:',
+ 'ModelFieldDisplayAsText' => 'Tekst',
+ 'ModelFieldDisplayAsGraphical' => 'Waarderingsbeheer',
+ 'ModelFieldTypeShortText' => 'Korte tekst',
+ 'ModelFieldTypeLongText' => 'Lange tekst',
+ 'ModelFieldTypeYesNo' => 'Ja/Nee',
+ 'ModelFieldTypeNumber' => 'Nummer',
+ 'ModelFieldTypeDate' => 'Datum',
+ 'ModelFieldTypeOptions' => 'Vooraf gedefinieerde waardenlijst',
+ 'ModelFieldTypeImage' => 'Afbeelding',
+ 'ModelFieldTypeSingleList' => 'Eenvoudige lijst',
+ 'ModelFieldTypeFile' => 'Bestand',
+ 'ModelFieldTypeFormatted' => 'Afhankelijk van andere velden',
+ 'ModelFieldParameters' => 'Parameters',
+ 'ModelFieldHasHistory' => 'Gebruik een geschiedenis',
+ 'ModelFieldFlat' => 'Toon op een lijn',
+ 'ModelFieldStep' => 'Incrementele stap:',
+ 'ModelFieldFileFormat' => 'Bestandsformaat:',
+ 'ModelFieldFileFile' => 'Eenvoudig bestand',
+ 'ModelFieldFileImage' => 'Afbeelding',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Geluid',
+ 'ModelFieldFileProgram' => 'Programma',
+ 'ModelFieldFileUrl' => 'Link',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Velden om te gebruiken',
+ 'ModelOptionsFieldsAuto' => 'Automatisch',
+ 'ModelOptionsFieldsNone' => 'Geen',
+ 'ModelOptionsFieldsTitle' => 'Zoals titel',
+ 'ModelOptionsFieldsId' => 'Zoals ID',
+ 'ModelOptionsFieldsCover' => 'Zoals cover',
+ 'ModelOptionsFieldsPlay' => 'Voor Playknop',
+ 'ModelCollectionSettings' => 'Collectie instellingen',
+ 'ModelCollectionSettingsLending' => 'Items kunnen geleend worden',
+ 'ModelCollectionSettingsTagging' => 'Items kunnen getagd worden',
+ 'ModelFilterActivated' => 'Zou in het zoekvak moeten zijn',
+ 'ModelFilterComparison' => 'Vergelijking',
+ 'ModelFilterContain' => 'Bevat',
+ 'ModelFilterDoesNotContain' => 'Bevat niet',
+ 'ModelFilterRegexp' => 'Reguliere expressie',
+ 'ModelFilterRange' => 'Bereik',
+ 'ModelFilterNumeric' => 'Vergelijking is numeriek',
+ 'ModelFilterQuick' => 'Maak een snelle filter',
+ 'ModelTooltipName' => 'Gebruik een naam om dit model voor vele collecties te herbruiken. Indien leeg, zullen de instellingen in het model zelf opgeslagen worden',
+ 'ModelTooltipLabel' => 'De veldnaam zoals het weergegeven zal worden',
+ 'ModelTooltipGroup' => 'Gebruikt om velden te groeperen. Items zonder waarde zitten in een standaardgroep',
+ 'ModelTooltipHistory' => 'Moeten de vorige ingevoerde waarden worden opgeslagen in een lijst geassocieerd aan het veld',
+ 'ModelTooltipFormat' => 'Dit formaat dient om de aktie van de playknop te bepalen',
+ 'ModelTooltipLending' => 'Dit voegt velden toe om uitleningen te beheren',
+ 'ModelTooltipTagging' => 'Dit voegt velden toe om tags te beheren',
+ 'ModelTooltipNumeric' => 'Moeten de waarden worden beschouwd als nummers om te vergelijken',
+ 'ModelTooltipQuick' => 'Dit voegt een submenu toe bij de filters',
+
+ 'ResultsTitle' => 'Kies een item', # Accepts model codes
+ 'ResultsNextTip' => 'Zoek in de volgende website',
+ 'ResultsPreview' => 'Voorvertoning',
+ 'ResultsInfo' => 'Je kan meerdere items toevoegen aan de collectie met Ctrl of Shift', # Accepts model codes
+
+ 'OptionsTitle' => 'Voorkeuren',
+ 'OptionsExpertMode' => 'Geavanceerde opties',
+ 'OptionsPrograms' => 'Kies de te gebruiken programma\'s voor verschillende media, laat leeg voor systeemstandaarden',
+ 'OptionsBrowser' => 'Webbrowser',
+ 'OptionsPlayer' => 'Videospeler',
+ 'OptionsAudio' => 'Geluidspeler',
+ 'OptionsImageEditor' => 'Afbeeldingsbewerker',
+ 'OptionsCdDevice' => 'CD-apparaat',
+ 'OptionsImages' => 'Afbeeldingenmap',
+ 'OptionsUseRelativePaths' => 'Gebruik relatieve paden voor afbeeldingen',
+ 'OptionsLayout' => 'Layout',
+ 'OptionsStatus' => 'Toon statusbalk',
+ 'OptionsUseStars' => 'Gebruik sterren om beoordelingen te tonen',
+ 'OptionsWarning' => 'Waarschuwing: Veranderingen op dit tabblad hebben geen effect tot je GCstar herstart.',
+ 'OptionsRemoveConfirm' => 'Vraag bevestiging voordat een item verwijderd wordt',
+ 'OptionsAutoSave' => 'Automatisch collectie opslaan',
+ 'OptionsAutoLoad' => 'Laad vorige collectie bij programmastart',
+ 'OptionsSplash' => 'Toon splash beeld',
+ 'OptionsTearoffMenus' => 'Sta afneembare menu\'s toe',
+ 'OptionsSpellCheck' => 'Gebruik spellingscontrole in lange tekstvelden',
+ 'OptionsProgramTitle' => 'Kies het programma om te gebruiken',
+ 'OptionsPlugins' => 'Website om data van op te halen',
+ 'OptionsAskPlugins' => 'Vraag (vele websites)',
+ 'OptionsPluginsMulti' => 'Vele websites',
+ 'OptionsPluginsMultiAsk' => 'Vraag (vele websites)',
+ 'OptionsPluginsMultiPerField' => 'Vele websites (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Stel lijst in',
+ 'OptionsAskImport' => 'Kies velden om te importeren',
+ 'OptionsProxy' => 'Gebruik een proxy',
+ 'OptionsCookieJar' => 'Gebruik dit cookie jar bestand',
+ 'OptionsLang' => 'Taal',
+ 'OptionsMain' => 'Hoofd',
+ 'OptionsPaths' => 'Paden',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Extra\'s',
+ 'OptionsDisplay' => 'Beeld',
+ 'OptionsToolbar' => 'Werkbalk',
+ 'OptionsToolbars' => {0 => 'Geen', 1 => 'Klein', 2 => 'Groot', 3 => 'Systeem instelling'},
+ 'OptionsToolbarPosition' => 'Positie',
+ 'OptionsToolbarPositions' => {0 => 'Bovenaan', 1 => 'Onderaan', 2 => 'Links', 3 => 'Rechts'},
+ 'OptionsExpandersMode' => 'Expanders te lang',
+ 'OptionsExpandersModes' => {'asis' => 'Doe niets', 'cut' => 'knip', 'wrap' => 'Regelafbraak'},
+ 'OptionsDateFormat' => 'Datum formaat',
+ 'OptionsDateFormatTooltip' => 'Formaat is gebruikt door strftime(3). Standaard is %d/%m/%Y',
+ 'OptionsView' => 'Items lijst',
+ 'OptionsViews' => {0 => 'Tekst', 1 => 'Afbeelding', 2 => 'Gedetailleerd'},
+ 'OptionsColumns' => 'Kolommen',
+ 'OptionsMailer' => 'E-mailer',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'Jouw e-mail',
+ 'OptionsTransform' => 'Plaats lidwoorden op het einde van de titels',
+ 'OptionsArticles' => 'Lidwoorden (door komma\'s gescheiden)',
+ 'OptionsSearchStop' => 'Zoeken mag onderbroken worden',
+ 'OptionsBigPics' => 'Gebruik grote afbeeldingen indien beschikbaar',
+ 'OptionsAlwaysOriginal' => 'Gebruik hoofdtitel als de originele titel niet beschikbaar is',
+ 'OptionsRestoreAccelerators' => 'Herstel sneltoetsen toetsenbord ',
+ 'OptionsHistory' => 'Grootte van de geschiedenis',
+ 'OptionsClearHistory' => 'Verwijder geschiedenis',
+ 'OptionsStyle' => 'Uiterlijk',
+ 'OptionsDontAsk' => 'Niet opnieuw vragen',
+ 'OptionsPathProgramsGroup' => 'Toepassingen',
+ 'OptionsProgramsSystem' => 'Gebruik standaard systeemtoepassingen',
+ 'OptionsProgramsUser' => 'Gebruik programma\'s van je eigen keuze',
+ 'OptionsProgramsSet' => 'Kies programma\'s',
+ 'OptionsPathImagesGroup' => 'Afbeeldingen',
+ 'OptionsInternetDataGroup' => 'Data importeren',
+ 'OptionsInternetSettingsGroup' => 'Instellingen',
+ 'OptionsDisplayInformationGroup' => 'Informatievenster',
+ 'OptionsDisplayArticlesGroup' => 'Lidwoorden',
+ 'OptionsImagesDisplayGroup' => 'Beeld',
+ 'OptionsImagesStyleGroup' => 'Stijl',
+ 'OptionsDetailedPreferencesGroup' => 'Voorkeuren',
+ 'OptionsFeaturesConveniencesGroup' => 'Gemak',
+ 'OptionsPicturesFormat' => 'Voorvoegsel bij afbeeldingen:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Titel of naam van het item',
+ 'OptionsPicturesWorkingDir' => '%werkmap% of . zal vervangen worden door collectiemap',
+ 'OptionsPicturesFileBase' => '%bestand_basis% zal vervangen worden door de collectiebestandsnaam zonder extensie (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%werkmap% kan alleen gebruikt worden aan het begin van het pad voor afbeeldingen',
+ 'OptionsConfigureMailers' => 'Stel e-mailprogramma\'s in',
+
+ 'ImagesOptionsButton' => 'Instellingen',
+ 'ImagesOptionsTitle' => 'Instellingen voor de afbeeldingenlijst',
+ 'ImagesOptionsSelectColor' => 'Kies een kleur',
+ 'ImagesOptionsUseOverlays' => 'Gebruik afbeelding overlay',
+ 'ImagesOptionsBg' => 'Achtergrond',
+ 'ImagesOptionsBgPicture' => 'Gebruik een achtergrondafbeelding',
+ 'ImagesOptionsFg'=> 'Selectie',
+ 'ImagesOptionsBgTooltip' => 'Verander achtergrondkleur',
+ 'ImagesOptionsFgTooltip'=> 'Verander selectiekleur',
+ 'ImagesOptionsResizeImgList' => 'Aantal kolommen automatisch veranderen',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Grootte',
+ 'ImagesOptionsSizeList' => {0 => 'Zeer klein', 1 => 'Klein', 2 => 'Gemiddeld', 3 => 'Groot', 4 => 'Zeer groot'},
+ 'ImagesOptionsSizeTooltip' => 'Kies afbeeldingsgrootte',
+
+ 'DetailedOptionsTitle' => 'Instellingen voor de gedetailleerde lijst',
+ 'DetailedOptionsImageSize' => 'afbeeldingsgrootte',
+ 'DetailedOptionsGroupItems' => 'Sorteer items op',
+ 'DetailedOptionsSecondarySort' => 'Sorteer onderliggende velden',
+ 'DetailedOptionsFields' => 'Kies de te tonen velden',
+ 'DetailedOptionsGroupedFirst' => 'Hou verweesde items samen',
+ 'DetailedOptionsAddCount' => 'Voeg aantal elementen aan categorieën toe',
+
+ 'ExtractButton' => 'Informatie',
+ 'ExtractTitle' => 'Bestandsinformatie',
+ 'ExtractImport' => 'Gebruik waarden',
+
+ 'FieldsListOpen' => 'Laad een veldlijst van een bestand',
+ 'FieldsListSave' => 'Bewaar veldlijst in een bestand',
+ 'FieldsListError' => 'Deze veldlijst kan niet gebruikt worden bij dit soort collectie',
+ 'FieldsListIgnore' => '--- Negeer',
+
+ 'ExportTitle' => 'Exporteer itemlijst',
+ 'ExportFilter' => 'Exporteer enkel getoonde items',
+ 'ExportFieldsTitle' => 'Velden om te exporteren',
+ 'ExportFieldsTip' => 'Kies velden om te exporteren',
+ 'ExportWithPictures' => 'Kopieer afbeeldingen in een onderliggende map',
+ 'ExportSortBy' => 'Sorteer op',
+ 'ExportOrder' => 'Volgorde',
+
+ 'ImportListTitle' => 'Importeer een andere itemlijst',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'Bestand',
+ 'ImportExportFieldsUnused' => 'Ongebruikte velden',
+ 'ImportExportFieldsUsed' => 'Gebruikte velden',
+ 'ImportExportFieldsFill' => 'Alles toevoegen',
+ 'ImportExportFieldsClear' => 'Alles verwijderen',
+ 'ImportExportFieldsEmpty' => 'Je moet minstens één veld kiezen',
+ 'ImportExportFileEmpty' => 'Je moet een bestandsnaam specifiëren',
+ 'ImportFieldsTitle' => 'Velden om te importeren',
+ 'ImportFieldsTip' => 'Kies velden om te importeren',
+ 'ImportNewList' => 'Maak een nieuwe collectie',
+ 'ImportCurrentList' => 'Voeg aan huidige collectie toe',
+ 'ImportDropError' => 'Er was een fout tijdens het openen van minstens één bestand. De vorige lijst wordt herladen.',
+ 'ImportGenerateId' => 'Genereer identificatie voor ieder item',
+
+ 'FileChooserOpenFile' => 'Kies een bestand om te gebruiken',
+ 'FileChooserDirectory' => 'Map',
+ 'FileChooserOpenDirectory' => 'Kies een map',
+ 'FileChooserOverwrite' => 'Dit bestand bestaat al. Wil je het overschrijven?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ #Some default panels
+ 'PanelCompact' => 'Compact',
+ 'PanelReadOnly' => 'Enkel lezen',
+ 'PanelForm' => 'Tabbladen',
+
+ 'PanelSearchButton' => 'Haal informatie op',
+ 'PanelSearchTip' => 'Zoek informatie op het internet',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Klik op de afbeelding om een andere te kiezen.',
+ 'PanelImageTipView' => 'Klik op de afbeelding om op ware grootte weer te geven.',
+ 'PanelImageTipMenu' => ' Rechts klikken voor meer opties.',
+ 'PanelImageTitle' => 'Kies een afbeelding',
+ 'PanelImageNoImage' => 'Geen afbeelding',
+ 'PanelSelectFileTitle' => 'Kies een bestand',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Herstel standaard',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'Van',
+ 'PanelTo' =>'Naar',
+
+ 'PanelWeb' => 'Bekijk informatie',
+ 'PanelWebTip' => 'Bekijk informatie op het internet voor dit item', # Accepts model codes
+ 'PanelRemoveTip' => 'Verwijder huidig item', # Accepts model codes
+
+ 'PanelDateSelect' => 'Kies',
+ 'PanelNobody' => 'Niemand',
+ 'PanelUnknown' => 'Onbekend',
+ 'PanelAdded' => 'Toegevoegd op',
+ 'PanelRating' => 'Waardering',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Locatie',
+
+ 'PanelLending' => 'Uitgeleend',
+ 'PanelBorrower' => 'Lener',
+ 'PanelLendDate' => 'Uitgeleend sinds',
+ 'PanelHistory' => 'Uitleengeschiedenis',
+ 'PanelReturned' => 'Item teruggebracht', # Accepts model codes
+ 'PanelReturnDate' => 'Datum teruggave',
+ 'PanelLendedYes' => 'Ooit uitgeleend',
+ 'PanelLendedNo' => 'Beschikbaar',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favorieten',
+ 'TagsAssigned' => 'Toegewezen tags',
+
+ 'PanelUser' => 'Gebruikersvelden',
+
+ 'CheckUndef' => 'Of',
+ 'CheckYes' => 'Ja',
+ 'CheckNo' => 'Nee',
+
+ 'ToolbarRandom' => 'Vannacht',
+ 'ToolbarAll' => 'Toon alles',
+ 'ToolbarAllTooltip' => 'Toon alle items',
+ 'ToolbarGroupBy' => 'Groepeer op',
+ 'ToolbarGroupByTooltip' => 'Kies het veld waarmee items gegroepeerd moeten worden',
+ 'ToolbarQuickSearch' => 'Snel zoeken',
+ 'ToolbarQuickSearchLabel' => 'Zoeken',
+ 'ToolbarQuickSearchTooltip' => 'Kies het veld om in te zoeken. Voer zoektermen in en druk op enter',
+ 'ToolbarSeparator' => ' Scheidingsteken',
+
+ 'PluginsTitle' => 'Zoek een item',
+ 'PluginsQuery' => 'Vraag',
+ 'PluginsFrame' => 'Zoek website',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Naam',
+ 'PluginsSearchFields' => 'Zoek velden',
+ 'PluginsAuthor' => 'Auteur',
+ 'PluginsLang' => 'Taal',
+ 'PluginsUseSite' => 'Gebruik geselecteerde website voor verdere zoekacties',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Lenersconfiguratie',
+ 'BorrowersList' => 'Leners',
+ 'BorrowersName' => 'Naam',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Voeg toe',
+ 'BorrowersRemove' => 'Verwijder',
+ 'BorrowersEdit' => 'Bewerk',
+ 'BorrowersTemplate' => 'Mail sjabloon',
+ 'BorrowersSubject' => 'Mail onderwerp',
+ 'BorrowersNotice1' => '%1 zal vervangen worden door de naam van de lener',
+ 'BorrowersNotice2' => '%2 zal vervangen worden door de titel van het item',
+ 'BorrowersNotice3' => '%3 zal vervangen worden door de uitleendatum',
+
+ 'BorrowersImportTitle' => 'Importeer lenersinformatie',
+ 'BorrowersImportType' => 'Bestandsformaat:',
+ 'BorrowersImportFile' => 'Bestand:',
+
+ 'BorrowedTitle' => 'Uitgeleende items', # Accepts model codes
+ 'BorrowedDate' => 'Sinds',
+ 'BorrowedDisplayInPanel' => 'Toon item in hoofdvenster', # Accepts model codes
+
+ 'MailTitle' => 'Stuur een e-mail',
+ 'MailFrom' => 'Van: ',
+ 'MailTo' => 'Naar: ',
+ 'MailSubject' => 'Onderwerp: ',
+ 'MailSmtpError' => 'Probleem bij verbinding met SMTP-server',
+ 'MailSendmailError' => 'Probleem wanneer sendmail gestart wordt',
+
+ 'SearchTooltip' => 'Zoek alle items', # Accepts model codes
+ 'SearchTitle' => 'Zoek item', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Velden om te vervangen',
+ 'QueryReplaceOld' => 'Huidige waarde',
+ 'QueryReplaceNew' => 'Nieuwe waarde',
+ 'QueryReplaceLaunch' => 'Vervang',
+
+ 'ImportWindowTitle' => 'Kies velden om te importeren',
+ 'ImportViewPicture' => 'Bekijk afbeelding',
+ 'ImportSelectAll' => 'Kies alles',
+ 'ImportSelectNone' => 'Kies niets',
+
+ 'MultiSiteTitle' => 'Websites om te gebruiken voor zoekopdrachten',
+ 'MultiSiteUnused' => 'Niet gebruikte plug-ins',
+ 'MultiSiteUsed' => 'Gebruikte plug-ins',
+ 'MultiSiteLang' => 'Vul lijst met Engelse plug-ins',
+ 'MultiSiteEmptyError' => 'Je hebt een lege websitelijst',
+ 'MultiSiteClear' => 'Wis lijst',
+
+ 'DisplayOptionsTitle' => 'Items om te tonen',
+ 'DisplayOptionsAll' => 'Kies alles',
+ 'DisplayOptionsSearch' => 'Zoek knop',
+
+ 'GenresTitle' => 'Genreconversie',
+ 'GenresCategoryName' => 'Genre om te gebruiken',
+ 'GenresCategoryMembers' => 'Genre om te vervangen',
+ 'GenresLoad' => 'Laad een lijst',
+ 'GenresExport' => 'Bewaar lijst in een bestand',
+ 'GenresModify' => 'Bewerk conversie',
+
+ 'PropertiesName' => 'Collectienaam',
+ 'PropertiesLang' => 'Taalcode',
+ 'PropertiesOwner' => 'Eigenaar',
+ 'PropertiesEmail' => 'E-mail',
+ 'PropertiesDescription' => 'Beschrijving',
+ 'PropertiesFile' => 'Bestandsinformatie',
+ 'PropertiesFilePath' => 'Volledig pad',
+ 'PropertiesItemsNumber' => 'Aantal items', # Accepts model codes
+ 'PropertiesFileSize' => 'Grootte',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Collectie eigenschappen',
+ 'PropertiesDefaultPicture' => 'Standaardafbeelding',
+
+ 'MailProgramsTitle' => 'Programma\'s om mail te versturen',
+ 'MailProgramsName' => 'Naam',
+ 'MailProgramsCommand' => 'Commandlijn',
+ 'MailProgramsRestore' => 'Herstel standaarden',
+ 'MailProgramsAdd' => 'Voeg een programma toe',
+ 'MailProgramsInstructions' => 'In command lijn, een aantal substituties worden gemaakt:
+ %f is vervangen door e-mailadres van de gebruiker.
+ %t is vervangen door adres van de ontvanger.
+ %s is vervangen door het onderwerp van het bericht.
+ %b is vervangen door de inhoud van het bericht.',
+
+ 'BookmarksBookmarks' => 'Bladwijzers',
+ 'BookmarksFolder' => 'Mappen',
+ 'BookmarksLabel' => 'Label',
+ 'BookmarksPath' => 'Doel',
+ 'BookmarksNewFolder' => 'Nieuwe map',
+
+ 'AdvancedSearchType' => 'Zoektype',
+ 'AdvancedSearchTypeAnd' => 'Items komen met alle criteria overeen', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Items komen met minstens één criterium overeen', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criteria',
+ 'AdvancedSearchAnyField' => 'Elk veld',
+ 'AdvancedSearchSaveTitle' => 'Bewaar zoekopdracht',
+ 'AdvancedSearchSaveName' => 'Naam',
+ 'AdvancedSearchSaveOverwrite' => 'Er bestaat al een opgeslagen zoekopdracht met deze naam. Gebruik een andere naam.',
+ 'AdvancedSearchUseCase' => 'Hoofdlettergevoelig',
+ 'AdvancedSearchIgnoreDiacritics' => 'Negeer accenten en andere diacritische tekens',
+
+ 'BugReportSubject' => 'Foutenrapport gegenereerd door GCstar',
+ 'BugReportVersion' => 'Versie',
+ 'BugReportPlatform' => 'Besturingssysteem',
+ 'BugReportMessage' => 'Fout bericht',
+ 'BugReportInformation' => 'Extra informatie',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/PL/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/PL/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..f431bc8
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::PL::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Dodaj nazwy pól na górze',
+ 'Separator' => 'Separator',
+ 'Replacement' => 'Zastąp separator znakiem',
+ 'Charset' => 'Kodowanie znaków',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/PL/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..4696453
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::PL::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/PL/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..28ba198
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::PL::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Niepoprawny plik szablonu',
+ 'UseFile' => 'Skorzystaj z poniższego pliku',
+ 'TemplateExternalFile' => 'Plik szablonu',
+ 'WithJS' => 'Używaj Javascript',
+ 'FileTemplate' => 'Plik tymczasowy:',
+ 'Preview' => 'Podgląd',
+ 'NoPreview' => 'Podgląd niedostępny',
+ 'Title' => 'Tytuł strony',
+ 'InfoFile' => 'Lista pozycji jest w pliku: ',
+ 'InfoDir' => 'Obrazy są w : ',
+ 'HeightImg' => 'Wysokość (w pikselach) obrazu do eksportu: ',
+ 'OpenFileInBrowser' => 'Otwórz wygenerowany plik w przeglądarce',
+ 'Note' => 'Lista wygenerowana przez program <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Wpisz szukany ciąg znaków',
+ 'SearchType1' => 'Tylko tytuł',
+ 'SearchType2' => 'Pełna informacja',
+ 'SearchButton' => 'Szukaj',
+ 'SearchTitle' => 'Wyświetlaj tylko filmy pasujące do kryterium szukania',
+ 'AllButton' => 'Wszystkie',
+ 'AllTitle' => 'Pokaż wszystkie',
+ 'Expand' => 'Rozwiń wszystkie',
+ 'ExpandTitle' => 'Wyświetl informacje o wszystkich filmach',
+ 'Collapse' => 'Ukryj wszystkie',
+ 'CollapseTitle' => 'Ukryj informacje o wszystkich filmach',
+ 'Borrowed' => 'Pożyczone przez: ',
+ 'NotBorrowed' => 'Dostępne',
+ 'Top' => 'Góra',
+ 'Bottom' => 'U dołu',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/PL/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..b0566e5
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::PL::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/PL/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..c7eb4c3
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::PL::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Zawiera DROP instrukcje',
+ 'WithCreate' => 'Zawiera CREATE instrukcje',
+ 'TableName' => 'Nazwa tabeli',
+ 'InfoFile' => 'Plik SQL: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/PL/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..4ee538d
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::PL::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Archiwum jest w pliku: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/PL/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..85c887d
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::PL::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Plik tymczasowy',
+ 'ModelText' => 'Tekst tymczasowy',
+ 'Models' => 'Tymczasowy do użytku',
+ 'UseFile' => 'Używaj pliku',
+ 'UseModel' => 'Używaj obszaru tekstowego',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/PL/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..9057666
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::PL::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Gdzie szukać',
+ 'Default' => 'Domyślny katalog Alexandrii',
+ 'Specified' => 'Katalog podany poniżej',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/PL/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..1c889d6
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::PL::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Kodowanie znaków',
+ 'Header' => 'Ignoruj pierwszą linie',
+ 'Separator' => 'Separator',
+ 'Plugin' => 'Strona używana',
+ 'UseFirst' => 'Wybierz pierwszy, jeżeli dużo wyników',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/PL/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..d7afa75
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::PL::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Katalog',
+ 'Recursive' => 'Przeglądaj podkatalogi',
+ 'Suffixes' => 'Sufiksy lub rozszerzenia nazw plików',
+ 'SuffixesTooltip' => 'Lista sufiksów lub rozszerzeń nzaw plików rozdzielonych przecinkami',
+ 'Remove' => 'Do usunięcia z nazw',
+ 'RemoveTooltip' => 'Lista słów rozdzielonych przecinkami, które mają być usunięte z nazw plików w trakcie pobierania',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Usuń tylko całe słowa',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Słowa będą usuwane tylko jeśli wystąpią w całości',
+ 'RemoveRegularExpr' => 'Wyrażenie regularne',
+ 'RemoveTooltipRegularExpr' => 'Pamiętaj, że \'Do usunięcia z nazw\' jest wyrażeniem regularnym Perla',
+ 'SkipFileAlreadyInCollection' => 'Dodaj tylko nowe pliki',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Dodaje tylko te pliki, których jeszcze nie ma w Zbiorze',
+ 'SkipFileNo' => 'Nie',
+ 'SkipFileFullPath' => 'na podstawie pełnej ścieżki',
+ 'SkipFileFileName' => 'na podstawie nazwy pliku',
+ 'SkipFileFileNameAndUpdate' => 'na podstawie nazwy pliku (ale zmienia ścieżkę w Zbiorze)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/PL/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..89d5767
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::PL::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Kopiuj obrazy',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCImport/GCImportList.pm b/lib/gcstar/GCLang/PL/GCImport/GCImportList.pm
new file mode 100644
index 0000000..9302174
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::PL::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Lista tytułów',
+ 'Plugin' => 'Strona używana',
+ 'UseFirst' => 'Wybierz pierwszy, jeżeli dużo wyników',
+ 'CommentAuto' => 'Import automatyczny',
+ 'CommentSite' => 'Strona: ',
+ 'CommentTitle' => 'Tytuł: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/PL/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..3f79709
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::PL::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/PL/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..1ed22b0
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::PL::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Plik nie jest plikiem kolekcji Tellico',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/PL/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..e6dd5cd
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCTVepisodes.pm
@@ -0,0 +1,51 @@
+{
+ package GCLang::PL::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Zbiór nagrań TV (odcinki)',
+ Items => sub {
+ my $number = shift;
+ return 'Odcinek' if $number eq '1';
+ return 'Odcinki' if $number =~ /(?<!1)[2-4]$/;
+ return 'Odcinków';
+ },
+ NewItem => 'Nowy odcinek',
+ NewSeries => 'Nowy serial',
+ Episode => 'Odcinek',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/PL/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..1679abb
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCTVseries.pm
@@ -0,0 +1,55 @@
+{
+ package GCLang::PL::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Zbiór nagrań TV (seriale)',
+ Items => sub {
+ my $number = shift;
+ return 'Serial' if $number eq '1';
+ return 'Seriale' if $number =~ /(?<!1)[2-4]$/;
+ return 'Seriali';
+ },
+ NewItem => 'Nowy serial',
+ Name => 'Tytuł',
+ Season => 'Sezon',
+ Part => 'Część',
+ Episodes => 'Odcinki',
+ FirstAired => 'Premiera',
+ Time => 'Długość odcinka',
+ Producer => 'Producent',
+ Music => 'Muzyka',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/PL/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..0bf0342
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCboardgames.pm
@@ -0,0 +1,89 @@
+{
+ package GCLang::PL::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar, WG
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Kolekcja gier planszowych',
+ Items => sub {
+ my $number = shift;
+ return 'Gra' if $number eq '1';
+ return 'Gry' if $number =~ /(?<!1)[2-4]$/;
+ return 'Gier';
+ },
+ NewItem => 'Nowa gra',
+
+ Id => 'Id',
+ Name => 'Nazwa',
+ Original => 'Nazwa oryginału',
+ Box => 'Zdjęcie pudełka',
+ DesignedBy => 'Autor',
+ PublishedBy => 'Wydawca',
+ Players => 'Ilość graczy',
+ PlayingTime => 'Czas gry',
+ SuggestedAge => 'Zalecany wiek graczy',
+ Released => 'Data wydania',
+ Description => 'Opis',
+ Category => 'Kategoria',
+ Mechanics => 'Mechanika gry',
+ ExpandedBy => 'Dodatki',
+ ExpansionFor => 'Dodatek do',
+ GameFamily => 'Rodzina gier',
+ IllustratedBy => 'Opracowanie graficzne',
+ Url => 'Strona internetowa',
+ TimesPlayed => 'Czas spędzony na grze',
+ CompleteContents => 'Kompletna',
+ Copies => 'Ilość egzemplarzy',
+ Condition => 'Stan',
+ Photos => 'Zdjęcia',
+ Photo1 => 'Zdjęcie pierwsze',
+ Photo2 => 'Zdjęcie drugie',
+ Photo3 => 'Zdjęcie trzecie',
+ Photo4 => 'Zdjęcie czwarte',
+ Comments => 'Opinie',
+
+ Perfect => 'Doskonały',
+ Good => 'Dobry',
+ Average => 'Znośny',
+ Poor => 'Zły',
+
+ CompleteYes => 'Zawartość kompletna',
+ CompleteNo => 'Brakuje elementów',
+
+ General => 'Ogólne',
+ Details => 'Szczegóły',
+ Personal => 'Osobiste',
+ Information => 'Informacje',
+
+ FilterRatingSelect => 'Ocena co najmniej...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCbooks.pm b/lib/gcstar/GCLang/PL/GCModels/GCbooks.pm
new file mode 100644
index 0000000..a2a222b
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCbooks.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::PL::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Księgozbiór',
+ Items => sub {
+ my $number = shift;
+ return 'Książka' if $number eq '1';
+ return 'Książki' if $number =~ /(?<!1)[2-4]$/;
+ return 'Książek';
+ },
+ NewItem => 'Nowa książka',
+
+ Isbn => 'ISBN',
+ Title => 'Tytuł',
+ Cover => 'Okładka',
+ Authors => 'Autor',
+ Publisher => 'Wydawca',
+ Publication => 'Data wydania',
+ Language => 'Język',
+ Genre => 'Gatunek',
+ Serie => 'Seria',
+ Rank => 'Ranga',
+ Bookdescription => 'Opis',
+ Pages => 'Stron',
+ Read => 'Przeczytana',
+ Acquisition => 'Data pozyskania',
+ Edition => 'Wydanie',
+ Format => 'Oprawa',
+ Comments => 'Komentarze',
+ Url => 'Strona internetowa',
+ Translator => 'Tłumaczenie',
+ Artist => 'Ilustrator',
+ DigitalFile => 'Digital version',
+
+ General => 'Ogólne',
+ Details => 'Szczegóły',
+
+ ReadNo => 'Nieczytana',
+ ReadYes => 'Czytana',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCcoins.pm b/lib/gcstar/GCLang/PL/GCModels/GCcoins.pm
new file mode 100644
index 0000000..8f7a14e
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCcoins.pm
@@ -0,0 +1,107 @@
+{
+ package GCLang::PL::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Kolekcja numizmatyczna',
+ Items => sub {
+ my $number = shift;
+ return 'Numizmat' if $number eq '1';
+ return 'Numizmaty' if $number =~ /(?<!1)[2-4]$/;
+ return 'Numizmatów';
+ },
+ NewItem => 'Nowy numizmat',
+
+ Name => 'Nazwa',
+ Country => 'Kraj',
+ Year => 'Rok',
+ Currency => 'Waluta',
+ Value => 'Nominał',
+ Picture => 'Zdjęcie',
+ Diameter => 'Średnica',
+ Metal => 'Metal',
+ Edge => 'Krawędź',
+ Edge1 => 'Krawędź 1',
+ Edge2 => 'Krawędź 2',
+ Edge3 => 'Krawędź 3',
+ Edge4 => 'Krawędź 4',
+ Head => 'Awers',
+ Tail => 'Rewers',
+ Comments => 'Komentarze',
+ History => 'Historia',
+ Website => 'Strona internetowa',
+ Estimate => 'Wycena',
+ References => 'Rekomendacje',
+ Type => 'Typ',
+ Coin => 'Moneta',
+ Banknote => 'Banknot',
+
+ Main => 'Główne',
+ Description => 'Opis',
+ Other => 'Inne informacje',
+ Pictures => 'Zdjęcia',
+
+ Condition => 'Stan (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCcomics.pm b/lib/gcstar/GCLang/PL/GCModels/GCcomics.pm
new file mode 100644
index 0000000..20cfb0f
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::PL::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCfilms.pm b/lib/gcstar/GCLang/PL/GCModels/GCfilms.pm
new file mode 100644
index 0000000..19b0a42
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCfilms.pm
@@ -0,0 +1,96 @@
+{
+ package GCLang::PL::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Filmoteka',
+ Items => sub {
+ my $number = shift;
+ return 'Film' if $number eq '1';
+ return 'Filmy' if $number =~ /(?<!1)[2-4]$/;
+ return 'Filmów';
+ },
+ NewItem => 'Nowy film',
+
+
+ Id => 'Id',
+ Title => 'Tytuł',
+ Date => 'Data',
+ Time => 'Czas trwania',
+ Director => 'Reżyser',
+ Country => 'Kraj',
+ MinimumAge => 'Minimalny wiek',
+ Genre => 'Gatunek',
+ Image => 'Obraz',
+ Original => 'Oryginalny tytuł',
+ Actors => 'Obsada',
+ Actor => 'Aktor',
+ Role => 'Rola',
+ Comment => 'Komentarz',
+ Synopsis => 'Opis',
+ Seen => 'Oglądany',
+ Number => 'Płyt',
+ Format => 'Media',
+ Region => 'Region',
+ Identifier => 'Identyfikator',
+ Url => 'Strona internetowa',
+ Audio => 'Dźwięk',
+ Video => 'Format obrazu',
+ Trailer => 'Plik wideo',
+ Serie => 'Kolekcja',
+ Rank => 'Ranga',
+ Subtitles => 'Napisy',
+
+ SeenYes => 'Przeglądane',
+ SeenNo => 'Nie przeglądane',
+
+ AgeUnrated => 'Bez ograniczeń wiekowych',
+ AgeAll => 'Bez ograniczeń',
+ AgeParent => 'Ochrona rodzicielska',
+
+ Main => 'Główne pozycje',
+ General => 'Główny',
+ Details => 'Szczegóły',
+
+ Information => 'Informacja',
+ Languages => 'Języki',
+ Encoding => 'Dekodowanie',
+
+ FilterAudienceAge => 'Widownia',
+ FilterSeenNo => 'Nie oglądane',
+ FilterSeenYes => 'Oglądane',
+ FilterRatingSelect => 'Notowanie Większe od...',
+
+ ExtractSize => 'Rozmiar',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCgames.pm b/lib/gcstar/GCLang/PL/GCModels/GCgames.pm
new file mode 100644
index 0000000..91e5b6d
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCgames.pm
@@ -0,0 +1,85 @@
+{
+ package GCLang::PL::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Kolekcja gier',
+ Items => sub {
+ my $number = shift;
+ return 'Gra' if $number eq '1';
+ return 'Gry' if $number =~ /(?<!1)[2-4]$/;
+ return 'Gier';
+ },
+ NewItem => 'Nowa gra',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Nazwa',
+ Platform => 'Platforma',
+ Players => 'Ilość graczy',
+ Released => 'Data wydania',
+ Editor => 'Wydawca',
+ Developer => 'Twórca',
+ Genre => 'Gatunek',
+ Box => 'Zdjęcie pudełka',
+ Case => 'Opakowanie',
+ Manual => 'Podręcznik',
+ Completion => 'Zaawansowanie (%)',
+ Executable => 'Executable',
+ Description => 'Opis',
+ Codes => 'Kody',
+ Code => 'Kod',
+ Effect => 'Efekt',
+ Secrets => 'Podpowiedzi',
+ Screenshots => 'Galeria',
+ Screenshot1 => 'Pierwsza zrzutka',
+ Screenshot2 => 'Druga zrzutka',
+ Comments => 'Opinie',
+ Url => 'Strona internetowa',
+ Unlockables => 'Da się odblokować...',
+ Unlockable => 'Do odblokowania',
+ Howto => 'Jak to zrobić',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Ogólne',
+ Details => 'Szczegóły',
+ Tips => 'Tipsy',
+ Information => 'Informacje',
+
+ FilterRatingSelect => 'Ocena co najmniej...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/PL/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..877718b
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::PL::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCminicars.pm b/lib/gcstar/GCLang/PL/GCModels/GCminicars.pm
new file mode 100644
index 0000000..ace475f
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::PL::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCmusics.pm b/lib/gcstar/GCLang/PL/GCModels/GCmusics.pm
new file mode 100644
index 0000000..5417c62
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCmusics.pm
@@ -0,0 +1,72 @@
+{
+ package GCLang::PL::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Fonoteka',
+ Items => sub {
+ my $number = shift;
+ return 'Album' if $number eq '1';
+ return 'Albumy' if $number =~ /(?<!1)[2-4]$/;
+ return 'Albumów';
+ },
+
+ NewItem => 'Nowy album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Tytuł',
+ Cover => 'Okładka',
+ Artist => 'Wykonawca',
+ Format => 'Format',
+ Running => 'Łączny czas',
+ Release => 'Data wydania',
+ Genre => 'Gatunek',
+ Origin => 'Źródło',
+
+#For tracks list
+ Tracks => 'Lista utworów',
+ Number => 'Ścieżka',
+ Track => 'Tytuł',
+ Time => 'Czas trwania',
+
+ Composer => 'Kompozytor',
+ Producer => 'Producent',
+ Playlist => 'Lista odtwarzania',
+ Comments => 'Opinie',
+ Label => 'Label',
+ Url => 'Strona internetowa',
+
+ General => 'Ogólne',
+ Details => 'Szczegóły',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/PL/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..16df556
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCperiodicals.pm
@@ -0,0 +1,55 @@
+{
+ package GCLang::PL::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Zbiór czasopism',
+ Items => sub {
+ my $number = shift;
+ return 'Czasopismo' if $number eq '1';
+ return 'Czasopisma' if $number =~ /(?<!1)[2-4]$/;
+ return 'Czasopism';
+ },
+ NewItem => 'Nowe czasopismo',
+
+ Title => 'Tytuł',
+ Cover => 'Okładka',
+ Periodical => 'Periodyczność',
+ Number => 'Numer',
+ Date => 'Data',
+ Subject => 'Temat',
+ Articles => 'Artykuły',
+
+ General => 'Ogólne',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/PL/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..bfac91e
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::PL::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/PL/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..a595af9
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCsoftware.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::PL::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Kolekcja oprogramowania',
+ Items => sub {
+ my $number = shift;
+ return 'Aplikacja' if $number eq '1';
+ return 'Aplikacje' if $number =~ /(?<!1)[2-4]$/;
+ return 'Aplikacji';
+ },
+ NewItem => 'Nowa aplikacja',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Nazwa',
+ Platform => 'Platforma',
+ Released => 'Data wydania',
+ Homepage => 'Strona domowa',
+ Editor => 'Wydawca',
+ Developer => 'Autor',
+ Category => 'Rodzaj',
+ Box => 'Zdjęcie pudełka',
+ NumberOfCopies => 'Liczba kopii',
+ Price => 'Cena',
+ Case => 'Opakowanie',
+ Manual => 'Podręcznik',
+ Executable => 'Plik wykonywalny',
+ Description => 'Opis',
+ License => 'Typ licencji',
+ Commercial => 'Komercyjna',
+ FreewareNoncommercial => 'Freeware (do użytku niekomercyjnego)',
+ OtherOpenSource => 'Inna Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Inna',
+ Registration => 'Rejestracja',
+ RegistrationInfo => 'Dane rejestracyjne',
+ RegInfo => 'Dane rejestracyjne',
+ RegistrationName => 'Nazwa użytkownika',
+ RegistrationNumber => 'Numer rejestracyjny',
+ RegistrationComments => 'Dodatkowe informacje/komentarz',
+ PanelRegistration => 'Dane rejestracyjne',
+ Screenshots => 'Galeria',
+ Screenshot1 => 'Pierwszy zrzut',
+ Screenshot2 => 'Drugi zrzut',
+ Comments => 'Opinie',
+ Url => 'Strona internetowa',
+
+ General => 'Ogólne',
+ Details => 'Szczegóły',
+ Information => 'Informacje',
+
+ FilterRatingSelect => 'Ocena co najmniej...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCstamps.pm b/lib/gcstar/GCLang/PL/GCModels/GCstamps.pm
new file mode 100644
index 0000000..4abc6f6
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::PL::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCwines.pm b/lib/gcstar/GCLang/PL/GCModels/GCwines.pm
new file mode 100644
index 0000000..90e756c
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCwines.pm
@@ -0,0 +1,87 @@
+{
+ package GCLang::PL::GCModels::GCwines;
+
+ use utf8;
+###################################################
+#
+# Copyright 2007 Yves Martin, WG
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Kolekcja win',
+ Items => sub {
+ my $number = shift;
+ return 'Wino' if $number eq '1';
+ return 'Wina' if $number =~ /(?<!1)[2-4]$/;
+ return 'Win';
+ },
+ NewItem => 'Nowe wino',
+
+ Name => 'Nazwa',
+ Designation => 'Apelacja',
+ Vintage => 'Rocznik',
+ Vineyard => 'Winnica',
+ Type => 'Typ',
+ Grapes => 'Grona',
+ Soil => 'Gleba',
+ Producer => 'Producent',
+ Country => 'Kraj',
+ Volume => 'Pojemność (ml)',
+ Alcohol => 'Alkohol (%)',
+ Medal => 'Medale/Wyróżnienia',
+
+ Storage => 'Przechowywanie',
+ Location => 'Miejsce',
+ ShelfIndex => 'Identyfikator',
+ Quantity => 'Ilość',
+ Acquisition => 'Pozyskanie',
+ PurchaseDate => 'Data zakupu',
+ PurchasePrice => 'Cena zakupu',
+ Gift => 'Prezent',
+ BottleLabel => 'Etykieta',
+ Website => 'Strona internetowa',
+
+ Tasted => 'Degustowane',
+ Comments => 'Opinie',
+ Serving => 'Podawanie',
+ TastingField => 'Opis smakowy',
+
+ General => 'Ogólne',
+ Details => 'Szczegóły',
+ Tasting => 'Degustacja',
+
+ TastedNo => 'Nie degustowane',
+ TastedYes => 'Degustowane',
+
+ FilterRange => 'Wybór',
+ FilterTastedNo => 'Jeszcze nie degustowane',
+ FilterTastedYes => 'Już degustowane',
+ FilterRatingSelect => 'Ocena co najmniej...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCstar.pm b/lib/gcstar/GCLang/PL/GCstar.pm
new file mode 100644
index 0000000..84782b8
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCstar.pm
@@ -0,0 +1,673 @@
+{
+ package GCLang::PL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Polski',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Ostrzeżenie</b>:
+
+Informacje pobrane z internetu (za pomocą wtyczki
+do wyszukiwania) są <b>tylko do użytku prywatnego</b>.
+
+Jakakolwiek dystrybucja pobranych danych bez
+autoryzacji, <b>zabroniona</b>.
+
+Aby dowiedzieć się skąd pochodzą dane pobrane
+można użyć <b>przycisku pod szczegółami</b>.',
+
+ 'AllItemsFiltered' => 'Brak pozycji pasujących do filtru', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Instalacja w ',
+ 'InstallMandatory' => 'Pakiety wymagane',
+ 'InstallOptional' => 'Pakiety opcjonalne',
+ 'InstallErrorMissing' => 'Błąd : Następujące pakiety Perl, są wymagane: ',
+ 'InstallPrompt' => 'Katalog główny dla instalacji [/usr/local]: ',
+ 'InstallEnd' => 'Koniec instalacji',
+ 'InstallNoError' => 'Brak błędu',
+ 'InstallLaunch' => 'Może być uruchomiona tylko jedna kopia',
+ 'InstallDirectory' => 'Katalog główny',
+ 'InstallTitle' => 'Instalacja GCstar',
+ 'InstallDependencies' => 'Elementy',
+ 'InstallPath' => 'Ścieżka',
+ 'InstallOptions' => 'Opcje',
+ 'InstallSelectDirectory' => 'Wybierz katalog główny dla programu',
+ 'InstallWithClean' => 'Usuń pliku w katalogu instalacyjnym',
+ 'InstallWithMenu' => 'Dodaj GCstar do Menu aplikacji',
+ 'InstallNoPermission' => 'Błąd: Nie masz uprawnień do zapisywania w wybranym katalogu',
+ 'InstallMissingMandatory' => 'Brakuje wymaganych elementów. Nie będziesz w stanie zainstalować GCstar dopóki ich nie zainstalujesz.',
+ 'InstallMissingOptional' => 'Brakuje elementów opcjonalnych. Lista znajduje sie poniżej. Niektóre funkcje GCstar mogą nie działać, lub działać niepoprawnie.',
+ 'InstallMissingNone' => 'Możesz kontynuować instalację GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Brak',
+ 'InstallMissingFor' => 'Brak',
+ 'InstallCleanDirectory' => 'Usuwanie plików GCstar z katalogu: ',
+ 'InstallCopyDirectory' => 'Kopiowanie plików w katalogu: ',
+ 'InstallCopyDesktop' => 'Kopiowanie plików pulpitu w: ',
+
+#Update
+ 'UpdateUseProxy' => 'Wybierz serwer proxy (naciśnij Enter aby pominąć): ',
+ 'UpdateNoPermission' => 'Nie masz uprawnień do zapisu w tym katalogu: ',
+ 'UpdateNone' => 'Nie znaleziono aktualizacji',
+ 'UpdateFileNotFound' => 'Nie znaleziono pliku',
+
+#Splash
+ 'SplashInit' => 'Uruchamianie',
+ 'SplashLoad' => 'Ładowanie Zbioru',
+ 'SplashDisplay' => 'Wyświetlanie Zbioru',
+ 'SplashSort' => 'Sortowanie Zbioru',
+ 'SplashDone' => 'Gotowe',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Wydaje się, że poprzednio używałeś GCfilms. Co chciałbyś wczytać z GCfilms do GCstar (nie będzie miało to znaczenia dla GCfilms jeśli nadal zechcesz go używać)?',
+ 'GCfilmsImportOptions' => 'Ustawienia',
+ 'GCfilmsImportData' => 'Lista filmów',
+
+#Menus
+ 'MenuFile' => 'Plik',
+ 'MenuNewList' => 'Nowy Zbiór',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => 'Ostatnio używany Zbiór',
+ 'MenuLend' => 'Wyświetl wypożyczone', # Accepts model codes
+ 'MenuImport' => 'Import',
+ 'MenuExport' => 'Eksport',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => 'Edycja',
+ 'MenuDuplicate' => 'Kopiuj bieżącą pozycję',, # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All {X}', # Accepts model codes
+ 'MenuEditDeleteCurrent' => 'Usuń bieżącą pozycję',, # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => 'Zmień pola Zbioru',
+ 'MenuEditLockItems' => 'Zablokuj Zbiory',
+
+ 'MenuDisplay' => 'Filtr',
+ 'MenuSavedSearches' => 'Zapisane wyszukiwania',
+ 'MenuSavedSearchesSave' => 'Zapisz bieżące wyszukiwanie',
+ 'MenuSavedSearchesEdit' => 'Edytuj zapisane wyszukiwania',
+ 'MenuAdvancedSearch' => 'Wyszukiwanie zaawansowane',
+ 'MenuViewAllItems' => 'Pokaż wszystkie pozycje', # Accepts model codes
+ 'MenuNoFilter' => 'Wszystkie',
+
+ 'MenuConfiguration' => 'Ustawienia',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => 'Wyświetlane informacje',
+ 'MenuBorrowers' => 'Dłużnicy',
+ 'MenuToolbarConfiguration' => 'Dos_tosuj pasek narzędzi',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Konwersja gatunków',
+
+ 'MenuBookmarks' => 'Ulubione',
+ 'MenuBookmarksAdd' => 'Dodaj bieżący Zbiór',
+ 'MenuBookmarksEdit' => 'Edytuj ulubione',
+
+ 'MenuHelp' => 'Pomoc',
+ 'MenuHelpContent' => 'Pomoc',
+ 'MenuAllPlugins' => 'Przegląd wtyczek',
+ 'MenuBugReport' => 'Zgłoś błąd',
+ 'MenuAbout' => 'O programie',
+
+ 'MenuNewWindow' => 'Pokaż w nowym oknie', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Rozwiń wszystkie',
+ 'ContextCollapseAll' => 'Zwiń wszystkie',
+ 'ContextChooseImage' => 'Wyb_ierz obraz',
+ 'ContextOpenWith' => 'O_twórz w',
+ 'ContextImageEditor' => 'Otwórz w edytorze graficznym',
+ 'ContextImgFront' => 'Przód',
+ 'ContextImgBack' => 'Tył',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Wprowadź wartość',
+
+ 'RemoveConfirm' => 'Czy naprawdę chcesz usunąć tą pozycję?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'Nowa pozycja', # Accepts model codes
+ 'NewItemTooltip' => 'Dodaj nową pozycję', # Accepts model codes
+ 'NoItemFound' => 'Nie znaleziono tej pozycji, czy chcesz przeszukać następną witrynę?',
+ 'OpenList' => 'Wybierz Zbiór',
+ 'SaveList' => 'Gdzie mam zapisać Zbiór?',
+ 'SaveListTooltip' => 'Zapisz Zbiór',
+ 'SaveUnsavedChanges' => 'Zmiany w Twoim Zbiorze nie zostały zapisane. Czy chcesz je zapisać?',
+ 'SaveDontSave' => 'Nie zapisuj',
+ 'PreferencesTooltip' => 'Ustaw swoje preferencje',
+ 'ViewTooltip' => 'Zmień sposób wyświetlania Zbioru',
+ 'PlayTooltip' => 'Odtwórz wideo połączone z filmem', # Accepts model codes
+ 'PlayFileNotFound' => 'W podanym miejscu nie ma pliku do odtworzenia:',
+ 'PlayRetry' => 'Ponów',
+
+ 'StatusSave' => 'Zapisuję...',
+ 'StatusLoad' => 'Wczytuję...',
+ 'StatusSearch' => 'Trwa wyszukiwanie...',
+ 'StatusGetInfo' => 'Pobieranie informacji...',
+ 'StatusGetImage' => 'Pobieranie zdjęcia...',
+
+ 'SaveError' => 'Nie mogę zapisać listy pozycji. Sprawdź uprawnienia lub wolne miejsce na dysku.',
+ 'OpenError' => 'Nie mogę odczytać listy pozycji. Sprawdź uprawnienia.',
+ 'OpenFormatError' => 'Nie mogę odczytać listy pozycji.',
+ 'OpenVersionWarning' => 'Zbiór został utworzony za pomocą nowszej wersji programu GCstar. Jeśli go zapiszesz możesz utracić część danych.',
+ 'OpenVersionQuestion' => 'Czy mimo to chcesz kontynuować?',
+ 'ImageError' => 'Wybrany katalog dla obrazów jest niewłaściwy. Wybierz inny.',
+ 'OptionsCreationError'=> 'Nie mogę stworzyć pliku konfiguracji: ',
+ 'OptionsOpenError'=> 'Nie mogę otworzyć pliku konfiguracji: ',
+ 'OptionsSaveError'=> 'Nie mogę zapisać pliku konfiguracji: ',
+ 'ErrorModelNotFound' => 'Nie znaleziono szablonu: ',
+ 'ErrorModelUserDir' => 'Szablony zdefiniowane przez użytkownika znajdują się w: ',
+
+ 'RandomTooltip' => 'Co by tu dziś ...?',
+ 'RandomError'=> 'Wszystko już było', # Accepts model codes
+ 'RandomEnd'=> 'Nie mam więcej propozycji', # Accepts model codes
+ 'RandomNextTip'=> 'Kolejna propozycja',
+ 'RandomOkTip'=> 'Wybierz',
+
+ 'AboutTitle' => 'O programie',
+ 'AboutDesc' => 'Menedżer Zbiorów Gtk2',
+ 'AboutVersion' => 'Wersja',
+ 'AboutTeam' => 'Organizacja',
+ 'AboutWho' => 'Christian Jodar (Tian): Project manager, Programmer
+Nyall Dawson (Zombiepig): Programmer
+TPF: Programmer
+Adolfo González: Programmer
+',
+ 'AboutLicense' => 'Rozpowszechniany na warunkach licencji GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Tłumaczenie: kepin & zomers, WG',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logo i webmaster: le Spektre',
+
+ 'ToolbarRandom' => 'Dziś wieczorem',
+
+ 'UnsavedCollection' => 'Zbiór nie zapisany',
+ 'ModelsSelect' => 'Wybierz typ zbioru',
+ 'ModelsPersonal' => 'Szablony osobiste',
+ 'ModelsDefault' => 'Szablony domyślne',
+ 'ModelsList' => 'Definiowanie zbioru',
+ 'ModelSettings' => 'Ustawienia zbioru',
+ 'ModelNewType' => 'Nowy typ zbioru',
+ 'ModelName' => 'Nazwa dla zbiorów tego typu:',
+ 'ModelFields' => 'Pola',
+ 'ModelOptions' => 'Opcje',
+ 'ModelFilters' => 'Filtry',
+ 'ModelNewField' => 'Nowe pole',
+ 'ModelFieldInformation' => 'Informacje',
+ 'ModelFieldName' => 'Etykieta:',
+ 'ModelFieldType' => 'Typ:',
+ 'ModelFieldGroup' => 'Grupa:',
+ 'ModelFieldValues' => 'Wartości',
+ 'ModelFieldInit' => 'Domyślna:',
+ 'ModelFieldMin' => 'Minimum:',
+ 'ModelFieldMax' => 'Maksimum:',
+ 'ModelFieldList' => 'Lista wartości:',
+ 'ModelFieldListLegend' => '<i>oddzielone przecinkami</i>',
+ 'ModelFieldDisplayAs' => 'Wyświetl jako:',
+ 'ModelFieldDisplayAsText' => 'Tekst',
+ 'ModelFieldDisplayAsGraphical' => 'Grafika',
+ 'ModelFieldTypeShortText' => 'Krótki tekst',
+ 'ModelFieldTypeLongText' => 'Długi tekst',
+ 'ModelFieldTypeYesNo' => 'Tak/Nie',
+ 'ModelFieldTypeNumber' => 'Liczba',
+ 'ModelFieldTypeDate' => 'Data',
+ 'ModelFieldTypeOptions' => 'Predefiniowana lista wartości',
+ 'ModelFieldTypeImage' => 'Obraz',
+ 'ModelFieldTypeSingleList' => 'Prosta lista',
+ 'ModelFieldTypeFile' => 'Plik',
+ 'ModelFieldTypeFormatted' => 'Zależne od innych pól',
+ 'ModelFieldParameters' => 'Parametry',
+ 'ModelFieldHasHistory' => 'Korzystaj z historii',
+ 'ModelFieldFlat' => 'Pokazuj w jednej linii',
+ 'ModelFieldStep' => 'Krok przyrostu:',
+ 'ModelFieldFileFormat' => 'Format pliku:',
+ 'ModelFieldFileFile' => 'Zwykły plik',
+ 'ModelFieldFileImage' => 'Obraz',
+ 'ModelFieldFileVideo' => 'Wideo',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Wykorzystane pola',
+ 'ModelOptionsFieldsAuto' => 'Automatycznie',
+ 'ModelOptionsFieldsNone' => 'Wcale',
+ 'ModelOptionsFieldsTitle' => 'Jako tytuł',
+ 'ModelOptionsFieldsId' => 'Jako identyfikator',
+ 'ModelOptionsFieldsCover' => 'Jako okładka',
+ 'ModelOptionsFieldsPlay' => 'Przycisk Odtwórz',
+ 'ModelCollectionSettings' => 'Ustawienia Zbioru',
+ 'ModelCollectionSettingsLending' => 'Pozycje mogą być pożyczane',
+ 'ModelCollectionSettingsTagging' => 'Można stosować znaczniki',
+ 'ModelFilterActivated' => 'Pole będzie szukane',
+ 'ModelFilterComparison' => 'Porównanie',
+ 'ModelFilterContain' => 'Zawiera',
+ 'ModelFilterDoesNotContain' => 'Nie zawiera',
+ 'ModelFilterRegexp' => 'Wyrażenie regularne',
+ 'ModelFilterRange' => 'W zakresie',
+ 'ModelFilterNumeric' => 'Porównanie jest numeryczne',
+ 'ModelFilterQuick' => 'Utwórz szybki filtr',
+ 'ModelTooltipName' => 'Podaj nazwę jeśli chciałbyś używać tego szablonu dla wielu zbiorów. Jeżeli jej nie podasz ustawienia będą przechowywane bezpośrednio w samym zbiorze',
+ 'ModelTooltipLabel' => 'Wyświetlana nazwa pola',
+ 'ModelTooltipGroup' => 'Używana do grupowania pól. Pozycje, dla których wartość ta nie będzie ustawiona znajdą się w grupie domyślnej',
+ 'ModelTooltipHistory' => 'Poprzednio wprowadzone wartości będą przechowywane w liście przypisanej do tego pola',
+ 'ModelTooltipFormat' => 'Ten format jest używany przy określaniu akcji otwarcia pliku przyciskiem Odtwórz',
+ 'ModelTooltipLending' => 'Dodaje kilka pól odnoszących się do pożyczania',
+ 'ModelTooltipTagging' => 'Dodaje kilka pól pozwalających na zarządzanie znacznikami',
+ 'ModelTooltipNumeric' => 'Wartości będą traktowane jako liczby przy porównaniu',
+ 'ModelTooltipQuick' => 'Dodaje podmenu w menu Filtrów',
+
+ 'ResultsTitle' => 'Wybierz pozycję', # Accepts model codes
+ 'ResultsNextTip' => 'Szukaj na następnej witrynie',
+ 'ResultsPreview' => 'Podgląd',
+ 'ResultsInfo' => 'Do Zbioru możesz dodać wiele pozycji jednocześnie, wybierając je trzymaj wciśnięty klawisz Ctrl lub Shift', # Accepts model codes
+
+ 'OptionsTitle' => 'Preferencje',
+ 'OptionsExpertMode' => 'Ustawienia zaawansowane',
+ 'OptionsPrograms' => 'Wybierz program do obsługi plików danego typu, puste pole spowoduje użycie aplikacji domyślnej',
+ 'OptionsBrowser' => 'Przeglądarka',
+ 'OptionsPlayer' => 'Odtwarzacz multimedialny',
+ 'OptionsAudio' => 'Odtwarzacz muzyczny',
+ 'OptionsImageEditor' => 'Edytor graficzny',
+ 'OptionsCdDevice' => 'Urządzenie CD',
+ 'OptionsImages' => 'Katalog obrazów',
+ 'OptionsUseRelativePaths' => 'Używaj względnych ścieżek dla obrazów',
+ 'OptionsLayout' => 'Układ',
+ 'OptionsStatus' => 'Wyświetlaj pasek stanu',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Ostrzeżenie: Zmiany zostaną wprowadzone dopiero po ponownym uruchomieniu programu.',
+ 'OptionsRemoveConfirm' => 'Potwierdzaj przed usunięciem pozycji',
+ 'OptionsAutoSave' => 'Autozapis Zbioru',
+ 'OptionsAutoLoad' => 'Po uruchomieniu załaduj poprzedni Zbiór',
+ 'OptionsSplash' => 'Pokazuj logo przy uruchamianiu',
+ 'OptionsTearoffMenus' => 'Włącz odrywane menu',
+ 'OptionsSpellCheck' => 'Zastosuj korektor pisowni w długich polach tekstowych',
+ 'OptionsProgramTitle' => 'Wybierz program którego chcesz używać',
+ 'OptionsPlugins' => 'Witryna do pobierania danych',
+ 'OptionsAskPlugins' => 'Pytaj (Wszystkie witryny)',
+ 'OptionsPluginsMulti' => 'Wiele witryn',
+ 'OptionsPluginsMultiAsk' => 'Pytaj (Wiele witryn)',
+ 'OptionsPluginsMultiPerField' => 'Wiele witryn (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Ustaw listę',
+ 'OptionsAskImport' => 'Wybierz pola do importu',
+ 'OptionsProxy' => 'Używaj proxy',
+ 'OptionsCookieJar' => 'Użyj tego pliku JAR',
+ 'OptionsLang' => 'Język',
+ 'OptionsMain' => 'Główny',
+ 'OptionsPaths' => 'Ścieżki',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Opcje',
+ 'OptionsDisplay' => 'Wyświetl',
+ 'OptionsToolbar' => 'Menu podręczne',
+ 'OptionsToolbars' => {0 => 'Brak', 1 => 'Małe', 2 => 'Duże', 3 => 'Ustawienia systemowe'},
+ 'OptionsToolbarPosition' => 'Pozycja',
+ 'OptionsToolbarPositions' => {0 => 'Góra', 1 => 'Dół', 2 => 'Lewa', 3 => 'Prawa'},
+ 'OptionsExpandersMode' => 'Rozmiar listy zbyt duży',
+ 'OptionsExpandersModes' => {'asis' => 'Nie zmieniaj', 'cut' => 'Przytnij', 'wrap' => 'Zawiń linie'},
+ 'OptionsDateFormat' => 'Format daty',
+ 'OptionsDateFormatTooltip' => 'Format stosowany w strftime(3). Domyślnie %d/%m/%Y',
+ 'OptionsView' => 'Lista pozycji',
+ 'OptionsViews' => {0 => 'Tekst', 1 => 'Obrazki', 2 => 'Szczegóły'},
+ 'OptionsColumns' => 'Kolumny',
+ 'OptionsMailer' => 'Program pocztowy',
+ 'OptionsSMTP' => 'Serwer',
+ 'OptionsFrom' => 'Twój adres e-mail',
+ 'OptionsTransform' => 'Umieszczaj rodzajniki na końcu',
+ 'OptionsArticles' => 'Rodzajniki',
+ 'OptionsSearchStop' => 'Zezwalaj na zatrzymanie szukania',
+ 'OptionsBigPics' => 'Użyj dużego zdjęcia jeśli to możliwe',
+ 'OptionsAlwaysOriginal' => 'Używaj głównego tytułu jako tytułu oryginalnego',
+ 'OptionsRestoreAccelerators' => 'Przywróć domyślne skróty',
+ 'OptionsHistory' => 'Rozmiar historii',
+ 'OptionsClearHistory' => 'Czyść historie',
+ 'OptionsStyle' => 'Skórka',
+ 'OptionsDontAsk' => 'Nie pytaj więcej',
+ 'OptionsPathProgramsGroup' => 'Aplikacje',
+ 'OptionsProgramsSystem' => 'Użyj programów zdefiniowanych przez system',
+ 'OptionsProgramsUser' => 'Użyj wybranych programów',
+ 'OptionsProgramsSet' => 'Wybierz programy',
+ 'OptionsPathImagesGroup' => 'Obrazy',
+ 'OptionsInternetDataGroup' => 'Import danych',
+ 'OptionsInternetSettingsGroup' => 'Ustawienia',
+ 'OptionsDisplayInformationGroup' => 'Wyświetlanie informacji',
+ 'OptionsDisplayArticlesGroup' => 'Rodzajniki',
+ 'OptionsImagesDisplayGroup' => 'Wyświetlanie',
+ 'OptionsImagesStyleGroup' => 'Styl',
+ 'OptionsDetailedPreferencesGroup' => 'Ustawienia',
+ 'OptionsFeaturesConveniencesGroup' => 'Ułatwienia',
+ 'OptionsPicturesFormat' => 'Prefiks dla obrazów:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Tytuł lub nazwa odpowiedniej pozycji',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% lub . będzie zastąpione katalogiem Zbioru (stosuj tylko na początku ścieżki)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% będzie zastąpione nazwą pliku Zbioru bez rozszerzenia (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% może być stosowane wyłącznie na początku ścieżki dla obrazów',
+ 'OptionsConfigureMailers' => 'Skonfiguruj programy pocztowe',
+
+ 'ImagesOptionsButton' => 'Ustawienia',
+ 'ImagesOptionsTitle' => 'Ustawienia listy obrazków',
+ 'ImagesOptionsSelectColor' => 'Wybierz kolor',
+ 'ImagesOptionsUseOverlays' => 'Zastosuj nakładki',
+ 'ImagesOptionsBg' => 'Tło',
+ 'ImagesOptionsBgPicture' => 'Obrazek jako tło',
+ 'ImagesOptionsFg'=> 'Zaznaczenie',
+ 'ImagesOptionsBgTooltip' => 'Zmień kolor tła',
+ 'ImagesOptionsFgTooltip'=> 'Zmień kolor zaznaczenia',
+ 'ImagesOptionsResizeImgList' => 'Automatycznie ustal liczbę kolumn',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Rozmiar',
+ 'ImagesOptionsSizeList' => {0 => 'Bardzo mały', 1 => 'Mały', 2 => 'Średni', 3 => 'Duży', 4 => 'Ogromny'},
+ 'ImagesOptionsSizeTooltip' => 'Wybierz rozmiar obrazka',
+
+ 'DetailedOptionsTitle' => 'Ustawienia dokładnej listy',
+ 'DetailedOptionsImageSize' => 'Rozmiar obrazków',
+ 'DetailedOptionsGroupItems' => 'Grupuj pozycje według',
+ 'DetailedOptionsSecondarySort' => 'Dodatkowo sortuj według',
+ 'DetailedOptionsFields' => 'Wybierz wyświetlane pola',
+ 'DetailedOptionsGroupedFirst' => 'Grupuj pozostałe pozycje',
+ 'DetailedOptionsAddCount' => 'Pokaż liczbę pozycji w grupie',
+
+ 'ExtractButton' => 'Informacje',
+ 'ExtractTitle' => 'Informacja o pliku wideo',
+ 'ExtractImport' => 'Używaj wartości',
+
+ 'FieldsListOpen' => 'Wczytaj listę pól z pliku',
+ 'FieldsListSave' => 'Zapisz listę pól do pliku',
+ 'FieldsListError' => 'Ta lista pól nie może być wykorzystana dla Zbioru tego rodzaju',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Eksportuj listę pozycji',
+ 'ExportFilter' => 'Eksportuj tylko wyświetlone pozycje',
+ 'ExportFieldsTitle' => 'Pola do wyeksportowania',
+ 'ExportFieldsTip' => 'Wybierz pola, które chcesz wyeksportować',
+ 'ExportWithPictures' => 'Kopiuj obrazy do podkatalogu',
+ 'ExportSortBy' => 'Sortuj według',
+ 'ExportOrder' => 'Kolejność',
+
+ 'ImportListTitle' => 'Importuj listę pozycji',
+ 'ImportExportData' => 'Dane',
+ 'ImportExportFile' => 'Plik',
+ 'ImportExportFieldsUnused' => 'Nieużywane pola',
+ 'ImportExportFieldsUsed' => 'Używane pola',
+ 'ImportExportFieldsFill' => 'Dodaj wszystkie',
+ 'ImportExportFieldsClear' => 'Usuń wszystkie',
+ 'ImportExportFieldsEmpty' => 'Musisz zaznaczyć chociaż jedno pole',
+ 'ImportExportFileEmpty' => 'Musisz określić nazwę pliku',
+ 'ImportFieldsTitle' => 'Pola do zaimportowania',
+ 'ImportFieldsTip' => 'Wybierz pola, które chcesz zaimportować',
+ 'ImportNewList' => 'Stwórz nowy Zbiór',
+ 'ImportCurrentList' => 'Dodaj do aktualnego Zbioru',
+ 'ImportDropError' => 'Jeden lub więcej z ładowanych plików spowodował błąd. Poprzednia lista zostanie przywrócona.',
+ 'ImportGenerateId' => 'Utwórz identyfikator dla każdej z pozycji',
+
+ 'FileChooserOpenFile' => 'Wybierz plik, który chcesz użyć',
+ 'FileChooserDirectory' => 'Katalog',
+ 'FileChooserOpenDirectory' => 'Wybierz katalog',
+ 'FileChooserOverwrite' => 'Plik już istnieje. Czy chcesz go zastąpić?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ 'PanelCompact' => 'Kompaktowy',
+ 'PanelReadOnly' => 'Tylko do odczytu',
+ 'PanelForm' => 'Zakładki',
+
+ 'PanelSearchButton' => 'Pobierz informacje',
+ 'PanelSearchTip' => 'Szukaj w internecie informacji o tym tytule',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Kliknij na zdjęciu aby wybrać inne.',
+ 'PanelImageTipView' => 'Kliknij na zdjęciu aby obejrzeć go w naturalnym rozmiarze.',
+ 'PanelImageTipMenu' => ' Prawy przycisk myszy - więcej opcji.',
+ 'PanelImageTitle' => 'Wybierz zdjęcie',
+ 'PanelImageNoImage' => 'Brak zdjęcia',
+ 'PanelSelectFileTitle' => 'Wybierz plik',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Przywróć domyślne',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'Od',
+ 'PanelTo' =>'Do',
+
+ 'PanelWeb' => 'Sprawdź informacje',
+ 'PanelWebTip' => 'Sprawdź w sieci informacje o tej pozycji', # Accepts model codes
+ 'PanelRemoveTip' => 'Usuń bieżącą pozycję', # Accepts model codes
+
+ 'PanelDateSelect' => 'Wybierz datę',
+ 'PanelNobody' => 'Nikt',
+ 'PanelUnknown' => 'Nieznany',
+ 'PanelAdded' => 'Dodano',
+ 'PanelRating' => 'Ocena',
+ 'PanelPressRating' => 'Ocena prasy',
+ 'PanelLocation' => 'Lokalizacja',
+
+ 'PanelLending' => 'Pożyczanie',
+ 'PanelBorrower' => 'Dłużnik',
+ 'PanelLendDate' => 'Data pożyczenia',
+ 'PanelHistory' => 'Historia wypożyczania',
+ 'PanelReturned' => 'Pozycja zwrócona', # Accepts model codes
+ 'PanelReturnDate' => 'Data zwrotu',
+ 'PanelLendedYes' => 'Pożyczone',
+ 'PanelLendedNo' => 'Dostępne',
+
+ 'PanelTags' => 'Znaczniki',
+ 'PanelFavourite' => 'Ulubione',
+ 'TagsAssigned' => 'Znaczniki przydzielone',
+
+ 'PanelUser' => 'Pola użytkownika',
+
+ 'CheckUndef' => 'Oba',
+ 'CheckYes' => 'Tak',
+ 'CheckNo' => 'Nie',
+
+ 'ToolbarAll' => 'Zobacz wszystkie',
+ 'ToolbarAllTooltip' => 'Zobacz wszystkie pozycje',
+ 'ToolbarGroupBy' => 'Grupuj według',
+ 'ToolbarGroupByTooltip' => 'Wybierz pole, według którego będą grupowane pozycje z listy',
+ 'ToolbarQuickSearch' => 'Szybkie wyszukiwanie',
+ 'ToolbarQuickSearchLabel' => 'Znajdź',
+ 'ToolbarQuickSearchTooltip' => 'Wybierz pole do przeszukania. Wprowadź wyrażenie i naciśnij Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Wyszukiwanie',
+ 'PluginsQuery' => 'Szukaj',
+ 'PluginsFrame' => 'Przeglądane witryny',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Nazwa',
+ 'PluginsSearchFields' => 'Przeglądane pola',
+ 'PluginsAuthor' => 'Autor',
+ 'PluginsLang' => 'Język',
+ 'PluginsUseSite' => 'Używaj wybranej witryny w kolejnych wyszukiwaniach',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Konfiguracja dłużnika',
+ 'BorrowersList' => 'Dłużnicy',
+ 'BorrowersName' => 'Nazwa',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Dodaj',
+ 'BorrowersRemove' => 'Usuń',
+ 'BorrowersEdit' => 'Edytuj',
+ 'BorrowersTemplate' => 'Kopia e-mail',
+ 'BorrowersSubject' => 'Temat e-mail',
+ 'BorrowersNotice1' => '%1 - nazwa dłużnika',
+ 'BorrowersNotice2' => '%2 - tytuł pozycji',
+ 'BorrowersNotice3' => '%3 - data wypożyczenia',
+
+ 'BorrowersImportTitle' => 'Import informacji o dłużnikach',
+ 'BorrowersImportType' => 'Format pliku:',
+ 'BorrowersImportFile' => 'Plik:',
+
+ 'BorrowedTitle' => 'Pożyczone pozycje', # Accepts model codes
+ 'BorrowedDate' => 'Od',
+ 'BorrowedDisplayInPanel' => 'Pokaż tą pozycję w głównym oknie', # Accepts model codes
+
+ 'MailTitle' => 'Wyślij e-mail',
+ 'MailFrom' => 'Od: ',
+ 'MailTo' => 'Do: ',
+ 'MailSubject' => 'Temat: ',
+ 'MailSmtpError' => 'Problem z serwerem SMTP',
+ 'MailSendmailError' => 'Błąd załadowania funkcji sendmail',
+
+ 'SearchTooltip' => 'Szukaj we wszystkich pozycjach', # Accepts model codes
+ 'SearchTitle' => 'Wyszukiwanie', # Accepts model codes
+ 'SearchNoField' => 'Nie wybrano żadnego pola dla wyszukiwania.
+Dodaj kilka w zakładce Filtry okienka ustawień Zbioru.',
+
+ 'QueryReplaceField' => 'Zamień w polu:',
+ 'QueryReplaceOld' => 'Znajdź',
+ 'QueryReplaceNew' => 'Zastąp',
+ 'QueryReplaceLaunch' => 'Zastąp',
+
+ 'ImportWindowTitle' => 'Wybierz pola do importu',
+ 'ImportViewPicture' => 'Zobacz obraz',
+ 'ImportSelectAll' => 'Zaznacz wszystkie',
+ 'ImportSelectNone' => 'Odznacz wszystkie',
+
+ 'MultiSiteTitle' => 'Witryny używane do wyszukiwania',
+ 'MultiSiteUnused' => 'Nieużywane wtyczki',
+ 'MultiSiteUsed' => 'Używane wtyczki',
+ 'MultiSiteLang' => 'Wypełnij listę polskimi wtyczkami',
+ 'MultiSiteEmptyError' => 'Twoja lista witryn jest pusta',
+ 'MultiSiteClear' => 'Wyczyść listę',
+
+ 'DisplayOptionsTitle' => 'Pozycje do wyświetlenia',
+ 'DisplayOptionsAll' => 'Zaznacz wszystkie',
+ 'DisplayOptionsSearch' => 'Przycisk Szukania',
+
+ 'GenresTitle' => 'Konwersja gatunków',
+ 'GenresCategoryName' => 'Użyj gatunku',
+ 'GenresCategoryMembers' => 'Zastąp gatunek',
+ 'GenresLoad' => 'Załaduj listę',
+ 'GenresExport' => 'Zapisz listę do pliku',
+ 'GenresModify' => 'Edytuj konwersje',
+
+ 'PropertiesName' => 'Nazwa Zbioru',
+ 'PropertiesLang' => 'Kod języka',
+ 'PropertiesOwner' => 'Właściciel',
+ 'PropertiesEmail' => 'E-mail',
+ 'PropertiesDescription' => 'Opis',
+ 'PropertiesFile' => 'Informacje o pliku',
+ 'PropertiesFilePath' => 'Pełna ścieżka',
+ 'PropertiesItemsNumber' => 'Ilość pozycji', # Accepts model codes
+ 'PropertiesFileSize' => 'Rozmiar',
+ 'PropertiesFileSizeSymbols' => ['Bajtów', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Właściwości Zbioru',
+ 'PropertiesDefaultPicture' => 'Zdjęcie domyślne',
+
+ 'MailProgramsTitle' => 'Programy pocztowe',
+ 'MailProgramsName' => 'Nazwa',
+ 'MailProgramsCommand' => 'Polecenie',
+ 'MailProgramsRestore' => 'Przywróć domyślne',
+ 'MailProgramsAdd' => 'Dodaj program',
+ 'MailProgramsInstructions' => 'W linii poleceń mogą występować poniższe symbole:
+ %f będzie zastąpione adresem e-mail użytkownika.
+ %t będzie zastąpione adresem odbiorcy.
+ %s będzie zastąpione tematem wiadomości.
+ %b będzie zastąpione tekstem wiadomości.',
+
+ 'BookmarksBookmarks' => 'Zakładki',
+ 'BookmarksFolder' => 'Katalog',
+ 'BookmarksLabel' => 'Etykieta',
+ 'BookmarksPath' => 'Ścieżka',
+ 'BookmarksNewFolder' => 'Nowy katalog',
+
+ 'AdvancedSearchType' => 'Typ wyszukiwania',
+ 'AdvancedSearchTypeAnd' => 'Pozycje spełniające wszystkie warunki', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Pozycje spełniające co najmniej jeden z warunków', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Warunki',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Zapisz wyszukiwanie',
+ 'AdvancedSearchSaveName' => 'Nazwa',
+ 'AdvancedSearchSaveOverwrite' => 'Wyszukiwanie o tej nazwie już istnieje. Proszę użyć innej nazwy.',
+ 'AdvancedSearchUseCase' => 'Uwzględniaj wielkość liter',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignoruj znaki diakrytyczne',
+
+ 'BugReportSubject' => 'Zgłoszenie błędu wygenerowane z programu GCstar',
+ 'BugReportVersion' => 'Wersja',
+ 'BugReportPlatform' => 'System operacyjny',
+ 'BugReportMessage' => 'Treść zgłoszenia',
+ 'BugReportInformation' => 'Informacje dodatkowe',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/PT/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..baa74c3
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::PT::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Incluir nomes de campo no topo',
+ 'Separator' => 'Separador',
+ 'Replacement' => 'Substitua o separador por',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/PT/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..beaa61d
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::PT::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/PT/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..3664f14
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::PT::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Invalid template file',
+ 'UseFile' => 'Use file specified below',
+ 'TemplateExternalFile' => 'Template file',
+ 'WithJS' => 'Usar Javascript',
+ 'FileTemplate' => 'Modelo:',
+ 'Preview' => 'Prévia',
+ 'NoPreview' => 'Nenhuma prévia disponível',
+ 'Title' => 'Título da página',
+ 'InfoFile' => 'Arquivo de lista de filmes: ',
+ 'InfoDir' => 'Pasta de imagens: ',
+ 'HeightImg' => 'Altura (em pixels) da imagem exportada: ',
+ 'OpenFileInBrowser' => 'Abrir arquivo gerado no navegador',
+ 'Note' => 'Lista generada por <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Introduza texto de busca',
+ 'SearchType1' => 'Apenas título',
+ 'SearchType2' => 'Toda informação',
+ 'SearchButton' => 'Procurar',
+ 'SearchTitle' => 'Mostrar apenas filmes coincidentes com o critérios anteriores',
+ 'AllButton' => 'Todos',
+ 'AllTitle' => 'Mostrar todos os filmes',
+ 'Expand' => 'Expandir tudo',
+ 'ExpandTitle' => 'Motrar informação de todos os filmes',
+ 'Collapse' => 'Contrair tudo',
+ 'CollapseTitle' => 'Ocultar a informação de todos os filmes',
+ 'Borrowed' => 'Emprestado por: ',
+ 'NotBorrowed' => 'Disponível',
+ 'Top' => 'Topo',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/PT/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..b77aba3
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::PT::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/PT/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..615cde3
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::PT::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Incluir uma instrução DROP',
+ 'WithCreate' => 'Incluir uma instrução CREATE',
+ 'TableName' => 'Nome da tabela',
+ 'InfoFile' => 'Arquivo SQL: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/PT/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..2743c46
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::PT::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'O arquivo .tar.gz se encontra em: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/PT/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..0d5493b
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::PT::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Modelo do arquivo',
+ 'ModelText' => 'Modelo do texto',
+ 'Models' => 'Usar modelo: ',
+ 'UseFile' => 'Usar arquivo',
+ 'UseModel' => 'Usar área de texto',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/PT/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..8db0227
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::PT::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Onde deve-se efetuar a busca',
+ 'Default' => 'Diretório padrão do Alexandria',
+ 'Specified' => 'Diretório especificado abaixo',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/PT/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..8620e98
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::PT::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Ignorar primeira linha',
+ 'Separator' => 'Separador',
+ 'Plugin' => 'Utilizar o site',
+ 'UseFirst' => 'Selecionar o primeiro se houver muitos resultados',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/PT/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..8924a5b
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::PT::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/PT/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..c472253
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::PT::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copiar imagens',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCImport/GCImportList.pm b/lib/gcstar/GCLang/PT/GCImport/GCImportList.pm
new file mode 100644
index 0000000..d0c28c1
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::PT::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Lista de títulos',
+ 'Plugin' => 'Utilizar o site',
+ 'UseFirst' => 'Selecionar o primeiro se houver muitos resultados',
+ 'CommentAuto' => 'Item importado automaticamente.',
+ 'CommentSite' => 'Website: ',
+ 'CommentTitle' => 'Título: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/PT/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..2eb7aba
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::PT::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/PT/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..5b5c67e
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::PT::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'O arquivo não é uma coleção Tellico válida',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/PT/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..beaa947
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::PT::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/PT/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..31f5e57
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::PT::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/PT/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..e488fb9
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::PT::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCbooks.pm b/lib/gcstar/GCLang/PT/GCModels/GCbooks.pm
new file mode 100644
index 0000000..caedcae
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCbooks.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::PT::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Coleção de livros',
+ Items => 'Livros',
+ NewItem => 'Novo livro',
+
+ Isbn => 'ISBN',
+ Title => 'Título',
+ Cover => 'Capa',
+ Authors => 'Autores',
+ Publisher => 'Editora',
+ Publication => 'Data de publicação',
+ Language => 'Língua',
+ Genre => 'Gênero',
+ Serie => 'Série',
+ Rank => 'Ranking',
+ Bookdescription => 'Descrição',
+ Pages => 'Páginas',
+ Read => 'Lido',
+ Acquisition => 'Data de aquisição',
+ Edition => 'Edição',
+ Format => 'Formato',
+ Comments => 'Comentários',
+ Url => 'Página da web',
+ Translator => 'Tradutor',
+ Artist => 'Artista',
+ DigitalFile => 'Digital version',
+
+ General => 'Geral',
+ Details => 'Detalhes',
+
+ ReadNo => 'Não lido',
+ ReadYes => 'Lido',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCcoins.pm b/lib/gcstar/GCLang/PT/GCModels/GCcoins.pm
new file mode 100644
index 0000000..bb6188a
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCcoins.pm
@@ -0,0 +1,102 @@
+{
+ package GCLang::PT::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Coleção numismatica',
+ Items => 'Moedas',
+ NewItem => 'Nova moeda',
+
+ Name => 'Nome',
+ Country => 'País',
+ Year => 'Ano',
+ Currency => 'Moeda corrente',
+ Value => 'Valor',
+ Picture => 'Figura principal',
+ Diameter => 'Diametro',
+ Metal => 'Metal',
+ Edge => 'Borda',
+ Edge1 => 'Borda 1',
+ Edge2 => 'Borda 2',
+ Edge3 => 'Borda 3',
+ Edge4 => 'Borda 4',
+ Head => 'Cara',
+ Tail => 'Coroa',
+ Comments => 'Comentários',
+ History => 'História',
+ Website => 'Página da web',
+ Estimate => 'Estimativa',
+ References => 'Referências',
+ Type => 'Tipo',
+ Coin => 'Moeda',
+ Banknote => 'Nota do banco',
+
+ Main => 'Principal',
+ Description => 'Descrição',
+ Other => 'Outras informações',
+ Pictures => 'Imagens',
+
+ Condition => 'Condição (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCcomics.pm b/lib/gcstar/GCLang/PT/GCModels/GCcomics.pm
new file mode 100644
index 0000000..f436260
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::PT::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCfilms.pm b/lib/gcstar/GCLang/PT/GCModels/GCfilms.pm
new file mode 100644
index 0000000..699434e
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCfilms.pm
@@ -0,0 +1,92 @@
+{
+ package GCLang::PT::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Coleção de filmes',
+ Items => 'Filmes',
+ NewItem => 'Novo filme',
+
+
+ Id => 'Id',
+ Title => 'Título',
+ Date => 'Data',
+ Time => 'Duração',
+ Director => 'Diretor',
+ Country => 'País',
+ MinimumAge => 'Censura',
+ Genre => 'Gênero',
+ Image => 'Imagem',
+ Original => 'Título original',
+ Actors => 'Elenco',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'Comentários',
+ Synopsis => 'Sinopse',
+ Seen => 'Visto',
+ Number => 'N° da mídia',
+ Format => 'Formato',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'Página da Web',
+ Audio => 'Áudio',
+ Video => 'Formato do vídeo',
+ Trailer => 'Arquivo de vídeo',
+ Serie => 'Série',
+ Rank => 'Ranking',
+ Subtitles => 'Lengendas',
+
+ SeenYes => 'Visto',
+ SeenNo => 'Não visto',
+
+ AgeUnrated => 'Desconhecida',
+ AgeAll => 'Livre',
+ AgeParent => 'Controle dos pais',
+
+ Main => 'Itens principais',
+ General => 'Geral',
+ Details => 'Detalhes',
+ Lending => 'Empréstimo',
+
+ Information => 'Informação',
+ Languages => 'Línguas',
+ Encoding => 'Codificação',
+
+ FilterAudienceAge => 'Idade mínima',
+ FilterSeenNo => '_Não visto ainda',
+ FilterSeenYes => '_Já visto',
+ FilterRatingSelect => 'Nota _mínima...',
+
+ ExtractSize => 'Tamanho',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCgames.pm b/lib/gcstar/GCLang/PT/GCModels/GCgames.pm
new file mode 100644
index 0000000..5f359e8
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCgames.pm
@@ -0,0 +1,80 @@
+{
+ package GCLang::PT::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Coleção de jogos',
+ Items => 'Jogos',
+ NewItem => 'Novo jogo',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Nome',
+ Platform => 'Plataforma',
+ Players => 'Número de jogadores',
+ Released => 'Data de lançamento',
+ Editor => 'Editor',
+ Developer => 'Desenvolvedor',
+ Genre => 'Gênero',
+ Box => 'Imagem da capa',
+ Case => 'Capa',
+ Manual => 'Manual de instruções',
+ Completion => 'Completado (%)',
+ Executable => 'Executable',
+ Description => 'Descrição',
+ Codes => 'Códigos',
+ Code => 'Código',
+ Effect => 'Efeito',
+ Secrets => 'Segredos',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'Primeiro screenshot',
+ Screenshot2 => 'Segundo screenshot',
+ Comments => 'Comentários',
+ Url => 'Página da web',
+ Unlockables => 'Desbloqueados',
+ Unlockable => 'Desbloqueado',
+ Howto => 'Como desbloquear',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Geral',
+ Details => 'Detalhes',
+ Tips => 'Tipos',
+ Information => 'Informação',
+
+ FilterRatingSelect => 'Nota _mínima...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/PT/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..757f21f
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::PT::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCminicars.pm b/lib/gcstar/GCLang/PT/GCModels/GCminicars.pm
new file mode 100644
index 0000000..07b9617
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::PT::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCmusics.pm b/lib/gcstar/GCLang/PT/GCModels/GCmusics.pm
new file mode 100644
index 0000000..309582e
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCmusics.pm
@@ -0,0 +1,66 @@
+{
+ package GCLang::PT::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Coleção de músicas',
+ Items => 'Albuns',
+ NewItem => 'Novo album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Título',
+ Cover => 'Capa',
+ Artist => 'Artista',
+ Format => 'Formato',
+ Running => 'Tempo de execução',
+ Release => 'Data de lançamento',
+ Genre => 'Gênero',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Faixas',
+ Number => 'Número',
+ Track => 'Título',
+ Time => 'Tempo',
+
+ Composer => 'Compositor',
+ Producer => 'Produtor',
+ Playlist => 'Lista de reprodução',
+ Comments => 'Comentários',
+ Label => 'Nome',
+ Url => 'Página da web',
+
+ General => 'Geral',
+ Details => 'Detalhes',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/PT/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..2386b93
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::PT::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/PT/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..1fa815f
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::PT::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/PT/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..9067f04
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::PT::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCstamps.pm b/lib/gcstar/GCLang/PT/GCModels/GCstamps.pm
new file mode 100644
index 0000000..79c8da4
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::PT::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCwines.pm b/lib/gcstar/GCLang/PT/GCModels/GCwines.pm
new file mode 100644
index 0000000..a60fe81
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCwines.pm
@@ -0,0 +1,65 @@
+{
+ package GCLang::PT::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Wines collection',
+ Items => {0 => 'Wine',
+ 1 => 'Wine',
+ X => 'Wines'},
+ NewItem => 'New wine',
+
+ Name => 'Name',
+ Designation => 'Designation',
+ Vintage => 'Vintage',
+ Vineyard => 'Vineyard',
+ Type => 'Type',
+ Grapes => 'Grapes',
+ Soil => 'Soil',
+ Producer => 'Producer',
+ Country => 'Country',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medal/Honour',
+
+ Storage => 'Storage',
+ Location => 'Location',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantity',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Purchase date',
+ PurchasePrice => 'Purchase price',
+ Gift => 'Gift',
+ BottleLabel => 'Bottle label',
+ Website => 'Reference on the web',
+
+ Tasted => 'Tasted',
+ Comments => 'Comments',
+ Serving => 'Serving',
+ TastingField => 'Testing notes',
+
+ General => 'General',
+ Details => 'Details',
+ Tasting => 'Tasting',
+
+ TastedNo => 'Non tasted',
+ TastedYes => 'Tasted',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Not yet tasted',
+ FilterTastedYes => 'Already _tasted',
+ FilterRatingSelect => 'Rating at _least...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCstar.pm b/lib/gcstar/GCLang/PT/GCstar.pm
new file mode 100644
index 0000000..0a5ec94
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCstar.pm
@@ -0,0 +1,673 @@
+{
+ package GCLang::PT;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Português',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Aviso</b>:
+
+A informação baixada de sites da internet (através
+dos plugins de busca) é para <b>uso pessoal apenas</b>.
+
+Qualquer redistribuição é proibida <b>permissão explicita</b>
+do site.
+
+Para escolher em qual site deseja buscar a informação, você
+pode usar o <b>botão abaixo dos detalhes do item</b>.',
+
+ 'AllItemsFiltered' => 'Nenhum item cumpre com os critérios do filtro', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Instalar em ',
+ 'InstallMandatory' => 'Componente obrigatórios',
+ 'InstallOptional' => 'Componentes opcionais',
+ 'InstallErrorMissing' => 'Error: os componentes seguintes devem ser instalados: ',
+ 'InstallPrompt' => 'Pasta predeterminado para a instalação [/usr/local]: ',
+ 'InstallEnd' => 'Fim da instalação',
+ 'InstallNoError' => 'Nenhum erro',
+ 'InstallLaunch' => 'Para utilizar a aplicação, execute ',
+ 'InstallDirectory' => 'Pasta de instalação',
+ 'InstallTitle' => 'Instalação do GCstar',
+ 'InstallDependencies' => 'Dependências',
+ 'InstallPath' => 'Caminho',
+ 'InstallOptions' => 'Opções',
+ 'InstallSelectDirectory' => 'Escolha a pasta para instalação',
+ 'InstallWithClean' => 'Apagar arquivos das pastas de instalação.',
+ 'InstallWithMenu' => 'Adicionar GCstar ao menu de Aplicações',
+ 'InstallNoPermission' => 'Error : Você não tem permissões para instalar na pasta selecionada',
+ 'InstallMissingMandatory' => 'Algumas dependências obrigatórias não estão disponíveis. Não poderá instalar GCstar até que se instalem no sistema.',
+ 'InstallMissingOptional' => 'Algumas dependências opcionais não estão disponíveis (lista abaixo). GCstar será instalado com algumas funções desabilitadas.',
+ 'InstallMissingNone' => 'Dependências satisfeitas. Pode continuar e instalar GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Não disponível',
+ 'InstallMissingFor' => 'Não disponível por',
+ 'InstallCleanDirectory' => 'Apagar arquivos de GCstar na pasta: ',
+ 'InstallCopyDirectory' => 'Copiando arquivos na pasta: ',
+ 'InstallCopyDesktop' => 'Copiando os arquivos da área de trabalho em: ',
+
+#Update
+ 'UpdateUseProxy' => 'Usar o Proxy (se não usa nenhum pressione Enter): ',
+ 'UpdateNoPermission' => 'Permissão de escrita negada para esta pasta: ',
+ 'UpdateNone' => 'Nenhuma atualização encontrada',
+ 'UpdateFileNotFound' => 'Arquivo não encontrado',
+
+#Splash
+ 'SplashInit' => 'Inicialização',
+ 'SplashLoad' => 'Carregando coleção',
+ 'SplashDisplay' => 'Mostrando Coleção',
+ 'SplashSort' => 'Sorting Collection',
+ 'SplashDone' => 'Pronto',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Parece que você usava GCfilms antes. Quer importar do GCfilms para o GCstar? (Não afetará o GCfilms, se você quiser seguir usando-o)',
+ 'GCfilmsImportOptions' => 'Preferências',
+ 'GCfilmsImportData' => 'Lista de filmes',
+
+#Menus
+ 'MenuFile' => '_Arquivo',
+ 'MenuNewList' => '_Nova coleção',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => 'Coleções _recentes',
+ 'MenuLend' => '_Ver itens emprestados', # Accepts model codes
+ 'MenuImport' => '_Importar',
+ 'MenuExport' => '_Exportar',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Editar',
+ 'MenuDuplicate' => '_Duplicar item', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Apagar item', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Trocar campos da coleção',
+ 'MenuEditLockItems' => '_Bloquear coleção',
+
+ 'MenuDisplay' => '_Filtros',
+ 'MenuSavedSearches' => 'Saved searches',
+ 'MenuSavedSearchesSave' => 'Save current search',
+ 'MenuSavedSearchesEdit' => 'Modify saved searches',
+ 'MenuAdvancedSearch' => 'Busca _avançada',
+ 'MenuViewAllItems' => '_Ver todos os itens', # Accepts model codes
+ 'MenuNoFilter' => '_Todos',
+
+ 'MenuConfiguration' => '_Configurações',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Informações exibidas',
+ 'MenuBorrowers' => '_Devedores',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Conversão de _gêneros',
+
+ 'MenuBookmarks' => 'Minhas _Coleções',
+ 'MenuBookmarksAdd' => '_Adicionar coleção atual',
+ 'MenuBookmarksEdit' => '_Editar coleções favoritas',
+
+ 'MenuHelp' => 'Aj_uda?',
+ 'MenuHelpContent' => '_Conteúdo?',
+ 'MenuAllPlugins' => 'Ver _plugins',
+ 'MenuBugReport' => '_Reportar um problema',
+ 'MenuAbout' => '_Sobre',
+
+ 'MenuNewWindow' => 'Mostrar item em uma nova janela', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Expandir tudo',
+ 'ContextCollapseAll' => 'Contrair todo',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Por favor, introduza um valor',
+
+ 'RemoveConfirm' => 'Tem certeza que quer apagar este item?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'Novo item', # Accepts model codes
+ 'NewItemTooltip' => 'Adicionar um novo item', # Accepts model codes
+ 'NoItemFound' => 'Nada foi encontrado. Deseja tentar a busca em outro site?',
+ 'OpenList' => 'Por favor, selecione uma coleção',
+ 'SaveList' => 'Selecione onde deseja salvar a coleção',
+ 'SaveListTooltip' => 'Salvar coleção atual',
+ 'SaveUnsavedChanges' => 'Existe mudanças na coleção atual. Deseja salvá-las',
+ 'SaveDontSave' => 'Não salvar',
+ 'PreferencesTooltip' => 'Selecionar preferências',
+ 'ViewTooltip' => 'Trocar o tipo de coleção',
+ 'PlayTooltip' => 'Reproduzir arquivo de vídeo associado ao item', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Salvando...',
+ 'StatusLoad' => 'Carregando...',
+ 'StatusSearch' => 'Busca em progresso...',
+ 'StatusGetInfo' => 'Baixando a informação...',
+ 'StatusGetImage' => 'Baixando imagem...',
+
+ 'SaveError' => 'Impossível salvar a coleção. Por favor, verifique as permissões de acesso e o espaço livre.',
+ 'OpenError' => 'Impossível abrir a coleção. Por favor, verifique as permissões de acesso.',
+ 'OpenFormatError' => 'Impossível abrir a coleção. O formato pode estar incorreto',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'O diretório de imagens está incorreto. Por favor, selecione outro.',
+ 'OptionsCreationError'=> 'Impossível criar um arquivo de opções: ',
+ 'OptionsOpenError'=> 'Impossível abrir um arquivo de opções: ',
+ 'OptionsSaveError'=> 'Impossível salvar um arquivo de opções: ',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'O que quer ver esta noite?',
+ 'RandomError'=> 'Você não possui itens selecionáveis', # Accepts model codes
+ 'RandomEnd'=> 'Não tem mais itens', # Accepts model codes
+ 'RandomNextTip'=> 'Segunda sugestão',
+ 'RandomOkTip'=> 'Aceitar este item',
+
+ 'AboutTitle' => 'Sobre GCstar',
+ 'AboutDesc' => 'Gerenciador de coleções',
+ 'AboutVersion' => 'Versão',
+ 'AboutTeam' => 'Equipe',
+ 'AboutWho' => 'Christian Jodar (Tian) : Gerente de projeto, Programador
+Nyall Dawson (Zombiepig) : Programador
+TPF : Programador
+Adolfo González : Programador
+',
+ 'AboutLicense' => 'Distribuído segundo os termos da GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Tradução para português (Brasil): Daniel Valença',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logo e webdesign por le Spektre',
+
+ 'ToolbarRandom' => 'Esta noite',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+ 'ModelsSelect' => 'Selecionar um tipo de coleção',
+ 'ModelsPersonal' => 'Modelos pessoais',
+ 'ModelsDefault' => 'Modelos padrões',
+ 'ModelsList' => 'Definições da coleção',
+ 'ModelSettings' => 'Configurações da coleção',
+ 'ModelNewType' => 'Novo tipo de coleção',
+ 'ModelName' => 'Nome do tipo de coleção:',
+ 'ModelFields' => 'Campos',
+ 'ModelOptions' => 'Opções',
+ 'ModelFilters' => 'Filtros',
+ 'ModelNewField' => 'Novo campo',
+ 'ModelFieldInformation' => 'Informação',
+ 'ModelFieldName' => 'Nome:',
+ 'ModelFieldType' => 'Tipo:',
+ 'ModelFieldGroup' => 'Grupo:',
+ 'ModelFieldValues' => 'Valores',
+ 'ModelFieldInit' => 'Padrões:',
+ 'ModelFieldMin' => 'Mínimo:',
+ 'ModelFieldMax' => 'Máximo:',
+ 'ModelFieldList' => 'Lista de valores:',
+ 'ModelFieldListLegend' => '<i>Separados por vírgulas</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Texto curto',
+ 'ModelFieldTypeLongText' => 'Texto longo',
+ 'ModelFieldTypeYesNo' => 'Sim/Não',
+ 'ModelFieldTypeNumber' => 'Número',
+ 'ModelFieldTypeDate' => 'Data',
+ 'ModelFieldTypeOptions' => 'Lista de valores predefinidos',
+ 'ModelFieldTypeImage' => 'Imagem',
+ 'ModelFieldTypeSingleList' => 'Lista simples',
+ 'ModelFieldTypeFile' => 'Arquivo',
+ 'ModelFieldTypeFormatted' => 'Dependente em outros campos',
+ 'ModelFieldParameters' => 'Parâmetros',
+ 'ModelFieldHasHistory' => 'Usar um histórico',
+ 'ModelFieldFlat' => 'Exibir uma linha',
+ 'ModelFieldStep' => 'Tamanho do incremento:',
+ 'ModelFieldFileFormat' => 'Formato do arquivo:',
+ 'ModelFieldFileFile' => 'Arquivo simples',
+ 'ModelFieldFileImage' => 'Imagem',
+ 'ModelFieldFileVideo' => 'Vídeo',
+ 'ModelFieldFileAudio' => 'Áudio',
+ 'ModelFieldFileProgram' => 'Programa',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Campos a usar',
+ 'ModelOptionsFieldsAuto' => 'Automático',
+ 'ModelOptionsFieldsNone' => 'Nenhum',
+ 'ModelOptionsFieldsTitle' => 'Como título',
+ 'ModelOptionsFieldsId' => 'Como identificador',
+ 'ModelOptionsFieldsCover' => 'Como capa',
+ 'ModelOptionsFieldsPlay' => 'Como botão de Reproduzir',
+ 'ModelCollectionSettings' => 'Preferências da coleção',
+ 'ModelCollectionSettingsLending' => 'Elementos que podem ser emprestados',
+ 'ModelCollectionSettingsTagging' => 'Items can be tagged',
+ 'ModelFilterActivated' => 'Deve aparecer na caixa de busca',
+ 'ModelFilterComparison' => 'Comparação',
+ 'ModelFilterContain' => 'Contém',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Escopo',
+ 'ModelFilterNumeric' => 'Comparação numérica',
+ 'ModelFilterQuick' => 'Criar um filtro rápido',
+ 'ModelTooltipName' => 'Usar um nome para reutilizar este modelo para outras coleções. Se vazio, as preferências serão salvas na própria coleção',
+ 'ModelTooltipLabel' => 'Nome do campo como será mostrado',
+ 'ModelTooltipGroup' => 'Usado para agrupar os campos. Itens sem valor serão atribuídos ao grupo padrão',
+ 'ModelTooltipHistory' => 'Os valores introduzidos anteriormente devem ser armazenados em uma lista associada ao campo?',
+ 'ModelTooltipFormat' => 'O formato se usa para determinar a ação para abrir o arquivo com o botão Reproduzir',
+ 'ModelTooltipLending' => 'Isto irá adicionar campos para o gerenciamento dos empréstimos',
+ 'ModelTooltipTagging' => 'This will add some fields to manage tags',
+ 'ModelTooltipNumeric' => 'Os valores devem ser considerados como números para comparação?',
+ 'ModelTooltipQuick' => 'Isto irá adicionar um sub-menu dentro do menu de Filtros',
+
+ 'ResultsTitle' => 'Selecione um item', # Accepts model codes
+ 'ResultsNextTip' => 'Buscar no próximo site',
+ 'ResultsPreview' => 'Prévia',
+ 'ResultsInfo' => 'You can add multiple items to the collection by holding down the Ctrl or the Shift key and selecting them', # Accepts model codes
+
+ 'OptionsTitle' => 'Preferências',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Navegador de Internet',
+ 'OptionsPlayer' => 'Reprodutor de vídeo',
+ 'OptionsAudio' => 'Reprodutor de áudio',
+ 'OptionsImageEditor' => 'Image editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Pasta de imagens',
+ 'OptionsUseRelativePaths' => 'Usar rotas relativas para as imagens',
+ 'OptionsLayout' => 'Disposição',
+ 'OptionsStatus' => 'Barra de status',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Atenção: As mudanças efetuadas nesta aba não terão efeito até que o aplicativo seja reiniciado.',
+ 'OptionsRemoveConfirm' => 'Pedir confirmação antes de apagar',
+ 'OptionsAutoSave' => 'Salvar coleção automaticamente',
+ 'OptionsAutoLoad' => 'Carregar a coleção anterior ao início',
+ 'OptionsSplash' => 'Exibir tela de início',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Use spelling checker for long text fields',
+ 'OptionsProgramTitle' => 'Escolha que programa a utilizar',
+ 'OptionsPlugins' => 'Site para baixar informações',
+ 'OptionsAskPlugins' => 'Perguntar (Todos os sites)',
+ 'OptionsPluginsMulti' => 'Vários sites',
+ 'OptionsPluginsMultiAsk' => 'Perguntar (Alguns sites)',
+ 'OptionsPluginsMultiPerField' => 'Vários sites (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Definir lista',
+ 'OptionsAskImport' => 'Escolher os campos a importar',
+ 'OptionsProxy' => 'Utilizar um proxy',
+ 'OptionsCookieJar' => 'Use this cookie jar file',
+ 'OptionsMain' => 'Principal',
+ 'OptionsLang' => 'Idioma',
+ 'OptionsPaths' => 'Pastas',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Opções',
+ 'OptionsDisplay' => 'Visualização',
+ 'OptionsToolbar' => 'Barra de ferramentas',
+ 'OptionsToolbars' => {0 => 'Nenhuma', 1 => 'Pequena', 2 => 'Grande', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'Posição',
+ 'OptionsToolbarPositions' => {0 => 'Acima', 1 => 'Abaixo', 2 => 'Esquerda', 3 => 'Direita'},
+ 'OptionsExpandersMode' => 'Expanders too long',
+ 'OptionsExpandersModes' => {'asis' => 'Do nothing', 'cut' => 'Cut', 'wrap' => 'Line wrap'},
+ 'OptionsDateFormat' => 'Date Format',
+ 'OptionsDateFormatTooltip' => 'Format is the one used by strftime(3). Default is %d/%m/%Y',
+ 'OptionsView' => 'Tipo de coleção',
+ 'OptionsViews' => {0 => 'Texto', 1 => 'Imagem', 2 => 'Detalhada'},
+ 'OptionsColumns' => 'Colunas',
+ 'OptionsMailer' => 'Método de envio',
+ 'OptionsSMTP' => 'Servidor',
+ 'OptionsFrom' => 'Seu e-mail',
+ 'OptionsTransform' => 'Colocar artigos ao final dos títulos',
+ 'OptionsArticles' => 'Artigos (separados por vírgula)',
+ 'OptionsSearchStop' => 'O usuário pode cancelar a busca',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'Usar título principal como o original se não encontrar nenhum',
+ 'OptionsRestoreAccelerators' => 'Restore accelerators',
+ 'OptionsHistory' => 'Tamanho do histórico',
+ 'OptionsClearHistory' => 'Limpar histórico',
+ 'OptionsStyle' => 'Skin',
+ 'OptionsDontAsk' => 'Não perguntar mais',
+ 'OptionsPathProgramsGroup' => 'Aplicações',
+ 'OptionsProgramsSystem' => 'Usar programas definidos pelo sistema',
+ 'OptionsProgramsUser' => 'Usar programas especificados',
+ 'OptionsProgramsSet' => 'Escolher programas',
+ 'OptionsPathImagesGroup' => 'Imagens',
+ 'OptionsInternetDataGroup' => 'Importar dados',
+ 'OptionsInternetSettingsGroup' => 'Configurações',
+ 'OptionsDisplayInformationGroup' => 'Mostrar informação',
+ 'OptionsDisplayArticlesGroup' => 'Artigos',
+ 'OptionsImagesDisplayGroup' => 'Exibir',
+ 'OptionsImagesStyleGroup' => 'Estilo',
+ 'OptionsDetailedPreferencesGroup' => 'Preferências',
+ 'OptionsFeaturesConveniencesGroup' => 'Conveniências',
+ 'OptionsPicturesFormat' => 'Prefixo para usar nas imagens:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Título ou nome do item associado',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% ou . será substituído com a pasta da coleção (usar apenas no começo da pasta)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% será substituído pelo nome do arquivo da coleção sem o sufixo (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% pode ser usado apenas no começo da pasta de imagens',
+ 'OptionsConfigureMailers' => 'Configurar programas de e-mail',
+
+ 'ImagesOptionsButton' => 'Configurações',
+ 'ImagesOptionsTitle' => 'Configurações para lista de imagens',
+ 'ImagesOptionsSelectColor' => 'Escolha uma cor',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Fundo',
+ 'ImagesOptionsBgPicture' => 'Usar uma imagem de fundo',
+ 'ImagesOptionsFg'=> 'Seleção',
+ 'ImagesOptionsBgTooltip' => 'Trocar cor de fundo',
+ 'ImagesOptionsFgTooltip'=> 'Trocar cor de seleção',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Tamanho',
+ 'ImagesOptionsSizeList' => {0 => 'Muito Pequeno', 1 => 'Pequeno', 2 => 'Médio', 3 => 'Grande', 4 => 'Muito Grande'},
+ 'ImagesOptionsSizeTooltip' => 'Selecione um tamanho de imagem',
+
+ 'DetailedOptionsTitle' => 'Configuração para lista detalhada',
+ 'DetailedOptionsImageSize' => 'Tamanho da imagem',
+ 'DetailedOptionsGroupItems' => 'Agrupar itens por',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'Selecione os campos a exibir',
+ 'DetailedOptionsGroupedFirst' => 'Keep together orphaned items',
+ 'DetailedOptionsAddCount' => 'Add number of elements on categories',
+
+ 'ExtractButton' => 'Informação',
+ 'ExtractTitle' => 'Informação do arquivo',
+ 'ExtractImport' => 'Usar valores',
+
+ 'FieldsListOpen' => 'Ler os campos da lista de um arquivo',
+ 'FieldsListSave' => 'Salvar os campos da lista em outro arquivo',
+ 'FieldsListError' => 'Estes campos não podem ser usados com este tipo de coleção',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Exportar itens',
+ 'ExportFilter' => 'Exportar apenas itens exibidos',
+ 'ExportFieldsTitle' => 'Campos a exportar',
+ 'ExportFieldsTip' => 'Escolha os campos para exportar',
+ 'ExportWithPictures' => 'Copiar as imagens de uma sub-pasta',
+ 'ExportSortBy' => 'Sort by',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Importar outra lista de itens',
+ 'ImportExportData' => 'Informação',
+ 'ImportExportFile' => 'Arquivo',
+ 'ImportExportFieldsUnused' => 'Campos inutilizados',
+ 'ImportExportFieldsUsed' => 'Campos utilizados',
+ 'ImportExportFieldsFill' => 'Todos os campos',
+ 'ImportExportFieldsClear' => 'Nenhum campo',
+ 'ImportExportFieldsEmpty' => 'Deve assinalar ao menos um campo',
+ 'ImportExportFileEmpty' => 'Especifique um nome para o arquivo',
+ 'ImportFieldsTitle' => 'Campos a importar',
+ 'ImportFieldsTip' => 'Escolha os campos para importar',
+ 'ImportNewList' => 'Criar uma nova coleção',
+ 'ImportCurrentList' => 'Adicionar para coleção atual',
+ 'ImportDropError' => 'Ocorreu um erro ao abrir em pelo menos um arquivo. A lista anterior será recarregada.',
+ 'ImportGenerateId' => 'Gerar identificador para cada item',
+
+ 'FileChooserOpenFile' => 'Por favor, selecione um arquivo',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Escolha uma pasta',
+ 'FileChooserOverwrite' => 'Este arquivo já existe. Deseja sobrescrevê-lo?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ #Some default panels
+ 'PanelCompact' => 'Compacto',
+ 'PanelReadOnly' => 'Somente leitura',
+ 'PanelForm' => 'Abas',
+
+ 'PanelSearchButton' => 'Baixar informação',
+ 'PanelSearchTip' => 'Buscar informação na Internet para este nome',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Click na imagem para selecionar outra',
+ 'PanelImageTipView' => 'Click na imagem para vê-la em tamanho real...',
+ 'PanelImageTipMenu' => 'Click com o botão direito para mais opções.',
+ 'PanelImageTitle' => 'Selecionar uma imagem',
+ 'PanelImageNoImage' => 'Sem imagem',
+ 'PanelSelectFileTitle' => 'Selecione um arquivo',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restaurar padrões',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'De',
+ 'PanelTo' =>'Para',
+
+ 'PanelWeb' => 'Ver informação',
+ 'PanelWebTip' => 'Ver informação na Internet sobre este item', # Accepts model codes
+ 'PanelRemoveTip' => 'Apagar item atual', # Accepts model codes
+
+ 'PanelDateSelect' => 'Selecionar',
+ 'PanelNobody' => 'Ninguém',
+ 'PanelUnknown' => 'Desconhecido',
+ 'PanelAdded' => 'Adicionar data',
+ 'PanelRating' => 'Nota',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Localidade',
+
+ 'PanelLending' => 'Emprestar',
+ 'PanelBorrower' => 'Devedor',
+ 'PanelLendDate' => 'Fora desde',
+ 'PanelHistory' => 'Histórico',
+ 'PanelReturned' => 'Item devolvido', # Accepts model codes
+ 'PanelReturnDate' => 'Data de devolução',
+ 'PanelLendedYes' => 'Emprestada',
+ 'PanelLendedNo' => 'Disponível',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favourite',
+ 'TagsAssigned' => 'Assigned Tags',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Qualquer',
+ 'CheckYes' => 'Sim',
+ 'CheckNo' => 'Não',
+
+ 'ToolbarAll' => 'Ver todas',
+ 'ToolbarAllTooltip' => 'Ver todos os itens',
+ 'ToolbarGroupBy' => 'Agrupar por',
+ 'ToolbarGroupByTooltip' => 'Selecionar o campo para usar nos itens agrupados na lista',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Buscar um item',
+ 'PluginsQuery' => 'Pergunta',
+ 'PluginsFrame' => 'Site de busca',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Nome',
+ 'PluginsSearchFields' => 'Campos de busca',
+ 'PluginsAuthor' => 'Autor',
+ 'PluginsLang' => 'Idioma',
+ 'PluginsUseSite' => 'Usar site selecionado para futuras buscas',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Configuração dos devedores',
+ 'BorrowersList' => 'Devedores',
+ 'BorrowersName' => 'Nome',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Adicionar',
+ 'BorrowersRemove' => 'Apagar',
+ 'BorrowersEdit' => 'Modificar',
+ 'BorrowersTemplate' => 'Modelo do e-mail',
+ 'BorrowersSubject' => 'Assunto do e-mail',
+ 'BorrowersNotice1' => '%1 será substituído pelo nome do devedor',
+ 'BorrowersNotice2' => '%2 será substituído pelo título do item',
+ 'BorrowersNotice3' => '%3 será substituído pela data do empréstimo',
+
+ 'BorrowersImportTitle' => 'Importar informação dos devedores',
+ 'BorrowersImportType' => 'Formato do arquivo:',
+ 'BorrowersImportFile' => 'Arquivo:',
+
+ 'BorrowedTitle' => 'Itens emprestados', # Accepts model codes
+ 'BorrowedDate' => 'Desde',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'Enviar um e-mail',
+ 'MailFrom' => 'De: ',
+ 'MailTo' => 'Para: ',
+ 'MailSubject' => 'Assunto: ',
+ 'MailSmtpError' => 'Problema de conexão com o servidor SMTP',
+ 'MailSendmailError' => 'Problema na execução do sendmail',
+
+ 'SearchTooltip' => 'Buscar em todos itens', # Accepts model codes
+ 'SearchTitle' => 'Busca de itens', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Campo para substituição',
+ 'QueryReplaceOld' => 'Nome atual',
+ 'QueryReplaceNew' => 'Novo nome',
+ 'QueryReplaceLaunch' => 'Substituir',
+
+ 'ImportWindowTitle' => 'Escolher os campos para importar',
+ 'ImportViewPicture' => 'Ver a imagem',
+ 'ImportSelectAll' => 'Selecionar todos',
+ 'ImportSelectNone' => 'Selecionar nenhum',
+
+ 'MultiSiteTitle' => 'Sites de busca',
+ 'MultiSiteUnused' => 'Plugins inutilizados',
+ 'MultiSiteUsed' => 'Plugins para usar',
+ 'MultiSiteLang' => 'Selecionar plugins em português',
+ 'MultiSiteEmptyError' => 'A lista de sites está vazia',
+ 'MultiSiteClear' => 'Limpar lista',
+
+ 'DisplayOptionsTitle' => 'Elementos a exibir',
+ 'DisplayOptionsAll' => 'Selecionar todos',
+ 'DisplayOptionsSearch' => 'Buscar',
+
+ 'GenresTitle' => 'Conversão de Gêneros',
+ 'GenresCategoryName' => 'Gênero a usar',
+ 'GenresCategoryMembers' => 'Gêneros a substituir',
+ 'GenresLoad' => 'Carregar uma lista',
+ 'GenresExport' => 'Exportar lista para arquivo',
+ 'GenresModify' => 'Editar conversão',
+
+ 'PropertiesName' => 'Nome da coleção',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Dono',
+ 'PropertiesEmail' => 'E-mail',
+ 'PropertiesDescription' => 'Descrição',
+ 'PropertiesFile' => 'Informação do arquivo',
+ 'PropertiesFilePath' => 'Caminho completo',
+ 'PropertiesItemsNumber' => 'Número de itens', # Accepts model codes
+ 'PropertiesFileSize' => 'Tamanho',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Propriedades da coleção',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Programas para enviar e-mails',
+ 'MailProgramsName' => 'Nome',
+ 'MailProgramsCommand' => 'Linha de comando',
+ 'MailProgramsRestore' => 'Restaurar padrões',
+ 'MailProgramsAdd' => 'Adicionar um programa',
+ 'MailProgramsInstructions' => 'Na linha de comandos, algumas substituições são feitas:
+ %f será sustituído pelo e-mail do usuário.
+ %t será sustituído pelo e-mail do destinatario.
+ %s será sustituído pelo assunto da mensagem.
+ %b será sustituído pelo corpo da mensagem.',
+
+ 'BookmarksBookmarks' => 'Favoritos',
+ 'BookmarksFolder' => 'Pastas',
+ 'BookmarksLabel' => 'Nome',
+ 'BookmarksPath' => 'Caminho',
+ 'BookmarksNewFolder' => 'Nova pasta',
+
+ 'AdvancedSearchType' => 'Tipo de busca',
+ 'AdvancedSearchTypeAnd' => 'Itens que cumpram todos os critérios', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Itens que cumpram pelo menos um critério', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Critério',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Bug report generated from GCstar',
+ 'BugReportVersion' => 'Version',
+ 'BugReportPlatform' => 'Operating system',
+ 'BugReportMessage' => 'Error message',
+ 'BugReportInformation' => 'Additional information',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/README b/lib/gcstar/GCLang/README
new file mode 100644
index 0000000..13c4fb3
--- /dev/null
+++ b/lib/gcstar/GCLang/README
@@ -0,0 +1,42 @@
+About Translations
+------------------
+
+GCstar translations are stored in seperate folders off the lib/gcstar/GCLang folder. Inside each language folder should be a file named GCstar.pm, and three subfolders: GCExport, GCImport and GCModels. The file GCstar.pm stores most of the common translations for the program. GCExport and GCImport are used for translations for the export and import plugins respectively, and GCModels stores translations for each individual model type (together with a file GCgeneric.pm, which is used for user-created collections types).
+
+Since version 1.5.0, a system for model-dependant strings was introduced. Some of the language strings are modified run-time to include the model-specific item type. Inside these strings, any strings contained in {}'s will be replaced by the corresponding string from the Item collection in the model language file. A good example is in the english translations, where each file in the GCModels folder contains an item collection similar to:
+ Items => {0 => 'Movie',
+ 1 => 'Movie',
+ X => 'Movies',
+ lowercase1 => 'movie',
+ lowercaseX => 'movies'
+ },
+
+Within model-dependant strings, gcstar will replace any instances of strings like {lowercase1} with the corresponding string from the model file. For example,
+'MenuLend' => 'Display _Borrowed {X}', will be converted to 'Display _Borrowed Movies' when a GCfilms model is loaded.
+'NewItemTooltip' => 'Add a new {lowercase1}', will be converted to 'Add a new movie'.
+
+A more complex example is the spanish language translation, where the items collection follows the pattern:
+ Items => {0 => 'Libro',
+ 1 => 'Libro',
+ lowercase1 => 'libro',
+ X => 'Libros',
+ lowercaseX => 'libros',
+ P1 => 'El Libro',
+ lowercaseP1 => 'el libro',
+ U1 => 'Un Libro',
+ lowercaseU1 => 'un libro',
+ AP1 => 'Al Libro',
+ lowercaseAP1 => 'al libro',
+ DP1 => 'Del Libro',
+ lowercaseDP1 => 'del libro',
+ PX => 'Los Libros',
+ lowercasePX => 'los libros',
+ E1 => 'Este Libro',
+ lowercaseE1 => 'este libro',
+ EX => 'Estos Libros',
+ lowercaseEX => 'estos libros'
+ },
+
+In this case, the string 'RemoveConfirm' => '¿Realmente quiere eliminar {lowercaseE1}?' will be converted to '¿Realmente quiere eliminar este libro?'.
+
+You can use these model-specific codes in any string marked by a "Accepts model codes" comment.
diff --git a/lib/gcstar/GCLang/RO/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/RO/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..3753e8c
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::RO::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Include numele câmpurilor în partea superioară',
+ 'Separator' => 'Separator',
+ 'Replacement' => 'Înlocuieşte separatorul cu',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/RO/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..9dccf1d
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::RO::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/RO/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..4a62051
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::RO::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Invalid template file',
+ 'UseFile' => 'Use file specified below',
+ 'TemplateExternalFile' => 'Template file',
+ 'WithJS' => 'Foloseşte Javascript',
+ 'FileTemplate' => 'Şablon :',
+ 'Preview' => 'Previzualizare',
+ 'NoPreview' => 'Previzualizare nedisponibilă',
+ 'Title' => 'Titlu pagină',
+ 'InfoFile' => 'Lista de filme este în fişierul: ',
+ 'InfoDir' => 'Imaginile sunt în: ',
+ 'HeightImg' => 'Înălţimea (în pixeli) a imaginilor exportate: ',
+ 'OpenFileInBrowser' => 'Deschide fişierul generat într-un navigator web',
+ 'Note' => 'Listă generată de către <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Introduceţi textul pentru căutare',
+ 'SearchType1' => 'Doar titlul',
+ 'SearchType2' => 'Informaţii complete',
+ 'SearchButton' => 'Caută',
+ 'SearchTitle' => 'Afişează doar filmele ce se potrivesc criteriului precedent',
+ 'AllButton' => 'Toate',
+ 'AllTitle' => 'Afişează toate filmele',
+ 'Expand' => 'Extinde tot',
+ 'ExpandTitle' => 'Afişează toate informaţiile filmelor',
+ 'Collapse' => 'Restrânge tot',
+ 'CollapseTitle' => 'Ascunde informaţiile filmelor',
+ 'Borrowed' => 'Împrumutat de către: ',
+ 'NotBorrowed' => 'Disponibil',
+ 'Top' => 'Sus',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/RO/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..2571c5a
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::RO::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/RO/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..fa65f3c
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::RO::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Include instrucţiuni DROP',
+ 'WithCreate' => 'Include instrucţiuni CREATE',
+ 'TableName' => 'Nume tabel',
+ 'InfoFile' => 'Fişier SQL: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/RO/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..ea231aa
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::RO::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Arhiva este în fişierul: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/RO/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..b4fe21e
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::RO::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Fişier şablon',
+ 'ModelText' => 'Şablon text',
+ 'Models' => 'Şablonul folosit',
+ 'UseFile' => 'Foloseşte fişier',
+ 'UseModel' => 'Foloseşte zona de text',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/RO/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..37b47cf
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::RO::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Unde ar trebui să caute',
+ 'Default' => 'Directorul implicit pentru Alexandria',
+ 'Specified' => 'Directorul specificat mai jos',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/RO/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..d912392
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::RO::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Ignoră prima linie',
+ 'Separator' => 'Separator',
+ 'Plugin' => 'Situl folosit',
+ 'UseFirst' => 'Selectaţi primul în caz de prea multe rezultate',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/RO/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..a83715c
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::RO::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/RO/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..4ac4341
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::RO::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copiază imaginile',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCImport/GCImportList.pm b/lib/gcstar/GCLang/RO/GCImport/GCImportList.pm
new file mode 100644
index 0000000..591cf2f
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::RO::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Listă titluri',
+ 'Plugin' => 'Situl folosit',
+ 'UseFirst' => 'Selectaţi primul în caz de prea multe rezultate',
+ 'CommentAuto' => 'Film importat automat.',
+ 'CommentSite' => 'Sit web: ',
+ 'CommentTitle' => 'Titlu: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/RO/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..9d5155f
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::RO::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/RO/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..8a39d84
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::RO::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Fişierul nu este o colecţie video Tellico',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/RO/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..199d288
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::RO::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/RO/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..735a4f3
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::RO::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/RO/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..ea32d12
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::RO::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colecţie de jocuri de masă',
+ Items => {0 => 'Joc',
+ 1 => 'Joc',
+ X => 'Jocuri'},
+ NewItem => 'Joc nou',
+
+ Id => 'Id',
+ Name => 'Nume',
+ Original => 'Nume original',
+ Box => 'Imagine cutie',
+ DesignedBy => 'Conceput de',
+ PublishedBy => 'Publicat de',
+ Players => 'Număr de jucători',
+ PlayingTime => 'Durată joc',
+ SuggestedAge => 'Vârstă sugerată',
+ Released => 'Lansat',
+ Description => 'Descriere',
+ Category => 'Categorie',
+ Mechanics => 'Mecanică',
+ ExpandedBy => 'Extins de',
+ ExpansionFor => 'Extindere la',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Pagină web',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Conţinut complet',
+ Copies => 'No. of copies',
+ Condition => 'Condiţie',
+ Photos => 'Imagini',
+ Photo1 => 'Prima imagine',
+ Photo2 => 'A doua imagine',
+ Photo3 => 'A treia imagine',
+ Photo4 => 'A patra imagine',
+ Comments => 'Comentarii',
+
+ Perfect => 'Perfect',
+ Good => 'Bun',
+ Average => 'Mediu',
+ Poor => 'Slab',
+
+ CompleteYes => 'Conţinut complet',
+ CompleteNo => 'Piese lipsă',
+
+ General => 'General',
+ Details => 'Detalii',
+ Personal => 'Personal',
+ Information => 'Informaţii',
+
+ FilterRatingSelect => 'Evaluat la cel _puţin...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCbooks.pm b/lib/gcstar/GCLang/RO/GCModels/GCbooks.pm
new file mode 100644
index 0000000..d8a5ff3
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCbooks.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::RO::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colecţie de cărţi',
+ Items => 'Cărţi',
+ NewItem => 'Carte nouă',
+
+ Isbn => 'ISBN',
+ Title => 'Tilu',
+ Cover => 'Copertă',
+ Authors => 'Autori',
+ Publisher => 'Editură',
+ Publication => 'Dată editare',
+ Language => 'Limbă',
+ Genre => 'Gen',
+ Serie => 'Colecţie',
+ Rank => 'Poziţie',
+ Bookdescription => 'Descriere',
+ Pages => 'Pagini',
+ Read => 'Citită',
+ Acquisition => 'Dată cumpărare',
+ Edition => 'Ediţie',
+ Format => 'Format',
+ Comments => 'Comentarii',
+ Url => 'Pagina web',
+ Translator => 'Traducător',
+ Artist => 'Artist',
+ DigitalFile => 'Digital version',
+
+ General => 'General',
+ Details => 'Detalii',
+
+ ReadNo => 'Necitită',
+ ReadYes => 'Citită',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCcoins.pm b/lib/gcstar/GCLang/RO/GCModels/GCcoins.pm
new file mode 100644
index 0000000..5800e6a
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCcoins.pm
@@ -0,0 +1,101 @@
+{
+ package GCLang::RO::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colecţie numismatică',
+ Items => 'Monezi',
+ NewItem => 'Monedă nouă',
+
+ Name => 'Nume',
+ Country => 'Ţară',
+ Year => 'An',
+ Currency => 'Monedă',
+ Value => 'Valoare',
+ Picture => 'Imagine principală',
+ Diameter => 'Diametru',
+ Metal => 'Metal',
+ Edge => 'Muchie',
+ Edge1 => 'Muchie 1',
+ Edge2 => 'Muchie 2',
+ Edge3 => 'Muchie 3',
+ Edge4 => 'Muchie 4',
+ Head => 'Cap',
+ Tail => 'Pajură',
+ Comments => 'Comentarii',
+ History => 'Istoric',
+ Website => 'Sit web',
+ Estimate => 'Estimare',
+ References => 'Referinţe',
+ Type => 'Tip',
+ Coin => 'Monedă',
+ Banknote => 'Bancnotă',
+
+ Main => 'Principal',
+ Description => 'Descriere',
+ Other => 'Alte informaţii',
+ Pictures => 'Imagini',
+
+ Condition => 'Condiţie (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCcomics.pm b/lib/gcstar/GCLang/RO/GCModels/GCcomics.pm
new file mode 100644
index 0000000..d7fee2c
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::RO::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCfilms.pm b/lib/gcstar/GCLang/RO/GCModels/GCfilms.pm
new file mode 100644
index 0000000..6503f40
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCfilms.pm
@@ -0,0 +1,91 @@
+{
+ package GCLang::RO::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colecţie filme',
+ Items => 'Filme',
+ NewItem => 'Film nou',
+
+
+ Id => 'Id',
+ Title => 'Titlu',
+ Date => 'Dată',
+ Time => 'Durată',
+ Director => 'Regizor',
+ Country => 'Ţară',
+ MinimumAge => 'Vârstă minimă',
+ Genre => 'Gen',
+ Image => 'Imagine',
+ Original => 'Titlu original',
+ Actors => 'Distribuţie',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'Comentarii',
+ Synopsis => 'Rezumat',
+ Seen => 'Vizionat',
+ Number => 'Numărul',
+ Format => 'Mediu',
+ Region => 'Region',
+ Identifier => 'Identificator',
+ Url => 'Web',
+ Audio => 'Audio',
+ Video => 'Format video',
+ Trailer => 'Fişier video',
+ Serie => 'Colecţie',
+ Rank => 'Poziţie',
+ Subtitles => 'Subtitrări',
+
+ SeenYes => 'Vizionat',
+ SeenNo => 'Nevizionat',
+
+ AgeUnrated => 'Neevaluat',
+ AgeAll => 'Toate vârstele',
+ AgeParent => 'Acord parental',
+
+ Main => 'Elemente principale',
+ General => 'General',
+ Details => 'Detalii',
+
+ Information => 'Informaţii',
+ Languages => 'Limbi',
+ Encoding => 'Codare',
+
+ FilterAudienceAge => 'Vârstă public',
+ FilterSeenNo => '_Nevizionat',
+ FilterSeenYes => '_Deja vizionat',
+ FilterRatingSelect => 'Evaluat la cel _puţin...',
+
+ ExtractSize => 'Mărime',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCgames.pm b/lib/gcstar/GCLang/RO/GCModels/GCgames.pm
new file mode 100644
index 0000000..13d0a40
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCgames.pm
@@ -0,0 +1,80 @@
+{
+ package GCLang::RO::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colecţie de jocuri video',
+ Items => 'Jocuri',
+ NewItem => 'Joc nou',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Nume',
+ Platform => 'Platformă',
+ Players => 'Număr de jucători',
+ Released => 'Dată lansare',
+ Editor => 'Editor',
+ Developer => 'Dezvoltator',
+ Genre => 'Gen',
+ Box => 'Imagine cutie',
+ Case => 'Carcasă',
+ Manual => 'Manual de instrucţiuni',
+ Completion => 'Completat (%)',
+ Executable => 'Executabil',
+ Description => 'Descriere',
+ Codes => 'Coduri',
+ Code => 'Cod',
+ Effect => 'Efecte',
+ Secrets => 'Secrete',
+ Screenshots => 'Capturi ecran',
+ Screenshot1 => 'Prima captura de ecran',
+ Screenshot2 => 'A doua captură de ecran',
+ Comments => 'Comentarii',
+ Url => 'Pagină web',
+ Unlockables => 'Deblocări',
+ Unlockable => 'Nu poate fi deblocat',
+ Howto => 'Cum se deblochează',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'General',
+ Details => 'Detalii',
+ Tips => 'Ponturi',
+ Information => 'Informaţii',
+
+ FilterRatingSelect => 'Evaluat la cel _puţin...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/RO/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..3b46b2b
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::RO::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCminicars.pm b/lib/gcstar/GCLang/RO/GCModels/GCminicars.pm
new file mode 100644
index 0000000..84f9c85
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::RO::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCmusics.pm b/lib/gcstar/GCLang/RO/GCModels/GCmusics.pm
new file mode 100644
index 0000000..55da50e
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCmusics.pm
@@ -0,0 +1,66 @@
+{
+ package GCLang::RO::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colecţie de muzică',
+ Items => 'Albume',
+ NewItem => 'Album nou',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Titlu',
+ Cover => 'Copertă',
+ Artist => 'Artist',
+ Format => 'Format',
+ Running => 'Durată',
+ Release => 'Dată lansare',
+ Genre => 'Gen',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Listă piese',
+ Number => 'Număr',
+ Track => 'Titlu',
+ Time => 'Durată',
+
+ Composer => 'Compozitor',
+ Producer => 'Producător',
+ Playlist => 'Listă de redare',
+ Comments => 'Comentarii',
+ Label => 'Etichetă',
+ Url => 'Pagină web',
+
+ General => 'General',
+ Details => 'Detalii',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/RO/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..b9297d7
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::RO::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/RO/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..f0196bd
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::RO::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/RO/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..30638f3
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::RO::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCstamps.pm b/lib/gcstar/GCLang/RO/GCModels/GCstamps.pm
new file mode 100644
index 0000000..3968651
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::RO::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCwines.pm b/lib/gcstar/GCLang/RO/GCModels/GCwines.pm
new file mode 100644
index 0000000..2b9c37d
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::RO::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colecţie de vinuri',
+ Items => 'Vinuri',
+ NewItem => 'Vin nou',
+
+ Name => 'Nume',
+ Designation => 'Destinaţie',
+ Vintage => 'Recoltă',
+ Vineyard => 'Podgorie',
+ Type => 'Tip',
+ Grapes => 'Struguri',
+ Soil => 'Sol',
+ Producer => 'Producător',
+ Country => 'Ţară',
+ Volume => 'Volum (ml)',
+ Alcohol => 'Alcool (%)',
+ Medal => 'Medalii/Premii',
+
+ Storage => 'Depozitare',
+ Location => 'Locaţie',
+ ShelfIndex => 'Index',
+ Quantity => 'Cantitate',
+ Acquisition => 'Achiziţie',
+ PurchaseDate => 'Dată cumpărare',
+ PurchasePrice => 'Preţ cumpărare',
+ Gift => 'Cadou',
+ BottleLabel => 'Etichetă sticlă',
+ Website => 'Referinţe pe web',
+
+ Tasted => 'Degustat',
+ Comments => 'Comentarii',
+ Serving => 'Porţie',
+ TastingField => 'Note testare',
+
+ General => 'General',
+ Details => 'Detalii',
+ Tasting => 'Degustare',
+
+ TastedNo => 'Nu a fost degustat',
+ TastedYes => 'Degustat',
+
+ FilterRange => 'Limite',
+ FilterTastedNo => '_Nu a fost încă degustat',
+ FilterTastedYes => 'Deja _degustat',
+ FilterRatingSelect => 'Evaluat la cel _puţin...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCstar.pm b/lib/gcstar/GCLang/RO/GCstar.pm
new file mode 100644
index 0000000..94fbb4a
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCstar.pm
@@ -0,0 +1,672 @@
+{
+ package GCLang::RO;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Română',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Atenţie</b>:
+
+Informaţiile transferate de pe siturile web (prin intermediul
+modulelor de căutare) sunt <b>doar pentru uz personal</b>.
+
+Orice redistribuire este interzisă fără <b>autorizarea
+explicită</b> a sitului web.
+
+Pentru a determina ce sit web este proprietarul informaţiei,
+puteţi folosi <b>butonul aflat sub detaliile filmului</b>.',
+
+ 'AllItemsFiltered' => 'Nici un element nu se potriveşte criteriilor dumneavoastră de filtrare', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Instalare în ',
+ 'InstallMandatory' => 'Componente obligatorii',
+ 'InstallOptional' => 'Componente opţionale',
+ 'InstallErrorMissing' => 'Eroare : Următoarele componente Perl trebuie instalate: ',
+ 'InstallPrompt' => 'Directorul principal pentru instalare [/usr/local]: ',
+ 'InstallEnd' => 'Sfârşitul instalării',
+ 'InstallNoError' => 'Nici o eroare',
+ 'InstallLaunch' => 'Pentru a folosi acestă aplicaţie, se poate porni ',
+ 'InstallDirectory' => 'Directorul principal',
+ 'InstallTitle' => 'Instalare GCstar',
+ 'InstallDependencies' => 'Dependinţe',
+ 'InstallPath' => 'Cale',
+ 'InstallOptions' => 'Opţiuni',
+ 'InstallSelectDirectory' => 'Selectaţi directorul principal pentru instalare',
+ 'InstallWithClean' => 'Şterge fişierele aflate în directorul de instalare',
+ 'InstallWithMenu' => 'Adaugă GCstar la meniul Aplicaţii',
+ 'InstallNoPermission' => 'Eroare: Nu aveţi permisiunile necesare pentru a scrie în directorul selectat',
+ 'InstallMissingMandatory' => 'Dependinţe esenţiale lipsesc. Nu veţi putea instala GCstar până când acestea nu vor fi prezente pe sistemul dumneavoastră.',
+ 'InstallMissingOptional' => 'Unele dependinţe opţionale lipsesc. Acestea sunt listate mai jos. GCstar poate fi instalat dar unele facilităţi ar putea să nu fie disponibile.',
+ 'InstallMissingNone' => 'Toate dependinţele sunt satisfăcute. Puteţi continua cu instalarea GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Lipsă',
+ 'InstallMissingFor' => 'Lipsă pentru',
+ 'InstallCleanDirectory' => 'Şterg fişierele GCstar din directorul: ',
+ 'InstallCopyDirectory' => 'Copiez fişierele în directorul: ',
+ 'InstallCopyDesktop' => 'Copiez fişierul desktop ‪în: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy-ul folosit (apăsaţi enter dacă nu e nevoie de unul): ',
+ 'UpdateNoPermission' => 'Nu există permsiuni pentru scriere în acest director: ',
+ 'UpdateNone' => 'Nici o actualizare nu a fost găsită',
+ 'UpdateFileNotFound' => 'Fişierul nu a fost găsit',
+
+#Splash
+ 'SplashInit' => 'Iniţializare',
+ 'SplashLoad' => 'Încărcare colecţie',
+ 'SplashDisplay' => 'Afişare colecţie',
+ 'SplashSort' => 'Sortare colecţie',
+ 'SplashDone' => 'Gata',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Se pare că foloseaţi GCfilms anterior. Ce doriţi să importaţi din GCfilms în GCstar (nu va influeţa GCfilms în cazul în care încă îl mai folosiţi)?',
+ 'GCfilmsImportOptions' => 'Setări',
+ 'GCfilmsImportData' => 'Listă filme',
+
+#Menus
+ 'MenuFile' => '_Fişier',
+ 'MenuNewList' => 'Colecţie _nouă',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => 'Colecţii _recente',
+ 'MenuLend' => 'Afişează elementele î_mprumutate', # Accepts model codes
+ 'MenuImport' => '_Importă',
+ 'MenuExport' => '_Exportă',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Editare',
+ 'MenuDuplicate' => '_Duplică element', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => 'Ş_terge element', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => 'S_chimbă câmpurile colecţiei',
+ 'MenuEditLockItems' => 'B_lochează colecţia',
+
+ 'MenuDisplay' => 'F_iltrare',
+ 'MenuSavedSearches' => 'Saved searches',
+ 'MenuSavedSearchesSave' => 'Save current search',
+ 'MenuSavedSearchesEdit' => 'Modify saved searches',
+ 'MenuAdvancedSearch' => 'Căutare a_vansată',
+ 'MenuViewAllItems' => 'Afişează to_ate elementele', # Accepts model codes
+ 'MenuNoFilter' => '_Oricare',
+
+ 'MenuConfiguration' => '_Setări',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Informaţii afişate',
+ 'MenuBorrowers' => '_Persoane care au împrumutat',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '_Conversie gen',
+
+ 'MenuBookmarks' => '_Colecţiile mele',
+ 'MenuBookmarksAdd' => '_Adaugă colecţia curentă',
+ 'MenuBookmarksEdit' => '_Editează colecţiile favorite',
+
+ 'MenuHelp' => '_Ajutor',
+ 'MenuHelpContent' => '_Ajutor',
+ 'MenuAllPlugins' => 'Arată _modulele',
+ 'MenuBugReport' => 'Raportează un _bug',
+ 'MenuAbout' => '_Despre GCstar',
+
+ 'MenuNewWindow' => 'Afişează elementul în fereastră _nouă', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Desfă tot',
+ 'ContextCollapseAll' => 'Strânge tot',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Vă rugăm introduceţi o valoare',
+
+ 'RemoveConfirm' => 'Sunteţi sigur că doriţi să ştergeţi acest element?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'Element nou', # Accepts model codes
+ 'NewItemTooltip' => 'Adaugă un element nou', # Accepts model codes
+ 'NoItemFound' => 'Nu a fost găsit nimic. Doriţi să căutaţi pe alt sit?',
+ 'OpenList' => 'Vă rugăm selectaţi colecţia',
+ 'SaveList' => 'Vă rugăm alegeţi unde să salvaţi colecţia',
+ 'SaveListTooltip' => 'Salvează colecţia curentă',
+ 'SaveUnsavedChanges' => 'Aveţi modificări nesalvate în colecţia dumneavoastră. Doriţi să le salvaţi?',
+ 'SaveDontSave' => 'Nu salva',
+ 'PreferencesTooltip' => 'Setaţi preferinţele dumneavoastră',
+ 'ViewTooltip' => 'Schimbă afişarea colecţiei',
+ 'PlayTooltip' => 'Redă fişierul video asociat acestui element', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Salvez...',
+ 'StatusLoad' => 'Încarc...',
+ 'StatusSearch' => 'Căutare în curs...',
+ 'StatusGetInfo' => 'Obţin informaţiile...',
+ 'StatusGetImage' => 'Obţin imaginea...',
+
+ 'SaveError' => 'Nu am putut salva lista de elemente. Vă rugăm verificaţi drepturile de acces şi spaţiul liber pe disc.',
+ 'OpenError' => 'Nu am putut deschide lista de elemente. Vă rugăm verificaţi drepturile de acces.',
+ 'OpenFormatError' => 'Nu am putut deschide lista de elemente.',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'Directorul selectat pentru a salva imaginile nu este corect. Vă rugăm selectaţi alt director.',
+ 'OptionsCreationError'=> 'Nu pot crea fişierul de opţiuni: ',
+ 'OptionsOpenError'=> 'Nu pot deschide fişierul de opţiuni: ',
+ 'OptionsSaveError'=> 'Nu pot salva fişierul de opţiuni: ',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'Ce să vedem în acestă seară?',
+ 'RandomError'=> 'Nu aveţi nici un element care să poate fi selectat', # Accepts model codes
+ 'RandomEnd'=> 'Nu mai sunt alte elemente', # Accepts model codes
+ 'RandomNextTip'=> 'Următoarea sugestie',
+ 'RandomOkTip'=> 'Acceptă acest element',
+
+ 'AboutTitle' => 'Despre GCstar',
+ 'AboutDesc' => 'Manager de colecţii',
+ 'AboutVersion' => 'Versiune',
+ 'AboutTeam' => 'Echipa',
+ 'AboutWho' => 'Christian Jodar (Tian): Manager de proiect, programator
+Nyall Dawson (Zombiepig) : Programator
+TPF : Programator
+Adolfo González : Programator
+',
+ 'AboutLicense' => 'Distribuit în termenii licenţei GNU GPL
+Copyright logo le Spektre',
+ 'AboutTranslation' => 'Traducerea în română de către Mugurel Tudor',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logo şi design web de către le Spektre',
+
+ 'ToolbarRandom' => 'În seara asta',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+ 'ModelsSelect' => 'Selectaţi un tip de colecţie',
+ 'ModelsPersonal' => 'Modele personale',
+ 'ModelsDefault' => 'Modele implicite',
+ 'ModelsList' => 'Definire colecţie',
+ 'ModelSettings' => 'Setări colecţie',
+ 'ModelNewType' => 'Nou tip de colecţie',
+ 'ModelName' => 'Numele tipului de colecţie:',
+ 'ModelFields' => 'Câmpuri',
+ 'ModelOptions' => 'Opţiuni',
+ 'ModelFilters' => 'Filtre',
+ 'ModelNewField' => 'Câmp nou',
+ 'ModelFieldInformation' => 'Informaţii',
+ 'ModelFieldName' => 'Etichetă:',
+ 'ModelFieldType' => 'Tip:',
+ 'ModelFieldGroup' => 'Grup:',
+ 'ModelFieldValues' => 'Valori',
+ 'ModelFieldInit' => 'Implicit:',
+ 'ModelFieldMin' => 'Minim:',
+ 'ModelFieldMax' => 'Maxim:',
+ 'ModelFieldList' => 'Listă valori:',
+ 'ModelFieldListLegend' => '<i>Separare prin virgulă</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Text scurt',
+ 'ModelFieldTypeLongText' => 'Text lung',
+ 'ModelFieldTypeYesNo' => 'Da/Nu',
+ 'ModelFieldTypeNumber' => 'Număr',
+ 'ModelFieldTypeDate' => 'Dată',
+ 'ModelFieldTypeOptions' => 'Listă predefinită de valori',
+ 'ModelFieldTypeImage' => 'Imagine',
+ 'ModelFieldTypeSingleList' => 'Listă simplă',
+ 'ModelFieldTypeFile' => 'Fişier',
+ 'ModelFieldTypeFormatted' => 'Depinde de alte câmpuri',
+ 'ModelFieldParameters' => 'Parametri',
+ 'ModelFieldHasHistory' => 'Foloseşte un istoric',
+ 'ModelFieldFlat' => 'Afişare pe o linie',
+ 'ModelFieldStep' => 'Pas de incrementare:',
+ 'ModelFieldFileFormat' => 'Format fişier:',
+ 'ModelFieldFileFile' => 'Fişier simplu',
+ 'ModelFieldFileImage' => 'Imagine',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Câmpuri folosite',
+ 'ModelOptionsFieldsAuto' => 'Automat',
+ 'ModelOptionsFieldsNone' => 'Nici unul',
+ 'ModelOptionsFieldsTitle' => 'Ca titlu',
+ 'ModelOptionsFieldsId' => 'Ca identificator',
+ 'ModelOptionsFieldsCover' => 'Ca şi copertă',
+ 'ModelOptionsFieldsPlay' => 'Pentru butonul de redare',
+ 'ModelCollectionSettings' => 'Setări colecţie',
+ 'ModelCollectionSettingsLending' => 'Elementele pot fi împrumutate',
+ 'ModelCollectionSettingsTagging' => 'Items can be tagged',
+ 'ModelFilterActivated' => 'Ar trebui să apară în fereastra de căutare',
+ 'ModelFilterComparison' => 'Comparaţie',
+ 'ModelFilterContain' => 'Conţine',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Domeniu',
+ 'ModelFilterNumeric' => 'Comparaţia e numerică',
+ 'ModelFilterQuick' => 'Creaţi un filtru rapid',
+ 'ModelTooltipName' => 'Folosiţi un nume pentru a reutiliza acest model pentru mai multe colecţii. Dacă este gol, setările vor fi stocate direct în colecţie',
+ 'ModelTooltipLabel' => 'Numele câmpului aşa cum va fi afişat',
+ 'ModelTooltipGroup' => 'Folosit pentru a grupa câmpurile. Elementele care nu au o valoare aici vor fi într-un grup implicit',
+ 'ModelTooltipHistory' => 'Dacă elementele introduse anterior vor fi stocate într-o listă asociată acestui câmp',
+ 'ModelTooltipFormat' => 'Acest format este folosit pentru a determina acţiunea de a deschide un fişier cu butonul de Redare',
+ 'ModelTooltipLending' => 'Aceasta va adăuga unele câmpuri pentru a gestiona împrumuturile',
+ 'ModelTooltipTagging' => 'This will add some fields to manage tags',
+ 'ModelTooltipNumeric' => 'Dacă valorile trebuie considerate ca numere în comparaţii',
+ 'ModelTooltipQuick' => 'Aceasta va adăuga un submeniu la Filtre',
+
+ 'ResultsTitle' => 'Selectaţi un element', # Accepts model codes
+ 'ResultsNextTip' => 'Caută pe următorul sit',
+ 'ResultsPreview' => 'Previzualizare',
+ 'ResultsInfo' => 'You can add multiple items to the collection by holding down the Ctrl or the Shift key and selecting them', # Accepts model codes
+
+ 'OptionsTitle' => 'Preferinţe',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Navigator web',
+ 'OptionsPlayer' => 'Player video',
+ 'OptionsAudio' => 'Player audio',
+ 'OptionsImageEditor' => 'Image editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Director de imagini',
+ 'OptionsUseRelativePaths' => 'Foloseşte căi relative pentru imagini',
+ 'OptionsLayout' => 'Layout',
+ 'OptionsStatus' => 'Afişează bara de status',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Atenţie: Modificările din acest tab nu vor avea efect decât după repornirea aplicaţiei.',
+ 'OptionsRemoveConfirm' => 'Cere o confirmare înainte de ştergerea elementului',
+ 'OptionsAutoSave' => 'Salvează colecţia automat',
+ 'OptionsAutoLoad' => 'Încarcă colecţia anterioară la pornire',
+ 'OptionsSplash' => 'Afişează ecranul de pornire',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Use spelling checker for long text fields',
+ 'OptionsProgramTitle' => 'Selectaţi programul ce va fi folosit',
+ 'OptionsPlugins' => 'Situl de la care se vor obţine informaţiile',
+ 'OptionsAskPlugins' => 'Întreabă (toate siturile)',
+ 'OptionsPluginsMulti' => 'Multe situri',
+ 'OptionsPluginsMultiAsk' => 'Întreabă (multe situri)',
+ 'OptionsPluginsMultiPerField' => 'Multe situri (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Setează lista',
+ 'OptionsAskImport' => 'Selectează câmpurile ce vor fi importate',
+ 'OptionsProxy' => 'Foloseşte un proxy',
+ 'OptionsCookieJar' => 'Foloseşte acest fişier cookie',
+ 'OptionsLang' => 'Limbă',
+ 'OptionsMain' => 'Principal',
+ 'OptionsPaths' => 'Căi',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Facilităţi',
+ 'OptionsDisplay' => 'Afişare',
+ 'OptionsToolbar' => 'Bară de unelte',
+ 'OptionsToolbars' => {0 => 'Fără', 1 => 'Mică', 2 => 'Mare', 3 => 'Setări sistem'},
+ 'OptionsToolbarPosition' => 'Poziţie',
+ 'OptionsToolbarPositions' => {0 => 'Sus', 1 => 'Jos', 2 => 'Stânga', 3 => 'Dreapta'},
+ 'OptionsExpandersMode' => 'Desfăsurători prea lungi',
+ 'OptionsExpandersModes' => {'asis' => 'Ignoră', 'cut' => 'Taie', 'wrap' => 'Rupe linia'},
+ 'OptionsDateFormat' => 'Format dată',
+ 'OptionsDateFormatTooltip' => 'Formatul este cel folosit de strftime(3). Implicit este %d/%m/%Y.',
+ 'OptionsView' => 'Afişare',
+ 'OptionsViews' => {0 => 'Text', 1 => 'Imagine', 2 => 'Detalii'},
+ 'OptionsColumns' => 'Coloane',
+ 'OptionsMailer' => 'Trimitere email',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'Email-ul dumneavoastră',
+ 'OptionsTransform' => 'Plasează articolele la sfârşitul titlurilor',
+ 'OptionsArticles' => 'Articole (separate prin virgulă)',
+ 'OptionsSearchStop' => 'Permite întreruperea căutărilor',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'Foloseşte titlul principal ca titlu original în cazul în care acesta nu este prezent',
+ 'OptionsRestoreAccelerators' => 'Restore accelerators',
+ 'OptionsHistory' => 'Mărime istoric',
+ 'OptionsClearHistory' => 'Şterge istoricul',
+ 'OptionsStyle' => 'Temă',
+ 'OptionsDontAsk' => 'Nu mai întreba din nou',
+ 'OptionsPathProgramsGroup' => 'Aplicaţii',
+ 'OptionsProgramsSystem' => 'Foloseşte programele definite de sistem',
+ 'OptionsProgramsUser' => 'Foloseşte programele specificate',
+ 'OptionsProgramsSet' => 'Setare programe',
+ 'OptionsPathImagesGroup' => 'Imagini',
+ 'OptionsInternetDataGroup' => 'Importare date',
+ 'OptionsInternetSettingsGroup' => 'Setări',
+ 'OptionsDisplayInformationGroup' => 'Afişare informaţii',
+ 'OptionsDisplayArticlesGroup' => 'Articole',
+ 'OptionsImagesDisplayGroup' => 'Afişare',
+ 'OptionsImagesStyleGroup' => 'Stil',
+ 'OptionsDetailedPreferencesGroup' => 'Preferinţe',
+ 'OptionsFeaturesConveniencesGroup' => 'Convenţii',
+ 'OptionsPicturesFormat' => 'Prefix folosit pentru imagini:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Titlul sau numele elementului asociat',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% sau . va fi înlocuit cu directorul colecţiei (folosiţi doar pentru începutul căilor)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% va fi înlocuit de numele fişierului de colecţie fără sufix (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% poate fi folosit doar la începutul căii pentru imagini',
+ 'OptionsConfigureMailers' => 'Configurează aplicaţiile pentru mail',
+
+ 'ImagesOptionsButton' => 'Setări',
+ 'ImagesOptionsTitle' => 'Setări pentru lista de imagini',
+ 'ImagesOptionsSelectColor' => 'Selectaţi o culoare',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Fundal',
+ 'ImagesOptionsBgPicture' => 'Foloseşte o imagine de fundal',
+ 'ImagesOptionsFg'=> 'Selecţie',
+ 'ImagesOptionsBgTooltip' => 'Schimbă culoarea pentru fundal',
+ 'ImagesOptionsFgTooltip'=> 'Schimbă culoarea pentru selecţie',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Mărime',
+ 'ImagesOptionsSizeList' => {0 => 'Foarte mică', 1 => 'Mică', 2 => 'Medie', 3 => 'Mare', 4 => 'Foarte mare'},
+ 'ImagesOptionsSizeTooltip' => 'Selectaţi mărimea imaginii',
+
+ 'DetailedOptionsTitle' => 'Setări pentru lista detaliată',
+ 'DetailedOptionsImageSize' => 'Mărime imagini',
+ 'DetailedOptionsGroupItems' => 'Grupează elementele după',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'Selectează câmpurile afişate',
+ 'DetailedOptionsGroupedFirst' => 'Păstrează împreună elementele orfane',
+ 'DetailedOptionsAddCount' => 'Adaugă numărul elementelor la categorii',
+
+ 'ExtractButton' => 'Informaţii',
+ 'ExtractTitle' => 'Informaţii fişier video',
+ 'ExtractImport' => 'Foloseşte valorile',
+
+ 'FieldsListOpen' => 'Încarcă o listă de câmpuri dintr-un fişier',
+ 'FieldsListSave' => 'Salvează lista de câmpuri într-un fişier',
+ 'FieldsListError' => 'Această listă de fişiere nu poate fi folosită cu acest tip de colecţie',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Exportă lista de elemente',
+ 'ExportFilter' => 'Exportă doar elementele afişate',
+ 'ExportFieldsTitle' => 'Câmpurile ce vor fi exportate',
+ 'ExportFieldsTip' => 'Selectaţi câmpurile pe care doriţi să le exportaţi',
+ 'ExportWithPictures' => 'Copiază imaginile într-un subdirector',
+ 'ExportSortBy' => 'Sortare după',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Importă altă listă de elemente',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'Fişier',
+ 'ImportExportFieldsUnused' => 'Câmpuri nefolosite',
+ 'ImportExportFieldsUsed' => 'Câmpuri folosite',
+ 'ImportExportFieldsFill' => 'Adaugă toate',
+ 'ImportExportFieldsClear' => 'Şterge toate',
+ 'ImportExportFieldsEmpty' => 'Trebuie să alegeţi cel puţin un câmp',
+ 'ImportExportFileEmpty' => 'Trebuie să specificaţi un nume de fişier',
+ 'ImportFieldsTitle' => 'Câmpurile ce vor fi importate',
+ 'ImportFieldsTip' => 'Selectaţi câmpurile pe care le doriţi importate',
+ 'ImportNewList' => 'Creează o nouă colecţie',
+ 'ImportCurrentList' => 'Adaugă la colecţia curentă',
+ 'ImportDropError' => 'A intervenit o eroare la deschiderea a cel puţin unui fişier. Listă precedentă va fi reîncărcată.',
+ 'ImportGenerateId' => 'Generează identificator pentru fiecare element',
+
+ 'FileChooserOpenFile' => 'Vă rugăm selectaţi fişierul pentru folosire',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Selectaţi un director',
+ 'FileChooserOverwrite' => 'Acest fişier deja există. Doriţi să îl suprascrieţi?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ 'PanelCompact' => 'Compact',
+ 'PanelReadOnly' => 'Doar pentru citire',
+ 'PanelForm' => 'Taburi',
+
+ 'PanelSearchButton' => 'Obţine informaţii',
+ 'PanelSearchTip' => 'Caută pe web informaţii despre acest titlu',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Clic pe imagine pentru a selecta alta.',
+ 'PanelImageTipView' => 'Clic pe image pentru a o vedea la dimensiunea originală.',
+ 'PanelImageTipMenu' => ' Clic dreapta pentru mai multe opţiuni.',
+ 'PanelImageTitle' => 'Selectaţi o imagine',
+ 'PanelImageNoImage' => 'Nici o imagine',
+ 'PanelSelectFileTitle' => 'Selectaţi un fişier',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restaurează valorile implicite',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'De la',
+ 'PanelTo' =>'Către',
+
+ 'PanelWeb' => 'Mai multe informaţii',
+ 'PanelWebTip' => 'Afişează informaţii de pe web despre acest element', # Accepts model codes
+ 'PanelRemoveTip' => 'Şterge elementul curent', # Accepts model codes
+
+ 'PanelDateSelect' => 'Selectaţi o dată',
+ 'PanelNobody' => 'Nimeni',
+ 'PanelUnknown' => 'Necunoscut',
+ 'PanelAdded' => 'Adaugă dată',
+ 'PanelRating' => 'Evaluare',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Locaţie',
+
+ 'PanelLending' => 'Împrumuturi',
+ 'PanelBorrower' => 'Împrumutat',
+ 'PanelLendDate' => 'Din data',
+ 'PanelHistory' => 'Istoric împrumuturi',
+ 'PanelReturned' => 'Element returnat', # Accepts model codes
+ 'PanelReturnDate' => 'Data returnării',
+ 'PanelLendedYes' => 'Împrumutat',
+ 'PanelLendedNo' => 'Disponibil',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favourite',
+ 'TagsAssigned' => 'Assigned Tags',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Nu contează',
+ 'CheckYes' => 'Da',
+ 'CheckNo' => 'Nu',
+
+ 'ToolbarAll' => 'Afişează tot',
+ 'ToolbarAllTooltip' => 'Afişează toate elementele',
+ 'ToolbarGroupBy' => 'Grupează după',
+ 'ToolbarGroupByTooltip' => 'Selectaţi câmpul folosit pentru a grupa elementele din listă',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Cautare elemente',
+ 'PluginsQuery' => 'Interogare',
+ 'PluginsFrame' => 'Sit pentru căutare',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Nume',
+ 'PluginsSearchFields' => 'Câmpuri căutate',
+ 'PluginsAuthor' => 'Autor',
+ 'PluginsLang' => 'Limbă',
+ 'PluginsUseSite' => 'Foloseşte situl selectat pentru viitoarele căutări',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Configurare împrumuturi',
+ 'BorrowersList' => 'Persoane care au împrumutat',
+ 'BorrowersName' => 'Nume',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Adaugă',
+ 'BorrowersRemove' => 'Şterge',
+ 'BorrowersEdit' => 'Editează',
+ 'BorrowersTemplate' => 'Şablon mail',
+ 'BorrowersSubject' => 'Subiect mail',
+ 'BorrowersNotice1' => '%1 va fi înlocuit cu numele celui care a împrumutat',
+ 'BorrowersNotice2' => '%2 va fi înlocuit cu numele filmului',
+ 'BorrowersNotice3' => '%3 va fi înlocuit cu data împrumutului',
+
+ 'BorrowersImportTitle' => 'Importă informaţiile despre cel care a împrumutat',
+ 'BorrowersImportType' => 'Format fişier:',
+ 'BorrowersImportFile' => 'Fişier:',
+
+ 'BorrowedTitle' => 'Elemente împrumutate', # Accepts model codes
+ 'BorrowedDate' => 'Din data de',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'Trimite un email',
+ 'MailFrom' => 'De la: ',
+ 'MailTo' => 'Către: ',
+ 'MailSubject' => 'Subiect: ',
+ 'MailSmtpError' => 'Problemă la conectarea la serverul SMTP',
+ 'MailSendmailError' => 'Problemă la lansarea sendmail',
+
+ 'SearchTooltip' => 'Caută toate elementele', # Accepts model codes
+ 'SearchTitle' => 'Căutare element', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Câmp pentru înlocuire',
+ 'QueryReplaceOld' => 'Numele actual',
+ 'QueryReplaceNew' => 'Noul nume',
+ 'QueryReplaceLaunch' => 'Înlocuieşte',
+
+ 'ImportWindowTitle' => 'Selectaţi câmpurile pentru import',
+ 'ImportViewPicture' => 'Afişează imaginea',
+ 'ImportSelectAll' => 'Selectează tot',
+ 'ImportSelectNone' => 'Nu selecta nimic',
+
+ 'MultiSiteTitle' => 'Siturile folosite pentru căutări',
+ 'MultiSiteUnused' => 'Module nefolosite',
+ 'MultiSiteUsed' => 'Module ce vor fi folosite',
+ 'MultiSiteLang' => 'Umple lista cu module pentru limba engleză',
+ 'MultiSiteEmptyError' => 'Lista de situri este goală',
+ 'MultiSiteClear' => 'Şterge lista',
+
+ 'DisplayOptionsTitle' => 'Elemente afişate',
+ 'DisplayOptionsAll' => 'Selectează tot',
+ 'DisplayOptionsSearch' => 'Buton căutare',
+
+ 'GenresTitle' => 'Conversie gen',
+ 'GenresCategoryName' => 'Genul de folosit',
+ 'GenresCategoryMembers' => 'Genul de înlocuit',
+ 'GenresLoad' => 'Încarcă o listă',
+ 'GenresExport' => 'Salvează lista într-un fişier',
+ 'GenresModify' => 'Editează conversia',
+
+ 'PropertiesName' => 'Nume colecţie',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Proprietar',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => 'Descriere',
+ 'PropertiesFile' => 'Informaţii fişier',
+ 'PropertiesFilePath' => 'Cale completă',
+ 'PropertiesItemsNumber' => 'Număr de elemente', # Accepts model codes
+ 'PropertiesFileSize' => 'Mărime',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Proprietăţi colecţie',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Programe pentru trimis mailuri',
+ 'MailProgramsName' => 'Nume',
+ 'MailProgramsCommand' => 'Linie de comandă',
+ 'MailProgramsRestore' => 'Restaurează valorile implicite',
+ 'MailProgramsAdd' => 'Adaugă un progra,',
+ 'MailProgramsInstructions' => 'În linia de comandă, unele înlocuiri sunt făcute:
+ %f este înlocuit cu adresa de mail a utilizatorului.
+ %t este înlocuit cu adresa de mail a destinatarului.
+ %s este înlocuit cu subiectul mesajului.
+ %b este înlocuit cu corpul mesajului.',
+
+ 'BookmarksBookmarks' => 'Favorite',
+ 'BookmarksFolder' => 'Director',
+ 'BookmarksLabel' => 'Etichetă',
+ 'BookmarksPath' => 'Cale',
+ 'BookmarksNewFolder' => 'Dosar nou',
+
+ 'AdvancedSearchType' => 'Tipul de căutare',
+ 'AdvancedSearchTypeAnd' => 'Elemente se potrivesc la toate criteriile', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Elementele se potrivesc la cel puţin un criteriu', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criteriu',
+ 'AdvancedSearchAnyField' => 'Orice câmp',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Raportare bug generată de GCstar',
+ 'BugReportVersion' => 'Versiune',
+ 'BugReportPlatform' => 'Sistem de operare',
+ 'BugReportMessage' => 'Mesaj de eroare',
+ 'BugReportInformation' => 'Informaţii adiţionale',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/RU/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/RU/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..d45fe36
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::RU::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Выключить имя полей вверху',
+ 'Separator' => 'Разделитель',
+ 'Replacement' => 'Заменить разделитель на',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/RU/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..3f78a04
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::RU::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/RU/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..ee75e3e
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::RU::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Invalid template file',
+ 'UseFile' => 'Use file specified below',
+ 'TemplateExternalFile' => 'Template file',
+ 'WithJS' => 'Использовать Javascript',
+ 'FileTemplate' => 'Шаблон:',
+ 'Preview' => 'Предварительный просмотр',
+ 'NoPreview' => 'Предварительный просмотр недоступен',
+ 'Title' => 'Заголовок страницы',
+ 'InfoFile' => 'Список фильмов в файле: ',
+ 'InfoDir' => 'Изображения в: ',
+ 'HeightImg' => 'Высота (в пикселах) изображения для экспорта: ',
+ 'OpenFileInBrowser' => 'Открыть созданый файл в вэб-браузере',
+ 'Note' => 'Список сгенерирован <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Введите текст для поиска',
+ 'SearchType1' => 'Только заголовок',
+ 'SearchType2' => 'полная информация',
+ 'SearchButton' => 'Искать',
+ 'SearchTitle' => 'Отобразить только фильмы удовлетворяющие предыдущему критерию',
+ 'AllButton' => 'Все',
+ 'AllTitle' => 'Отобразить все фильмы',
+ 'Expand' => 'Раскрыть все',
+ 'ExpandTitle' => 'Показать информацию всех фильмов',
+ 'Collapse' => 'Свернуть все',
+ 'CollapseTitle' => 'Свернуть информацию всех фильмоы',
+ 'Borrowed' => 'Взял : ',
+ 'NotBorrowed' => 'Доступен',
+ 'Top' => 'Наверх',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/RU/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..82b06d7
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::RU::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/RU/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..a5648c6
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::RU::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Включить DROP инструкцию',
+ 'WithCreate' => 'Включить CREATE инструкцию',
+ 'TableName' => 'Имя таблицы',
+ 'InfoFile' => 'SQL Файл: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/RU/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..ee69aa9
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::RU::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Архив в файле: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/RU/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..fe5b8d8
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::RU::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Файл шаблона',
+ 'ModelText' => 'Текст шаблона',
+ 'Models' => 'Использовать шаблон',
+ 'UseFile' => 'Использовать файл',
+ 'UseModel' => 'Использовать область текста',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/RU/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..6a4cc68
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::RU::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Где следует искать',
+ 'Default' => 'Директория Alexandria по-умолчанию',
+ 'Specified' => 'Директория указанная ниже',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/RU/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..7690988
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::RU::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Игнорировать первую строку',
+ 'Separator' => 'Разделитель',
+ 'Plugin' => 'Использовать сайт',
+ 'UseFirst' => 'Выберите первый (если много результатов)',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/RU/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..1b7c794
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::RU::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/RU/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..f261058
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::RU::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Копировать изображения',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCImport/GCImportList.pm b/lib/gcstar/GCLang/RU/GCImport/GCImportList.pm
new file mode 100644
index 0000000..015346c
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::RU::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Список названий',
+ 'Plugin' => 'Использовать сайт',
+ 'UseFirst' => 'Выберите первый (если много результатов)',
+ 'CommentAuto' => 'Фильмы импортированы автоматически.',
+ 'CommentSite' => 'Вэбсайт: ',
+ 'CommentTitle' => 'Название: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/RU/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..61689bc
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::RU::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/RU/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..252a37e
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::RU::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Это не видеоколлеция Tellico',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/RU/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..54e042d
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::RU::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/RU/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..7ae4731
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::RU::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/RU/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..b291885
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::RU::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCbooks.pm b/lib/gcstar/GCLang/RU/GCModels/GCbooks.pm
new file mode 100644
index 0000000..092b77a
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCbooks.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::RU::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Коллекция книг',
+ Items => 'Книги',
+ NewItem => 'Новая книга',
+
+ Isbn => 'ISBN',
+ Title => 'Заголовок',
+ Cover => 'Обложка',
+ Authors => 'Авторы',
+ Publisher => 'Издатель',
+ Publication => 'Дата издания',
+ Language => 'Язык',
+ Genre => 'Жанр',
+ Serie => 'Коллеция',
+ Rank => 'Ранг',
+ Bookdescription => 'Описание',
+ Pages => 'Страниц',
+ Read => 'Прочтено?',
+ Acquisition => 'Дата получения',
+ Edition => 'Редакция',
+ Format => 'Формат',
+ Comments => 'Комментарии',
+ Url => 'Узел ВЭБ',
+ Translator => 'Translator',
+ Artist => 'Artist',
+ DigitalFile => 'Digital version',
+
+ General => 'Общее',
+ Details => 'Детали',
+
+ ReadNo => 'Не прочитано',
+ ReadYes => 'Прочитано',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCcoins.pm b/lib/gcstar/GCLang/RU/GCModels/GCcoins.pm
new file mode 100644
index 0000000..bbaf626
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCcoins.pm
@@ -0,0 +1,101 @@
+{
+ package GCLang::RU::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Numismatic collection',
+ Items => 'Coins',
+ NewItem => 'New coin',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Currency => 'Currency',
+ Value => 'Value',
+ Picture => 'Main picture',
+ Diameter => 'Diameter',
+ Metal => 'Metal',
+ Edge => 'Edge',
+ Edge1 => 'Edge 1',
+ Edge2 => 'Edge 2',
+ Edge3 => 'Edge 3',
+ Edge4 => 'Edge 4',
+ Head => 'Head',
+ Tail => 'Tail',
+ Comments => 'Comments',
+ History => 'History',
+ Website => 'Website',
+ Estimate => 'Estimate',
+ References => 'References',
+ Type => 'Type',
+ Coin => 'Coin',
+ Banknote => 'Bank note',
+
+ Main => 'Main',
+ Description => 'Description',
+ Other => 'Other information',
+ Pictures => 'Pictures',
+
+ Condition => 'Condition (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCcomics.pm b/lib/gcstar/GCLang/RU/GCModels/GCcomics.pm
new file mode 100644
index 0000000..a06f194
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::RU::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCfilms.pm b/lib/gcstar/GCLang/RU/GCModels/GCfilms.pm
new file mode 100644
index 0000000..89878d2
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCfilms.pm
@@ -0,0 +1,92 @@
+{
+ package GCLang::RU::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Коллекция фильмов',
+ Items => 'Фильмы',
+ NewItem => 'Новый фильм',
+
+
+ Id => 'Идентификатор',
+ Title => 'Название',
+ Date => 'Дата',
+ Time => 'Длительность',
+ Director => 'Режиссёр',
+ Country => 'Страна',
+ MinimumAge => 'Минимальный возраст',
+ Genre => 'Жанр',
+ Image => 'Картинка',
+ Original => 'Оригинальный заголовок',
+ Actors => 'Актеры',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'Комментарии',
+ Synopsis => 'Описание',
+ Seen => 'Просмотрен',
+ Number => '# носителей',
+ Format => 'Носитель',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'ВЭБ',
+ Audio => 'Аудио',
+ Video => 'Видео формат',
+ Trailer => 'Видео файл',
+ Serie => 'Коллеция',
+ Rank => 'Ранг',
+ Subtitles => 'Субтитры',
+
+ SeenYes => 'Смотрел',
+ SeenNo => 'Не смотрел',
+
+ AgeUnrated => 'Без ограничений',
+ AgeAll => 'Для _Любого возраста',
+ AgeParent => 'Под присмотром родителей',
+
+ Main => 'Основное',
+ General => 'Общие',
+ Details => 'Детали',
+ Lending => 'На руках',
+
+ Information => 'Информация',
+ Languages => 'Языки',
+ Encoding => 'Кодирование',
+
+ FilterAudienceAge => 'Возраст аудитории:',
+ FilterSeenNo => 'Нет',
+ FilterSeenYes => '_Уже просмотрено',
+ FilterRatingSelect => 'По Крайней мере...',
+
+ ExtractSize => 'Размер',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCgames.pm b/lib/gcstar/GCLang/RU/GCModels/GCgames.pm
new file mode 100644
index 0000000..1d68b80
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCgames.pm
@@ -0,0 +1,80 @@
+{
+ package GCLang::RU::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Коллекция видео-игр',
+ Items => 'Игры',
+ NewItem => 'Новая игра',
+
+ Id => 'Идентификатор',
+ Ean => 'EAN',
+ Name => 'Имя',
+ Platform => 'Платформа',
+ Players => 'Количество игроков',
+ Released => 'Дата выпуска',
+ Editor => 'Редактор',
+ Developer => 'Developer',
+ Genre => 'Жанр',
+ Box => 'Изображения коробки',
+ Case => 'Case',
+ Manual => 'Instructions manual',
+ Completion => 'Пройдено (%)',
+ Executable => 'Executable',
+ Description => 'Описание',
+ Codes => 'Коды',
+ Code => 'Код',
+ Effect => 'Эффект',
+ Secrets => 'Секреты',
+ Screenshots => 'Снимки экраны',
+ Screenshot1 => 'Первый снимок',
+ Screenshot2 => 'Второй снимок',
+ Comments => 'Comments',
+ Url => 'ВЭБ страница',
+ Unlockables => 'Бонусы',
+ Unlockable => 'Бонусы',
+ Howto => 'Как разблокировать',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Общее',
+ Details => 'Детали',
+ Tips => 'Подсказки',
+ Information => 'Информация',
+
+ FilterRatingSelect => 'По Крайней мере...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/RU/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..0058c77
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::RU::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCminicars.pm b/lib/gcstar/GCLang/RU/GCModels/GCminicars.pm
new file mode 100644
index 0000000..78706f2
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::RU::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCmusics.pm b/lib/gcstar/GCLang/RU/GCModels/GCmusics.pm
new file mode 100644
index 0000000..44c7d44
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCmusics.pm
@@ -0,0 +1,66 @@
+{
+ package GCLang::RU::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Коллекция музыки',
+ Items => 'Альбомы',
+ NewItem => 'Новый альбом',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Название',
+ Cover => 'Обложка',
+ Artist => 'Исполнитель',
+ Format => 'Формат',
+ Running => 'Время звучания',
+ Release => 'Дата выпуска',
+ Genre => 'Жанр',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Список композиций',
+ Number => 'Номер',
+ Track => 'Название',
+ Time => 'Время',
+
+ Composer => 'Композитор',
+ Producer => 'Продюсер',
+ Playlist => 'Плейлист',
+ Comments => 'Комментарии',
+ Label => 'Label',
+ Url => 'ВЭБ страница',
+
+ General => 'Общее',
+ Details => 'Дательно',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/RU/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..94a4d99
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::RU::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/RU/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..61b2ae0
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::RU::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/RU/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..eadce6c
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::RU::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCstamps.pm b/lib/gcstar/GCLang/RU/GCModels/GCstamps.pm
new file mode 100644
index 0000000..16f004b
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::RU::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCwines.pm b/lib/gcstar/GCLang/RU/GCModels/GCwines.pm
new file mode 100644
index 0000000..92bded9
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::RU::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Wines collection',
+ Items => 'Wines',
+ NewItem => 'New wine',
+
+ Name => 'Name',
+ Designation => 'Designation',
+ Vintage => 'Vintage',
+ Vineyard => 'Vineyard',
+ Type => 'Type',
+ Grapes => 'Grapes',
+ Soil => 'Soil',
+ Producer => 'Producer',
+ Country => 'Country',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medal/Honour',
+
+ Storage => 'Storage',
+ Location => 'Location',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantity',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Purchase date',
+ PurchasePrice => 'Purchase price',
+ Gift => 'Gift',
+ BottleLabel => 'Bottle label',
+ Website => 'Reference on the web',
+
+ Tasted => 'Tasted',
+ Comments => 'Comments',
+ Serving => 'Serving',
+ TastingField => 'Testing notes',
+
+ General => 'General',
+ Details => 'Details',
+ Tasting => 'Tasting',
+
+ TastedNo => 'Non tasted',
+ TastedYes => 'Tasted',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Not yet tasted',
+ FilterTastedYes => 'Already _tasted',
+ FilterRatingSelect => 'Rating at _least...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCstar.pm b/lib/gcstar/GCLang/RU/GCstar.pm
new file mode 100644
index 0000000..28c5ea9
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCstar.pm
@@ -0,0 +1,672 @@
+{
+ package GCLang::RU;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Russian',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Предупреждение</b>:
+
+Информация загруженная с вэб-сайтов (через плагин поиска)
+предназначена только для <b>персонального</b> использования.
+
+Любое её распространение запрещено без
+<b>соответсвующего разрешения</b> сайта.
+
+Для того что определить какой сайт является владельцем информации
+вы можете использоватье <b>кнопку на закладке детальной информации о фильме</b>.',
+
+ 'AllItemsFiltered' => 'Нет фильмов удовлетворяющих вашим критериям', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Инсталлировать в ',
+ 'InstallMandatory' => 'Необходимые компоненты',
+ 'InstallOptional' => 'Допонительные (необязательные) компоненты',
+ 'InstallErrorMissing' => 'Ошибка : Следующие Perl-компонеты должны быть установлены: ',
+ 'InstallPrompt' => 'Базовая директория для инсталляции [/usr/local]: ',
+ 'InstallEnd' => 'Конец инсталляции',
+ 'InstallNoError' => 'Без ошибок',
+ 'InstallLaunch' => 'Для того что бы использоватть это приложение вы можете запустить ',
+ 'InstallDirectory' => 'Базовая директория',
+ 'InstallTitle' => 'Инсталляция GCstar',
+ 'InstallDependencies' => 'Зависимости',
+ 'InstallPath' => 'Путь',
+ 'InstallOptions' => 'Опции',
+ 'InstallSelectDirectory' => 'Выберите базовую директорию для инсталляции',
+ 'InstallWithClean' => 'Удалить файлы найденные в директории для инсталляции',
+ 'InstallWithMenu' => 'Добавить GCstar в меню Приложений',
+ 'InstallNoPermission' => 'Ошибка : У вас нет прав на запись в указанную директорию',
+ 'InstallMissingMandatory' => 'Необходимые зависмости не удовлетворены. Вы не можете проинсталлировать GCfilms пока не будут установлены зависимые компоненты.',
+ 'InstallMissingOptional' => 'Некоторые из дополнительных компонентов отсутствуют. Они перечислены ниже. GCfilms может быть проинсталлированн, но некоторые возможности не будут доступны.',
+ 'InstallMissingNone' => 'Не неудовлетворённых зависимостей. Вы можете продолжить инсталляцию GCfilms',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Отсутствует',
+ 'InstallMissingFor' => 'Отсутствует',
+ 'InstallCleanDirectory' => 'Удаление файлов GCstar в директории: ',
+ 'InstallCopyDirectory' => 'Копируются файлы в директорию: ',
+ 'InstallCopyDesktop' => 'Копируются файлы рабочего стола в диреткорию: ',
+
+#Update
+ 'UpdateUseProxy' => 'Использовать прокси-сервер (или просто нажмите Enter если не нужно): ',
+ 'UpdateNoPermission' => 'Права записи в эту директорию отсутствуют : ',
+ 'UpdateNone' => 'Обновлений не найдены',
+ 'UpdateFileNotFound' => 'Файл не найден',
+
+#Splash
+ 'SplashInit' => 'Инициализация',
+ 'SplashLoad' => 'Загружается',
+ 'SplashDisplay' => 'Отображать коллекцию',
+ 'SplashSort' => 'Sorting Collection',
+ 'SplashDone' => 'Всё готово',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Кажется вы ранее уже использовали GCFilms. Что вы хотите импортировать из GCfilms в GCstar (это не затронет приложение GCFilms если Вы все ещё захотите потом его использовать)?',
+ 'GCfilmsImportOptions' => 'Установки',
+ 'GCfilmsImportData' => 'Список фильмов',
+
+#Menus
+ 'MenuFile' => '_Файл',
+ 'MenuNewList' => '_Новая коллекция',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_Последние коллеции',
+ 'MenuLend' => 'Показать фильмы на _Руках', # Accepts model codes
+ 'MenuImport' => '_Импорт',
+ 'MenuExport' => '_Экспорт',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Редактирование',
+ 'MenuDuplicate' => '_Дублировать фильм', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Удалить фильм', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Изменить поля коллекции',
+ 'MenuEditLockItems' => '_Зафиксировать коллекцию',
+
+ 'MenuDisplay' => '_Фильтр',
+ 'MenuSavedSearches' => 'Saved searches',
+ 'MenuSavedSearchesSave' => 'Save current search',
+ 'MenuSavedSearchesEdit' => 'Modify saved searches',
+ 'MenuAdvancedSearch' => 'Расширенный _Поиск',
+ 'MenuViewAllItems' => 'Показать _ВСЕ фильмы', # Accepts model codes
+ 'MenuNoFilter' => '_Любой',
+
+ 'MenuConfiguration' => '_Настройки',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Отображаемая информация',
+ 'MenuBorrowers' => '_Должники',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '_Преобразование жанров',
+
+ 'MenuBookmarks' => 'Моя _Коллекция',
+ 'MenuBookmarksAdd' => 'Добавить _текущую коллекцию',
+ 'MenuBookmarksEdit' => '_Редактировать закладки коллекций',
+
+ 'MenuHelp' => '_Помощь',
+ 'MenuHelpContent' => '_Помощь',
+ 'MenuAllPlugins' => 'Все подключаемые _модули',
+ 'MenuBugReport' => 'Отправить отчёт об _ошибке',
+ 'MenuAbout' => '_О GCstar',
+
+ 'MenuNewWindow' => 'Показать фильм в _Новом Окне', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Развернуть всё',
+ 'ContextCollapseAll' => 'Свернуть всё',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Пожалуйста введите занчение',
+
+ 'RemoveConfirm' => 'Вы действительно хотите удалить этот фильм?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'Новый элемент', # Accepts model codes
+ 'NewItemTooltip' => 'Добавить новый фильм', # Accepts model codes
+ 'NoItemFound' => 'Фильм не был найде. Хотите поискать на другом сайте?',
+ 'OpenList' => 'Пожалуйста выберите коллекцию',
+ 'SaveList' => 'Пожалуйста выберите куда сохранить коллекцию',
+ 'SaveListTooltip' => 'Сохранить текущую коллекцию',
+ 'SaveUnsavedChanges' => 'В вашей коллекций есть несохранённые изменения, хотите их сохранить?',
+ 'SaveDontSave' => 'Не сохранять',
+ 'PreferencesTooltip' => 'Установите свои предпочтения',
+ 'ViewTooltip' => 'Изменить отоюражение коллекции',
+ 'PlayTooltip' => 'Воспроизвести видео ассоциируемое с фильмом', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Сохраняется...',
+ 'StatusLoad' => 'Загружается...',
+ 'StatusSearch' => 'Идёт поиск...',
+ 'StatusGetInfo' => 'Получается информация...',
+ 'StatusGetImage' => 'Получается изображение...',
+
+ 'SaveError' => 'Не могу сохранить список фильмов. Пожалуйста проверьте права доступа и свободное мето на диске.',
+ 'OpenError' => 'Не могу открыть список фильмо. Пожалуйста проверьте права доступа.',
+ 'OpenFormatError' => 'Не могу открыть список фильмо.',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'Выбранная для сохранения изображение директория не верна. Пожалуйста выберите другую.',
+ 'OptionsCreationError'=> 'Не могу создать файл опций: ',
+ 'OptionsOpenError'=> 'Не могу открыть файл опций: ',
+ 'OptionsSaveError'=> 'Не могу сохранить файл опций: ',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'Чего бы посмотреть сегодня вечером ?',
+ 'RandomError'=> 'У вас нет непросмотренных фильмов', # Accepts model codes
+ 'RandomEnd'=> 'Больше нет фильмов', # Accepts model codes
+ 'RandomNextTip'=> 'Следущее предложение',
+ 'RandomOkTip'=> 'Я согласен на этот фильм',
+
+ 'AboutTitle' => 'О GCstar',
+ 'AboutDesc' => 'Gtk2 Каталог Фиьмов',
+ 'AboutVersion' => 'Версия',
+ 'AboutTeam' => 'Команда',
+ 'AboutWho' => 'Christian Jodar (Tian): Руководитель проекта, Программист
+Nyall Dawson (Zombiepig): Программист
+TPF: Программист
+Adolfo González: Программист
+',
+ 'AboutLicense' => 'Распространяется под лицензией GNU GPL
+Логотипы Copyright le Spektre',
+ 'AboutTranslation' => 'Русский перевод Андрей Гуселетов',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Логотипы и вэб-дизайн : le Spektre',
+
+ 'ToolbarRandom' => 'Сегодня вечером',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+ 'ModelsSelect' => 'Выберите тип коллекции',
+ 'ModelsPersonal' => 'Персональные модели',
+ 'ModelsDefault' => 'По-умолчанию',
+ 'ModelsList' => 'Определение коллекции',
+ 'ModelSettings' => 'настройки коллекции',
+ 'ModelNewType' => 'новый тип коллекции',
+ 'ModelName' => 'Имя нового типа коллекции:',
+ 'ModelFields' => 'Fields',
+ 'ModelOptions' => 'Options',
+ 'ModelFilters' => 'Filters',
+ 'ModelNewField' => 'Новое поле',
+ 'ModelFieldInformation' => 'Информация',
+ 'ModelFieldName' => 'Метка:',
+ 'ModelFieldType' => 'Тип:',
+ 'ModelFieldGroup' => 'Группа:',
+ 'ModelFieldValues' => 'Значения',
+ 'ModelFieldInit' => 'По-умолчанию:',
+ 'ModelFieldMin' => 'Минимум:',
+ 'ModelFieldMax' => 'Максимум:',
+ 'ModelFieldList' => 'Список значений:',
+ 'ModelFieldListLegend' => '<i>Разделённые запятой</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Короткое описание текст',
+ 'ModelFieldTypeLongText' => 'Длинное описание',
+ 'ModelFieldTypeYesNo' => 'Да/Нет',
+ 'ModelFieldTypeNumber' => 'Число',
+ 'ModelFieldTypeDate' => 'Дата',
+ 'ModelFieldTypeOptions' => 'Предопределённый список значений',
+ 'ModelFieldTypeImage' => 'Изображение',
+ 'ModelFieldTypeSingleList' => 'Простой список',
+ 'ModelFieldTypeFile' => 'Файл',
+ 'ModelFieldTypeFormatted' => 'Dependant on other fields',
+ 'ModelFieldParameters' => 'Параметры',
+ 'ModelFieldHasHistory' => 'Использовать историю',
+ 'ModelFieldFlat' => 'Отображать на одной строке',
+ 'ModelFieldStep' => 'Шаг увеличения:',
+ 'ModelFieldFileFormat' => 'Формат файла:',
+ 'ModelFieldFileFile' => 'Простой файл',
+ 'ModelFieldFileImage' => 'Изображение',
+ 'ModelFieldFileVideo' => 'Видео',
+ 'ModelFieldFileAudio' => 'Аудио',
+ 'ModelFieldFileProgram' => 'Программа',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Использовать поля',
+ 'ModelOptionsFieldsAuto' => 'Автоматически',
+ 'ModelOptionsFieldsNone' => 'Нет',
+ 'ModelOptionsFieldsTitle' => 'Как заголовок',
+ 'ModelOptionsFieldsId' => 'Как идентифекатор',
+ 'ModelOptionsFieldsCover' => 'Как обложку',
+ 'ModelOptionsFieldsPlay' => 'Для кнопки Воспроизведение',
+ 'ModelCollectionSettings' => 'Настройки коллекции',
+ 'ModelCollectionSettingsLending' => 'Предмет может быть дан взаймы',
+ 'ModelCollectionSettingsTagging' => 'Items can be tagged',
+ 'ModelFilterActivated' => 'Должно быть в строке поиска',
+ 'ModelFilterComparison' => 'Сравнение',
+ 'ModelFilterContain' => 'Содержит',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Диапазон',
+ 'ModelFilterNumeric' => 'ИСпользовать цифровое сравнение',
+ 'ModelFilterQuick' => 'Создать бытрый фильтр',
+ 'ModelTooltipName' => 'Используйте имя для того чтобы потом можно было использовать эту модель в других коллекция. Оставьте значение по-умолчанию, для того чтобы сохранить модель только в самой коллекции.',
+ 'ModelTooltipLabel' => 'Поле имени так как оно будет отображено',
+ 'ModelTooltipGroup' => 'Используется для группировки полей. Элементы без значений здесь будут в группе по-умолчанию.',
+ 'ModelTooltipHistory' => 'Должно ли введенное значение сохраняться в списке ассоциированном с полем',
+ 'ModelTooltipFormat' => 'Формат используется для определения действия которое происходит при нажатии кнопки Воспроизведение',
+ 'ModelTooltipLending' => 'Тут будут добавлены некоторые поля для управления займами',
+ 'ModelTooltipTagging' => 'This will add some fields to manage tags',
+ 'ModelTooltipNumeric' => 'Должны ли значения считаться цифрами при сравнении',
+ 'ModelTooltipQuick' => 'Это добавит подменю в фильтры',
+
+ 'ResultsTitle' => 'Выберите фильм', # Accepts model codes
+ 'ResultsNextTip' => 'искать на следующем сайте',
+ 'ResultsPreview' => 'Предпросмотр',
+ 'ResultsInfo' => 'You can add multiple items to the collection by holding down the Ctrl or the Shift key and selecting them', # Accepts model codes
+
+ 'OptionsTitle' => 'Предпочтения',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Вэб браузер',
+ 'OptionsPlayer' => 'Видео проигрыватель',
+ 'OptionsAudio' => 'Аудио проигрыватель',
+ 'OptionsImageEditor' => 'Image editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Директория с изображения',
+ 'OptionsUseRelativePaths' => 'Использовать относительные пути для изображений',
+ 'OptionsLayout' => 'Расположение',
+ 'OptionsStatus' => 'Отображать строку статуса',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Внимание : изменения на этой вкладке не будут применыны до перезагрузки приложения.',
+ 'OptionsRemoveConfirm' => 'Спрашивать подтверждение перед удалением фильма',
+ 'OptionsAutoSave' => 'Автоматически сохранять коллекцию',
+ 'OptionsAutoLoad' => 'Загружать предыдущую коллекцию при старте',
+ 'OptionsSplash' => 'Показывать стартовый экран',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Use spelling checker for long text fields',
+ 'OptionsProgramTitle' => 'Выберите программу',
+ 'OptionsPlugins' => 'Сайт с которого нужно получать данные',
+ 'OptionsAskPlugins' => 'Спрашивать (Все сайты)',
+ 'OptionsPluginsMulti' => 'Несколько сайтов',
+ 'OptionsPluginsMultiAsk' => 'Спрашивать (Несколько сайтов)',
+ 'OptionsPluginsMultiPerField' => 'Несколько сайтов (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Задать список',
+ 'OptionsAskImport' => 'Выберите поля для импортирования',
+ 'OptionsProxy' => 'Использовать прокси',
+ 'OptionsCookieJar' => 'Use this cookie jar file',
+ 'OptionsLang' => 'Язык',
+ 'OptionsMain' => 'Основные',
+ 'OptionsPaths' => 'Пути',
+ 'OptionsInternet' => 'Интернет',
+ 'OptionsConveniences' => 'Возможности',
+ 'OptionsDisplay' => 'Отображение',
+ 'OptionsToolbar' => 'Панель инструментов',
+ 'OptionsToolbars' => {0 => 'Нет', 1 => 'Маленькая', 2 => 'Большая', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'Позиция',
+ 'OptionsToolbarPositions' => {0 => 'Вверху', 1 => 'Внизу', 2 => 'Слева', 3 => 'Справа'},
+ 'OptionsExpandersMode' => 'Expanders too long',
+ 'OptionsExpandersModes' => {'asis' => 'Do nothing', 'cut' => 'Cut', 'wrap' => 'Line wrap'},
+ 'OptionsDateFormat' => 'Date Format',
+ 'OptionsDateFormatTooltip' => 'Format is the one used by strftime(3). Default is %d/%m/%Y',
+ 'OptionsView' => 'Вид',
+ 'OptionsViews' => {0 => 'Текст', 1 => 'Картинка', 2 => 'Детально'},
+ 'OptionsColumns' => 'Колонки',
+ 'OptionsMailer' => 'Почтовый сервер',
+ 'OptionsSMTP' => 'Сервер',
+ 'OptionsFrom' => 'Ваш e-mail',
+ 'OptionsTransform' => 'Помещать артикли в конце названия',
+ 'OptionsArticles' => 'Артикли (разделённые запятой)',
+ 'OptionsSearchStop' => 'Разрешить прерывать поиск',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'Использовать основной заголовок вместо оригинального, если он отсутствует',
+ 'OptionsRestoreAccelerators' => 'Restore accelerators',
+ 'OptionsHistory' => 'Размер истории',
+ 'OptionsClearHistory' => 'Очистить историю',
+ 'OptionsStyle' => 'Шкура',
+ 'OptionsDontAsk' => 'Больше не спрашивать',
+ 'OptionsPathProgramsGroup' => 'Приложения',
+ 'OptionsProgramsSystem' => 'Use programs defined by system',
+ 'OptionsProgramsUser' => 'Use specified programs',
+ 'OptionsProgramsSet' => 'Set programs',
+ 'OptionsPathImagesGroup' => 'Изображения',
+ 'OptionsInternetDataGroup' => 'Импорт данных',
+ 'OptionsInternetSettingsGroup' => 'Настройки',
+ 'OptionsDisplayInformationGroup' => 'Информация',
+ 'OptionsDisplayArticlesGroup' => 'Статьи',
+ 'OptionsImagesDisplayGroup' => 'Отобразить',
+ 'OptionsImagesStyleGroup' => 'Стиль',
+ 'OptionsDetailedPreferencesGroup' => 'Предпочтения',
+ 'OptionsFeaturesConveniencesGroup' => 'Соглашения',
+ 'OptionsPicturesFormat' => 'Префикс для использования в изображениях:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Заголовок или имя ассоциированного элемента ',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% or . will be replaced with collection directory (use only on beginning of path)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% will be replaced by collection file name without suffix (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% could only be used on the beginning of the path for pictures',
+ 'OptionsConfigureMailers' => 'Настройка почтовой программы',
+
+ 'ImagesOptionsButton' => 'Настройки',
+ 'ImagesOptionsTitle' => 'Настройки для списка изображений',
+ 'ImagesOptionsSelectColor' => 'Выберите цвет',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Фон',
+ 'ImagesOptionsBgPicture' => 'Выберите фоновое изображение',
+ 'ImagesOptionsFg'=> 'Выделение',
+ 'ImagesOptionsBgTooltip' => 'Изменить цвет фона',
+ 'ImagesOptionsFgTooltip'=> 'Изменить цвет выделения',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Размер',
+ 'ImagesOptionsSizeList' => {0 => 'Очень маленькое', 1 => 'Маленькое', 2 => 'Среднее', 3 => 'Большое', 4 => 'Очень большое'},
+ 'ImagesOptionsSizeTooltip' => 'Выберите размер изображеня',
+
+ 'DetailedOptionsTitle' => 'Настройки для детализированного списка',
+ 'DetailedOptionsImageSize' => 'Размер изображения',
+ 'DetailedOptionsGroupItems' => 'Группировать элементы по',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'Выберите поля для отображения',
+ 'DetailedOptionsGroupedFirst' => 'Keep together orphaned items',
+ 'DetailedOptionsAddCount' => 'Add number of elements on categories',
+
+ 'ExtractButton' => 'Информация',
+ 'ExtractTitle' => 'Информация из видеофайла',
+ 'ExtractImport' => 'Использовать значения',
+
+ 'FieldsListOpen' => 'Загрузить список полей из файла',
+ 'FieldsListSave' => 'Сохранить список полей в файл',
+ 'FieldsListError' => 'Этот список полей не может быть использован с данным типом коллекции',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Экспортировать список фильмов',
+ 'ExportFilter' => 'Экспортировать только показанные фильмы',
+ 'ExportFieldsTitle' => 'Поля для экспорта',
+ 'ExportFieldsTip' => 'Выберите поля которые вы хотите экспортировать',
+ 'ExportWithPictures' => 'Скопировать изображения в под-директорию',
+ 'ExportSortBy' => 'Sort by',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Импортировать другой список фильмоа',
+ 'ImportExportData' => 'Данные',
+ 'ImportExportFile' => 'Файл',
+ 'ImportExportFieldsUnused' => 'Неиспользуемые поля',
+ 'ImportExportFieldsUsed' => 'Используемые поля',
+ 'ImportExportFieldsFill' => 'Добавить все',
+ 'ImportExportFieldsClear' => 'Удалить все',
+ 'ImportExportFieldsEmpty' => 'Вы должны выбрать по карйней мере одно поле',
+ 'ImportExportFileEmpty' => 'Вы должны указать имя файла',
+ 'ImportFieldsTitle' => 'Поля для экспорта',
+ 'ImportFieldsTip' => 'Выберите поля которые вы хотите экспортировать',
+ 'ImportNewList' => 'Создать новую коллекцию',
+ 'ImportCurrentList' => 'Добавить к текущей коллекции',
+ 'ImportDropError' => 'Произошла ошибка в процессе открытия, по крайней мере в одном файле. Будет загружен предыдущий список.',
+ 'ImportGenerateId' => 'Generate identifier for each item',
+
+ 'FileChooserOpenFile' => 'Пожалуйста, выберите файл',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Выберите директорию',
+ 'FileChooserOverwrite' => 'Такой файл уже существует. Вы хотите перезаписать его?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ 'PanelCompact' => 'Компактно',
+ 'PanelReadOnly' => 'Только для чтения',
+ 'PanelForm' => 'Вкладки',
+
+ 'PanelSearchButton' => 'Получить информацию',
+ 'PanelSearchTip' => 'Искать в Инетрнет информацию по этому заголовку',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Щёлкните на картинке для выбора другой.',
+ 'PanelImageTipView' => 'Нажмите на картинке для просмотра её в оригинальном размере.',
+ 'PanelImageTipMenu' => ' Правый щелчок - еще опции',
+ 'PanelImageTitle' => 'Выберите картинку',
+ 'PanelImageNoImage' => 'No image',
+ 'PanelSelectFileTitle' => 'Выберите файл',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restore default',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'От',
+ 'PanelTo' =>'Куда',
+
+ 'PanelWeb' => 'Смотреть информацию',
+ 'PanelWebTip' => 'Посмотреть информацию в Интернет об этом фильме', # Accepts model codes
+ 'PanelRemoveTip' => 'Удалить текущий фильм', # Accepts model codes
+
+ 'PanelDateSelect' => 'Выберите дату',
+ 'PanelNobody' => 'Никто',
+ 'PanelUnknown' => 'Неизвестно',
+ 'PanelAdded' => 'Добавить дату',
+ 'PanelRating' => 'Рейтинг',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Размещение',
+
+ 'PanelLending' => 'На руках',
+ 'PanelBorrower' => 'Должник',
+ 'PanelLendDate' => 'С ',
+ 'PanelHistory' => 'История',
+ 'PanelReturned' => 'Фильм возвращён', # Accepts model codes
+ 'PanelReturnDate' => 'Дата возврата',
+ 'PanelLendedYes' => 'Взято напрокат',
+ 'PanelLendedNo' => 'Доступно',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favourite',
+ 'TagsAssigned' => 'Assigned Tags',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Или',
+ 'CheckYes' => 'Да',
+ 'CheckNo' => 'Нет',
+
+ 'ToolbarAll' => 'Показать все',
+ 'ToolbarAllTooltip' => 'Показать все фильмы',
+ 'ToolbarGroupBy' => 'Группировать по',
+ 'ToolbarGroupByTooltip' => 'Выберите поля для группировки элементов в списке',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Искать фильм',
+ 'PluginsQuery' => 'Запрос',
+ 'PluginsFrame' => 'Искать сайт',
+ 'PluginsLogo' => 'Лого',
+ 'PluginsName' => 'Имя',
+ 'PluginsSearchFields' => 'Поля для поиска',
+ 'PluginsAuthor' => 'Автор',
+ 'PluginsLang' => 'Язык',
+ 'PluginsUseSite' => 'Использовать выбранный сайт для последующего поиска',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Конфигурация должника',
+ 'BorrowersList' => 'Должники',
+ 'BorrowersName' => 'Имя',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Добавить',
+ 'BorrowersRemove' => 'Удалить',
+ 'BorrowersEdit' => 'Редактировать',
+ 'BorrowersTemplate' => 'Шаблон для почты',
+ 'BorrowersSubject' => 'Тема письма',
+ 'BorrowersNotice1' => '%1 будет заменено именем должника',
+ 'BorrowersNotice2' => '%2 будет заменено названием фильма',
+ 'BorrowersNotice3' => '%3 будет заменено датой',
+
+ 'BorrowersImportTitle' => 'Импорт информации о должниках',
+ 'BorrowersImportType' => 'Формат файла:',
+ 'BorrowersImportFile' => 'Файл:',
+
+ 'BorrowedTitle' => 'На руках', # Accepts model codes
+ 'BorrowedDate' => 'С ',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'Послать e-mail',
+ 'MailFrom' => 'От: ',
+ 'MailTo' => 'Кому: ',
+ 'MailSubject' => 'Тема: ',
+ 'MailSmtpError' => 'Проблемы в процессе присоединения к SMTP серверу',
+ 'MailSendmailError' => 'Проблемы при запуске sendmail',
+
+ 'SearchTooltip' => 'Искать все фильмы', # Accepts model codes
+ 'SearchTitle' => 'Поиск фильмов', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Поле для замены',
+ 'QueryReplaceOld' => 'Текущее имя',
+ 'QueryReplaceNew' => 'Новое имя',
+ 'QueryReplaceLaunch' => 'Заменить',
+
+ 'ImportWindowTitle' => 'Выберите поля для импортирования',
+ 'ImportViewPicture' => 'Посмотреть картинку',
+ 'ImportSelectAll' => 'Выбрать все',
+ 'ImportSelectNone' => 'Сбросить выбор',
+
+ 'MultiSiteTitle' => 'Использовать для поиска сайты',
+ 'MultiSiteUnused' => 'Неиспользуемые плагины',
+ 'MultiSiteUsed' => 'Использовать плагины',
+ 'MultiSiteLang' => 'Заполнить список Английскими плагинами',
+ 'MultiSiteEmptyError' => 'У вас пустой список сайтов',
+ 'MultiSiteClear' => 'Очистить список',
+
+ 'DisplayOptionsTitle' => 'Отображать',
+ 'DisplayOptionsAll' => 'Выбрать все',
+ 'DisplayOptionsSearch' => 'Кнопки поиска',
+
+ 'GenresTitle' => 'Конвертация жанров',
+ 'GenresCategoryName' => 'Использовать жанр',
+ 'GenresCategoryMembers' => 'Заменить на',
+ 'GenresLoad' => 'Загрузить список',
+ 'GenresExport' => 'Сохранить список жанров в файл',
+ 'GenresModify' => 'Редактировать конвертацию',
+
+ 'PropertiesName' => 'Имя коллекции',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Владелец',
+ 'PropertiesEmail' => 'E-mail',
+ 'PropertiesDescription' => 'Описание',
+ 'PropertiesFile' => 'Информация о файле',
+ 'PropertiesFilePath' => 'Полный путь',
+ 'PropertiesItemsNumber' => 'Количество элементов', # Accepts model codes
+ 'PropertiesFileSize' => 'Размер',
+ 'PropertiesFileSizeSymbols' => ['Байт', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Свойства коллекции',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Программы для отправки почты',
+ 'MailProgramsName' => 'Имя',
+ 'MailProgramsCommand' => 'Коммандная строка',
+ 'MailProgramsRestore' => 'Восстановить значения по-умолчанию',
+ 'MailProgramsAdd' => 'Добавить программу',
+ 'MailProgramsInstructions' => 'В коммандной строке делаются такие подстановки:
+ %f заменяется e-mail адресом пользователя.
+ %t заменяется адресом получателя.
+ %s заменяется темой сообщения.
+ %b заменяется телом сообщения.',
+
+ 'BookmarksBookmarks' => 'Закладки',
+ 'BookmarksFolder' => 'Директория',
+ 'BookmarksLabel' => 'Метка',
+ 'BookmarksPath' => 'Путь',
+ 'BookmarksNewFolder' => 'Новая папка',
+
+ 'AdvancedSearchType' => 'Тип поиска',
+ 'AdvancedSearchTypeAnd' => 'Элементы удовлетворяющие всем критериям', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Элементы удовлетворяющие по крайней мере одному критерию', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Критерий',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Bug report generated from GCstar',
+ 'BugReportVersion' => 'Version',
+ 'BugReportPlatform' => 'Operating system',
+ 'BugReportMessage' => 'Error message',
+ 'BugReportInformation' => 'Additional information',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/SR/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/SR/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..cdab08e
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::SR::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Uključi imena polja na vrhu',
+ 'Separator' => 'Graničnik',
+ 'Replacement' => 'Zameni graničnik sa',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/SR/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..9e88357
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::SR::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/SR/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..2aa34c9
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::SR::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Invalid template file',
+ 'UseFile' => 'Use file specified below',
+ 'TemplateExternalFile' => 'Template file',
+ 'WithJS' => 'Koristi Javascript',
+ 'FileTemplate' => 'Šabloni :',
+ 'Preview' => 'Vidi kako izgleda',
+ 'NoPreview' => 'Za ovaj šablon ne postoji slika',
+ 'Title' => 'Ime strane',
+ 'InfoFile' => 'Lista filmova je u fajlu: ',
+ 'InfoDir' => 'Slike su u: ',
+ 'HeightImg' => 'Visina (u pikselima) na koju će slika biti smanjena: ',
+ 'OpenFileInBrowser' => 'Otvori nastali fajl u internet brauzeru',
+ 'Note' => 'Lista napravljena pomoću <a href="http://www.gcstar.org/">GCstar</a>-a',
+ 'InputTitle' => 'Unesite reči koje tražite',
+ 'SearchType1' => 'Samo po naslovu',
+ 'SearchType2' => 'U svim podacima',
+ 'SearchButton' => 'Traži',
+ 'SearchTitle' => 'Prikaži samo filmove koji odgovaraju prošlom kriterijumu',
+ 'AllButton' => 'Svi',
+ 'AllTitle' => 'Pokaži sve filmove',
+ 'Expand' => 'Otvori sve',
+ 'ExpandTitle' => 'Prikaži informacije za sve filmove',
+ 'Collapse' => 'Zatvori sve',
+ 'CollapseTitle' => 'Zatvori informacije za sve filmove',
+ 'Borrowed' => 'Pozajmljen: ',
+ 'NotBorrowed' => 'Ovde',
+ 'Top' => 'Na vrh',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/SR/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..b7a31a5
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::SR::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/SR/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..ee6ef07
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::SR::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Uključi DROP instrukciju',
+ 'WithCreate' => 'Uključi CREATE instrukciju',
+ 'TableName' => 'Ime tabele',
+ 'InfoFile' => 'SQL fajl: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/SR/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..483d75b
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::SR::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Arhiva je u fajlu: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/SR/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..0a1b7dc
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::SR::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Fajl šablona',
+ 'ModelText' => 'Tekst šablona',
+ 'Models' => 'Koristi šablon',
+ 'UseFile' => 'Koristi fajl',
+ 'UseModel' => 'Koristi tekst polje',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/SR/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..41925a2
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::SR::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Where should it search',
+ 'Default' => 'Default Alexandria\'s directory',
+ 'Specified' => 'Directory specified below',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/SR/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..191d187
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::SR::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Ignoriši prvu liniju',
+ 'Separator' => 'Graničnik',
+ 'Plugin' => 'Sajt koji će da se koristi',
+ 'UseFirst' => 'Ako ima više rezultata, odaberi prvi',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/SR/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..74ecdc1
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::SR::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/SR/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..312f014
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::SR::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copy pictures',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCImport/GCImportList.pm b/lib/gcstar/GCLang/SR/GCImport/GCImportList.pm
new file mode 100644
index 0000000..4aed91c
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::SR::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Lista naslova',
+ 'Plugin' => 'Sajt koji će da se koristi',
+ 'UseFirst' => 'Ako ima više rezultata, odaberi prvi',
+ 'CommentAuto' => 'Filmovi automatski ubačeni.',
+ 'CommentSite' => 'Internet stranica: ',
+ 'CommentTitle' => 'Naslov: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/SR/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..8e5e493
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::SR::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/SR/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..7d766d4
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::SR::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Fajl nije Tellico video kolekcija',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/SR/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..580c2c5
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::SR::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/SR/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..c3df78c
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::SR::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/SR/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..7cb7f2f
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::SR::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCbooks.pm b/lib/gcstar/GCLang/SR/GCModels/GCbooks.pm
new file mode 100644
index 0000000..4f6bbf3
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCbooks.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::SR::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Books collection',
+ Items => 'Books',
+ NewItem => 'New book',
+
+ Isbn => 'ISBN',
+ Title => 'Title',
+ Cover => 'Cover',
+ Authors => 'Authors',
+ Publisher => 'Publisher',
+ Publication => 'Publication date',
+ Language => 'Language',
+ Genre => 'Genre',
+ Serie => 'Kolekcija',
+ Rank => 'Ocena',
+ Bookdescription => 'Description',
+ Pages => 'Pages',
+ Read => 'Read',
+ Acquisition => 'Acquisition date',
+ Edition => 'Edition',
+ Format => 'Format',
+ Comments => 'Comments',
+ Url => 'Web page',
+ Translator => 'Translator',
+ Artist => 'Artist',
+ DigitalFile => 'Digital version',
+
+ General => 'General',
+ Details => 'Details',
+
+ ReadNo => 'Not read',
+ ReadYes => 'Read',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCcoins.pm b/lib/gcstar/GCLang/SR/GCModels/GCcoins.pm
new file mode 100644
index 0000000..ce6f1e5
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCcoins.pm
@@ -0,0 +1,102 @@
+{
+ package GCLang::SR::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Numismatic collection',
+ Items => 'Coins',
+ NewItem => 'New coin',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Currency => 'Currency',
+ Value => 'Value',
+ Picture => 'Main picture',
+ Diameter => 'Diameter',
+ Metal => 'Metal',
+ Edge => 'Edge',
+ Edge1 => 'Edge 1',
+ Edge2 => 'Edge 2',
+ Edge3 => 'Edge 3',
+ Edge4 => 'Edge 4',
+ Head => 'Head',
+ Tail => 'Tail',
+ Comments => 'Comments',
+ History => 'History',
+ Website => 'Website',
+ Estimate => 'Estimate',
+ References => 'References',
+ Type => 'Type',
+ Coin => 'Coin',
+ Banknote => 'Bank note',
+
+ Main => 'Main',
+ Description => 'Description',
+ Other => 'Other information',
+ Pictures => 'Pictures',
+
+ Condition => 'Condition (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCcomics.pm b/lib/gcstar/GCLang/SR/GCModels/GCcomics.pm
new file mode 100644
index 0000000..d9d9811
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::SR::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCfilms.pm b/lib/gcstar/GCLang/SR/GCModels/GCfilms.pm
new file mode 100644
index 0000000..dc9a576
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCfilms.pm
@@ -0,0 +1,91 @@
+{
+ package GCLang::SR::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Movies collection',
+ Items => 'Filmovi',
+ NewItem => 'Novi film',
+
+
+ Id => 'Redni broj',
+ Title => 'Naslov',
+ Date => 'Datum',
+ Time => 'Trajanje',
+ Director => 'Režiser',
+ Country => 'Zemlja',
+ MinimumAge => 'Ne za mlađe od',
+ Genre => 'Žanr',
+ Image => 'Slika',
+ Original => 'Naslov originala',
+ Actors => 'Uloge',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'Komentari',
+ Synopsis => 'Radnja',
+ Seen => 'Pogledan',
+ Number => '# medija',
+ Format => 'Medij',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'Internet',
+ Audio => 'Zvuk',
+ Video => 'Video format',
+ Trailer => 'Video fajl',
+ Serie => 'Kolekcija',
+ Rank => 'Ocena',
+ Subtitles => 'Prevod',
+
+ SeenYes => 'Gledao',
+ SeenNo => 'Neodgledan',
+
+ AgeUnrated => 'Neocenjen',
+ AgeAll => 'Svi Uzrasti',
+ AgeParent => 'Roditeljska Pratnja',
+
+ Main => 'Main items',
+ General => 'Opšte',
+ Details => 'Detalji',
+
+ Information => 'Informacije',
+ Languages => 'Jezici',
+ Encoding => 'Kodna strana',
+
+ FilterAudienceAge => 'Uzrast publike',
+ FilterSeenNo => '_Negledani',
+ FilterSeenYes => '_Already Viewed',
+ FilterRatingSelect => 'Ocena _Najmanje...',
+
+ ExtractSize => 'Veličina',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCgames.pm b/lib/gcstar/GCLang/SR/GCModels/GCgames.pm
new file mode 100644
index 0000000..cdb1d58
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCgames.pm
@@ -0,0 +1,80 @@
+{
+ package GCLang::SR::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Video games collection',
+ Items => 'Games',
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Players => 'Number of players',
+ Released => 'Release Date',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Genre => 'Genre',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instructions manual',
+ Completion => 'Completion (%)',
+ Executable => 'Executable',
+ Description => 'Description',
+ Codes => 'Codes',
+ Code => 'Code',
+ Effect => 'Effect',
+ Secrets => 'Secrets',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ Unlockables => 'Unlockables',
+ Unlockable => 'Unlockable',
+ Howto => 'How to unlock',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'General',
+ Details => 'Details',
+ Tips => 'Tips',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/SR/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..5dd19d9
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::SR::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCminicars.pm b/lib/gcstar/GCLang/SR/GCModels/GCminicars.pm
new file mode 100644
index 0000000..53bad12
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::SR::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCmusics.pm b/lib/gcstar/GCLang/SR/GCModels/GCmusics.pm
new file mode 100644
index 0000000..48a7aa9
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCmusics.pm
@@ -0,0 +1,66 @@
+{
+ package GCLang::SR::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Music collection',
+ Items => 'Albums',
+ NewItem => 'New album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Title',
+ Cover => 'Cover',
+ Artist => 'Artist',
+ Format => 'Format',
+ Running => 'Running time',
+ Release => 'Release date',
+ Genre => 'Genre',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Tracks list',
+ Number => 'Number',
+ Track => 'Title',
+ Time => 'Time',
+
+ Composer => 'Composer',
+ Producer => 'Producer',
+ Playlist => 'Playlist',
+ Comments => 'Comments',
+ Label => 'Label',
+ Url => 'Web page',
+
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/SR/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..a73e38e
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::SR::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/SR/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..d79165c
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::SR::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/SR/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..528e096
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::SR::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCstamps.pm b/lib/gcstar/GCLang/SR/GCModels/GCstamps.pm
new file mode 100644
index 0000000..7c7ee61
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::SR::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCwines.pm b/lib/gcstar/GCLang/SR/GCModels/GCwines.pm
new file mode 100644
index 0000000..8ce352b
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::SR::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Wines collection',
+ Items => 'Wines',
+ NewItem => 'New wine',
+
+ Name => 'Name',
+ Designation => 'Designation',
+ Vintage => 'Vintage',
+ Vineyard => 'Vineyard',
+ Type => 'Type',
+ Grapes => 'Grapes',
+ Soil => 'Soil',
+ Producer => 'Producer',
+ Country => 'Country',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medal/Honour',
+
+ Storage => 'Storage',
+ Location => 'Location',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantity',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Purchase date',
+ PurchasePrice => 'Purchase price',
+ Gift => 'Gift',
+ BottleLabel => 'Bottle label',
+ Website => 'Reference on the web',
+
+ Tasted => 'Tasted',
+ Comments => 'Comments',
+ Serving => 'Serving',
+ TastingField => 'Testing notes',
+
+ General => 'General',
+ Details => 'Details',
+ Tasting => 'Tasting',
+
+ TastedNo => 'Non tasted',
+ TastedYes => 'Tasted',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Not yet tasted',
+ FilterTastedYes => 'Already _tasted',
+ FilterRatingSelect => 'Rating at _least...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCstar.pm b/lib/gcstar/GCLang/SR/GCstar.pm
new file mode 100644
index 0000000..4d6498b
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCstar.pm
@@ -0,0 +1,669 @@
+{
+ package GCLang::SR;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Srpski',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Upozorenje</b>:
+
+Informacije skinute sa web sajtova (putem modula za pretragu) su <b>samo za ličnu upotrebu</b>.
+
+Svaka daljna distribucija je zabranjena bez <b>jasne dozvole</b> sajta.
+
+Da biste odredili koji sajt je vlasnik informacija, možete da koristite <b>dugme ispod podataka o filmu</b>.',
+
+ 'AllItemsFiltered' => 'Nijedan film ne odgovara zadatom kriterijumu', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Instaliraj u',
+ 'InstallMandatory' => 'Obavezne komponente',
+ 'InstallOptional' => 'Opcione komponente',
+ 'InstallErrorMissing' => 'Greška : Sledeće Perl komponente moraju prethodno da budu instalirane: ',
+ 'InstallPrompt' => 'Osnovni direktorijum za instalaciju [/usr/local]: ',
+ 'InstallEnd' => 'Kraj instalacije',
+ 'InstallNoError' => 'Bez grešaka',
+ 'InstallLaunch' => 'Da biste koristili ovaj program, možete pokrenuti ',
+ 'InstallDirectory' => 'Osnovni direktorijum',
+ 'InstallTitle' => 'GCstar instalacija',
+ 'InstallDependencies' => 'Zavisnosti',
+ 'InstallPath' => 'Putanja',
+ 'InstallOptions' => 'Opcije',
+ 'InstallSelectDirectory' => 'Izaberite osnovni direktorijum za instalaciju',
+ 'InstallWithClean' => 'Obriš fajlove koji se nalaze u instalacionom direktorijumu',
+ 'InstallWithMenu' => 'Dodaj GCstar u listu programa',
+ 'InstallNoPermission' => 'Greška: Nemate dozvolu za pisanje u direktorijum koji ste odabrali',
+ 'InstallMissingMandatory' => 'Nedostaju obavezne zavisne komponente. Nećete moći da instalirate GCstar dok ih ne dodate u sistem.',
+ 'InstallMissingOptional' => 'Nedostaju neke obavezne zavisne komponente. Imena su im izlistana ispod. GCstar se može instalirati, ali neke funkcije vam neće raditi.',
+ 'InstallMissingNone' => 'Sve zavisnosti su u redu. Možete da nastavite sa GCstar instalacijom.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Nedostaju',
+ 'InstallMissingFor' => 'Nedostaju',
+ 'InstallCleanDirectory' => 'Removing GCstar\'s files in directory: ',
+ 'InstallCopyDirectory' => 'Copying files in directory: ',
+ 'InstallCopyDesktop' => 'Copying desktop file in: ',
+
+#Update
+ 'UpdateUseProxy' => 'Koristi proxy (pritisnite enter ako ih nema): ',
+ 'UpdateNoPermission' => 'Odbijena dozvola za pisanje u ovom direktorijumu: ',
+ 'UpdateNone' => 'Novija verzija nije pronađena',
+ 'UpdateFileNotFound' => 'Fajl nije pronađen',
+
+#Splash
+ 'SplashInit' => 'Startovanje',
+ 'SplashLoad' => 'Učitavam kolekciju',
+ 'SplashDisplay' => 'Displaying Collection',
+ 'SplashSort' => 'Sorting Collection',
+ 'SplashDone' => 'Spremno',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'It seems you were using GCfilms before. What do you want to import from GCfilms to GCstar (it won\'t impact GCfilms if you still want to use it)?',
+ 'GCfilmsImportOptions' => 'Settings',
+ 'GCfilmsImportData' => 'Movies list',
+
+#Menus
+ 'MenuFile' => '_Fajl',
+ 'MenuNewList' => '_Nova Kolekcija',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_Poslednje Kolekcije',
+ 'MenuLend' => 'Prikaži Po_zajmljene Filmove', # Accepts model codes
+ 'MenuImport' => '_Uvezi',
+ 'MenuExport' => '_Izvezi',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Izmeni',
+ 'MenuDuplicate' => '_Dupliraj Film', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Obriši Film', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Change collection fields',
+ 'MenuEditLockItems' => '_Zaključaj Kolekciju',
+
+ 'MenuDisplay' => 'F_ilter',
+ 'MenuSavedSearches' => 'Saved searches',
+ 'MenuSavedSearchesSave' => 'Save current search',
+ 'MenuSavedSearchesEdit' => 'Modify saved searches',
+ 'MenuAdvancedSearch' => 'A_dvanced Search',
+ 'MenuViewAllItems' => 'Prikaži _Sve Filmove', # Accepts model codes
+ 'MenuNoFilter' => '_Bilo Koji',
+
+ 'MenuConfiguration' => '_Podešavanja',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Prikazane Informacije',
+ 'MenuBorrowers' => '_Pozajmljivači',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Prebacivanje _Žanra',
+
+ 'MenuBookmarks' => 'My _Collections',
+ 'MenuBookmarksAdd' => '_Add current collection',
+ 'MenuBookmarksEdit' => '_Edit bookmarked collections',
+
+ 'MenuHelp' => '_Pomoć',
+ 'MenuHelpContent' => '_Pomoć',
+ 'MenuAllPlugins' => 'View _plugins',
+ 'MenuBugReport' => 'Report a _bug',
+ 'MenuAbout' => '_O GCstar',
+
+ 'MenuNewWindow' => 'Prikaži Film U _Novom Prozoru', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Expand all',
+ 'ContextCollapseAll' => 'Collapse all',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Please enter value',
+
+ 'RemoveConfirm' => 'Da listvarno želite da obrišete ovaj film?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'New item', # Accepts model codes
+ 'NewItemTooltip' => 'Dodaj novi film', # Accepts model codes
+ 'NoItemFound' => 'Film nije pronađen. Da li želite da pretražite drugi sajt?',
+ 'OpenList' => 'Odaberite kolekciju',
+ 'SaveList' => 'Odaberite gde ćete da sačuvate kolekciju',
+ 'SaveListTooltip' => 'Sačuvaj trenutnu kolekciju',
+ 'SaveUnsavedChanges' => 'There are unsaved changes in your collection. Do you want to save them?',
+ 'SaveDontSave' => 'Don\'t save',
+ 'PreferencesTooltip' => 'Podesite svoje parametre',
+ 'ViewTooltip' => 'Promenite prikaz kolekcije',
+ 'PlayTooltip' => 'Pustite film', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Saving...',
+ 'StatusLoad' => 'Loading...',
+ 'StatusSearch' => 'Pretraga u toku...',
+ 'StatusGetInfo' => 'Prikupljanje informacija u toku...',
+ 'StatusGetImage' => 'Snimanje slike u toku...',
+
+ 'SaveError' => 'Ne mogu da sačuvam listu filmova. Proverite prava pristupa i slobodan prostor na disku.',
+ 'OpenError' => 'Ne mogu da otvorim listu filmova. Proverite prava pristupa.',
+ 'OpenFormatError' => 'Cannot open items list. Format may be incorrect.',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'Odabrani direktorijum za čuvanje slika nije ispravan. Odaberite drugi.',
+ 'OptionsCreationError'=> 'Ne mogu da napravim fajl sa opcijama: ',
+ 'OptionsOpenError'=> 'Ne mogu da otvorim fajl sa opcijama: ',
+ 'OptionsSaveError'=> 'Ne mogu da sačuvam fajl sa opcijama: ',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'Šta gledati večeras ?',
+ 'RandomError'=> 'Nemate neodgledanih filmova', # Accepts model codes
+ 'RandomEnd'=> 'Nemate više filmova', # Accepts model codes
+ 'RandomNextTip'=> 'Sledeći predlog',
+ 'RandomOkTip'=> 'Biram ovaj film',
+
+ 'AboutTitle' => 'O GCstar',
+ 'AboutDesc' => 'Gtk2 Katalog Filmova',
+ 'AboutVersion' => 'Verzija',
+ 'AboutTeam' => 'Tim',
+ 'AboutWho' => 'Christian Jodar (Tian): Vođa projekta, Programer
+Nyall Dawson (Zombiepig): Programer
+TPF: Programer
+Adolfo González: Programer
+',
+ 'AboutLicense' => 'Distribuirano pod GNU GPL uslovima
+Logo Copyright le Spektre',
+ 'AboutTranslation' => 'Prevod na srpski Mario Tomić (http://www.mariotomic.com)',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logo i web dizajn le Spektre',
+
+ 'ToolbarRandom' => 'Večeras',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+ 'ModelsSelect' => 'Select a collection type',
+ 'ModelsPersonal' => 'Personal models',
+ 'ModelsDefault' => 'Default models',
+ 'ModelsList' => 'Collection definition',
+ 'ModelSettings' => 'Collection settings',
+ 'ModelNewType' => 'New collection type',
+ 'ModelName' => 'Name of the collection type:',
+ 'ModelFields' => 'Fields',
+ 'ModelOptions' => 'Options',
+ 'ModelFilters' => 'Filters',
+ 'ModelNewField' => 'New field',
+ 'ModelFieldInformation' => 'Information',
+ 'ModelFieldName' => 'Label:',
+ 'ModelFieldType' => 'Type:',
+ 'ModelFieldGroup' => 'Group:',
+ 'ModelFieldValues' => 'Values',
+ 'ModelFieldInit' => 'Default:',
+ 'ModelFieldMin' => 'Minimum:',
+ 'ModelFieldMax' => 'Maximum:',
+ 'ModelFieldList' => 'Values list:',
+ 'ModelFieldListLegend' => '<i>Comma separated</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Short text',
+ 'ModelFieldTypeLongText' => 'Long text',
+ 'ModelFieldTypeYesNo' => 'Yes/No',
+ 'ModelFieldTypeNumber' => 'Number',
+ 'ModelFieldTypeDate' => 'Date',
+ 'ModelFieldTypeOptions' => 'Pre-defined values list',
+ 'ModelFieldTypeImage' => 'Image',
+ 'ModelFieldTypeSingleList' => 'Simple list',
+ 'ModelFieldTypeFile' => 'File',
+ 'ModelFieldTypeFormatted' => 'Dependant on other fields',
+ 'ModelFieldParameters' => 'Parameters',
+ 'ModelFieldHasHistory' => 'Use an history',
+ 'ModelFieldFlat' => 'Display on one line',
+ 'ModelFieldStep' => 'Increment step:',
+ 'ModelFieldFileFormat' => 'File format:',
+ 'ModelFieldFileFile' => 'Simple file',
+ 'ModelFieldFileImage' => 'Image',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Fields to use',
+ 'ModelOptionsFieldsAuto' => 'Automatic',
+ 'ModelOptionsFieldsNone' => 'None',
+ 'ModelOptionsFieldsTitle' => 'As title',
+ 'ModelOptionsFieldsId' => 'As identifier',
+ 'ModelOptionsFieldsCover' => 'As cover',
+ 'ModelOptionsFieldsPlay' => 'For Play button',
+ 'ModelCollectionSettings' => 'Collection settings',
+ 'ModelCollectionSettingsLending' => 'Items could be borrowed',
+ 'ModelCollectionSettingsTagging' => 'Items can be tagged',
+ 'ModelFilterActivated' => 'Should be in search box',
+ 'ModelFilterComparison' => 'Comparison',
+ 'ModelFilterContain' => 'Contains',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Range',
+ 'ModelFilterNumeric' => 'Comparison is numeric',
+ 'ModelFilterQuick' => 'Create a quick filter',
+ 'ModelTooltipName' => 'Use a name to re-use this model for many collections. If empty, the settings will be directly stored in the collection itself',
+ 'ModelTooltipLabel' => 'The field name as it will be displayed',
+ 'ModelTooltipGroup' => 'Used to group fields. Items with no value here will be in a default group',
+ 'ModelTooltipHistory' => 'Should the previous entered values be stored in a list associated to the field',
+ 'ModelTooltipFormat' => 'This format is used to determine the action to open the file with the Play button',
+ 'ModelTooltipLending' => 'This will add some fields to manage lendings',
+ 'ModelTooltipTagging' => 'This will add some fields to manage tags',
+ 'ModelTooltipNumeric' => 'Should the values be consider as numbers for comparison',
+ 'ModelTooltipQuick' => 'This will add a submenu in the Filters one',
+
+ 'ResultsTitle' => 'Odaberite film', # Accepts model codes
+ 'ResultsNextTip' => 'Pretraži sledeći sajt',
+ 'ResultsPreview' => 'Preview',
+ 'ResultsInfo' => 'You can add multiple items to the collection by holding down the Ctrl or the Shift key and selecting them', # Accepts model codes
+
+ 'OptionsTitle' => 'Podešavanja',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Web brauzer',
+ 'OptionsPlayer' => 'Video plejer',
+ 'OptionsAudio' => 'Audio player',
+ 'OptionsImageEditor' => 'Image editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Direktorijum sa slikama',
+ 'OptionsUseRelativePaths' => 'Koristi relativnu putanju do slika',
+ 'OptionsLayout' => 'Izgled',
+ 'OptionsStatus' => 'Pokaži statusnu liniju',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Upozorenje: Izmene sa ove kartice se neće videti dok se program ponovo ne pokrene.',
+ 'OptionsRemoveConfirm' => 'Traži potvrdu pre nego što obrišeš film',
+ 'OptionsAutoSave' => 'Automatski sačuvaj kolekciju',
+ 'OptionsAutoLoad' => 'Load previous collection on startup',
+ 'OptionsSplash' => 'Prikaži uvodni ekran (splash screen)',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Use spelling checker for long text fields',
+ 'OptionsProgramTitle' => 'Odaberite koji program želite da koristite',
+ 'OptionsPlugins' => 'Sajt sa kog želite da preuzmete podatke',
+ 'OptionsAskPlugins' => 'Pitaj me (Svi sajtovi)',
+ 'OptionsPluginsMulti' => 'Neki sajtovi',
+ 'OptionsPluginsMultiAsk' => 'Pitaj me (Neki sajtovi)',
+ 'OptionsPluginsMultiPerField' => 'Neki sajtovi (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Zadaj listu',
+ 'OptionsAskImport' => 'Odaberite polja za uvoženje',
+ 'OptionsProxy' => 'Koristi proxy',
+ 'OptionsCookieJar' => 'Use this cookie jar file',
+ 'OptionsLang' => 'Jezik',
+ 'OptionsMain' => 'Glavni',
+ 'OptionsPaths' => 'Putanje',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Funkcije',
+ 'OptionsDisplay' => 'Prikaz',
+ 'OptionsToolbar' => 'Alati',
+ 'OptionsToolbars' => {0 => 'Bez', 1 => 'Mali', 2 => 'Veliki', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'Pozicija',
+ 'OptionsToolbarPositions' => {0 => 'Vrh', 1 => 'Dno', 2 => 'Levo', 3 => 'Desno'},
+ 'OptionsExpandersMode' => 'Expanders too long',
+ 'OptionsExpandersModes' => {'asis' => 'Do nothing', 'cut' => 'Cut', 'wrap' => 'Line wrap'},
+ 'OptionsDateFormat' => 'Date Format',
+ 'OptionsDateFormatTooltip' => 'Format is the one used by strftime(3). Default is %d/%m/%Y',
+ 'OptionsView' => 'Prikaz',
+ 'OptionsViews' => {0 => 'Tekst', 1 => 'Slika', 2 => 'Detaljno'},
+ 'OptionsColumns' => 'Kolone',
+ 'OptionsMailer' => 'E-mail servis',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'Vaš e-mail',
+ 'OptionsTransform' => 'Stavi članove posle naslova filma',
+ 'OptionsArticles' => 'Članovi (Odvojeni zarezom)',
+ 'OptionsSearchStop' => 'Dozvoli da pretraga bude prekinuta',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'Koristi glavni naslov kao originalni ukoliko originalnog nema',
+ 'OptionsRestoreAccelerators' => 'Restore accelerators',
+ 'OptionsHistory' => 'Veličina istorije',
+ 'OptionsClearHistory' => 'Obriši istoriju',
+ 'OptionsStyle' => 'Promena izgleda',
+ 'OptionsDontAsk' => 'Ne pitaj više',
+ 'OptionsPathProgramsGroup' => 'Applications',
+ 'OptionsProgramsSystem' => 'Use programs defined by system',
+ 'OptionsProgramsUser' => 'Use specified programs',
+ 'OptionsProgramsSet' => 'Set programs',
+ 'OptionsPathImagesGroup' => 'Images',
+ 'OptionsInternetDataGroup' => 'Data import',
+ 'OptionsInternetSettingsGroup' => 'Settings',
+ 'OptionsDisplayInformationGroup' => 'Information display',
+ 'OptionsDisplayArticlesGroup' => 'Articles',
+ 'OptionsImagesDisplayGroup' => 'Display',
+ 'OptionsImagesStyleGroup' => 'Style',
+ 'OptionsDetailedPreferencesGroup' => 'Preferences',
+ 'OptionsFeaturesConveniencesGroup' => 'Conveniences',
+ 'OptionsPicturesFormat' => 'Prefix to use for pictures:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Title or name of the associated item',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% or . will be replaced with collection directory (use only on beginning of path)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% will be replaced by collection file name without suffix (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% could only be used on the beginning of the path for pictures',
+ 'OptionsConfigureMailers' => 'Configure mailing programs',
+
+ 'ImagesOptionsButton' => 'Podešavanja',
+ 'ImagesOptionsTitle' => 'Podešavanja za liste slika',
+ 'ImagesOptionsSelectColor' => 'Odaberi boju',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Pozadina',
+ 'ImagesOptionsBgPicture' => 'Upotrebi pozadisku sliku',
+ 'ImagesOptionsFg'=> 'Selekcija',
+ 'ImagesOptionsBgTooltip' => 'Promeni boju pozadine',
+ 'ImagesOptionsFgTooltip'=> 'Promeni boju selekcije',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Veličina',
+ 'ImagesOptionsSizeList' => {0 => 'Vrlo mali', 1 => 'Mali', 2 => 'Srednji', 3 => 'Veliki', 4 => 'Vrlo veliki'},
+ 'ImagesOptionsSizeTooltip' => 'Odaberi veličinu slike',
+
+ 'DetailedOptionsTitle' => 'Podešavanja za detaljnu listu',
+ 'DetailedOptionsImageSize' => 'Veličina slike',
+ 'DetailedOptionsGroupItems' => 'Grupiši filmove prema kolekciji',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'Odaberi polja za prikaz',
+ 'DetailedOptionsGroupedFirst' => 'Keep together orphaned items',
+ 'DetailedOptionsAddCount' => 'Add number of elements on categories',
+
+ 'ExtractButton' => 'Informacije',
+ 'ExtractTitle' => 'Informacije o video fajlu',
+ 'ExtractImport' => 'Koristi vrednosti',
+
+ 'FieldsListOpen' => 'Load a fields list from a file',
+ 'FieldsListSave' => 'Save fields list to a file',
+ 'FieldsListError' => 'This fields list cannot be used with this kind of collection',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Izvezi listu filmova',
+ 'ExportFilter' => 'Izvezi samo prikazane filmove',
+ 'ExportFieldsTitle' => 'Polja za izvoženje',
+ 'ExportFieldsTip' => 'Odaberi polja koja želiš da izvezeš',
+ 'ExportWithPictures' => 'Kopiraj slike u pod-direktorijum',
+ 'ExportSortBy' => 'Sort by',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Uvezi drugu listu filmova',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'Fajl',
+ 'ImportExportFieldsUnused' => 'Neiskorišćena polja',
+ 'ImportExportFieldsUsed' => 'Iskorišćena polja',
+ 'ImportExportFieldsFill' => 'Dodaj sva',
+ 'ImportExportFieldsClear' => 'Ukloni sva',
+ 'ImportExportFieldsEmpty' => 'Moraš da izabereš barem jedno polje',
+ 'ImportExportFileEmpty' => 'Moraš da navedeš ime fajla',
+ 'ImportFieldsTitle' => 'Polja za uvoženje',
+ 'ImportFieldsTip' => 'Odaberi polja koja želiš da uvezeš',
+ 'ImportNewList' => 'Napravi novu kolekciju',
+ 'ImportCurrentList' => 'Dodaj u trenutnu kolekciju',
+ 'ImportDropError' => 'Došlo je do greške pri otvaranju najmanje jednog fajla. Učitaće se prethodna lista.',
+ 'ImportGenerateId' => 'Generate identifier for each item',
+
+ 'FileChooserOpenFile' => 'Odaberi fajl koji ?eš da koristiš',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Odaberite direktorijum',
+ 'FileChooserOverwrite' => 'Ovaj fajl već postoji. Da li želite da ga zamenite novim fajlom?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ 'PanelCompact' => 'Sažeti',
+ 'PanelReadOnly' => 'Samo Za čitanje',
+ 'PanelForm' => 'Kartice',
+
+ 'PanelSearchButton' => 'Prikupi informacije',
+ 'PanelSearchTip' => 'Pretraži internet za informacije o ovom filmu',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Klikni na sliku da odabereš neku drugu.',
+ 'PanelImageTipView' => 'Click on the picture to view it in real size.',
+ 'PanelImageTipMenu' => ' Desni klik za više opcija.',
+ 'PanelImageTitle' => 'Odaberi sliku',
+ 'PanelImageNoImage' => 'No image',
+ 'PanelSelectFileTitle' => 'Odaberi fajl',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restore default',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'From',
+ 'PanelTo' =>'To',
+
+ 'PanelWeb' => 'Pogledaj Informacije',
+ 'PanelWebTip' => 'Pogledaj Informacije o ovom filmu na internetu', # Accepts model codes
+ 'PanelRemoveTip' => 'Obriši ovaj film', # Accepts model codes
+
+ 'PanelDateSelect' => 'Odaberi datum',
+ 'PanelNobody' => 'Niko',
+ 'PanelUnknown' => 'Nepoznat',
+ 'PanelAdded' => 'Add date',
+ 'PanelRating' => 'Ocena',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Lokacija',
+
+ 'PanelLending' => 'Pozajmljivanje',
+ 'PanelBorrower' => 'Pozajmio',
+ 'PanelLendDate' => 'Pozajmljen Od',
+ 'PanelHistory' => 'Istorija Pozajmljivanja',
+ 'PanelReturned' => 'Vraćen Film', # Accepts model codes
+ 'PanelReturnDate' => 'Datum vraćanja',
+ 'PanelLendedYes' => 'Pozajmljen',
+ 'PanelLendedNo' => 'Ovde',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favourite',
+ 'TagsAssigned' => 'Assigned Tags',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Ili',
+ 'CheckYes' => 'Da',
+ 'CheckNo' => 'Ne',
+
+ 'ToolbarAll' => 'Vidi sve',
+ 'ToolbarAllTooltip' => 'Vidi sve filmove',
+ 'ToolbarGroupBy' => 'Group by',
+ 'ToolbarGroupByTooltip' => 'Select the field to use to group items in list',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Traži po filmovima',
+ 'PluginsQuery' => 'Query',
+ 'PluginsFrame' => 'Traži po internet sajtu',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Ime',
+ 'PluginsSearchFields' => 'Search fields',
+ 'PluginsAuthor' => 'Autor',
+ 'PluginsLang' => 'Jezik',
+ 'PluginsUseSite' => 'Koristi odabrani sajt za sledeće pretrage',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Opcije za pozajmljivače',
+ 'BorrowersList' => 'Pozajmljivači',
+ 'BorrowersName' => 'Ime',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Dodaj',
+ 'BorrowersRemove' => 'Obriši',
+ 'BorrowersEdit' => 'Promeni',
+ 'BorrowersTemplate' => 'Predefinisani mail šablon',
+ 'BorrowersSubject' => 'Naslov maila',
+ 'BorrowersNotice1' => '%1 će biti zamenjeno imenom onog kome pozajmljuješ',
+ 'BorrowersNotice2' => '%2 će biti zamenjeno imenom filma',
+ 'BorrowersNotice3' => '%3 će biti zamenjeno datumom pozajmice',
+
+ 'BorrowersImportTitle' => 'Import borrowers information',
+ 'BorrowersImportType' => 'File format:',
+ 'BorrowersImportFile' => 'File:',
+
+ 'BorrowedTitle' => 'Pozajmljeni filmovi', # Accepts model codes
+ 'BorrowedDate' => 'Od',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'Pošalji mu e-mail',
+ 'MailFrom' => 'Od: ',
+ 'MailTo' => 'Za: ',
+ 'MailSubject' => 'Naslov: ',
+ 'MailSmtpError' => 'Problem sa povezivanjem na server za slanje maila (SMTP server)',
+ 'MailSendmailError' => 'Problem sa startovanjem mail servera (sendmail)',
+
+ 'SearchTooltip' => 'Pretraži sve filmove', # Accepts model codes
+ 'SearchTitle' => 'Traži film', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Field to replace',
+ 'QueryReplaceOld' => 'Trenutno ime',
+ 'QueryReplaceNew' => 'Novo ime',
+ 'QueryReplaceLaunch' => 'Replace',
+
+ 'ImportWindowTitle' => 'Odaberi polja koja će se uvesti',
+ 'ImportViewPicture' => 'Vidi sliku',
+ 'ImportSelectAll' => 'Odaberi sve',
+ 'ImportSelectNone' => 'Poništi odabrano',
+
+ 'MultiSiteTitle' => 'Za pretragu koristi ove sajtove',
+ 'MultiSiteUnused' => 'Nekorišćeni dodaci',
+ 'MultiSiteUsed' => 'Koristi ove dodatke',
+ 'MultiSiteLang' => 'Ubaci u listu dodatke na engleskom',
+ 'MultiSiteEmptyError' => 'Lista sajtova je prazna',
+ 'MultiSiteClear' => 'Obriši listu',
+
+ 'DisplayOptionsTitle' => 'Prikaži sledeće',
+ 'DisplayOptionsAll' => 'Odaberi sve',
+ 'DisplayOptionsSearch' => 'Taster pretrage',
+
+ 'GenresTitle' => 'Menjanje Žanrova',
+ 'GenresCategoryName' => 'Žanr',
+ 'GenresCategoryMembers' => 'Umesto žanra',
+ 'GenresLoad' => 'Učitaj listu',
+ 'GenresExport' => 'Sačuvaj listu kao fajl',
+ 'GenresModify' => 'Izmeni menjanje žanrova',
+
+ 'PropertiesName' => 'Collection name',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Owner',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => 'Description',
+ 'PropertiesFile' => 'File Information',
+ 'PropertiesFilePath' => 'Full path',
+ 'PropertiesItemsNumber' => 'Number of items', # Accepts model codes
+ 'PropertiesFileSize' => 'Size',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Collection properties',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Programs for mail sending',
+ 'MailProgramsName' => 'Name',
+ 'MailProgramsCommand' => 'Command line',
+ 'MailProgramsRestore' => 'Restore defaults',
+ 'MailProgramsAdd' => 'Add a program',
+ 'MailProgramsInstructions' => 'In command line, some substitutions are made:
+ %f is replaced with user\'s e-mail address.
+ %t is replaced with the recipient address.
+ %s is replaced with the subject of the message.
+ %b is replaced with the body of the message.',
+
+ 'BookmarksBookmarks' => 'Bookmarks',
+ 'BookmarksFolder' => 'Directory',
+ 'BookmarksLabel' => 'Label',
+ 'BookmarksPath' => 'Path',
+ 'BookmarksNewFolder' => 'New folder',
+
+ 'AdvancedSearchType' => 'Type of search',
+ 'AdvancedSearchTypeAnd' => 'Items matching all criteria', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Items matching at least one criterion', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criteria',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Bug report generated from GCstar',
+ 'BugReportVersion' => 'Version',
+ 'BugReportPlatform' => 'Operating system',
+ 'BugReportMessage' => 'Error message',
+ 'BugReportInformation' => 'Additional information',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/SV/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/SV/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..e3173da
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::SV::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Inkludera fältens namn på toppen',
+ 'Separator' => 'Separator',
+ 'Replacement' => 'Ersätt separatorn med',
+ 'Charset' => 'Teckenkodning',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/SV/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..7a19023
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::SV::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/SV/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..7640c9a
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::SV::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Ogiltig mall-fil',
+ 'UseFile' => 'Använd nedanstående specificerade fil',
+ 'TemplateExternalFile' => 'Mall-fil',
+ 'WithJS' => 'Använd Javascript',
+ 'FileTemplate' => 'Mall:',
+ 'Preview' => 'Förhandsgranskning',
+ 'NoPreview' => 'Ingen förhandsgranskning tillgänglig',
+ 'Title' => 'Sidans titel',
+ 'InfoFile' => 'Filmlistan är i filen: ',
+ 'InfoDir' => 'Bilder är i: ',
+ 'HeightImg' => 'Höjd (i pixlar) på bilderna som kommer exporteras: ',
+ 'OpenFileInBrowser' => 'Öppna genererad fil i webbläsaren',
+ 'Note' => 'Lista genererad med <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Ange söktext',
+ 'SearchType1' => 'Endast titel',
+ 'SearchType2' => 'Full information',
+ 'SearchButton' => 'Sök',
+ 'SearchTitle' => 'Visa endast filmer som matchar föregående kriterium',
+ 'AllButton' => 'Alla',
+ 'AllTitle' => 'Visa alla filmer',
+ 'Expand' => 'Expandera alla',
+ 'ExpandTitle' => 'Visa information om alla filmer',
+ 'Collapse' => 'Fäll ihop alla',
+ 'CollapseTitle' => 'Fäll ihop information om alla filmer',
+ 'Borrowed' => 'Lånad av: ',
+ 'NotBorrowed' => 'Tillgänglig',
+ 'Top' => 'Topp',
+ 'Bottom' => 'Botten',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/SV/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..49fe4bb
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::SV::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/SV/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..2d80b7a
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::SV::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Inkludera DROP instruktionen',
+ 'WithCreate' => 'Inkludera CREATE instruktionen',
+ 'TableName' => 'Tabellnamn',
+ 'InfoFile' => 'SQL fil: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/SV/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..33e5e4f
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::SV::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Arkivet finns i filen: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/SV/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..b41258f
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::SV::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Mallfil',
+ 'ModelText' => 'Malltext',
+ 'Models' => 'Mall att använda',
+ 'UseFile' => 'Använd filen',
+ 'UseModel' => 'Använd textarea',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/SV/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..2f3af6b
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::SV::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Var bör sökning ske',
+ 'Default' => 'Förvälj Alexandria\'s katalog',
+ 'Specified' => 'Katalog specifierad nedan',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/SV/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..e4d3a17
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::SV::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Teckenkodning',
+ 'Header' => 'Ignorera första raden',
+ 'Separator' => 'Separator',
+ 'Plugin' => 'Hemsida att använda',
+ 'UseFirst' => 'Välj först en av många resultat',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/SV/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..112abb1
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::SV::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Mapp',
+ 'Recursive' => 'Bläddra undermappar',
+ 'Suffixes' => 'Suffix eller filändelser',
+ 'SuffixesTooltip' => 'En komma-separerad lista av suffix eller filändelser att betrakta',
+ 'Remove' => 'Att ta bort från namn',
+ 'RemoveTooltip' => 'En komma-separerad lista av ord som bör tas bort från filnamn för att skapa de hämtade filnamnen från',
+ 'Ask'=> 'Fråga',
+ 'AskEnd'=> 'Fråga alla vid slute',
+ 'AddWithoutInfo'=> 'Lägg till utan info',
+ 'DontAdd'=> 'Lägg inte till',
+ 'TakeFirst' => 'Välj först',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Ta enbart bort hela ord',
+ 'NoResult'=> 'Inga resultat',
+ 'NoResultTooltip'=> 'Vad skall vi göra när inga sökresultat returneras av plugin:et',
+ 'RemoveTooltipWholeWord' => 'Ord kommer enbart tas bort ifall de förekommer som ett helt ord',
+ 'RemoveRegularExpr' => 'Reguljärt uttryck',
+ 'RemoveTooltipRegularExpr' => 'Tänk på att \'Ta bort från namn\' är ett reguljärt uttryck i perl',
+ 'SkipFileAlreadyInCollection' => 'Lägg enbart till nya filer',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Lägg enbart till filer som inte redan finns i samlingen',
+ 'SkipFileNo' => 'Nej',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'baserad på filnamnet (men uppdatera sökväg i samlingen)',
+ 'InfoFromFileNameRegExp' => 'Parsa filnamn med reguljärt uttryck',
+ 'InfoFromFileNameRegExpTooltip' => 'Använd detta för att införskaffa info från filnamn (tillämpat efter borttagning av ändelse). Lämna tomt ifall ej nödvändig. Kända fält: $T:Titel, $A:Alfabetisk titel, $Y:Releasedatum, $S:Säsong, $E:Episod, $N:Alfabetiskt serienamn, $x:Avsnittsnummer, $y:Totalt antal avsnitt',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/SV/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..aeeb60a
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::SV::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Kopiera bilder',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCImport/GCImportList.pm b/lib/gcstar/GCLang/SV/GCImport/GCImportList.pm
new file mode 100644
index 0000000..21079f3
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::SV::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Namnlista',
+ 'Plugin' => 'Hemsida att använda',
+ 'UseFirst' => 'Välj först en av många resultat',
+ 'CommentAuto' => 'Artikel automatiskt importerad.',
+ 'CommentSite' => 'Hemsida: ',
+ 'CommentTitle' => 'Titel: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/SV/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..826765a
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::SV::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/SV/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..3ac54f2
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::SV::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Filen är ingen Tellico samling som stöds',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/SV/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..2ba74e6
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCTVepisodes.pm
@@ -0,0 +1,45 @@
+{
+ package GCLang::SV::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ CollectionDescription => 'TV-episod samling',
+ Items => 'Episoder',
+ NewItem => 'Ny episod',
+ NewSeries => 'Nya serier',
+ Episode => 'Episod',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/SV/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..7647402
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCTVseries.pm
@@ -0,0 +1,49 @@
+{
+ package GCLang::SV::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ CollectionDescription => 'TV-serie samling',
+ Items => 'Serier',
+ NewItem => 'Nya serier',
+ Name => 'Namn',
+ Season => 'Säsong',
+ Part => 'Del',
+ Episodes => 'Episod',
+ FirstAired => 'Lanserad',
+ Time => 'Ep. Längd',
+ Producer => 'Producent',
+ Music => 'Musik',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/SV/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..9ec109b
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::SV::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Brädspelssamling',
+ Items => {0 => 'Spel',
+ 1 => 'Spel',
+ X => 'Spel'},
+ NewItem => 'Nytt spel',
+
+ Id => 'Id',
+ Name => 'Namn',
+ Original => 'Original namn',
+ Box => 'Omslagsbild',
+ DesignedBy => 'Designad av',
+ PublishedBy => 'Utgiven av',
+ Players => 'Antal spelare',
+ PlayingTime => 'Speltid',
+ SuggestedAge => 'Rekommenderad ålder',
+ Released => 'Utgiven',
+ Description => 'Beskrivning',
+ Category => 'Kategori',
+ Mechanics => 'Mekanik',
+ ExpandedBy => 'Expanderad av',
+ ExpansionFor => 'Expansion för',
+ GameFamily => 'Spelfamilj',
+ IllustratedBy => 'Illustrerad av',
+ Url => 'Hemsida',
+ TimesPlayed => 'Antal spelade sessioner',
+ CompleteContents => 'Komplett innehåll',
+ Copies => 'Antal exemplar',
+ Condition => 'Skick',
+ Photos => 'Bilder',
+ Photo1 => 'Första bild',
+ Photo2 => 'Andra bild',
+ Photo3 => 'Tredje bild',
+ Photo4 => 'Fjärde bild',
+ Comments => 'Kommentarer',
+
+ Perfect => 'Perfekt',
+ Good => 'Bra',
+ Average => 'Medel',
+ Poor => 'Undermålig',
+
+ CompleteYes => 'Komplett innehåll',
+ CompleteNo => 'Saknade delar',
+
+ General => 'Allmänt',
+ Details => 'Detaljer',
+ Personal => 'Personligt',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Betyg _Åtminstone...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCbooks.pm b/lib/gcstar/GCLang/SV/GCModels/GCbooks.pm
new file mode 100644
index 0000000..f91e0f1
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCbooks.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::SV::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Boksamling',
+ Items => 'Böcker',
+ NewItem => 'Ny bok',
+
+ Isbn => 'ISBN',
+ Title => 'Titel',
+ Cover => 'Omslag',
+ Authors => 'Författare',
+ Publisher => 'Utgivare',
+ Publication => 'Utgivningsdatum',
+ Language => 'Språk',
+ Genre => 'Genre',
+ Serie => 'Serie',
+ Rank => 'Grad',
+ Bookdescription => 'Beskrivning',
+ Pages => 'Antal sidor',
+ Read => 'Läst',
+ Acquisition => 'Förvärvsdatum',
+ Edition => 'Utgåva',
+ Format => 'Format',
+ Comments => 'Kommentarer',
+ Url => 'Hemsida',
+ Translator => 'Översättare',
+ Artist => 'Illustratör',
+ DigitalFile => 'Digital version',
+
+ General => 'Allmänt',
+ Details => 'Detaljer',
+
+ ReadNo => 'Ej läst',
+ ReadYes => 'Läst',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCcoins.pm b/lib/gcstar/GCLang/SV/GCModels/GCcoins.pm
new file mode 100644
index 0000000..54027c8
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCcoins.pm
@@ -0,0 +1,102 @@
+{
+ package GCLang::SV::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Myntsamling',
+ Items => 'Mynt',
+ NewItem => 'Nytt mynt',
+
+ Name => 'Namn',
+ Country => 'Land',
+ Year => 'År',
+ Currency => 'Valuta',
+ Value => 'Värde',
+ Picture => 'Huvudbild',
+ Diameter => 'Diameter',
+ Metal => 'Metall',
+ Edge => 'Kant',
+ Edge1 => 'Kant 1',
+ Edge2 => 'Kant 2',
+ Edge3 => 'Kant 3',
+ Edge4 => 'Kant 4',
+ Head => 'Huvud',
+ Tail => 'Baksida',
+ Comments => 'Kommentarer',
+ History => 'Historik',
+ Website => 'Hemsida',
+ Estimate => 'Bedömning',
+ References => 'Referenser',
+ Type => 'Typ',
+ Coin => 'Mynt',
+ Banknote => 'Banknotering',
+
+ Main => 'Huvud',
+ Description => 'Beskrivning',
+ Other => 'Övrig information',
+ Pictures => 'Bilder',
+
+ Condition => 'Tillstånd (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCcomics.pm b/lib/gcstar/GCLang/SV/GCModels/GCcomics.pm
new file mode 100644
index 0000000..f01bb23
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::SV::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCfilms.pm b/lib/gcstar/GCLang/SV/GCModels/GCfilms.pm
new file mode 100644
index 0000000..7075d79
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCfilms.pm
@@ -0,0 +1,91 @@
+{
+ package GCLang::SV::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Filmsamling',
+ Items => 'Filmer',
+ NewItem => 'Ny film',
+
+
+ Id => 'Id',
+ Title => 'Titel',
+ Date => 'Datum',
+ Time => 'Längd',
+ Director => 'Regissör',
+ Country => 'Land',
+ MinimumAge => 'Åldersgräns',
+ Genre => 'Genre',
+ Image => 'Bild',
+ Original => 'Original titel',
+ Actors => 'Roller',
+ Actor => 'Skådespelare',
+ Role => 'Roll',
+ Comment => 'Kommentarer',
+ Synopsis => 'Synopsis',
+ Seen => 'Visad',
+ Number => '# av Media',
+ Format => 'Media',
+ Region => 'Region',
+ Identifier => 'Identifierare',
+ Url => 'Hemsida',
+ Audio => 'Ljud',
+ Video => 'Videoformat',
+ Trailer => 'Videofil',
+ Serie => 'Serie',
+ Rank => 'Grad',
+ Subtitles => 'Undertexter',
+
+ SeenYes => 'Visad',
+ SeenNo => 'Ej visad',
+
+ AgeUnrated => 'Ej betygsatt',
+ AgeAll => 'Alla Åldrar',
+ AgeParent => 'Åldersgräns',
+
+ Main => 'Huvudartiklar',
+ General => 'Allmänt',
+ Details => 'Detaljer',
+
+ Information => 'Information',
+ Languages => 'Språk',
+ Encoding => 'Kodning',
+
+ FilterAudienceAge => 'Publik ålder',
+ FilterSeenNo => '_Ännu ej visad',
+ FilterSeenYes => '_Redan visad',
+ FilterRatingSelect => 'Betyg _Åtminstone...',
+
+ ExtractSize => 'Storlek',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCgames.pm b/lib/gcstar/GCLang/SV/GCModels/GCgames.pm
new file mode 100644
index 0000000..f708e93
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCgames.pm
@@ -0,0 +1,80 @@
+{
+ package GCLang::SV::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Videospelsamling',
+ Items => 'Spel',
+ NewItem => 'Nytt spel',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Namn',
+ Platform => 'Plattform',
+ Players => 'Antal spelare',
+ Released => 'Releasedatum',
+ Editor => 'Utgivare',
+ Developer => 'Utvecklare',
+ Genre => 'Genre',
+ Box => 'Omslagsbild',
+ Case => 'Fodral',
+ Manual => 'Instruktionsmanual',
+ Completion => 'Fullständighet (%)',
+ Executable => 'Startfil',
+ Description => 'Beskrivning',
+ Codes => 'Koder',
+ Code => 'Kod',
+ Effect => 'Effekt',
+ Secrets => 'Hemligheter',
+ Screenshots => 'Bilder',
+ Screenshot1 => 'Första bild',
+ Screenshot2 => 'Andra screenshot',
+ Comments => 'Kommentarer',
+ Url => 'Hemsida',
+ Unlockables => 'Upplåsningar',
+ Unlockable => 'Upplåsningsbar',
+ Howto => 'Hur låsa upp',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Allmänt',
+ Details => 'Detaljer',
+ Tips => 'Tips',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Betyg _Åtminstone...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/SV/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..4d52094
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::SV::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCminicars.pm b/lib/gcstar/GCLang/SV/GCModels/GCminicars.pm
new file mode 100644
index 0000000..16b8ec9
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::SV::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCmusics.pm b/lib/gcstar/GCLang/SV/GCModels/GCmusics.pm
new file mode 100644
index 0000000..f85eca9
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCmusics.pm
@@ -0,0 +1,66 @@
+{
+ package GCLang::SV::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Musiksamling',
+ Items => 'Album',
+ NewItem => 'Nytt album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Titel',
+ Cover => 'Omslag',
+ Artist => 'Artist',
+ Format => 'Format',
+ Running => 'Speltid',
+ Release => 'Releasedatum',
+ Genre => 'Genre',
+ Origin => 'Ursprung',
+
+#For tracks list
+ Tracks => 'Låtlista',
+ Number => 'Nummer',
+ Track => 'Titel',
+ Time => 'Tid',
+
+ Composer => 'Kompositör',
+ Producer => 'Producent',
+ Playlist => 'Spellista',
+ Comments => 'Kommentarer',
+ Label => 'Beteckning',
+ Url => 'Hemsida',
+
+ General => 'Allmänt',
+ Details => 'Detaljer',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/SV/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..e42b68a
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::SV::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Tidsskriftssamling',
+ Items => {0 => 'Tidsskrift',
+ 1 => 'Tidsskrift',
+ X => 'Tidsskrifter'},
+ NewItem => 'Ny Tidsskrift',
+
+ Title => 'Titel',
+ Cover => 'Omslag',
+ Periodical => 'Tidsskrift',
+ Number => 'Nummer',
+ Date => 'Datum',
+ Subject => 'Ämne',
+ Articles => 'Artiklar',
+
+ General => 'Allmänt',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/SV/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..6cc88b1
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::SV::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/SV/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..15ce1d0
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::SV::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCstamps.pm b/lib/gcstar/GCLang/SV/GCModels/GCstamps.pm
new file mode 100644
index 0000000..b6e8348
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::SV::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Frimärkssamling',
+ Items => {0 => 'Frimärken',
+ 1 => 'Frimärke',
+ X => 'Frimärken'},
+ NewItem => 'Nytt frimärke',
+
+ General => 'Allmänt',
+ Detail => 'Detaljerat',
+ Value => 'Värde',
+ Notes => 'Noteringar',
+ Views => 'Vyer',
+
+ Name => 'Namn',
+ Country => 'Land',
+ Year => 'År',
+ Catalog => 'Katalog',
+ Number => 'Nummer',
+ Topic => 'Ämne',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Graverad av',
+ Type => 'Typ',
+ Format => 'Format',
+ Description => 'Beskrivning',
+ Color => 'Färg',
+ Gum => 'Klister',
+ Paper => 'Papper',
+ Perforation => 'Tandning',
+ PerforationSize => 'Tandningens storlek',
+ CancellationType => 'Typ av stämpel',
+ Comments => 'Kommentarer',
+ PrintingVariety => 'Form av tryck',
+ IssueDate => 'Datum för utfärdande',
+ EndOfIssue => 'Slut för utfärdande',
+ Issue => 'Utfärdande',
+ Grade => 'Sortering',
+ Status => 'Status',
+ Adjusted => 'Anpassad',
+ Cancellation => 'Stämpel',
+ CancellationCondition => 'Stämpelns skick',
+ GumCondition => 'Klistrets skick',
+ PerforationCondition => 'Tandningens skick',
+ ConditionNotes => 'Notering av skick',
+ Error => 'Fel',
+ ErrorNotes => 'Notering av fel',
+ FaceValue => 'Ansiktsvärde',
+ MintValue => 'Myntvärde',
+ UsedValue => 'Begagnatvärde',
+ PurchasedDate => 'Införskaffad datum',
+ Quantity => 'Kvantitet',
+ History => 'Historia',
+ Picture1 => 'Bild 1',
+ Picture2 => 'Bild 2',
+ Picture3 => 'Bild 3',
+
+ AirMail => 'Flygpost',
+ MilitaryStamp => 'Militärt frimärke',
+ Official => 'Officiell',
+ PostageDue => 'Postat den',
+ Regular => 'Vanlig',
+ Revenue => 'Intäkt',
+ SpecialDelivery => 'Special leverans',
+ StrikeStamp => 'Strejk frimärke',
+ TelegraphStamp => 'Telegraf frimärke',
+ WarStamp => 'Krigsfrimärke',
+ WarTaxStamp => 'Krigsskattefrimärke',
+
+ Booklet => 'Häfte',
+ BookletPane => 'Panel för häfte',
+ Card => 'Kort',
+ Coil => 'Rulle',
+ Envelope => 'Kuvert',
+ FirstDayCover => 'Första omslag',
+ Sheet => 'Blad',
+ Single => 'Singel',
+
+ Heliogravure => 'Heliogravyr',
+ Lithography => 'Litografi',
+ Offset => 'Utjämning',
+ Photogravure => 'Fotogravyr',
+ RecessPrinting => 'Fördjupningstryck',
+ Typography => 'Typografi',
+
+ OriginalGum => 'Originalklister',
+ Ungummed => 'Oklistrad',
+ Regummed => 'Omklistrad',
+
+ Chalky => 'Kritad',
+ ChinaPaper => 'Kinapapper',
+ Coarsed => 'Ojämn',
+ Glossy => 'Blank',
+ Granite => 'Granit',
+ Laid => 'Dämpad',
+ Manila => 'Manillapapper',
+ Native => 'Naturlig',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Randig',
+ Rice => 'Ris',
+ Silk => 'Silke',
+ Smoothed => 'Jämn',
+ Thick => 'Tjock',
+ Thin => 'Tunn',
+ Wove => 'Vågig',
+
+ CoarsedPerforation => 'Ojämn tandning',
+ CombPerforation => 'Bruten tandning',
+ CompoundPerforation => 'Sammansatt tandning',
+ DamagedPerforation => 'Skadad tandning',
+ DoublePerforation => 'Dubbeltandning',
+ HarrowPerforation => 'Harvig tandning',
+ LinePerforation => 'Linjerad tandning',
+ NoPerforation => 'Ingen tandning',
+
+ CancellationToOrder => 'Stämpel att beställa',
+ FancyCancellation => 'Dekorerad stämpel',
+ FirstDayCancellation => 'Första stämpeln',
+ NumeralCancellation => 'Numerisk stämpel',
+ PenMarked => 'Pennmarkerad',
+ RailroadCancellation => 'Tågstämpel',
+ SpecialCancellation => 'Specialstämpel',
+
+ Superb => 'Super',
+ ExtraFine => 'Extra Fin',
+ VeryFine => 'Väldigt fin',
+ FineVeryFine => 'Fin/Väldigt fin',
+ Fine => 'Fin',
+ Average => 'Medel',
+ Poor => 'Dålig',
+
+ Owned => 'Ägd',
+ Ordered => 'Beställd',
+ Sold => 'Såld',
+ ToSell => 'Att sälja',
+ Wanted => 'Vill ha',
+
+ LightCancellation => 'Lätt stämplad',
+ HeavyCancellation => 'Hårt stämplad',
+ ModerateCancellation => 'Medelstämplad',
+
+ MintNeverHinged => 'Mynt aldrig fäst',
+ MintLightHinged => 'Mynt lätt fäst',
+ HingedRemnant => 'Lämpligt fäst',
+ HeavilyHinged => 'Väldigt fäst',
+ LargePartOriginalGum => 'Stor del original klister',
+ SmallPartOriginalGum => 'Liten del original klister',
+ NoGum => 'Inget klister',
+
+ Perfect => 'Perfekt',
+ VeryNice => 'Väldigt bra',
+ Nice => 'Bra',
+ Incomplete => 'Ej komplett',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCwines.pm b/lib/gcstar/GCLang/SV/GCModels/GCwines.pm
new file mode 100644
index 0000000..96dfae3
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::SV::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Wines collection',
+ Items => 'Wines',
+ NewItem => 'New wine',
+
+ Name => 'Name',
+ Designation => 'Designation',
+ Vintage => 'Vintage',
+ Vineyard => 'Vineyard',
+ Type => 'Type',
+ Grapes => 'Grapes',
+ Soil => 'Soil',
+ Producer => 'Producer',
+ Country => 'Country',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medal/Honour',
+
+ Storage => 'Storage',
+ Location => 'Location',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantity',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Purchase date',
+ PurchasePrice => 'Purchase price',
+ Gift => 'Gift',
+ BottleLabel => 'Bottle label',
+ Website => 'Reference on the web',
+
+ Tasted => 'Tasted',
+ Comments => 'Comments',
+ Serving => 'Serving',
+ TastingField => 'Testing notes',
+
+ General => 'General',
+ Details => 'Details',
+ Tasting => 'Tasting',
+
+ TastedNo => 'Non tasted',
+ TastedYes => 'Tasted',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Not yet tasted',
+ FilterTastedYes => 'Already _tasted',
+ FilterRatingSelect => 'Rating at _least...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCstar.pm b/lib/gcstar/GCLang/SV/GCstar.pm
new file mode 100644
index 0000000..6cad462
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCstar.pm
@@ -0,0 +1,670 @@
+{
+ package GCLang::SV; # Use the swedish language package
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Svenska',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Varning</b>:
+
+Information nerladdad från hemsidor (genom söktilläggen) är <b>enbart för privat bruk</b>.
+
+Alla nydistribueringar är förbjudna utan respektive hemsidors <b>explicita medgivande</b>.
+
+För att avgöra vilken hemsida som äger informationen, så kan du använda <b>knappen under artikelns detaljer</b>.',
+
+ 'AllItemsFiltered' => 'Inga artiklar matchar ditt filteringskriterium', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Installera i ',
+ 'InstallMandatory' => 'Nödvändiga komponenter',
+ 'InstallOptional' => 'Valfria komponenter',
+ 'InstallErrorMissing' => 'Fel : Följande Perl komponenter måste installeras',
+ 'InstallPrompt' => 'Grundkatalog för installation [/usr/local]: ',
+ 'InstallEnd' => 'Installationen slutförd',
+ 'InstallNoError' => 'Inga fel påträffades',
+ 'InstallLaunch' => 'För att starta programmet, så kan du starta ',
+ 'InstallDirectory' => 'Grundkatalog',
+ 'InstallTitle' => 'GCstar installation',
+ 'InstallDependencies' => 'Beroenden',
+ 'InstallPath' => 'Sökväg',
+ 'InstallOptions' => 'Inställningar',
+ 'InstallSelectDirectory' => 'Välj grundkatalog för installationen',
+ 'InstallWithClean' => 'Ta bort filer som hittats i installationskatalogen',
+ 'InstallWithMenu' => 'Lägg till GCstar till Program-menyn',
+ 'InstallNoPermission' => 'Fel: Du har inte rättighet att skriva till vald katalog',
+ 'InstallMissingMandatory' => 'Nödvändiga beroenden fattas. Du kommer inte kunna installera GCstar förrän de har lagts till i ditt system.',
+ 'InstallMissingOptional' => 'Valfria beroenden fattas. De är listade under. GCstar kommer att installeras men viss funktionalitet kommer inte vara tillgänglig.',
+ 'InstallMissingNone' => 'Inga beroenden fattas. Du bör fortsätta installationen av GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Fattas',
+ 'InstallMissingFor' => 'Fattas för',
+ 'InstallCleanDirectory' => 'Tar bort GCstar\'s filer i katalogen: ',
+ 'InstallCopyDirectory' => 'Kopiera filer i katalogen: ',
+ 'InstallCopyDesktop' => 'Kopiera skrivbordsfilen i: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy att använda (Tryck bara enter om ingen): ',
+ 'UpdateNoPermission' => 'Skrivrättighet nekad i denna katalog: ',
+ 'UpdateNone' => 'Inga updateringar har hittats',
+ 'UpdateFileNotFound' => 'Filen ej hittad',
+
+#Splash
+ 'SplashInit' => 'Initiering',
+ 'SplashLoad' => 'Laddar Samling',
+ 'SplashDisplay' => 'Visar Samling',
+ 'SplashSort' => 'Sorterar samling',
+ 'SplashDone' => 'Färdig',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Det verkar som du använt GCfilms tidigare. Vad vill du importera från GCfilms till GCstar (det kommer inte att påverka GCfilms ifall du fortfarande vill använda det)?',
+ 'GCfilmsImportOptions' => 'Inställningar',
+ 'GCfilmsImportData' => 'Filmlista',
+
+#Menus
+ 'MenuFile' => '_Arkiv',
+ 'MenuNewList' => '_Ny Samling',
+ 'MenuStats' => 'Statistik',
+ 'MenuHistory' => '_Tidigare Samlingar',
+ 'MenuLend' => 'Visa _Lånade Artiklar', # Accepts model codes
+ 'MenuImport' => '_Importera',
+ 'MenuExport' => '_Exportera',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Redigera',
+ 'MenuDuplicate' => 'Ko_piera artikel', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Ta bort artikel', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Ändra samlingens fält',
+ 'MenuEditLockItems' => '_Lås Samling',
+
+ 'MenuDisplay' => 'F_ilter',
+ 'MenuSavedSearches' => 'Sparade sökningar',
+ 'MenuSavedSearchesSave' => 'Spara aktuell sökning',
+ 'MenuSavedSearchesEdit' => 'Modifiera sparade sökningar',
+ 'MenuAdvancedSearch' => 'A_vancerad Sök',
+ 'MenuViewAllItems' => 'Visa _Alla artiklar', # Accepts model codes
+ 'MenuNoFilter' => '_Någon',
+
+ 'MenuConfiguration' => '_Inställningar',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Visad Information',
+ 'MenuBorrowers' => '_Låntagare',
+ 'MenuToolbarConfiguration' => '_Verktygsfältets kontroller',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Genre _Konvertering',
+
+ 'MenuBookmarks' => 'Mina _Samlingar',
+ 'MenuBookmarksAdd' => '_Lägg till aktuell samling',
+ 'MenuBookmarksEdit' => '_Redigera sparade samlingar',
+
+ 'MenuHelp' => '_Hjälp',
+ 'MenuHelpContent' => '_Innehåll',
+ 'MenuAllPlugins' => 'Visa _tillägg',
+ 'MenuBugReport' => 'Rapportera en _bugg',
+ 'MenuAbout' => '_Om GCstar',
+
+ 'MenuNewWindow' => 'Visa artikel i _Nytt Fönster', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Expandera alla',
+ 'ContextCollapseAll' => 'Komprimera alla',
+ 'ContextChooseImage' => 'Välj _Bild',
+ 'ContextImageEditor' => 'Öppna med Bildredigerare',
+ 'ContextOpenWith' => 'Öppna me_d',
+ 'ContextImgFront' => 'Framsida',
+ 'ContextImgBack' => 'Baksida',
+ 'ContextChooseFile' => 'Välj en Fil',
+ 'ContextChooseFolder' => 'Välj en Mapp',
+
+ 'DialogEnterNumber' => 'Var god ange ett värde',
+
+ 'RemoveConfirm' => 'Är du säker på att du vill ta bort denna artikel?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'Ny artikel', # Accepts model codes
+ 'NewItemTooltip' => 'Lägg till en ny artikel', # Accepts model codes
+ 'NoItemFound' => 'Ingenting hittades. Vill du söka på en annan hemsida?',
+ 'OpenList' => 'Var god välj samling',
+ 'SaveList' => 'Var god välj vart du vill spara samlingen',
+ 'SaveListTooltip' => 'Spara aktuell samling',
+ 'SaveUnsavedChanges' => 'Det finns osparade ändringar i din samling. Vill du spara dem?',
+ 'SaveDontSave' => 'Spara inte',
+ 'PreferencesTooltip' => 'Ställ in dina inställningar',
+ 'ViewTooltip' => 'Ändra samlingsvisning',
+ 'PlayTooltip' => 'Spela video associerad med artikel', # Accepts model codes
+ 'PlayFileNotFound' => 'Filen att spela hittades ej på denna platsen:',
+ 'PlayRetry' => 'Försök igen',
+
+ 'StatusSave' => 'Sparar...',
+ 'StatusLoad' => 'Laddar...',
+ 'StatusSearch' => 'Sökning pågår...',
+ 'StatusGetInfo' => 'Hämtar information...',
+ 'StatusGetImage' => 'Hämtar bild...',
+
+ 'SaveError' => 'Artikellistan kunde inte sparas. Var god kontrollera rättigheter och ledigt diskutrymme.',
+ 'OpenError' => 'Artikellistan kunde inte öppnas. Var god kontrollera rättigheter.',
+ 'OpenFormatError' => 'Artikellistan kunde inte öppnas. Formatet kan vara felaktigt.',
+ 'OpenVersionWarning' => 'Samlingen är skapad med en nyare version av GCstar. Om du sparar den, kan dataförlust ske.',
+ 'OpenVersionQuestion' => 'Vill du fortfarande fortsätta?',
+ 'ImageError' => 'Vald katalog att spara bilder till är felaktig. Var god välj en annan.',
+ 'OptionsCreationError'=> 'Kan inte skapa inställningsfil: ',
+ 'OptionsOpenError'=> 'Kan inte öppna inställningsfil: ',
+ 'OptionsSaveError'=> 'Kan inte spara inställningsfil: ',
+ 'ErrorModelNotFound' => 'Modell ej funnen: ',
+ 'ErrorModelUserDir' => 'Användardefinierade modeller finns i: ',
+
+ 'RandomTooltip' => 'Vad ska vi se ikväll ?',
+ 'RandomError'=> 'Du har inga artiklar som kan bli valda', # Accepts model codes
+ 'RandomEnd'=> 'Det finns inga fler artiklar', # Accepts model codes
+ 'RandomNextTip'=> 'Nästa förslag',
+ 'RandomOkTip'=> 'Acceptera denna artikel',
+
+ 'AboutTitle' => 'Om GCstar',
+ 'AboutDesc' => 'Samlingshanterare',
+ 'AboutVersion' => 'Version',
+ 'AboutTeam' => 'Team',
+ 'AboutWho' => 'Christian Jodar (Tian): Projektföreståndare, Programmerare
+Nyall Dawson (Zombiepig): Programmerare
+TPF: Programmerare
+Adolfo González: Programmerare
+',
+ 'AboutLicense' => 'Distribuerad under GNU GPL Licensen, Logotyper Copyright le Spektre',
+ 'AboutTranslation' => 'Svensk översättning av anonym medarbetare',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logotyper och webbdesign skapad av le Spektre',
+
+ 'ToolbarRandom' => 'Ikväll',
+
+ 'UnsavedCollection' => 'Osparad samling',
+ 'ModelsSelect' => 'Välj en samlingstyp',
+ 'ModelsPersonal' => 'Personliga samlingar',
+ 'ModelsDefault' => 'Förvalda samlingar',
+ 'ModelsList' => 'Samlingsdefinition',
+ 'ModelSettings' => 'Samlingsinställningar',
+ 'ModelNewType' => 'Ny samlingstyp',
+ 'ModelName' => 'Namn på samlingstyp:',
+ 'ModelFields' => 'Fält',
+ 'ModelOptions' => 'Inställningar',
+ 'ModelFilters' => 'Filter',
+ 'ModelNewField' => 'Nytt fält',
+ 'ModelFieldInformation' => 'Information',
+ 'ModelFieldName' => 'Beteckning:',
+ 'ModelFieldType' => 'Typ:',
+ 'ModelFieldGroup' => 'Grupp:',
+ 'ModelFieldValues' => 'Värden',
+ 'ModelFieldInit' => 'Förvalt:',
+ 'ModelFieldMin' => 'Minimum:',
+ 'ModelFieldMax' => 'Maximum:',
+ 'ModelFieldList' => 'Värdelista:',
+ 'ModelFieldListLegend' => '<i>Separerat med komma</i>',
+ 'ModelFieldDisplayAs' => 'Visa som: ',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Värdering',
+ 'ModelFieldTypeShortText' => 'Kort text',
+ 'ModelFieldTypeLongText' => 'Lång text',
+ 'ModelFieldTypeYesNo' => 'Ja/Nej',
+ 'ModelFieldTypeNumber' => 'Nummer',
+ 'ModelFieldTypeDate' => 'Datum',
+ 'ModelFieldTypeOptions' => 'Fördefinierad värdelista',
+ 'ModelFieldTypeImage' => 'Bild',
+ 'ModelFieldTypeSingleList' => 'Enkel lista',
+ 'ModelFieldTypeFile' => 'Fil',
+ 'ModelFieldTypeFormatted' => 'Beroende av andra fält',
+ 'ModelFieldParameters' => 'Parametrar',
+ 'ModelFieldHasHistory' => 'Använd historik',
+ 'ModelFieldFlat' => 'Visa på en rad',
+ 'ModelFieldStep' => 'Öka steg:',
+ 'ModelFieldFileFormat' => 'Filformat:',
+ 'ModelFieldFileFile' => 'Enkel fil',
+ 'ModelFieldFileImage' => 'Bild',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Ljud',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'Länk',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Fält att använda',
+ 'ModelOptionsFieldsAuto' => 'Automatisk',
+ 'ModelOptionsFieldsNone' => 'Ingen',
+ 'ModelOptionsFieldsTitle' => 'Som titel',
+ 'ModelOptionsFieldsId' => 'Som identifierare',
+ 'ModelOptionsFieldsCover' => 'Som omslag',
+ 'ModelOptionsFieldsPlay' => 'För Spelaknapp',
+ 'ModelCollectionSettings' => 'Samlingsinställningar',
+ 'ModelCollectionSettingsLending' => 'Artiklar kan bli utlånade',
+ 'ModelCollectionSettingsTagging' => 'Produkter kan bli märkta',
+ 'ModelFilterActivated' => 'Bör vara i sökrutan',
+ 'ModelFilterComparison' => 'Jämförelser',
+ 'ModelFilterContain' => 'Innehåller',
+ 'ModelFilterDoesNotContain' => 'Innehåller ej',
+ 'ModelFilterRegexp' => 'Reguljära uttryck',
+ 'ModelFilterRange' => 'Räckvidd',
+ 'ModelFilterNumeric' => 'Jämförelsen är numerisk',
+ 'ModelFilterQuick' => 'Skapa ett snabbt filter',
+ 'ModelTooltipName' => 'Använd ett namn för att återanvända denna modell för många samlingar. Om den är tom, så kommer inställningarna sparas direkt i själva samlingen',
+ 'ModelTooltipLabel' => 'Fältnamnet såsom den kommer visas',
+ 'ModelTooltipGroup' => 'Används för att gruppera fält. Artiklar utan värden här kommer att vara i den förinställda gruppen',
+ 'ModelTooltipHistory' => 'Bör de tidigare angivna värdena sparas i en lista associerad till fältet',
+ 'ModelTooltipFormat' => 'Detta format används för att avgöra hur filen skall öppnas med Spelaknappen',
+ 'ModelTooltipLending' => 'Detta kommer att lägga till några fält för att hantera utlåningar',
+ 'ModelTooltipTagging' => 'Detta kommer lägga till några fält för att hantera märkning',
+ 'ModelTooltipNumeric' => 'Bör värdena anses som nummer för jämförelse',
+ 'ModelTooltipQuick' => 'Detta kommer lägga till en undermeny i Filtermenyn',
+
+ 'ResultsTitle' => 'Välj en artikel', # Accepts model codes
+ 'ResultsNextTip' => 'Sök på nästa hemsida',
+ 'ResultsPreview' => 'Förhandsgranska',
+ 'ResultsInfo' => 'Du kan lägga till flera produkter till en samling genom att hålla ner Ctrl- eller Skift-tangenten för att markera dem', # Accepts model codes
+
+ 'OptionsTitle' => 'Inställningar',
+ 'OptionsExpertMode' => 'Expert Läge',
+ 'OptionsPrograms' => 'Specifiera program att använda med övrig media, lämna tomt för att använda systemets inställningar.',
+ 'OptionsBrowser' => 'Webbläsare',
+ 'OptionsPlayer' => 'Videospelare',
+ 'OptionsAudio' => 'Ljudspelare',
+ 'OptionsImageEditor' => 'Bildredigerare',
+ 'OptionsCdDevice' => 'CD enhet',
+ 'OptionsImages' => 'Bildkatalog',
+ 'OptionsUseRelativePaths' => 'Använd relativa sökvägar för bilder',
+ 'OptionsLayout' => 'Layout',
+ 'OptionsStatus' => 'Visa statusfält',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Varning: Ändringar i denna flik kommer ej ta effekt förrän applikationen startas om.',
+ 'OptionsRemoveConfirm' => 'Fråga efter godkännande innan artikel tas bort',
+ 'OptionsAutoSave' => 'Spara samling automatiskt',
+ 'OptionsAutoLoad' => 'Ladda senast valda samling vid uppstart',
+ 'OptionsSplash' => 'Visa splash screen',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Använd stavningskontroll för långa textfält',
+ 'OptionsProgramTitle' => 'Välj program att använda',
+ 'OptionsPlugins' => 'Hemsida att hämta data från',
+ 'OptionsAskPlugins' => 'Fråga (Alla hemsidor)',
+ 'OptionsPluginsMulti' => 'Många hemsidor',
+ 'OptionsPluginsMultiAsk' => 'Fråga (Många hemsidor)',
+ 'OptionsPluginsMultiPerField' => 'Många sajter (per fält)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Många sajter per ordning av valt fäl',
+ 'OptionsPluginsMultiPerFieldDesc' => 'För varje fält kommer vi fylla i fältet med den första icke-tomma informationen med början från vänster',
+ 'OptionsPluginsMultiPerFieldFirst' => 'Första',
+ 'OptionsPluginsMultiPerFieldLast' => 'Sista',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Ta bort',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Töm valda fältlistor',
+ 'OptionsPluginsList' => 'Välj lista',
+ 'OptionsAskImport' => 'Välj fält som ska importeras',
+ 'OptionsProxy' => 'Använd en proxy',
+ 'OptionsCookieJar' => 'Använd denna kak-jarfil',
+ 'OptionsLang' => 'Språk',
+ 'OptionsMain' => 'Huvud',
+ 'OptionsPaths' => 'Sökväg',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Funktioner',
+ 'OptionsDisplay' => 'Visning',
+ 'OptionsToolbar' => 'Verktygsfält',
+ 'OptionsToolbars' => {0 => 'Inget', 1 => 'Litet', 2 => 'Stort', 3 => 'Systeminställningar'},
+ 'OptionsToolbarPosition' => 'Position',
+ 'OptionsToolbarPositions' => {0 => 'Topp', 1 => 'Botten', 2 => 'Vänster', 3 => 'Höger'},
+ 'OptionsExpandersMode' => 'För lång expanderare',
+ 'OptionsExpandersModes' => {'asis' => 'Gör ingenting', 'cut' => 'Klipp ut', 'wrap' => 'Radbrytning'},
+ 'OptionsDateFormat' => 'Datumformat',
+ 'OptionsDateFormatTooltip' => 'Formatet är det som används av strftime(3). Standard är %d/%m/%y',
+ 'OptionsView' => 'Artikellista',
+ 'OptionsViews' => {0 => 'Text', 1 => 'Bild', 2 => 'Detaljerat'},
+ 'OptionsColumns' => 'Kolumner',
+ 'OptionsMailer' => 'E-post',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'Din e-post',
+ 'OptionsTransform' => 'Placera artiklar i slutet av titlarna',
+ 'OptionsArticles' => 'Artiklar (Separerat med komma)',
+ 'OptionsSearchStop' => 'Tillåt att pågående sökning avbryts',
+ 'OptionsBigPics' => 'Använd stora bilder om möjligt',
+ 'OptionsAlwaysOriginal' => 'Använd huvudtitels som förvald titel om ingen finns',
+ 'OptionsRestoreAccelerators' => 'Återställ acceleratorer',
+ 'OptionsHistory' => 'Storlek av histori',
+ 'OptionsClearHistory' => 'Töm historik',
+ 'OptionsStyle' => 'Skal',
+ 'OptionsDontAsk' => 'Fråga inte längre',
+ 'OptionsPathProgramsGroup' => 'Program',
+ 'OptionsProgramsSystem' => 'Använd program som är definierade av systemet',
+ 'OptionsProgramsUser' => 'Använd specificerade program',
+ 'OptionsProgramsSet' => 'Ställ in program',
+ 'OptionsPathImagesGroup' => 'Bilder',
+ 'OptionsInternetDataGroup' => 'Importera data',
+ 'OptionsInternetSettingsGroup' => 'Inställningar',
+ 'OptionsDisplayInformationGroup' => 'Informationsvisning',
+ 'OptionsDisplayArticlesGroup' => 'Artiklar',
+ 'OptionsImagesDisplayGroup' => 'Visning',
+ 'OptionsImagesStyleGroup' => 'Stil',
+ 'OptionsDetailedPreferencesGroup' => 'Inställningar',
+ 'OptionsFeaturesConveniencesGroup' => 'Bekvämlighet',
+ 'OptionsPicturesFormat' => 'Prefix att använda för bilder:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Titel eller namn att associera med artikel',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% eller . kommer att ersättas med samlingskatalogen (använd bara början av sökvägen)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% kommer att ersättas med samlingsfilnamnet utan suffix (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% kan enbart användas i början av sökvägen för bilder',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% kan enbart användas i början av sökvägen för bilder',
+ 'OptionsConfigureMailers' => 'Konfigurera e-postklienter',
+
+ 'ImagesOptionsButton' => 'Inställningar',
+ 'ImagesOptionsTitle' => 'Inställningar för bildlistan',
+ 'ImagesOptionsSelectColor' => 'Välj en färg',
+ 'ImagesOptionsUseOverlays' => 'Använd bildöverdrag',
+ 'ImagesOptionsBg' => 'Bakgrund',
+ 'ImagesOptionsBgPicture' => 'Använd en bakgrundsbild',
+ 'ImagesOptionsFg'=> 'Markering',
+ 'ImagesOptionsBgTooltip' => 'Ändra bakgrundsfärg',
+ 'ImagesOptionsFgTooltip'=> 'Ändra markeringsfärg',
+ 'ImagesOptionsResizeImgList' => 'Ändra automatiskt antalet kolumner',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Storlek',
+ 'ImagesOptionsSizeList' => {0 => 'Väldigt liten', 1 => 'Liten', 2 => 'Mellan', 3 => 'Stor', 4 => 'Extra Stor'},
+ 'ImagesOptionsSizeTooltip' => 'Välj en bildstorlek',
+
+ 'DetailedOptionsTitle' => 'Inställningar för detaljerad lista',
+ 'DetailedOptionsImageSize' => 'Bildstorlek',
+ 'DetailedOptionsGroupItems' => 'Gruppera artiklar efter',
+ 'DetailedOptionsSecondarySort' => 'Sortera fält för barn',
+ 'DetailedOptionsFields' => 'Välj fält att visa',
+ 'DetailedOptionsGroupedFirst' => 'Gruppera alla artiklar som har barn',
+ 'DetailedOptionsAddCount' => 'Ange antalet element för kategorier',
+
+ 'ExtractButton' => 'Information',
+ 'ExtractTitle' => 'Filinformation',
+ 'ExtractImport' => 'Använd värden',
+
+ 'FieldsListOpen' => 'Ladda en fältlista från en fil',
+ 'FieldsListSave' => 'Spara fältlista till en fil',
+ 'FieldsListError' => 'Dessa fältlistor kan inte användas med denna typ av samling',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Exportera artikellista',
+ 'ExportFilter' => 'Exportera enbart visade artiklar',
+ 'ExportFieldsTitle' => 'Fält som kommer exporteras',
+ 'ExportFieldsTip' => 'Välj fält som du vill exportera',
+ 'ExportWithPictures' => 'Kopiera bilder i en underkatalog',
+ 'ExportSortBy' => 'Sortera på',
+ 'ExportOrder' => 'Ordning',
+
+ 'ImportListTitle' => 'Importa en annan artikellista',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'Fil',
+ 'ImportExportFieldsUnused' => 'Osparade fält',
+ 'ImportExportFieldsUsed' => 'Använda fält',
+ 'ImportExportFieldsFill' => 'Lägg till Alla',
+ 'ImportExportFieldsClear' => 'Ta bort Alla',
+ 'ImportExportFieldsEmpty' => 'Du måste välja minst ett fält',
+ 'ImportExportFileEmpty' => 'Du måste specificera ett filnamn',
+ 'ImportFieldsTitle' => 'Fält som kommer importeras',
+ 'ImportFieldsTip' => 'Välj fält du vill importera',
+ 'ImportNewList' => 'Skapa en ny samling',
+ 'ImportCurrentList' => 'Lägg till aktuell samling',
+ 'ImportDropError' => 'Det uppstod ett fel med att öppna åtminstone en fil. Föregående lista kommer laddas om.',
+ 'ImportGenerateId' => 'Generera identifierare för varje artikel',
+
+ 'FileChooserOpenFile' => 'Var god välj en fil att använda',
+ 'FileChooserDirectory' => 'Mapp',
+ 'FileChooserOpenDirectory' => 'Välj en katalog',
+ 'FileChooserOverwrite' => 'Den här filen existerar redan. Vill du skriva över den?',
+ 'FileAllFiles' => 'Alla Filer',
+ 'FileVideoFiles' => 'Video Filer',
+ 'FileEbookFiles' => 'Ebook Filer',
+ 'FileAudioFiles' => 'Audio Filer',
+ 'FileGCstarFiles' => 'GCstar Samlingar',
+
+ #Some default panels
+ 'PanelCompact' => 'Kompakt',
+ 'PanelReadOnly' => 'Enbart läsning',
+ 'PanelForm' => 'Flikar',
+
+ 'PanelSearchButton' => 'Hämta Information',
+ 'PanelSearchTip' => 'Sök webben för information om detta namn',
+ 'PanelSearchContextChooseOne' => 'Välj en sajt...',
+ 'PanelSearchContextMultiSite' => 'Använd "Många sajter"',
+ 'PanelSearchContextMultiSitePerField' => 'Använd "Många sajter per fält"',
+ 'PanelSearchContextOptions' => 'Ändra inställningar...',
+ 'PanelImageTipOpen' => 'Klicka på bilden för att välja en annan.',
+ 'PanelImageTipView' => 'Klicka på bilden för att visa den i dess riktiga storlek.',
+ 'PanelImageTipMenu' => ' Högerklicka för ytterligare alternativ.',
+ 'PanelImageTitle' => 'Välj en bild',
+ 'PanelImageNoImage' => 'Ingen bild',
+ 'PanelSelectFileTitle' => 'Välj en fil',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Återställ förvald',
+ 'PanelRefresh' => 'Uppdatera',
+ 'PanelRefreshTip' => 'Uppdatera information från webben',
+
+ 'PanelFrom' =>'Från',
+ 'PanelTo' =>'Till',
+
+ 'PanelWeb' => 'Visa Information',
+ 'PanelWebTip' => 'Visa information på webben om denna artikel', # Accepts model codes
+ 'PanelRemoveTip' => 'Ta bort aktuell artikel', # Accepts model codes
+
+ 'PanelDateSelect' => 'Välj',
+ 'PanelNobody' => 'Ingen',
+ 'PanelUnknown' => 'Okänd',
+ 'PanelAdded' => 'Lägg till datum',
+ 'PanelRating' => 'Betyg',
+ 'PanelPressRating' => 'Klicka i betyg',
+ 'PanelLocation' => 'Lokalisering',
+
+ 'PanelLending' => 'Utlåning',
+ 'PanelBorrower' => 'Låntagare',
+ 'PanelLendDate' => 'Utlånad sedan',
+ 'PanelHistory' => 'Utlåningshistorik',
+ 'PanelReturned' => 'Artikel Returnerad', # Accepts model codes
+ 'PanelReturnDate' => 'Returnerad datum',
+ 'PanelLendedYes' => 'Lånad',
+ 'PanelLendedNo' => 'Tillgänglig',
+
+ 'PanelTags' => 'Etikett',
+ 'PanelFavourite' => 'Favorit',
+ 'TagsAssigned' => 'Tilldelad etikett',
+
+ 'PanelUser' => 'Användarfält',
+
+ 'CheckUndef' => 'Både',
+ 'CheckYes' => 'Ja',
+ 'CheckNo' => 'Nej',
+
+ 'ToolbarAll' => 'Visa Alla',
+ 'ToolbarAllTooltip' => 'Visa alla artiklar',
+ 'ToolbarGroupBy' => 'Gruppera på',
+ 'ToolbarGroupByTooltip' => 'Välj det fält att använda för att gruppera artiklar i listan',
+ 'ToolbarQuickSearch' => 'Snabbsök',
+ 'ToolbarQuickSearchLabel' => 'Sök',
+ 'ToolbarQuickSearchTooltip' => 'Markera fältet att söka i. Ange sökord och tryck Enter',
+ 'ToolbarSeparator' => ' Avskiljare',
+
+ 'PluginsTitle' => 'Sök en artikel',
+ 'PluginsQuery' => 'Förfrågan',
+ 'PluginsFrame' => 'Sök hemsida',
+ 'PluginsLogo' => 'Logotyp',
+ 'PluginsName' => 'Namn',
+ 'PluginsSearchFields' => 'Sök fält',
+ 'PluginsAuthor' => 'Författare',
+ 'PluginsLang' => 'Språk',
+ 'PluginsUseSite' => 'Använd valda hemsidor för framtida sökningar',
+ 'PluginsPreferredTooltip' => 'Sajt rekommenderad av GCstar',
+ 'PluginDisabled' => 'Avaktiverad',
+
+ 'BorrowersTitle' => 'Konfigurera låntagare',
+ 'BorrowersList' => 'Låntagare',
+ 'BorrowersName' => 'Namn',
+ 'BorrowersEmail' => 'E-post',
+ 'BorrowersAdd' => 'Lägg till',
+ 'BorrowersRemove' => 'Ta bort',
+ 'BorrowersEdit' => 'Redigera',
+ 'BorrowersTemplate' => 'E-post mall',
+ 'BorrowersSubject' => 'E-post ämne',
+ 'BorrowersNotice1' => '%1 kommer att ersättas med låntagarens namn',
+ 'BorrowersNotice2' => '%2 kommer att ersättas med artikelns titel',
+ 'BorrowersNotice3' => '%3 kommer att ersättas med låningsdatum',
+
+ 'BorrowersImportTitle' => 'Importera låntagarens information',
+ 'BorrowersImportType' => 'Filformat:',
+ 'BorrowersImportFile' => 'Fil:',
+
+ 'BorrowedTitle' => 'Lånade artiklar', # Accepts model codes
+ 'BorrowedDate' => 'Sedan',
+ 'BorrowedDisplayInPanel' => 'Visa artikel i huvudfönstret', # Accepts model codes
+
+ 'MailTitle' => 'Skicka e-post',
+ 'MailFrom' => 'Från: ',
+ 'MailTo' => 'Till: ',
+ 'MailSubject' => 'Ämne: ',
+ 'MailSmtpError' => 'Problem med att ansluta till SMTP servern',
+ 'MailSendmailError' => 'Problem med att köra sendmail',
+
+ 'SearchTooltip' => 'Sök alla artiklar', # Accepts model codes
+ 'SearchTitle' => 'Artikelsökning', # Accepts model codes
+ 'SearchNoField' => 'Inget fält har markerats för sökrutan. Lägg till några av dem i fliken
+Filter under samlingens inställningar.',
+
+ 'QueryReplaceField' => 'Fält att ersätta',
+ 'QueryReplaceOld' => 'Aktuellt värde',
+ 'QueryReplaceNew' => 'Nytt värde',
+ 'QueryReplaceLaunch' => 'Ersätt',
+
+ 'ImportWindowTitle' => 'Välj Fält att Importera',
+ 'ImportViewPicture' => 'Visa bild',
+ 'ImportSelectAll' => 'Välj alla',
+ 'ImportSelectNone' => 'Välj ingen',
+
+ 'MultiSiteTitle' => 'Hemsida att använda för sökningar',
+ 'MultiSiteUnused' => 'Oanvända tillägg',
+ 'MultiSiteUsed' => 'Tillägg att använda',
+ 'MultiSiteLang' => 'Fyll lista med Svenska tillägg',
+ 'MultiSiteEmptyError' => 'Du har en tom hemsidelista',
+ 'MultiSiteClear' => 'Töm lista',
+
+ 'DisplayOptionsTitle' => 'Artiklar att visa',
+ 'DisplayOptionsAll' => 'Välj alla',
+ 'DisplayOptionsSearch' => 'Sök knapp',
+
+ 'GenresTitle' => 'Genre Konvertering',
+ 'GenresCategoryName' => 'Genre att använda',
+ 'GenresCategoryMembers' => 'Genre att ersätta',
+ 'GenresLoad' => 'Ladda en lista',
+ 'GenresExport' => 'Spara listan till en fil',
+ 'GenresModify' => 'Redigera konvertering',
+
+ 'PropertiesName' => 'Namn på samling',
+ 'PropertiesLang' => 'Språkkod',
+ 'PropertiesOwner' => 'Ägare',
+ 'PropertiesEmail' => 'E-post',
+ 'PropertiesDescription' => 'Beskrivning',
+ 'PropertiesFile' => 'Filinformation',
+ 'PropertiesFilePath' => 'Full sökväg',
+ 'PropertiesItemsNumber' => 'Antal artiklar', # Accepts model codes
+ 'PropertiesFileSize' => 'Storlek',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Egenskap för samling',
+ 'PropertiesDefaultPicture' => 'Förinställd bild',
+
+ 'MailProgramsTitle' => 'Program för att skicka e-post',
+ 'MailProgramsName' => 'Namn',
+ 'MailProgramsCommand' => 'Kommandorad',
+ 'MailProgramsRestore' => 'Återställ förvalda',
+ 'MailProgramsAdd' => 'Lägg till ett program',
+ 'MailProgramsInstructions' => 'I kommandoraden, så görs några ersättningar:
+ %f ersätts med användarens e-postadress.
+ %t ersätts med mottagarens adress.
+ %s ersätts med ämnet för meddelandet.
+ %b ersätts med meddelandets kropp.',
+
+ 'BookmarksBookmarks' => 'Bokmärken',
+ 'BookmarksFolder' => 'Kataloger',
+ 'BookmarksLabel' => 'Beteckning',
+ 'BookmarksPath' => 'Sökväg',
+ 'BookmarksNewFolder' => 'Ny mapp',
+
+ 'AdvancedSearchType' => 'Typ av sökning',
+ 'AdvancedSearchTypeAnd' => 'Artiklarna matchade alla kriterier', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Artiklarna matchade åtminstone ett kriterium', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Kriterium',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Spara sökning',
+ 'AdvancedSearchSaveName' => 'Namn',
+ 'AdvancedSearchSaveOverwrite' => 'En sparad sökning existerar redan med detta namn. Var god använd ett annat.',
+ 'AdvancedSearchUseCase' => 'Skiftlägeskänslighet',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignorera brytning och diakritiska tecken',
+
+ 'BugReportSubject' => 'Felrapport genererad från GCstar',
+ 'BugReportVersion' => 'Version',
+ 'BugReportPlatform' => 'Operativsystem',
+ 'BugReportMessage' => 'Felmeddelande',
+ 'BugReportInformation' => 'Ytterligare information',
+
+#Statistics
+ 'StatsFieldToUse' => 'Fält att använd',
+ 'StatsSortByNumber' => 'Sortera på nummer av {x}',
+ 'StatsGenerate' => 'Generera',
+ 'StatsKindOfGraph' => 'Typ av grafik',
+ 'StatsBars' => 'Staplar',
+ 'StatsPie' => 'Tårtdiagra',
+ 'Stats3DPie' => '3D diagram',
+ 'StatsArea' => 'Areor',
+ 'StatsHistory' => 'Historik',
+ 'StatsWidth' => 'Bredd',
+ 'StatsHeight' => 'Höjd',
+ 'StatsFontSize' => 'Teckenstorlek',
+ 'StatsDisplayNumber' => 'Visa nummer',
+ 'StatsSave' => 'Spara statistik-bild till fil',
+ 'StatsAccumulate' => 'Samla ihop värden',
+ 'StatsShowAllDates' => 'Visa alla datum',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/TR/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/TR/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..511d2ba
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::TR::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'En üstteki alan adlarını da dahil et',
+ 'Separator' => 'Ayırıcı',
+ 'Replacement' => 'Ayrıcıyı şununla değiştir',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/TR/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..9c2797e
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::TR::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/TR/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..2d272b6
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::TR::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Invalid template file',
+ 'UseFile' => 'Use file specified below',
+ 'TemplateExternalFile' => 'Template file',
+ 'WithJS' => 'Javascript kullan',
+ 'FileTemplate' => 'Biçem :',
+ 'Preview' => 'Önizleme',
+ 'NoPreview' => 'Önizleme yok',
+ 'Title' => 'Sayfa başlığı',
+ 'InfoFile' => 'Film listesinin bulunduğu dosya: ',
+ 'InfoDir' => 'Kapak dosyası: ',
+ 'HeightImg' => 'Kapak resmi yüksekliği (piksel olarak): ',
+ 'OpenFileInBrowser' => 'Oluşturulan dosyayı tarayıcıda aç',
+ 'Note' => 'Bu liste <a href="http://www.gcstar.org/">GCstar</a> yazılımıyla oluşturulmuştur.',
+ 'InputTitle' => 'Arama için başlık giriniz',
+ 'SearchType1' => 'Sadece film adı',
+ 'SearchType2' => 'Tüm bilgiler',
+ 'SearchButton' => 'Ara',
+ 'SearchTitle' => 'Sadece bir önceki kritere uyanları göster',
+ 'AllButton' => 'Tümü',
+ 'AllTitle' => 'Tüm filmleri göster',
+ 'Expand' => 'Genişlet',
+ 'ExpandTitle' => 'Tüm filmlerin bilgilerini göster',
+ 'Collapse' => 'Hepsini kapat',
+ 'CollapseTitle' => 'Tüm film bilgilerini kapat',
+ 'Borrowed' => 'Ödünç alan: ',
+ 'NotBorrowed' => 'Arşivde',
+ 'Top' => 'Başa dön',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/TR/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..df42d68
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::TR::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/TR/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..f9908e1
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::TR::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'DROP komutunu içersin',
+ 'WithCreate' => 'CREATE komutunu içersin',
+ 'TableName' => 'Tablo Adı',
+ 'InfoFile' => 'SQL dosyası: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/TR/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..fd0b81e
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::TR::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Şu arşivin içinde: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/TR/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..56ccbbe
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::TR::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Biçem dosyası',
+ 'ModelText' => 'Biçem metni',
+ 'Models' => 'Kullanıcak biçem',
+ 'UseFile' => 'Kullanılacak dosya',
+ 'UseModel' => 'Metin alanını kullan',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/TR/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..482a474
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::TR::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Where should it search',
+ 'Default' => 'Default Alexandria\'s directory',
+ 'Specified' => 'Directory specified below',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/TR/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..1205169
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::TR::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'İlk satırı yoksay',
+ 'Separator' => 'Ayırıcı',
+ 'Plugin' => 'Kullanıcak site',
+ 'UseFirst' => 'Eğer bir çok sonuç varsa ilkini seç',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/TR/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..23744cb
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::TR::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/TR/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..643d36f
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::TR::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copy pictures',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCImport/GCImportList.pm b/lib/gcstar/GCLang/TR/GCImport/GCImportList.pm
new file mode 100644
index 0000000..6b06cd2
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::TR::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'İsim listesi',
+ 'Plugin' => 'Kullanıcak site',
+ 'UseFirst' => 'Eğer bir çok sonuç varsa ilkini seç',
+ 'CommentAuto' => 'Film otomatik olarak alınmıştır.',
+ 'CommentSite' => 'Web Sitesi: ',
+ 'CommentTitle' => 'Adı: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/TR/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..7b822bd
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::TR::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/TR/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..2b434a1
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::TR::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Bu dosya bir Tellico video veritabanı dosyası değil',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/TR/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..b0acada
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::TR::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/TR/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..3079efb
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::TR::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/TR/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..fa06a07
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::TR::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCbooks.pm b/lib/gcstar/GCLang/TR/GCModels/GCbooks.pm
new file mode 100644
index 0000000..4d8048c
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCbooks.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::TR::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Books collection',
+ Items => 'Books',
+ NewItem => 'New book',
+
+ Isbn => 'ISBN',
+ Title => 'Title',
+ Cover => 'Cover',
+ Authors => 'Authors',
+ Publisher => 'Publisher',
+ Publication => 'Publication date',
+ Language => 'Language',
+ Genre => 'Genre',
+ Serie => 'Koleksiyon',
+ Rank => 'Sıralama',
+ Bookdescription => 'Description',
+ Pages => 'Pages',
+ Read => 'Read',
+ Acquisition => 'Acquisition date',
+ Edition => 'Edition',
+ Format => 'Format',
+ Comments => 'Comments',
+ Url => 'Web page',
+ Translator => 'Translator',
+ Artist => 'Artist',
+ DigitalFile => 'Digital version',
+
+ General => 'General',
+ Details => 'Details',
+
+ ReadNo => 'Not read',
+ ReadYes => 'Read',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCcoins.pm b/lib/gcstar/GCLang/TR/GCModels/GCcoins.pm
new file mode 100644
index 0000000..3e152e1
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCcoins.pm
@@ -0,0 +1,101 @@
+{
+ package GCLang::TR::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Numismatic collection',
+ Items => 'Coins',
+ NewItem => 'New coin',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Currency => 'Currency',
+ Value => 'Value',
+ Picture => 'Main picture',
+ Diameter => 'Diameter',
+ Metal => 'Metal',
+ Edge => 'Edge',
+ Edge1 => 'Edge 1',
+ Edge2 => 'Edge 2',
+ Edge3 => 'Edge 3',
+ Edge4 => 'Edge 4',
+ Head => 'Head',
+ Tail => 'Tail',
+ Comments => 'Comments',
+ History => 'History',
+ Website => 'Website',
+ Estimate => 'Estimate',
+ References => 'References',
+ Type => 'Type',
+ Coin => 'Coin',
+ Banknote => 'Bank note',
+
+ Main => 'Main',
+ Description => 'Description',
+ Other => 'Other information',
+ Pictures => 'Pictures',
+
+ Condition => 'Condition (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCcomics.pm b/lib/gcstar/GCLang/TR/GCModels/GCcomics.pm
new file mode 100644
index 0000000..a7c9034
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::TR::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCfilms.pm b/lib/gcstar/GCLang/TR/GCModels/GCfilms.pm
new file mode 100644
index 0000000..27b090c
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCfilms.pm
@@ -0,0 +1,91 @@
+{
+ package GCLang::TR::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Film Koleksiyonu',
+ Items => 'Filmler',
+ NewItem => 'Film Ekle',
+
+
+ Id => 'No',
+ Title => 'Film Adı',
+ Date => 'Yıl',
+ Time => 'Süre',
+ Director => 'Yönetmen',
+ Country => 'Ülke',
+ MinimumAge => 'Yaş Grubu',
+ Genre => 'Türü',
+ Image => 'Kapak',
+ Original => 'Özgün Adı',
+ Actors => 'Oyuncular',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'Yorumlar, Ödüller ve Diğer Bilgiler',
+ Synopsis => 'Konu',
+ Seen => 'İzlendi',
+ Number => 'Sayısı',
+ Format => 'Medya',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'Web',
+ Audio => 'Ses',
+ Video => 'Video formatı',
+ Trailer => 'Video dosyası',
+ Serie => 'Koleksiyon',
+ Rank => 'Sıralama',
+ Subtitles => 'Altyazı(lar)',
+
+ SeenYes => 'İzlendi',
+ SeenNo => 'İzlenmedi',
+
+ AgeUnrated => 'Değerlendirilmemiş',
+ AgeAll => 'Herkes',
+ AgeParent => 'Ebeveyn Kontrollü',
+
+ Main => 'Genel Bilgiler',
+ General => 'Genel',
+ Details => 'Detay',
+
+ Information => 'Bilgi',
+ Languages => 'Dil(ler)',
+ Encoding => 'Encoding',
+
+ FilterAudienceAge => 'İzleyici grubu',
+ FilterSeenNo => 'İzlen_medi',
+ FilterSeenYes => 'İ_zlendi',
+ FilterRatingSelect => '_Puanı En Az...',
+
+ ExtractSize => 'Boyut',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCgames.pm b/lib/gcstar/GCLang/TR/GCModels/GCgames.pm
new file mode 100644
index 0000000..b5c23a7
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCgames.pm
@@ -0,0 +1,80 @@
+{
+ package GCLang::TR::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Oyun Koleksiyonu',
+ Items => 'Oyunlar',
+ NewItem => 'Yeni Oyun',
+
+ Id => 'No',
+ Ean => 'EAN',
+ Name => 'Ad',
+ Platform => 'Platform',
+ Players => 'Oyuncu Sayısı',
+ Released => 'Yayınlanma Tarihi',
+ Editor => 'Editör',
+ Developer => 'Developer',
+ Genre => 'Kategori',
+ Box => 'Kapak Resmi',
+ Case => 'Case',
+ Manual => 'Instructions manual',
+ Completion => 'Tamamlanma (%)',
+ Executable => 'Executable',
+ Description => 'Bilgi',
+ Codes => 'Kodlar',
+ Code => 'Kod',
+ Effect => 'Etki',
+ Secrets => 'Sırlar',
+ Screenshots => 'Ekran Görüntüleri',
+ Screenshot1 => '1. Ekran Görüntüsü',
+ Screenshot2 => '2. Ekran Görüntüsü',
+ Comments => 'Comments',
+ Url => 'Web Sayfası',
+ Unlockables => 'Kilitlenmiş Özellikler',
+ Unlockable => 'Kilitlenen',
+ Howto => 'Nasıl çözülür?',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Genel',
+ Details => 'Detay',
+ Tips => 'İpucu',
+ Information => 'Bilgi',
+
+ FilterRatingSelect => 'En _Az Puanı...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/TR/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..a810643
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::TR::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCminicars.pm b/lib/gcstar/GCLang/TR/GCModels/GCminicars.pm
new file mode 100644
index 0000000..29863be
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::TR::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCmusics.pm b/lib/gcstar/GCLang/TR/GCModels/GCmusics.pm
new file mode 100644
index 0000000..3daffd4
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCmusics.pm
@@ -0,0 +1,66 @@
+{
+ package GCLang::TR::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Music collection',
+ Items => 'Albums',
+ NewItem => 'New album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Title',
+ Cover => 'Cover',
+ Artist => 'Artist',
+ Format => 'Format',
+ Running => 'Running time',
+ Release => 'Release date',
+ Genre => 'Genre',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Tracks list',
+ Number => 'Number',
+ Track => 'Title',
+ Time => 'Time',
+
+ Composer => 'Composer',
+ Producer => 'Producer',
+ Playlist => 'Playlist',
+ Comments => 'Comments',
+ Label => 'Label',
+ Url => 'Web page',
+
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/TR/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..e5b6650
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::TR::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/TR/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..1413e71
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::TR::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/TR/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..6930057
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::TR::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCstamps.pm b/lib/gcstar/GCLang/TR/GCModels/GCstamps.pm
new file mode 100644
index 0000000..90d5eb9
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::TR::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCwines.pm b/lib/gcstar/GCLang/TR/GCModels/GCwines.pm
new file mode 100644
index 0000000..3fb250e
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::TR::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Wines collection',
+ Items => 'Wines',
+ NewItem => 'New wine',
+
+ Name => 'Name',
+ Designation => 'Designation',
+ Vintage => 'Vintage',
+ Vineyard => 'Vineyard',
+ Type => 'Type',
+ Grapes => 'Grapes',
+ Soil => 'Soil',
+ Producer => 'Producer',
+ Country => 'Country',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medal/Honour',
+
+ Storage => 'Storage',
+ Location => 'Location',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantity',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Purchase date',
+ PurchasePrice => 'Purchase price',
+ Gift => 'Gift',
+ BottleLabel => 'Bottle label',
+ Website => 'Reference on the web',
+
+ Tasted => 'Tasted',
+ Comments => 'Comments',
+ Serving => 'Serving',
+ TastingField => 'Testing notes',
+
+ General => 'General',
+ Details => 'Details',
+ Tasting => 'Tasting',
+
+ TastedNo => 'Non tasted',
+ TastedYes => 'Tasted',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Not yet tasted',
+ FilterTastedYes => 'Already _tasted',
+ FilterRatingSelect => 'Rating at _least...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCstar.pm b/lib/gcstar/GCLang/TR/GCstar.pm
new file mode 100644
index 0000000..e576604
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCstar.pm
@@ -0,0 +1,677 @@
+{
+ package GCLang::TR;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+#
+# Turkish Language File, v.2
+# KaraGarga, 17/07/2006
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Türkçe',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Dikkat!</b>:
+
+Eklentiler aracılığıyla diğer sitelerden indirilen bilgiler
+sadece <b>kişisel amaçlar için</b> kullanılmalıdır.
+
+Bu bilgilerin, ilgili sitenin izni olmaksızın dağıtımı
+<b>yasaktır</b>.
+
+Bilginin hangi siteden alındığını <b>film detaylarının altındaki link düğmesinden öğrenebilirsiniz.</b>.',
+
+ 'AllItemsFiltered' => 'Aradığınız anahtar sözcükle ilişkili bir film bulunamadı.', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Kurulum klasörü ',
+ 'InstallMandatory' => 'Gerekli Bileşenler',
+ 'InstallOptional' => 'Diğer Bileşenler',
+ 'InstallErrorMissing' => 'Hata : Aşağıdaki Perl bileşenini kurmalısınız: ',
+ 'InstallPrompt' => 'Yazılımın kurulacağı klasör [/usr/local]: ',
+ 'InstallEnd' => 'Kurulumun sonu',
+ 'InstallNoError' => 'Hata Yok',
+ 'InstallLaunch' => 'Bu yazılımı kullanmak için, şunu başlatmalısınız ',
+ 'InstallDirectory' => 'Ana klasör',
+ 'InstallTitle' => 'GCstar kurulumu',
+ 'InstallDependencies' => 'Bağımlı bileşenler',
+ 'InstallPath' => 'Dizin',
+ 'InstallOptions' => 'Seçenekler',
+ 'InstallSelectDirectory' => 'Kurulum için bir ana klasör seçiniz',
+ 'InstallWithClean' => 'Kurulum dizinindeki dosyaları temizle',
+ 'InstallWithMenu' => 'GCstar yazılımını Programlar menüsüne ekle',
+ 'InstallNoPermission' => 'Hata: Seçtiğiniz klasöre yazma hakkınız yok',
+ 'InstallMissingMandatory' => 'Zorunlu bileşenler eksik. Bu bileşenleri kurmadan GCstar yazılımını kullanamazsınız.',
+ 'InstallMissingOptional' => 'Bazı seçimlik bileşenler eksik. Bu bileşenler aşağıda listelenmiştir. GCstar yazılımını kurabilirsiniz ancak bu bileşenler olmadan bazı özelliklerini kullanmayabilirsiniz.',
+ 'InstallMissingNone' => 'Eksik bağımlı bileşen yok. GCstar yazılımını kurmaya devam edebilirsiniz.',
+ 'InstallOK' => 'Tamam',
+ 'InstallMissing' => 'Eksik',
+ 'InstallMissingFor' => 'Eksikler',
+ 'InstallCleanDirectory' => 'Removing GCstar\'s files in directory: ',
+ 'InstallCopyDirectory' => 'Copying files in directory: ',
+ 'InstallCopyDesktop' => 'Copying desktop file in: ',
+
+#Update
+ 'UpdateUseProxy' => 'Kullanılacak Proxy (emin değilseniz sadece entere basınız): ',
+ 'UpdateNoPermission' => 'Bu klasöre yazma hakkınız yok ya da reddedildi: ',
+ 'UpdateNone' => 'Herhangi bir güncelleme bulunamadı.',
+ 'UpdateFileNotFound' => 'Dosya bulunamadı',
+
+#Splash
+ 'SplashInit' => 'Program açılıyor...',
+ 'SplashLoad' => 'Veritabanı yükleniyor...',
+ 'SplashDisplay' => 'Displaying Collection',
+ 'SplashSort' => 'Sorting Collection',
+ 'SplashDone' => 'Hazır.',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Daha önce GCfilms yazılımını kullanıyordunuz. Bu yazılımdaki verileri otomatik almak ister misiniz? (bu seçenk GCfilms yazılımını kullanmanızı etkilemeyecektir.)',
+ 'GCfilmsImportOptions' => 'Ayarlar',
+ 'GCfilmsImportData' => 'Film Listesi',
+
+#Menus
+ 'MenuFile' => '_Dosya',
+ 'MenuNewList' => '_Yeni Kolleksiyon',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_Son Kullanılanlar',
+ 'MenuLend' => 'Ö_dünç Verilenler', # Accepts model codes
+ 'MenuImport' => '_Al',
+ 'MenuExport' => '_Ver',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => 'Düz_enle',
+ 'MenuDuplicate' => '_Kopyasını oluştur', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Sil', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Change collection fields',
+ 'MenuEditLockItems' => '_Veritabanını kilitle',
+
+ 'MenuDisplay' => '_Filtrele',
+ 'MenuSavedSearches' => 'Saved searches',
+ 'MenuSavedSearchesSave' => 'Save current search',
+ 'MenuSavedSearchesEdit' => 'Modify saved searches',
+ 'MenuAdvancedSearch' => 'A_dvanced Search',
+ 'MenuViewAllItems' => 'Tümünü Göste', # Accepts model codes
+ 'MenuNoFilter' => '_Hepsi',
+
+ 'MenuConfiguration' => '_Ayarlar',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Bilgi Alanları',
+ 'MenuBorrowers' => '_Ödünç Alanlar',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '_Tür Çevrimi',
+
+ 'MenuBookmarks' => 'My _Collections',
+ 'MenuBookmarksAdd' => '_Add current collection',
+ 'MenuBookmarksEdit' => '_Edit bookmarked collections',
+
+ 'MenuHelp' => '_Yardım',
+ 'MenuHelpContent' => '_Yardım',
+ 'MenuAllPlugins' => 'View _plugins',
+ 'MenuBugReport' => 'Report a _bug',
+ 'MenuAbout' => 'GCstar _Hakkında',
+
+ 'MenuNewWindow' => '_Yeni Pencerede Göster', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Hepsini Aç',
+ 'ContextCollapseAll' => 'Hepsini Kapa',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Lütfen bir değer giriniz',
+
+ 'RemoveConfirm' => 'Bu başlığı silmek istediğinize emin misiniz?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'New item', # Accepts model codes
+ 'NewItemTooltip' => 'Yeni başlık eklemek için tıklayın', # Accepts model codes
+ 'NoItemFound' => 'Aradığınız başlık bulunamadı. Başka bir siteden arama yapmak ister misiniz?',
+ 'OpenList' => 'Lütfen bir veritabanı seçin',
+ 'SaveList' => 'Listeyi nereye kaydedeceğiniz seçiniz',
+ 'SaveListTooltip' => 'Açık olan veritabanını kaydetmek için tıklayınız',
+ 'SaveUnsavedChanges' => 'There are unsaved changes in your collection. Do you want to save them?',
+ 'SaveDontSave' => 'Don\'t save',
+ 'PreferencesTooltip' => 'Ayarları yapmak için tıklayınız',
+ 'ViewTooltip' => 'Koleksiyonun görsel ayarlarını değiştirir',
+ 'PlayTooltip' => 'Dosyayı lişkilendirilmiş oynatıcı ile başlatır', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Saving...',
+ 'StatusLoad' => 'Loading...',
+ 'StatusSearch' => 'Aranıyor...',
+ 'StatusGetInfo' => 'Bilgiler alınıyor...',
+ 'StatusGetImage' => 'Kapak alınıyor...',
+
+ 'SaveError' => 'GCStar Koleksiyonu kaydedilemiyor. Erişim engelleri ve boş alan kontrolü yapınız.',
+ 'OpenError' => 'GCStar Koleksiyonu açamıyor. Dosyanın erişim izinlerini kontrol ediniz.',
+ 'OpenFormatError' => 'Koleksiyonu açamıyor.',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'Kapak dosyaları için seçtiğiniz klasör yanlış. Lütfen başka bir klasör seçiniz.',
+ 'OptionsCreationError'=> 'Ayar dosyası oluşturulamıyor: ',
+ 'OptionsOpenError'=> 'Ayar dosyası açılamıyor: ',
+ 'OptionsSaveError'=> 'Ayar dosyası kaydedilemiyor: ',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'Bana öneride bulun. Rastgele dosya seçer.',
+ 'RandomError'=> 'Tüm başlıkları izlemişsiniz ya da veritanında başlık yok.', # Accepts model codes
+ 'RandomEnd'=> 'Tüm başlıkları izlemişsiniz. Başka başlık kalmadı.', # Accepts model codes
+ 'RandomNextTip'=> 'Bir Sonraki Öneri',
+ 'RandomOkTip'=> 'Tamam bu iyi',
+
+ 'AboutTitle' => 'GCstar Hakkında',
+ 'AboutDesc' => 'Veritabanı Yöneticisi',
+ 'AboutVersion' => 'Sürüm',
+ 'AboutTeam' => 'Takım',
+ 'AboutWho' => 'Christian Jodar (Tian): Proje Yöneticisi, Programcı
+Nyall Dawson (Zombiepig): Programcı
+TPF: Programcı
+Adolfo González: Programcı
+',
+ 'AboutLicense' => 'GNU GPL lisansı altında dağıtılmaktadır
+Logoların telif hakları le Spektre',
+ 'AboutTranslation' => 'Türkçe çeviri KaraGarga\'ya aittir',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logo ve webtasarımı: le Spektre',
+
+ 'ToolbarRandom' => 'Gece',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+ 'ModelsSelect' => 'Bir koleksiyon türü seçiniz',
+ 'ModelsPersonal' => 'Personal models',
+ 'ModelsDefault' => 'Default models',
+ 'ModelsList' => 'Koleksiyon Türleri',
+ 'ModelSettings' => 'Collection settings',
+ 'ModelNewType' => 'New collection type',
+ 'ModelName' => 'Name of the collection type:',
+ 'ModelFields' => 'Fields',
+ 'ModelOptions' => 'Options',
+ 'ModelFilters' => 'Filters',
+ 'ModelNewField' => 'New field',
+ 'ModelFieldInformation' => 'Information',
+ 'ModelFieldName' => 'Label:',
+ 'ModelFieldType' => 'Type:',
+ 'ModelFieldGroup' => 'Group:',
+ 'ModelFieldValues' => 'Values',
+ 'ModelFieldInit' => 'Default:',
+ 'ModelFieldMin' => 'Minimum:',
+ 'ModelFieldMax' => 'Maximum:',
+ 'ModelFieldList' => 'Values list:',
+ 'ModelFieldListLegend' => '<i>Comma separated</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Short text',
+ 'ModelFieldTypeLongText' => 'Long text',
+ 'ModelFieldTypeYesNo' => 'Yes/No',
+ 'ModelFieldTypeNumber' => 'Number',
+ 'ModelFieldTypeDate' => 'Date',
+ 'ModelFieldTypeOptions' => 'Pre-defined values list',
+ 'ModelFieldTypeImage' => 'Image',
+ 'ModelFieldTypeSingleList' => 'Simple list',
+ 'ModelFieldTypeFile' => 'File',
+ 'ModelFieldTypeFormatted' => 'Dependant on other fields',
+ 'ModelFieldParameters' => 'Parameters',
+ 'ModelFieldHasHistory' => 'Use an history',
+ 'ModelFieldFlat' => 'Display on one line',
+ 'ModelFieldStep' => 'Increment step:',
+ 'ModelFieldFileFormat' => 'File format:',
+ 'ModelFieldFileFile' => 'Simple file',
+ 'ModelFieldFileImage' => 'Image',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Fields to use',
+ 'ModelOptionsFieldsAuto' => 'Automatic',
+ 'ModelOptionsFieldsNone' => 'None',
+ 'ModelOptionsFieldsTitle' => 'As title',
+ 'ModelOptionsFieldsId' => 'As identifier',
+ 'ModelOptionsFieldsCover' => 'As cover',
+ 'ModelOptionsFieldsPlay' => 'For Play button',
+ 'ModelCollectionSettings' => 'Collection settings',
+ 'ModelCollectionSettingsLending' => 'Items could be borrowed',
+ 'ModelCollectionSettingsTagging' => 'Items can be tagged',
+ 'ModelFilterActivated' => 'Should be in search box',
+ 'ModelFilterComparison' => 'Comparison',
+ 'ModelFilterContain' => 'Contains',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Range',
+ 'ModelFilterNumeric' => 'Comparison is numeric',
+ 'ModelFilterQuick' => 'Create a quick filter',
+ 'ModelTooltipName' => 'Use a name to re-use this model for many collections. If empty, the settings will be directly stored in the collection itself',
+ 'ModelTooltipLabel' => 'The field name as it will be displayed',
+ 'ModelTooltipGroup' => 'Used to group fields. Items with no value here will be in a default group',
+ 'ModelTooltipHistory' => 'Should the previous entered values be stored in a list associated to the field',
+ 'ModelTooltipFormat' => 'This format is used to determine the action to open the file with the Play button',
+ 'ModelTooltipLending' => 'This will add some fields to manage lendings',
+ 'ModelTooltipTagging' => 'This will add some fields to manage tags',
+ 'ModelTooltipNumeric' => 'Should the values be consider as numbers for comparison',
+ 'ModelTooltipQuick' => 'This will add a submenu in the Filters one',
+
+ 'ResultsTitle' => 'Bir başlık seçiniz', # Accepts model codes
+ 'ResultsNextTip' => 'Bir sonraki sitede ara',
+ 'ResultsPreview' => 'Preview',
+ 'ResultsInfo' => 'You can add multiple items to the collection by holding down the Ctrl or the Shift key and selecting them', # Accepts model codes
+
+ 'OptionsTitle' => 'Ayarlar',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Web tarayıcı',
+ 'OptionsPlayer' => 'Video oynatıcı',
+ 'OptionsAudio' => 'Audio oynatıcı',
+ 'OptionsImageEditor' => 'Image editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Kapak klasörü',
+ 'OptionsUseRelativePaths' => 'Kapak resimleri için değişken dizin yapısı kullan',
+ 'OptionsLayout' => 'Başlık Bilgileri Paneli',
+ 'OptionsStatus' => 'Durum barını göster',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Dikkat: Bu alandaki değişikleri uygulamak için yazılımı tekrar başlatmalısınız.',
+ 'OptionsRemoveConfirm' => 'Başlık silmeden önce onay iste',
+ 'OptionsAutoSave' => 'Veritabanını otomatik olarak kaydet',
+ 'OptionsAutoLoad' => 'Load previous collection on startup',
+ 'OptionsSplash' => 'Başlangıç ekranını göster',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Use spelling checker for long text fields',
+ 'OptionsProgramTitle' => 'Bir Program Seçiniz',
+ 'OptionsPlugins' => 'Bilginin alınacağı siteyi seçiniz',
+ 'OptionsAskPlugins' => 'Sor (Tüm Siteler)',
+ 'OptionsPluginsMulti' => 'Seçtiğim Siteler',
+ 'OptionsPluginsMultiAsk' => 'Sor (Seçtiğim Siteler)',
+ 'OptionsPluginsMultiPerField' => 'Seçtiğim Siteler (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Listeyi oluşturun',
+ 'OptionsAskImport' => 'Alınacak bilgi alanları',
+ 'OptionsProxy' => 'Proxy Kullan',
+ 'OptionsCookieJar' => 'Use this cookie jar file',
+ 'OptionsLang' => 'Dil',
+ 'OptionsMain' => 'Genel',
+ 'OptionsPaths' => 'Dizin',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Diğer',
+ 'OptionsDisplay' => 'Görsel',
+ 'OptionsToolbar' => 'Menü',
+ 'OptionsToolbars' => {0 => 'Yok', 1 => 'Küçük', 2 => 'Büyük', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'Konum',
+ 'OptionsToolbarPositions' => {0 => 'Üst', 1 => 'Alt', 2 => 'Sol', 3 => 'Sağ'},
+ 'OptionsExpandersMode' => 'Expanders too long',
+ 'OptionsExpandersModes' => {'asis' => 'Do nothing', 'cut' => 'Cut', 'wrap' => 'Line wrap'},
+ 'OptionsDateFormat' => 'Date Format',
+ 'OptionsDateFormatTooltip' => 'Format is the one used by strftime(3). Default is %d/%m/%Y',
+ 'OptionsView' => 'Film Listesi',
+ 'OptionsViews' => {0 => 'Başlık Adları', 1 => 'Kapak', 2 => 'Detay'},
+ 'OptionsColumns' => 'Kolonlar',
+ 'OptionsMailer' => 'E-posta istemcisi',
+ 'OptionsSMTP' => 'Sunucu',
+ 'OptionsFrom' => 'E-posta adresiniz',
+ 'OptionsTransform' => 'Aşağıdaki öbekleri film adının sonuna koy',
+ 'OptionsArticles' => 'Öbekler (virgülle ayrılmış)',
+ 'OptionsSearchStop' => 'Aramanın durdurulmasını sağlar',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'Başlık için özgün ad yoksa kendi adını kullan',
+ 'OptionsRestoreAccelerators' => 'Restore accelerators',
+ 'OptionsHistory' => 'Geçmiş dosya kısıtlaması',
+ 'OptionsClearHistory' => 'Geçmişi temizle',
+ 'OptionsStyle' => 'Arayüz',
+ 'OptionsDontAsk' => 'Bir daha sorma',
+ 'OptionsPathProgramsGroup' => 'Yazılımlar',
+ 'OptionsProgramsSystem' => 'Use programs defined by system',
+ 'OptionsProgramsUser' => 'Use specified programs',
+ 'OptionsProgramsSet' => 'Set programs',
+ 'OptionsPathImagesGroup' => 'Resimler',
+ 'OptionsInternetDataGroup' => 'Veri alma',
+ 'OptionsInternetSettingsGroup' => 'Ayarlar',
+ 'OptionsDisplayInformationGroup' => 'Bilgi gösterimi',
+ 'OptionsDisplayArticlesGroup' => 'Articles',
+ 'OptionsImagesDisplayGroup' => 'Görsel',
+ 'OptionsImagesStyleGroup' => 'Stil',
+ 'OptionsDetailedPreferencesGroup' => 'Seçenekler',
+ 'OptionsFeaturesConveniencesGroup' => 'Conveniences',
+ 'OptionsPicturesFormat' => 'Prefix to use for pictures:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Title or name of the associated item',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% or . will be replaced with collection directory (use only on beginning of path)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% will be replaced by collection file name without suffix (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% could only be used on the beginning of the path for pictures',
+ 'OptionsConfigureMailers' => 'Configure mailing programs',
+
+ 'ImagesOptionsButton' => 'Ayarlar',
+ 'ImagesOptionsTitle' => 'Kağak listesi için ayarlar',
+ 'ImagesOptionsSelectColor' => 'Renk seçiniz',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Arkaplan',
+ 'ImagesOptionsBgPicture' => 'Arkaplan resmi kullan',
+ 'ImagesOptionsFg'=> 'Seçim',
+ 'ImagesOptionsBgTooltip' => 'Arkaplanı değiştir',
+ 'ImagesOptionsFgTooltip'=> 'Seçili alan rengini değiştir',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Boyut',
+ 'ImagesOptionsSizeList' => {0 => 'Minik', 1 => 'Küçük', 2 => 'Orta', 3 => 'Büyük', 4 => 'Devasa'},
+ 'ImagesOptionsSizeTooltip' => 'Resim boyutu seçiniz',
+
+ 'DetailedOptionsTitle' => 'Detaylı liste için ayarlar',
+ 'DetailedOptionsImageSize' => 'Kapak boyutu',
+ 'DetailedOptionsGroupItems' => 'Filmleri Koleksiyon türüne göre sınıflandır',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'Gösterilecek alanları seçiniz',
+ 'DetailedOptionsGroupedFirst' => 'Keep together orphaned items',
+ 'DetailedOptionsAddCount' => 'Add number of elements on categories',
+
+ 'ExtractButton' => 'Bilgi',
+ 'ExtractTitle' => 'Video Bilgisi',
+ 'ExtractImport' => 'Bu değerleri kullan',
+
+ 'FieldsListOpen' => 'Load a fields list from a file',
+ 'FieldsListSave' => 'Save fields list to a file',
+ 'FieldsListError' => 'This fields list cannot be used with this kind of collection',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Film listesini ver',
+ 'ExportFilter' => 'Sadece seçili filmleri ver',
+ 'ExportFieldsTitle' => 'Verilecek alanlar',
+ 'ExportFieldsTip' => 'Aktarılacak alanları seçiniz',
+ 'ExportWithPictures' => 'Kapak resimlerini bir alt klasöre kopyala',
+ 'ExportSortBy' => 'Sort by',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Diğer bir film listesinden aktar',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'Dosya',
+ 'ImportExportFieldsUnused' => 'Kullanılmayacak alanlar',
+ 'ImportExportFieldsUsed' => 'Kullanılacak alanlar',
+ 'ImportExportFieldsFill' => 'Tümüün Ekle',
+ 'ImportExportFieldsClear' => 'Tümünü Sil',
+ 'ImportExportFieldsEmpty' => 'En az bir alan seçmelisiniz',
+ 'ImportExportFileEmpty' => 'Dosya adı belirlemelisiniz',
+ 'ImportFieldsTitle' => 'Alınacak Alanlar',
+ 'ImportFieldsTip' => 'Alınacak alanları seçiniz',
+ 'ImportNewList' => 'Yeni veritabanı oluştur',
+ 'ImportCurrentList' => 'Açık olan veritabanına aktar',
+ 'ImportDropError' => 'Dosyanın açılmasında sorun çıktı. Bir önceki veritabanı yüklenecek.',
+ 'ImportGenerateId' => 'Generate identifier for each item',
+
+ 'FileChooserOpenFile' => 'Lütfen bir dosya seçiniz',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Bir Klasör Seçiniz',
+ 'FileChooserOverwrite' => 'Bu dosya zaten var. Üzerine yazmak istediğinizden emin misiniz?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ #Some default panels
+ 'PanelCompact' => 'İşlevsel',
+ 'PanelReadOnly' => 'Salt Okunur',
+ 'PanelForm' => 'Sekmeler',
+
+ 'PanelSearchButton' => 'Bilgi Al',
+ 'PanelSearchTip' => 'Bu film için internetten bilgi al',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Başka bir kapak resmi seçmek için tıklayınız.',
+ 'PanelImageTipView' => 'Click on the picture to view it in real size.',
+ 'PanelImageTipMenu' => ' Daha fazla seçenek için sağ tıklayınız.',
+ 'PanelImageTitle' => 'Kapak seç',
+ 'PanelImageNoImage' => 'No image',
+ 'PanelSelectFileTitle' => 'Dosya Seçiniz',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restore default',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'From',
+ 'PanelTo' =>'To',
+
+ 'PanelWeb' => 'Bilgileri göster',
+ 'PanelWebTip' => 'Bu filmin internet bilgisini göster', # Accepts model codes
+ 'PanelRemoveTip' => 'Seçili filmi siliniz', # Accepts model codes
+
+ 'PanelDateSelect' => 'Tarih Seçiniz',
+ 'PanelNobody' => 'Kimse',
+ 'PanelUnknown' => 'Bilinmiyor',
+ 'PanelAdded' => 'Add date',
+ 'PanelRating' => 'Puan',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Yer',
+
+ 'PanelLending' => 'Ödünç',
+ 'PanelBorrower' => 'Ödünç Alan',
+ 'PanelLendDate' => 'Ödünç Verme Tarihi',
+ 'PanelHistory' => 'Ödünç Geçmişi',
+ 'PanelReturned' => 'Geri Dönme Tarihi', # Accepts model codes
+ 'PanelReturnDate' => 'Geri dönme tarihi',
+ 'PanelLendedYes' => 'Ödün verilme',
+ 'PanelLendedNo' => 'Arşivde',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favourite',
+ 'TagsAssigned' => 'Assigned Tags',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Farketmez',
+ 'CheckYes' => 'Evet',
+ 'CheckNo' => 'Hayır',
+
+ 'ToolbarAll' => 'Tümünü Göster',
+ 'ToolbarAllTooltip' => 'Tüm filmleri görmek için tıklayınız',
+ 'ToolbarGroupBy' => 'Grupla',
+ 'ToolbarGroupByTooltip' => 'Select the field to use to group items in list',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Film arayınız',
+ 'PluginsQuery' => 'Query',
+ 'PluginsFrame' => 'Arama sitesi',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Adı',
+ 'PluginsSearchFields' => 'Search fields',
+ 'PluginsAuthor' => 'Yazarı',
+ 'PluginsLang' => 'Dil',
+ 'PluginsUseSite' => 'Her zaman bu siteyi kullan',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Ödünç Seçenekleri',
+ 'BorrowersList' => 'Borrowers',
+ 'BorrowersName' => 'Adı',
+ 'BorrowersEmail' => 'E-posta',
+ 'BorrowersAdd' => 'Ekle',
+ 'BorrowersRemove' => 'Sil',
+ 'BorrowersEdit' => 'Düzenle',
+ 'BorrowersTemplate' => 'E-posta örneği',
+ 'BorrowersSubject' => 'Posta konusu',
+ 'BorrowersNotice1' => '%1 - Ödünç alanın adı',
+ 'BorrowersNotice2' => '%2 - Film adı',
+ 'BorrowersNotice3' => '%3 - Ödün alma tarihi',
+
+ 'BorrowersImportTitle' => 'Import borrowers information',
+ 'BorrowersImportType' => 'File format:',
+ 'BorrowersImportFile' => 'File:',
+
+ 'BorrowedTitle' => 'Ödünç verilmiş filmler', # Accepts model codes
+ 'BorrowedDate' => 'Alma Tarihi',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'E-posta gönder',
+ 'MailFrom' => 'Kimden: ',
+ 'MailTo' => 'Kime: ',
+ 'MailSubject' => 'Konu: ',
+ 'MailSmtpError' => 'SMTP sunucusuna bağlanamıyor',
+ 'MailSendmailError' => 'Sendmail istemcisini çalıştıramıyor',
+
+ 'SearchTooltip' => 'Detaylı arama için tıklayınız', # Accepts model codes
+ 'SearchTitle' => 'Film Arama', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Değiştirilecek alan',
+ 'QueryReplaceOld' => 'Şimdiki değer',
+ 'QueryReplaceNew' => 'Yeni Değer',
+ 'QueryReplaceLaunch' => 'Değiştir',
+
+ 'ImportWindowTitle' => 'Alınacak alanları seçiniz',
+ 'ImportViewPicture' => 'Resmi göster',
+ 'ImportSelectAll' => 'Tümünü seç',
+ 'ImportSelectNone' => 'Hiçbirini seçme',
+
+ 'MultiSiteTitle' => 'Arama için kullanılan siteler',
+ 'MultiSiteUnused' => 'Kullanılmayacaklar',
+ 'MultiSiteUsed' => 'Kullanılacak eklentiler',
+ 'MultiSiteLang' => 'İngilizce eklentileri göster',
+ 'MultiSiteEmptyError' => 'Site listeniz boş',
+ 'MultiSiteClear' => 'Listeyi temizle',
+
+ 'DisplayOptionsTitle' => 'Gösterilecek alanlar',
+ 'DisplayOptionsAll' => 'Tümünü Seç',
+ 'DisplayOptionsSearch' => 'Arama düğmesi',
+
+ 'GenresTitle' => 'Tür Dönüştürme',
+ 'GenresCategoryName' => 'Kullanılan Tür',
+ 'GenresCategoryMembers' => 'Değiştirilecek Tür',
+ 'GenresLoad' => 'Liste yükle',
+ 'GenresExport' => 'Listeyi kaydet',
+ 'GenresModify' => 'Tür Düzenle',
+
+ 'PropertiesName' => 'Collection name',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Owner',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => 'Description',
+ 'PropertiesFile' => 'File Information',
+ 'PropertiesFilePath' => 'Full path',
+ 'PropertiesItemsNumber' => 'Number of items', # Accepts model codes
+ 'PropertiesFileSize' => 'Size',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Collection properties',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Programs for mail sending',
+ 'MailProgramsName' => 'Name',
+ 'MailProgramsCommand' => 'Command line',
+ 'MailProgramsRestore' => 'Restore defaults',
+ 'MailProgramsAdd' => 'Add a program',
+ 'MailProgramsInstructions' => 'In command line, some substitutions are made:
+ %f is replaced with user\'s e-mail address.
+ %t is replaced with the recipient address.
+ %s is replaced with the subject of the message.
+ %b is replaced with the body of the message.',
+
+ 'BookmarksBookmarks' => 'Bookmarks',
+ 'BookmarksFolder' => 'Directory',
+ 'BookmarksLabel' => 'Label',
+ 'BookmarksPath' => 'Path',
+ 'BookmarksNewFolder' => 'New folder',
+
+ 'AdvancedSearchType' => 'Type of search',
+ 'AdvancedSearchTypeAnd' => 'Items matching all criteria', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Items matching at least one criterion', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criteria',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Bug report generated from GCstar',
+ 'BugReportVersion' => 'Version',
+ 'BugReportPlatform' => 'Operating system',
+ 'BugReportMessage' => 'Error message',
+ 'BugReportInformation' => 'Additional information',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/UK/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/UK/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..a6722c0
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::UK::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Включити імена полів вгорі',
+ 'Separator' => 'Розділювач',
+ 'Replacement' => 'Замінити розділювач на',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/UK/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..f7b3e0e
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::UK::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/UK/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..82573a6
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::UK::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Неприпустимий файл зразка',
+ 'UseFile' => 'Вживати файл, вказаний нижче',
+ 'TemplateExternalFile' => 'Файл зразка',
+ 'WithJS' => 'Використовувати Javascript',
+ 'FileTemplate' => 'Зразок:',
+ 'Preview' => 'Попередній перегляд',
+ 'NoPreview' => 'Перегляд недоступний',
+ 'Title' => 'Заголовок сторінки',
+ 'InfoFile' => 'Список фільмів у файлі: ',
+ 'InfoDir' => 'Зображення у: ',
+ 'HeightImg' => 'Висота (у пікселях) експортованих зображень: ',
+ 'OpenFileInBrowser' => 'Відкрити створений файл у переглядачі тенет',
+ 'Note' => 'Список створений програмою <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Введіть текст для пошуку',
+ 'SearchType1' => 'Лише заголовки',
+ 'SearchType2' => 'Повна інформація',
+ 'SearchButton' => 'Пошук',
+ 'SearchTitle' => 'Показувати лише фільми, що відповідають попереднім критеріям',
+ 'AllButton' => 'Всі',
+ 'AllTitle' => 'Показувати всі фільми',
+ 'Expand' => 'Розгорнути всі',
+ 'ExpandTitle' => 'Показати всю інформацію про фільми',
+ 'Collapse' => 'Згорнути всі',
+ 'CollapseTitle' => 'Згорнути всю інформацію про фільми',
+ 'Borrowed' => 'Позичений: ',
+ 'NotBorrowed' => 'Доступний',
+ 'Top' => 'Вгору',
+ 'Bottom' => 'Вниз',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/UK/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..7df0554
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::UK::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/UK/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..8f30eba
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::UK::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Включити інструкцію DROP',
+ 'WithCreate' => 'Включити інструкцію CREATE',
+ 'TableName' => 'Ім\'я таблиці',
+ 'InfoFile' => 'SQL файл: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/UK/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..b0682d6
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::UK::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Архів у файлі: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/UK/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..a9fa0e8
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::UK::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Файл зразка',
+ 'ModelText' => 'Текст зразка',
+ 'Models' => 'Використовувати зразок',
+ 'UseFile' => 'Використовувати файл',
+ 'UseModel' => 'Використовувати область тексту',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/UK/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..fa999e6
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::UK::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Де його шукати',
+ 'Default' => 'Типова тека Alexandria',
+ 'Specified' => 'Тека, вказана нижче',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/UK/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..d29b198
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::UK::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Ігнорувати перший рядок',
+ 'Separator' => 'Розділювач',
+ 'Plugin' => 'Використовувати сайт',
+ 'UseFirst' => 'Використовувати перший, якщо знайдено декілька',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/UK/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..dd6e8e1
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::UK::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/UK/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..faf756c
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::UK::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Копіювати зображення',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCImport/GCImportList.pm b/lib/gcstar/GCLang/UK/GCImport/GCImportList.pm
new file mode 100644
index 0000000..7721814
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::UK::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Список імен',
+ 'Plugin' => 'Використовувати сайт',
+ 'UseFirst' => 'Використовувати перший, якщо знайдено декілька',
+ 'CommentAuto' => 'Запис автоматично імпортований.',
+ 'CommentSite' => 'Вебсайт: ',
+ 'CommentTitle' => 'Заголовок: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/UK/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..70b9cc2
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::UK::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/UK/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..2fbd677
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::UK::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Файл не є підтримуваною колекцією Tellico',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/UK/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..88db64e
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::UK::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/UK/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..61a449c
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::UK::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/UK/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..385ecc4
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::UK::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Колекція настільних ігор',
+ Items => {0 => 'Ігор',
+ 1 => 'Гра',
+ X => 'Ігор'},
+ NewItem => 'Нова гра',
+
+ Id => 'Id',
+ Name => 'Назва',
+ Original => 'Оригінальна назва',
+ Box => 'Зображення коробки',
+ DesignedBy => 'Розроблена',
+ PublishedBy => 'Видана',
+ Players => 'Число гравців',
+ PlayingTime => 'Час гри',
+ SuggestedAge => 'Рекомендований вік',
+ Released => 'Випущено',
+ Description => 'Опис',
+ Category => 'Категорія',
+ Mechanics => 'Механіка',
+ ExpandedBy => 'Розширення',
+ ExpansionFor => 'Розширення для',
+ GameFamily => 'Сім\'я ігор',
+ IllustratedBy => 'Ілюстрації',
+ Url => 'Сторінка тенет',
+ TimesPlayed => 'Грали разів',
+ CompleteContents => 'Наявність вмісту',
+ Copies => 'Число копій',
+ Condition => 'Стан',
+ Photos => 'Фотографії',
+ Photo1 => 'Перше зображення',
+ Photo2 => 'Друге зображення',
+ Photo3 => 'Третє зображення',
+ Photo4 => 'Четверте зображення',
+ Comments => 'Коментарі',
+
+ Perfect => 'Чудово',
+ Good => 'Добре',
+ Average => 'Посередньо',
+ Poor => 'Погано',
+
+ CompleteYes => 'Наявний повністю',
+ CompleteNo => 'Частково втрачений',
+
+ General => 'Загальна',
+ Details => 'Подробиці',
+ Personal => 'Особиста',
+ Information => 'Інформація',
+
+ FilterRatingSelect => '_Оцінка принаймні...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCbooks.pm b/lib/gcstar/GCLang/UK/GCModels/GCbooks.pm
new file mode 100644
index 0000000..0136856
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCbooks.pm
@@ -0,0 +1,69 @@
+{
+ package GCLang::UK::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Колекція книг',
+ Items => 'Книги',
+ NewItem => 'Нова книга',
+
+ Isbn => 'ISBN',
+ Title => 'Заголовок',
+ Cover => 'Обкладинка',
+ Authors => 'Автори',
+ Publisher => 'Видавець',
+ Publication => 'Дата видання',
+ Language => 'Мова',
+ Genre => 'Жанр',
+ Serie => 'Серія',
+ Rank => 'Розряд',
+ Bookdescription => 'Опис',
+ Pages => 'Сторінок',
+ Read => 'Прочитана',
+ Rating => 'Оцінка',
+ Acquisition => 'Дата придбання',
+ Edition => 'Видання',
+ Format => 'Формат',
+ Comments => 'Коментарі',
+ Url => 'Сторінка тенет',
+ Translator => 'Перекладач',
+ Artist => 'Художник',
+ DigitalFile => 'Digital version',
+
+ General => 'Загальна',
+ Details => 'Подробиці',
+
+ ReadNo => 'Не прочитана',
+ ReadYes => 'Прочитана',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCcoins.pm b/lib/gcstar/GCLang/UK/GCModels/GCcoins.pm
new file mode 100644
index 0000000..3f5528d
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCcoins.pm
@@ -0,0 +1,102 @@
+{
+ package GCLang::UK::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Нумізматична колекція',
+ Items => 'Монети',
+ NewItem => 'Нова монета',
+
+ Name => 'Назва',
+ Country => 'Країна',
+ Year => 'Рік',
+ Currency => 'Грошова одиниця',
+ Value => 'Значення',
+ Picture => 'Головне зображення',
+ Diameter => 'Діаметр',
+ Metal => 'Метал',
+ Edge => 'Грань',
+ Edge1 => 'Грань 1',
+ Edge2 => 'Грань 2',
+ Edge3 => 'Грань 3',
+ Edge4 => 'Грань 4',
+ Head => 'Аверс',
+ Tail => 'Реверс',
+ Comments => 'Коментарі',
+ History => 'Історія',
+ Website => 'Сторінка тенет',
+ Estimate => 'Цінність',
+ References => 'Посилання',
+ Type => 'Тип',
+ Coin => 'Монета',
+ Banknote => 'Банкнота',
+
+ Main => 'Головна',
+ Description => 'Опис',
+ Other => 'Інша інформація',
+ Pictures => 'Зображення',
+
+ Condition => 'Стан (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCcomics.pm b/lib/gcstar/GCLang/UK/GCModels/GCcomics.pm
new file mode 100644
index 0000000..9a70b74
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::UK::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCfilms.pm b/lib/gcstar/GCLang/UK/GCModels/GCfilms.pm
new file mode 100644
index 0000000..6936741
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCfilms.pm
@@ -0,0 +1,92 @@
+{
+ package GCLang::UK::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Колекція фільмів',
+ Items => 'Фільми',
+ NewItem => 'Новий фільм',
+
+
+ Id => 'Ідентифікатор',
+ Title => 'Назва',
+ Date => 'Дата',
+ Time => 'Тривалість',
+ Director => 'Режисер',
+ Country => 'Країна',
+ MinimumAge => 'Мінімальний вік',
+ Genre => 'Жанр',
+ Image => 'Зображення',
+ Original => 'Оригінальна назва',
+ Actors => 'В ролях',
+ Actor => 'Актор',
+ Role => 'Роль',
+ Comment => 'Коментарі',
+ Synopsis => 'Анотація',
+ Seen => 'Переглянутий',
+ Number => 'Кількість носіїв',
+ Rating => 'Оцінка',
+ Format => 'Носій',
+ Region => 'Region',
+ Identifier => 'Ідентифікатор',
+ Url => 'Сторінка тенет',
+ Audio => 'Звук',
+ Video => 'Відео формат',
+ Trailer => 'Відеофайл',
+ Serie => 'Колекція',
+ Rank => 'Розряд',
+ Subtitles => 'Субтитри',
+
+ SeenYes => 'Переглянутий',
+ SeenNo => 'Не переглянутий',
+
+ AgeUnrated => 'Неоцінений',
+ AgeAll => 'Будь-який вік',
+ AgeParent => 'Під наглядом батьків',
+
+ Main => 'Головні пункти',
+ General => 'Загальна',
+ Details => 'Подробиці',
+
+ Information => 'Інформація',
+ Languages => 'Мови',
+ Encoding => 'Кодування',
+
+ FilterAudienceAge => 'Вік глядачів',
+ FilterSeenNo => '_Ще не переглянутий',
+ FilterSeenYes => '_Вже переглянутий',
+ FilterRatingSelect => '_Оцінка принаймні...',
+
+ ExtractSize => 'Розмір',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCgames.pm b/lib/gcstar/GCLang/UK/GCModels/GCgames.pm
new file mode 100644
index 0000000..0c80a1a
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCgames.pm
@@ -0,0 +1,81 @@
+{
+ package GCLang::UK::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Колекція відеоігор',
+ Items => 'Ігри',
+ NewItem => 'Нова гра',
+
+ Id => 'Ідентифікатор',
+ Ean => 'EAN',
+ Name => 'Назва',
+ Platform => 'Платформа',
+ Players => 'Кількість гравців',
+ Released => 'Дата випуску',
+ Editor => 'Редактор',
+ Developer => 'Розробник',
+ Genre => 'Жанр',
+ Box => 'Зображення коробки',
+ Case => 'Корпус',
+ Manual => 'Підручник інструкцій',
+ Rating => 'Оцінка',
+ Completion => 'Завершено (%)',
+ Executable => 'Запускаючий файл',
+ Description => 'Опис',
+ Codes => 'Коди',
+ Code => 'Код',
+ Effect => 'Наслідок',
+ Secrets => 'Секрети',
+ Screenshots => 'Знімки екрану',
+ Screenshot1 => 'Перший знімок',
+ Screenshot2 => 'Другий знімок',
+ Comments => 'Коментарі',
+ Url => 'Сторінка тенет',
+ Unlockables => 'Розблокування',
+ Unlockable => 'Розблокування',
+ Howto => 'Як розблокувати',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Загальна',
+ Details => 'Подробиці',
+ Tips => 'Поради',
+ Information => 'Інформація',
+
+ FilterRatingSelect => '_Оцінка принаймні...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/UK/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..536399e
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::UK::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCminicars.pm b/lib/gcstar/GCLang/UK/GCModels/GCminicars.pm
new file mode 100644
index 0000000..e0f899a
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::UK::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCmusics.pm b/lib/gcstar/GCLang/UK/GCModels/GCmusics.pm
new file mode 100644
index 0000000..d273b9b
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCmusics.pm
@@ -0,0 +1,66 @@
+{
+ package GCLang::UK::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Колекція музики',
+ Items => 'Альбоми',
+ NewItem => 'Новий альбом',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Назва',
+ Cover => 'Обкладинка',
+ Artist => 'Виконавець',
+ Format => 'Формат',
+ Running => 'Час виконання',
+ Release => 'Дата випуску',
+ Genre => 'Жанр',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Список доріжок',
+ Number => 'Номер',
+ Track => 'Назва',
+ Time => 'Час',
+
+ Composer => 'Композитор',
+ Producer => 'Продюсер',
+ Playlist => 'Перелік композицій',
+ Comments => 'Коментарі',
+ Label => 'Мітка',
+ Url => 'Сторінка тенет',
+
+ General => 'Загальна',
+ Details => 'Подробиці',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/UK/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..c872b36
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::UK::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/UK/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..4272997
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::UK::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/UK/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..8959938
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::UK::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCstamps.pm b/lib/gcstar/GCLang/UK/GCModels/GCstamps.pm
new file mode 100644
index 0000000..64e1c8a
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::UK::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCwines.pm b/lib/gcstar/GCLang/UK/GCModels/GCwines.pm
new file mode 100644
index 0000000..2a25fab
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::UK::GCModels::GCwines;
+
+ use utf8;
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Колекція вин',
+ Items => {0 => 'Вин',
+ 1 => 'Вино',
+ X => 'Вин'},
+ NewItem => 'Нове вино',
+
+ Name => 'Назва',
+ Designation => 'Позначка',
+ Vintage => 'Модель',
+ Vineyard => 'Виноградник',
+ Type => 'Тип',
+ Grapes => 'Виноград',
+ Soil => 'Грунт',
+ Producer => 'Виробник',
+ Country => 'Країна',
+ Volume => 'Об\'єм (мл)',
+ Alcohol => 'Спирт (%)',
+ Medal => 'Медаль/Вшанування',
+
+ Storage => 'Зберігання',
+ Location => 'Місце',
+ ShelfIndex => 'Покажчик',
+ Quantity => 'Розмір',
+ Acquisition => 'Придбано',
+ PurchaseDate => 'Дата покупки',
+ PurchasePrice => 'Вартість покупки',
+ Gift => 'Подарунок',
+ BottleLabel => 'Етикетка пляшки',
+ Website => 'Посилання на тенета',
+
+ Tasted => 'Дегустоване',
+ Comments => 'Коментарі',
+ Serving => 'Порції',
+ TastingField => 'Помітки дегустації',
+
+ General => 'Загальна',
+ Details => 'Подробиці',
+ Tasting => 'Дегустація',
+
+ TastedNo => 'Не дегустоване',
+ TastedYes => 'Дегустоване',
+
+ FilterRange => 'Діапазон',
+ FilterTastedNo => '_Ще не дегустоване',
+ FilterTastedYes => 'Уже _дегустоване',
+ FilterRatingSelect => 'Оцінка _принаймні...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCstar.pm b/lib/gcstar/GCLang/UK/GCstar.pm
new file mode 100644
index 0000000..14d3ea6
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCstar.pm
@@ -0,0 +1,674 @@
+{
+ package GCLang::UK;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Ukrainian',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Попередження</b>:
+
+Інформація, звантажена з веб-сайтів (за допомогою
+пошукових втулків) призначена <b>лише для особистого використання</b>.
+
+Заборонений будь-який перерозподіл без
+<b>явного дозволу сайту</b>.
+
+Щоб визначити, який сайт володіє інформацією,
+можна скористатись <b>кнопкою на вкладці подробиць про фільм</b>.',
+
+ 'AllItemsFiltered' => 'Не знайдено відповідностей вашому запиту', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Встановити до ',
+ 'InstallMandatory' => 'Обов\'язкові компоненти',
+ 'InstallOptional' => 'Додаткові компоненти',
+ 'InstallErrorMissing' => 'Помилка : Потрібно встановити наступні компоненти Perl: ',
+ 'InstallPrompt' => 'Основна тека для встановлення [/usr/local]: ',
+ 'InstallEnd' => 'Кінець встановлення',
+ 'InstallNoError' => 'Немає помилок',
+ 'InstallLaunch' => 'Для використання цього додатку ви можете запустити ',
+ 'InstallDirectory' => 'Основна таке',
+ 'InstallTitle' => 'Встановлення GCstar',
+ 'InstallDependencies' => 'Залежності',
+ 'InstallPath' => 'Шлях',
+ 'InstallOptions' => 'Опції',
+ 'InstallSelectDirectory' => 'Виберіть основну теку для встановлення',
+ 'InstallWithClean' => 'Усунути файли, знайдені у теці встановлення',
+ 'InstallWithMenu' => 'Додати GCstar меню Додатки',
+ 'InstallNoPermission' => 'Помилка: Ви не маєте дозволу для запису в обрану теку',
+ 'InstallMissingMandatory' => 'Обов\'язкові залежності відсутні. Ви не можете встановити GCstar поки вони не будуть додані до системи.',
+ 'InstallMissingOptional' => 'Деякі додаткові залежності відсутні. Їх список нижче. GCstar можна встановити, але деякі можливості будуть недоступні.',
+ 'InstallMissingNone' => 'Усі залежності забезпечено. Ви можете продовжити встановлення GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Відсутні',
+ 'InstallMissingFor' => 'Відсутні для',
+ 'InstallCleanDirectory' => 'Усунення файлів GCstar з теки: ',
+ 'InstallCopyDirectory' => 'Копіювання файлів до теки: ',
+ 'InstallCopyDesktop' => 'Копіювання файлів стільниці: ',
+
+#Update
+ 'UpdateUseProxy' => 'Вживати проксі (просто натисніть ввід, якщо немає): ',
+ 'UpdateNoPermission' => 'Немає дозволу запису до цієї теки: ',
+ 'UpdateNone' => 'Оновлень не знайдено',
+ 'UpdateFileNotFound' => 'Файл не знайдений',
+
+#Splash
+ 'SplashInit' => 'Ініціалізування',
+ 'SplashLoad' => 'Завантаження колекції',
+ 'SplashDisplay' => 'Показ колекції',
+ 'SplashSort' => 'Сортування колекції',
+ 'SplashDone' => 'Готово',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Здається ви раніше користувались GCfilms. Що ви хочете імпортувати з GCfilms до GCstar (це не вплине на GCfilms якщо ви і далі хочете ним користуватись)?',
+ 'GCfilmsImportOptions' => 'Налаштування',
+ 'GCfilmsImportData' => 'Список фільмів',
+
+#Menus
+ 'MenuFile' => '_Файл',
+ 'MenuNewList' => '_Нова колекція',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_Останні колекції',
+ 'MenuLend' => 'Показати _позичені', # Accepts model codes
+ 'MenuImport' => '_Імпорт',
+ 'MenuExport' => '_Експорт',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Редагування',
+ 'MenuDuplicate' => '_Дублювати фільм', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Усунути фільм', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Змінити поля колекції',
+ 'MenuEditLockItems' => 'За_блокувати колекцію',
+
+ 'MenuDisplay' => 'Ф_ільтр',
+ 'MenuSavedSearches' => 'Saved searches',
+ 'MenuSavedSearchesSave' => 'Save current search',
+ 'MenuSavedSearchesEdit' => 'Modify saved searches',
+ 'MenuAdvancedSearch' => '_Розширений пошук',
+ 'MenuViewAllItems' => 'Показати _всі записи', # Accepts model codes
+ 'MenuNoFilter' => '_Усі',
+
+ 'MenuConfiguration' => '_Параметри',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Відображувана інформація',
+ 'MenuBorrowers' => '_Боржники',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Зміна _Жанру',
+
+ 'MenuBookmarks' => '_Мої колекції',
+ 'MenuBookmarksAdd' => '_Додати поточну колекцію',
+ 'MenuBookmarksEdit' => '_Редагувати закладки',
+
+ 'MenuHelp' => '_Допомога',
+ 'MenuHelpContent' => '_Зміст',
+ 'MenuAllPlugins' => 'Перегляд _втулків',
+ 'MenuBugReport' => '_Надіслати звіт про помилку',
+ 'MenuAbout' => '_Про GCstar',
+
+ 'MenuNewWindow' => 'Показати запис у _новому вікні', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Розгорнути усі',
+ 'ContextCollapseAll' => 'Згорнути усі',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Будь ласка, введіть значення',
+
+ 'RemoveConfirm' => 'Ви дійсно хочете усунути цей запис?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'Новий запис', # Accepts model codes
+ 'NewItemTooltip' => 'Додати новий запис', # Accepts model codes
+ 'NoItemFound' => 'Нічого не знайдено. Ви хочете шукати на іншому сайті?',
+ 'OpenList' => 'Будь ласка, оберіть колекцію',
+ 'SaveList' => 'Будь ласка, виберіть куди зберегти колекцію',
+ 'SaveListTooltip' => 'Зберегти поточну колекцію',
+ 'SaveUnsavedChanges' => 'Є незбережені зміни у вашій колекції. Ви хочете їх зберегти?',
+ 'SaveDontSave' => 'Не зберігати',
+ 'PreferencesTooltip' => 'Налаштуйте ваші уподобання',
+ 'ViewTooltip' => 'Змініть показ колекції',
+ 'PlayTooltip' => 'Програвати відео, зв\'язане з записом', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Збереження...',
+ 'StatusLoad' => 'Завантаження...',
+ 'StatusSearch' => 'Виконується пошук...',
+ 'StatusGetInfo' => 'Отримання інформації...',
+ 'StatusGetImage' => 'Отримання зображення...',
+
+ 'SaveError' => 'Неможливо зберегти список записів. Будь ласка, перевірте права доступу та наявність вільного місця на диску.',
+ 'OpenError' => 'Неможливо зберегти список записів. Будь ласка, перевірте права доступу.',
+ 'OpenFormatError' => 'Неможливо відкрити список записів. Формат може бути неправильним.',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'Обрана тека для збереження зображень некоректна. Будь ласка, виберіть іншу.',
+ 'OptionsCreationError'=> 'Неможливо створити файл опцій: ',
+ 'OptionsOpenError'=> 'Неможливо відкрити файл опцій: ',
+ 'OptionsSaveError'=> 'Неможливо зберегти файл опцій: ',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'Що подивитись сьогодні ввечері ?',
+ 'RandomError'=> 'У вас немає вибраних записів', # Accepts model codes
+ 'RandomEnd'=> 'Немає більше записів', # Accepts model codes
+ 'RandomNextTip'=> 'Наступна пропозиція',
+ 'RandomOkTip'=> 'Прийняти цей запис',
+
+ 'AboutTitle' => 'Про GCstar',
+ 'AboutDesc' => 'Менеджер колекцій',
+ 'AboutVersion' => 'Версія',
+ 'AboutTeam' => 'Команда',
+ 'AboutWho' => 'Tian: Керівник проекту, програміст
+Nyall Dawson (Zombiepig): програміст
+TPF: програміст
+Adolfo González : програміст
+',
+ 'AboutLicense' => 'Розповсюджується згідно умов GNU GPL
+Права на логотипи належать le Spektre',
+ 'AboutTranslation' => 'Український переклад виконав Ailandar',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Логотип та вебдизайн le Spektre',
+
+ 'ToolbarRandom' => 'Цього вечора',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+ 'ModelsSelect' => 'Виберіть тип колекції',
+ 'ModelsPersonal' => 'Особисті моделі',
+ 'ModelsDefault' => 'Типові моделі',
+ 'ModelsList' => 'Опис колекції',
+ 'ModelSettings' => 'Налаштування колекції',
+ 'ModelNewType' => 'Новий тип колекції',
+ 'ModelName' => 'Ім\'я типу колекції:',
+ 'ModelFields' => 'Поля',
+ 'ModelOptions' => 'Опції',
+ 'ModelFilters' => 'Фільтри',
+ 'ModelNewField' => 'Нове поле',
+ 'ModelFieldInformation' => 'Інформація',
+ 'ModelFieldName' => 'Мітка:',
+ 'ModelFieldType' => 'Тип:',
+ 'ModelFieldGroup' => 'Група:',
+ 'ModelFieldValues' => 'Значення',
+ 'ModelFieldInit' => 'Типово:',
+ 'ModelFieldMin' => 'Мінімум:',
+ 'ModelFieldMax' => 'Максимум:',
+ 'ModelFieldList' => 'Список значень:',
+ 'ModelFieldListLegend' => '<i>Розділені комами</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Короткий текст',
+ 'ModelFieldTypeLongText' => 'Довгий текст',
+ 'ModelFieldTypeYesNo' => 'Так/Ні',
+ 'ModelFieldTypeNumber' => 'Номер',
+ 'ModelFieldTypeDate' => 'Дата',
+ 'ModelFieldTypeOptions' => 'Напередвизначений список значень',
+ 'ModelFieldTypeImage' => 'Зображення',
+ 'ModelFieldTypeSingleList' => 'Простий список',
+ 'ModelFieldTypeFile' => 'Файл',
+ 'ModelFieldTypeFormatted' => 'Залежне від інших полів',
+ 'ModelFieldParameters' => 'Параметри',
+ 'ModelFieldHasHistory' => 'Використовувати історію',
+ 'ModelFieldFlat' => 'Показувати в один рядок',
+ 'ModelFieldStep' => 'Крок збільшення:',
+ 'ModelFieldFileFormat' => 'Формат файлу:',
+ 'ModelFieldFileFile' => 'Прстий файл',
+ 'ModelFieldFileImage' => 'Зображення',
+ 'ModelFieldFileVideo' => 'Відео',
+ 'ModelFieldFileAudio' => 'Аудіо',
+ 'ModelFieldFileProgram' => 'Програма',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Використовувати поля',
+ 'ModelOptionsFieldsAuto' => 'Автоматично',
+ 'ModelOptionsFieldsNone' => 'Ніяк',
+ 'ModelOptionsFieldsTitle' => 'Як заголовок',
+ 'ModelOptionsFieldsId' => 'Як ідентифікатор',
+ 'ModelOptionsFieldsCover' => 'Як обкладинку',
+ 'ModelOptionsFieldsPlay' => 'Для кнопки Програти',
+ 'ModelCollectionSettings' => 'Налаштування колекції',
+ 'ModelCollectionSettingsLending' => 'Об\'єкти можна позичати',
+ 'ModelCollectionSettingsTagging' => 'Записам можна призначати бирки',
+ 'ModelFilterActivated' => 'Може бути в рядку пошуку',
+ 'ModelFilterComparison' => 'Порівняння',
+ 'ModelFilterContain' => 'Містить',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Діапазон',
+ 'ModelFilterNumeric' => 'Порівняння є числовим',
+ 'ModelFilterQuick' => 'Створити швидкий фільтр',
+ 'ModelTooltipName' => 'Використовувати ім\'я щоб вживати цю модель в інших колекціях. Якщо порожнє, налаштування будуть збережені безпосередньо в самій колекції',
+ 'ModelTooltipLabel' => 'Ім\'я поля, як воно буде показуватись',
+ 'ModelTooltipGroup' => 'Вживається для групування полів. Записи без даного значення можуть бути в типовій групі',
+ 'ModelTooltipHistory' => 'Попередньо введені значення повинні зберігатись у списку зв\'язаних з полем',
+ 'ModelTooltipFormat' => 'Цей формат вживається для визначення дії при відкритті файлу кнопкою Програти',
+ 'ModelTooltipLending' => 'Це додає декілька полів для керування видачами',
+ 'ModelTooltipTagging' => 'Це додає декілька полів для керування бирками',
+ 'ModelTooltipNumeric' => 'Значення можуть використовуватись як числа при порівнянні',
+ 'ModelTooltipQuick' => 'Це додає підменю у меню Фільтри',
+
+ 'ResultsTitle' => 'Виберіть об\'єкт', # Accepts model codes
+ 'ResultsNextTip' => 'Шукати на наступному сайті',
+ 'ResultsPreview' => 'Попередній перегляд',
+ 'ResultsInfo' => 'Ви можете додавати декілька записів до колекції утримуючи клавішу Ctrl або Shift та вибираючи записи', # Accepts model codes
+
+ 'OptionsTitle' => 'Параметри',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Веб оглядач',
+ 'OptionsPlayer' => 'Відео програвач',
+ 'OptionsAudio' => 'Аудіо програвач',
+ 'OptionsImageEditor' => 'Image editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Тека зображень',
+ 'OptionsUseRelativePaths' => 'Вживати відносні шляхи для зображень',
+ 'OptionsLayout' => 'Вигляд',
+ 'OptionsStatus' => 'Показувати рядок стану',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Попередження: Зміни на цій сторінці будуть застосовані після перезавантаження програми.',
+ 'OptionsRemoveConfirm' => 'Питати підтвердження перед видаленням записів',
+ 'OptionsAutoSave' => 'Автоматично зберігати колекцію',
+ 'OptionsAutoLoad' => 'Завантажувати попередню колекцію при запуску',
+ 'OptionsSplash' => 'Показувати екран заставки',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Використовувати перевірку правопису для великих текстових полів',
+ 'OptionsProgramTitle' => 'Оберіть програму для використання',
+ 'OptionsPlugins' => 'Отримувати дані з сайту',
+ 'OptionsAskPlugins' => 'Питати (Всі сайти)',
+ 'OptionsPluginsMulti' => 'Декілька сайтів',
+ 'OptionsPluginsMultiAsk' => 'Питати (Декілька сайтів)',
+ 'OptionsPluginsMultiPerField' => 'Декілька сайтів (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Встановити список',
+ 'OptionsAskImport' => 'Виберіть поля для імпортування',
+ 'OptionsProxy' => 'Використовувати проксі',
+ 'OptionsCookieJar' => 'Використовувати цей cookie jar файл',
+ 'OptionsLang' => 'Мова',
+ 'OptionsMain' => 'Головне',
+ 'OptionsPaths' => 'Шляхи',
+ 'OptionsInternet' => 'Інтернет',
+ 'OptionsConveniences' => 'Функції',
+ 'OptionsDisplay' => 'Вигляд',
+ 'OptionsToolbar' => 'Панель інструментів',
+ 'OptionsToolbars' => {0 => 'Немає', 1 => 'Малі значки', 2 => 'Великі значки', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'Розміщення',
+ 'OptionsToolbarPositions' => {0 => 'Вгорі', 1 => 'Внизу', 2 => 'Ліворуч', 3 => 'Праворуч'},
+ 'OptionsExpandersMode' => 'Розширювачі занадто довгі',
+ 'OptionsExpandersModes' => {'asis' => 'Не робити нічого', 'cut' => 'Обрізати', 'wrap' => 'Перенести рядок'},
+ 'OptionsDateFormat' => 'Формат дати',
+ 'OptionsDateFormatTooltip' => 'Формат - один з тих, що використовуються функцією strftime(3). Типово це %d/%m/%Y',
+ 'OptionsView' => 'Список записів',
+ 'OptionsViews' => {0 => 'Текст', 1 => 'Зображення', 2 => 'Детальний'},
+ 'OptionsColumns' => 'Колонки',
+ 'OptionsMailer' => 'Відсилати через',
+ 'OptionsSMTP' => 'Сервер',
+ 'OptionsFrom' => 'Ваш e-mail',
+ 'OptionsTransform' => 'Розміщувати артиклі в кінці заголовків',
+ 'OptionsArticles' => 'Артиклі (Розділені комами)',
+ 'OptionsSearchStop' => 'Дозволяти переривання пошуку',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'Використовувати головний заголовок як оригінальний, якщо останній відсутній',
+ 'OptionsRestoreAccelerators' => 'Відновити акселератори',
+ 'OptionsHistory' => 'Розмір історії',
+ 'OptionsClearHistory' => 'Очистити історію',
+ 'OptionsStyle' => 'Вигляд',
+ 'OptionsDontAsk' => 'Більше не питати',
+ 'OptionsPathProgramsGroup' => 'Додатки',
+ 'OptionsProgramsSystem' => 'Використовувати програми, визначені системою',
+ 'OptionsProgramsUser' => 'Використовувати інші програми',
+ 'OptionsProgramsSet' => 'Обрати програми',
+ 'OptionsPathImagesGroup' => 'Зображення',
+ 'OptionsInternetDataGroup' => 'Імпорт даних',
+ 'OptionsInternetSettingsGroup' => 'Налаштування',
+ 'OptionsDisplayInformationGroup' => 'Показ інформації',
+ 'OptionsDisplayArticlesGroup' => 'Статті',
+ 'OptionsImagesDisplayGroup' => 'Показати',
+ 'OptionsImagesStyleGroup' => 'Стиль',
+ 'OptionsDetailedPreferencesGroup' => 'Уподобання',
+ 'OptionsFeaturesConveniencesGroup' => 'Зручності',
+ 'OptionsPicturesFormat' => 'Префікс для використання у зображеннях:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Заголовок або ім\'я зв\'язаного запису',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% або . буде замінене текою колекції (вживається лише на початку шляху)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% буде замінене іменем колекції без суфіксу (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% може вживатись тільки на початку шляху до зображень',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% може вживатись тільки на початку шляху до зображень',
+ 'OptionsConfigureMailers' => 'Налаштування поштових програм',
+
+ 'ImagesOptionsButton' => 'Налаштування',
+ 'ImagesOptionsTitle' => 'Налаштування для списку зображень',
+ 'ImagesOptionsSelectColor' => 'Оберіть колір',
+ 'ImagesOptionsUseOverlays' => 'Використовувати покриття зображень',
+ 'ImagesOptionsBg' => 'Тло',
+ 'ImagesOptionsBgPicture' => 'Вживати фонове зображення',
+ 'ImagesOptionsFg'=> 'Відбір',
+ 'ImagesOptionsBgTooltip' => 'Змінити колір тла',
+ 'ImagesOptionsFgTooltip'=> 'Змінити колір відбору',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Розмір',
+ 'ImagesOptionsSizeList' => {0 => 'Дуже малий', 1 => 'Малий', 2 => 'Середній', 3 => 'Великий', 4 => 'Дуже великий'},
+ 'ImagesOptionsSizeTooltip' => 'Виберіть розмір зображення',
+
+ 'DetailedOptionsTitle' => 'Налаштування для детального списку',
+ 'DetailedOptionsImageSize' => 'Розмір зображень',
+ 'DetailedOptionsGroupItems' => 'Групувати записи за',
+ 'DetailedOptionsSecondarySort' => 'Сортувати поля для дітей',
+ 'DetailedOptionsFields' => 'Обрати поля для відображення',
+ 'DetailedOptionsGroupedFirst' => 'Збирати разом осиротілі записи',
+ 'DetailedOptionsAddCount' => 'Додати номер елемента в категорії',
+
+ 'ExtractButton' => 'Інформація',
+ 'ExtractTitle' => 'Інформація про файл',
+ 'ExtractImport' => 'Вживати значення',
+
+ 'FieldsListOpen' => 'Завантажити список полів з файлу',
+ 'FieldsListSave' => 'Зберегти список полів до файлу',
+ 'FieldsListError' => 'Цей список полів не може використовуватись з даним видом колекцій',
+ 'FieldsListIgnore' => '--- Ігнорувати',
+
+ 'ExportTitle' => 'Експортування списку записів',
+ 'ExportFilter' => 'Експортувати тільки відображувані записи',
+ 'ExportFieldsTitle' => 'Поля для експортування',
+ 'ExportFieldsTip' => 'Оберіть поля, які ви хочете експортувати',
+ 'ExportWithPictures' => 'Копіювати зображення у підтеку',
+ 'ExportSortBy' => 'Сортувати за',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Імпортувати інший список записів',
+ 'ImportExportData' => 'Дані',
+ 'ImportExportFile' => 'Файл',
+ 'ImportExportFieldsUnused' => 'Невикористовувані поля',
+ 'ImportExportFieldsUsed' => 'Використовувані поля',
+ 'ImportExportFieldsFill' => 'Додати всі',
+ 'ImportExportFieldsClear' => 'Усунути всі',
+ 'ImportExportFieldsEmpty' => 'Ви повинні обрати хоча б одне поле',
+ 'ImportExportFileEmpty' => 'Ви повинні визначити ім\'я файлу',
+ 'ImportFieldsTitle' => 'Поля для імпорту',
+ 'ImportFieldsTip' => 'Оберіть поля, які ви хочете імпортувати',
+ 'ImportNewList' => 'Створити нову колекцію',
+ 'ImportCurrentList' => 'Додати до поточної колекції',
+ 'ImportDropError' => 'Виникла помилка при відкритті щонайменше одного файлу. Попередній список буде перевантажений.',
+ 'ImportGenerateId' => 'Створити ідентифікатор для кожного запису',
+
+ 'FileChooserOpenFile' => 'Будь ласка, оберіть файл для використання',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Оберіть теку',
+ 'FileChooserOverwrite' => 'Це поле уже існує. Ви хочете його переписати?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ #Some default panels
+ 'PanelCompact' => 'Компактний',
+ 'PanelReadOnly' => 'Лише для читання',
+ 'PanelForm' => 'Вкладки',
+
+ 'PanelSearchButton' => 'Отримати інформацію',
+ 'PanelSearchTip' => 'Пошук в інтернеті інформації за цим іменем',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Клацніть на зображенні для вибору іншого.',
+ 'PanelImageTipView' => 'Клацніть на зображенні для перегляду його справжнього розміру.',
+ 'PanelImageTipMenu' => ' Клацніть правою клавішею для інших варіантів.',
+ 'PanelImageTitle' => 'Вибрати зображення',
+ 'PanelImageNoImage' => 'Немає зображення',
+ 'PanelSelectFileTitle' => 'Оберіть файл',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Відновити типову',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'Від',
+ 'PanelTo' =>'До',
+
+ 'PanelWeb' => 'Перегляд інформації',
+ 'PanelWebTip' => 'Перегляд інформації в інтернеті про даний запис', # Accepts model codes
+ 'PanelRemoveTip' => 'Усунути поточний запис', # Accepts model codes
+
+ 'PanelDateSelect' => 'Обрати',
+ 'PanelNobody' => 'Ніхто',
+ 'PanelUnknown' => 'Невідомий',
+ 'PanelAdded' => 'Дата додавання',
+ 'PanelRating' => 'Оцінка',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Місце',
+
+ 'PanelLending' => 'Позичка',
+ 'PanelBorrower' => 'Боржник',
+ 'PanelLendDate' => 'Позичив',
+ 'PanelHistory' => 'Історія позичок',
+ 'PanelReturned' => 'Річ повернута', # Accepts model codes
+ 'PanelReturnDate' => 'Дата повернення',
+ 'PanelLendedYes' => 'Позичено',
+ 'PanelLendedNo' => 'Доступно',
+
+ 'PanelTags' => 'Бирки',
+ 'PanelFavourite' => 'Улюблене',
+ 'TagsAssigned' => 'Призначені бирки',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Будь-які',
+ 'CheckYes' => 'Так',
+ 'CheckNo' => 'Ні',
+
+ 'ToolbarAll' => 'Показати всі',
+ 'ToolbarAllTooltip' => 'Показати всі записи',
+ 'ToolbarGroupBy' => 'Групувати за',
+ 'ToolbarGroupByTooltip' => 'Оберіть поле для групування за ним записів у списку',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Пошук запису',
+ 'PluginsQuery' => 'Запит',
+ 'PluginsFrame' => 'Пошук на сайті',
+ 'PluginsLogo' => 'Логотип',
+ 'PluginsName' => 'Ім\'я',
+ 'PluginsSearchFields' => 'Поля пошуку',
+ 'PluginsAuthor' => 'Автор',
+ 'PluginsLang' => 'Мова',
+ 'PluginsUseSite' => 'Використовувати поточний сайт для майбутніх пошуків',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Налаштування боржників',
+ 'BorrowersList' => 'Боржники',
+ 'BorrowersName' => 'Ім\'я',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Додати',
+ 'BorrowersRemove' => 'Усунути',
+ 'BorrowersEdit' => 'Редагувати',
+ 'BorrowersTemplate' => 'Шаблон листа',
+ 'BorrowersSubject' => 'Тема листа',
+ 'BorrowersNotice1' => '%1 буде замінене на ім\'я боржника',
+ 'BorrowersNotice2' => '%2 буде замінене на назву речі',
+ 'BorrowersNotice3' => '%3 буде замінене на дату позички',
+
+ 'BorrowersImportTitle' => 'Імпорт інформації про боржників',
+ 'BorrowersImportType' => 'Формат файлу:',
+ 'BorrowersImportFile' => 'Файл:',
+
+ 'BorrowedTitle' => 'Позичені речі', # Accepts model codes
+ 'BorrowedDate' => 'З',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'Надіслати e-mail',
+ 'MailFrom' => 'Від: ',
+ 'MailTo' => 'Кому: ',
+ 'MailSubject' => 'Тема: ',
+ 'MailSmtpError' => 'Проблема підключення до SMTP сервера',
+ 'MailSendmailError' => 'Проблема запуску sendmail',
+
+ 'SearchTooltip' => 'Шукати всі записи', # Accepts model codes
+ 'SearchTitle' => 'Пошук запису', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Поля для заміни',
+ 'QueryReplaceOld' => 'Поточне значення',
+ 'QueryReplaceNew' => 'Нове значення',
+ 'QueryReplaceLaunch' => 'Замінити',
+
+ 'ImportWindowTitle' => 'Виберіть поля для імпорту',
+ 'ImportViewPicture' => 'Перегляд зображення',
+ 'ImportSelectAll' => 'Вибрати всі',
+ 'ImportSelectNone' => 'Не вибрати жодного',
+
+ 'MultiSiteTitle' => 'Сайти для використання при пошуку',
+ 'MultiSiteUnused' => 'Невикористовувані втулки',
+ 'MultiSiteUsed' => 'Використовувати втулки',
+ 'MultiSiteLang' => 'Заповніть список англійськими втулками',
+ 'MultiSiteEmptyError' => 'У вас порожній список сайтів',
+ 'MultiSiteClear' => 'Очистити список',
+
+ 'DisplayOptionsTitle' => 'Елементи для відображення',
+ 'DisplayOptionsAll' => 'Вибрати всі',
+ 'DisplayOptionsSearch' => 'Кнопка пошуку',
+
+ 'GenresTitle' => 'Зміна жанру',
+ 'GenresCategoryName' => 'Використовується жанр',
+ 'GenresCategoryMembers' => 'Жанр для заміни',
+ 'GenresLoad' => 'Завантажити список',
+ 'GenresExport' => 'Зберегти список до файлу',
+ 'GenresModify' => 'Редагувати заміну',
+
+ 'PropertiesName' => 'Назва колекції',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Власник',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => 'Опис',
+ 'PropertiesFile' => 'Інформація про файл',
+ 'PropertiesFilePath' => 'Повний шлях',
+ 'PropertiesItemsNumber' => 'Кількість записів', # Accepts model codes
+ 'PropertiesFileSize' => 'Розмір',
+ 'PropertiesFileSizeSymbols' => ['Байтів', 'Кб', 'Мб', 'Гб', 'Тб', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Властивості колекції',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Програми для надсилання пошти',
+ 'MailProgramsName' => 'Назва',
+ 'MailProgramsCommand' => 'Командкий рядок',
+ 'MailProgramsRestore' => 'Відновити типові',
+ 'MailProgramsAdd' => 'Додати програму',
+ 'MailProgramsInstructions' => 'В командному рядку роляться деякі заміни:
+ %f замінюється на e-mail адресу користувача.
+ %t замінюється на адресу одержувача.
+ %s замінюється на тему повідомлення.
+ %b замінюється на тіло повідомлення.',
+
+ 'BookmarksBookmarks' => 'Закладки',
+ 'BookmarksFolder' => 'Теки',
+ 'BookmarksLabel' => 'Мітка',
+ 'BookmarksPath' => 'Шлях',
+ 'BookmarksNewFolder' => 'Нова тека',
+
+ 'AdvancedSearchType' => 'Тип пошуку',
+ 'AdvancedSearchTypeAnd' => 'Записи, що відповідають всім критеріям', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Записи, що відповідають хоча б одному критерію', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Критерій',
+ 'AdvancedSearchAnyField' => 'Будь-яке поле',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Звіт про помилку, згенерований GCstar',
+ 'BugReportVersion' => 'Версія',
+ 'BugReportPlatform' => 'Операційна система',
+ 'BugReportMessage' => 'Повідомлення про помилку',
+ 'BugReportInformation' => 'Додаткова інформація',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/ZH/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..46ac08a
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::ZH::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => '包含頂端的欄位名稱',
+ 'Separator' => '分隔符號',
+ 'Replacement' => '用來取代分隔符號',
+ 'Charset' => '字元集',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/ZH/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..76b6bce
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::ZH::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/ZH/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..50fe454
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::ZH::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => '無效的模板檔',
+ 'UseFile' => '使用下方指定的檔案',
+ 'WithJS' => '使用Javascript',
+ 'FileTemplate' => '模板',
+ 'Preview' => '預覽',
+ 'NoPreview' => '沒有預覽可用',
+ 'TemplateExternalFile' => '模板檔案',
+ 'Title' => '頁面標題',
+ 'InfoFile' => '檔案中的電影列表:',
+ 'InfoDir' => '圖片在:',
+ 'HeightImg' => '匯出圖片的高度(像素)',
+ 'OpenFileInBrowser' => '在瀏覽器打開產生的檔案',
+ 'Note' => '本列表由<a href="http://www.gcstar.org/">GCstar</a>產生',
+ 'InputTitle' => '輸入搜尋字串',
+ 'SearchType1' => '只有標題',
+ 'SearchType2' => '全部資訊',
+ 'SearchButton' => '搜尋',
+ 'SearchTitle' => '只顯示匹配條件的電影',
+ 'AllButton' => '全部',
+ 'AllTitle' => '顯示全部電影',
+ 'Expand' => '展開全部',
+ 'ExpandTitle' => '顯示所有電影訊息',
+ 'Collapse' => '褶疊全部',
+ 'CollapseTitle' => '褶疊全部電影資訊',
+ 'Borrowed' => '被誰借走:',
+ 'NotBorrowed' => '可用',
+ 'Top' => '頂端',
+ 'Bottom' => '底部',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/ZH/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..9c995c2
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::ZH::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/ZH/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..7a9192b
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::ZH::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => '包含DROP指引',
+ 'WithCreate' => '包含CREATE指引',
+ 'TableName' => '表格名稱',
+ 'InfoFile' => 'SQL檔案: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/ZH/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..5bbad15
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ZH::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => '檔案中有壓縮檔:',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/ZH/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..04c42fb
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::ZH::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => '模板檔案',
+ 'ModelText' => '模板文字',
+ 'Models' => '模板使用',
+ 'UseFile' => '使用檔案',
+ 'UseModel' => '使用文字區域',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/ZH/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..3acc812
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::ZH::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => '要搜尋哪個位置',
+ 'Default' => '預設的Alexandria資料夾',
+ 'Specified' => '在下面指定資料夾',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/ZH/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..dbcde26
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::ZH::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => '字元集',
+ 'Header' => '忽略第一行',
+ 'Separator' => '分隔符號',
+ 'Plugin' => '被使用的站點',
+ 'UseFirst' => '當回傳太多結果時使用第一個',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/ZH/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..5869ab7
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCImport/GCImportFolder.pm
@@ -0,0 +1,70 @@
+{
+ package GCLang::ZH::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => '資料夾',
+ 'Recursive' => '遞迴掃描子目錄',
+ 'Suffixes' => '後綴或副檔名',
+ 'SuffixesTooltip' => '用逗點分隔打算處理的後綴或副檔名列表',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied before removing anything).\nLeave empty if not needed.\nKnown fields : $T:Title, $A:Article, $Y:Year, $S:Season, $E:Episode, $N:Serie Name'
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/ZH/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..8629dce
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ZH::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => '複製圖片',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCImport/GCImportList.pm b/lib/gcstar/GCLang/ZH/GCImport/GCImportList.pm
new file mode 100644
index 0000000..84b082c
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::ZH::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => '名稱列表',
+ 'Plugin' => '被使用的站點',
+ 'UseFirst' => '當回傳太多結果時使用第一個',
+ 'CommentAuto' => '項目自動匯入',
+ 'CommentSite' => '網站:',
+ 'CommentTitle' => '標題:',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/ZH/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..833e085
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::ZH::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/ZH/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..79ea6ad
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ZH::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => '檔案不是個被支援的Tellico收藏集',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/ZH/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..018ef7e
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::ZH::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '電視劇(集)收藏集',
+ Items => '集',
+ NewItem => '新章節',
+ NewSeries => '新系列',
+ Episode => '集',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/ZH/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..7c80048
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::ZH::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '電視劇(系列)收藏集',
+ Items => '個系列',
+ NewItem => '新系列',
+ Name => '系列名稱',
+ Season => '季',
+ Part => 'Part',
+ Episodes => '集',
+ FirstAired => '首播',
+ Time => '每集長度',
+ Producer => '製片商',
+ Music => '音樂',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/ZH/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..78af50d
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::ZH::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '桌上遊戲收藏集',
+ Items => {0 => '份遊戲',
+ 1 => '份遊戲',
+ X => '份遊戲'},
+ NewItem => '新遊戲',
+
+ Id => 'Id',
+ Name => '名稱',
+ Original => '原名',
+ Box => '遊戲盒圖片',
+ DesignedBy => '設計者',
+ PublishedBy => '出版商',
+ Players => '遊玩者人數',
+ PlayingTime => '遊戲時間',
+ SuggestedAge => '建議年齡',
+ Released => '釋出',
+ Description => '描述',
+ Category => '分類',
+ Mechanics => '遊戲機制',
+ ExpandedBy => '有哪些擴充',
+ ExpansionFor => '擴充對象',
+ GameFamily => '遊戲家族',
+ IllustratedBy => '繪師',
+ Url => '網頁',
+ TimesPlayed => '遊玩次數',
+ CompleteContents => '內容完整',
+ Copies => 'No. of copies',
+ Condition => '保存狀態',
+ Photos => '照片',
+ Photo1 => '第一張圖片',
+ Photo2 => '第二張圖片',
+ Photo3 => '第三張圖片',
+ Photo4 => '第四張圖片',
+ Comments => '評論',
+
+ Perfect => '完美',
+ Good => '良好',
+ Average => '普通',
+ Poor => '糟糕',
+
+ CompleteYes => '內容完整',
+ CompleteNo => '遺失一部份',
+
+ General => '一般',
+ Details => '項目細節',
+ Personal => '個人',
+ Information => '資訊',
+
+ FilterRatingSelect => '評價至少到(_L)...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCbooks.pm b/lib/gcstar/GCLang/ZH/GCModels/GCbooks.pm
new file mode 100644
index 0000000..3ff732f
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCbooks.pm
@@ -0,0 +1,70 @@
+{
+ package GCLang::ZH::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '書本收藏集',
+ Items => {0 => '本書',
+ 1 => '本書',
+ X => '本書'},
+ NewItem => '新書',
+
+ Isbn => 'ISBN',
+ Title => '標題',
+ Cover => '封皮',
+ Authors => '作者',
+ Publisher => '出版商',
+ Publication => '出版日期',
+ Language => '語言',
+ Genre => '類型',
+ Serie => '系列',
+ Rank => '等級',
+ Bookdescription => '書籍描述',
+ Pages => '頁數',
+ Read => '已讀',
+ Acquisition => '取得日期',
+ Edition => '版本',
+ Format => '格式',
+ Comments => '評論',
+ Url => '網頁',
+ Translator => '譯者',
+ Artist => '插畫家',
+ DigitalFile => 'Digital version',
+
+ General => '一般',
+ Details => '書籍細節',
+
+ ReadNo => '未讀',
+ ReadYes => '已讀',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCcoins.pm b/lib/gcstar/GCLang/ZH/GCModels/GCcoins.pm
new file mode 100644
index 0000000..7f611ac
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCcoins.pm
@@ -0,0 +1,104 @@
+{
+ package GCLang::ZH::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '錢幣收藏集',
+ Items => {0 => '份錢幣',
+ 1 => '份錢幣',
+ X => '份錢幣'},
+ NewItem => '新錢幣',
+
+ Name => '名稱',
+ Country => '國家',
+ Year => '年份',
+ Currency => '貨幣',
+ Value => '價值',
+ Picture => '主要圖片',
+ Diameter => '直徑',
+ Metal => '金屬',
+ Edge => '邊緣',
+ Edge1 => '邊緣 1',
+ Edge2 => '邊緣 2',
+ Edge3 => '邊緣 3',
+ Edge4 => '邊緣 4',
+ Head => '正面(人頭)',
+ Tail => '反面',
+ Comments => '評論',
+ History => '歷史',
+ Website => '網站',
+ Estimate => '估價',
+ References => '參考資料',
+ Type => '類型',
+ Coin => '硬幣',
+ Banknote => '鈔票',
+
+ Main => '主要',
+ Description => '描述',
+ Other => '其他訊息',
+ Pictures => '圖片',
+
+ Condition => 'PCGS狀態分級',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCcomics.pm b/lib/gcstar/GCLang/ZH/GCModels/GCcomics.pm
new file mode 100644
index 0000000..0ae5766
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::ZH::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '漫畫收藏集',
+ Items => {0 => '本漫畫',
+ 1 => '本漫畫',
+ X => '本漫畫'},
+ NewItem => '新漫畫',
+
+
+ Id => 'Id',
+ Name => '名稱',
+ Series => '書名',
+ Volume => '卷號',
+ Title => '標題',
+ Writer => '腳本作者',
+ Illustrator => '繪師',
+ Colourist => '著色師',
+ Publisher => '出版商',
+ Synopsis => '故事提要',
+ Collection => '收藏',
+ PublishDate => '出版日期',
+ PrintingDate => '印刷日期',
+ ISBN => 'ISBN',
+ Type => '印刷版本',
+ Category => '分類',
+ Format => '格式',
+ NumberBoards => '印刷批號',
+ Signing => '簽名',
+ Cost => '售價',
+ Rating => '評價',
+ Comment => '意見',
+ Url => '網頁',
+
+ FilterRatingSelect => '評價至少到(_L)...',
+
+ Main => '主項目',
+ General => '一般資訊',
+ Details => '細節',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCfilms.pm b/lib/gcstar/GCLang/ZH/GCModels/GCfilms.pm
new file mode 100644
index 0000000..0feb400
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCfilms.pm
@@ -0,0 +1,93 @@
+{
+ package GCLang::ZH::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '電影收藏集',
+ Items => {0 => '部電影',
+ 1 => '部電影',
+ X => '部電影'},
+ NewItem => '新電影',
+
+
+ Id => 'Id',
+ Title => '名稱',
+ Date => '日期',
+ Time => '片長',
+ Director => '導演',
+ Country => '國家',
+ MinimumAge => '最小年齡限制',
+ Genre => '類型',
+ Image => '圖片',
+ Original => '原名',
+ Actors => '演員',
+ Actor => '演員',
+ Role => '角色',
+ Comment => '評論',
+ Synopsis => '故事概覽',
+ Seen => '已觀賞',
+ Number => '媒體數量',
+ Format => '媒體格式',
+ Region => '地區',
+ Identifier => 'Identifier',
+ Url => '網頁',
+ Audio => '聲音',
+ Video => '影片格式',
+ Trailer => '預告片',
+ Serie => '系列',
+ Rank => '等級',
+ Subtitles => '字幕',
+
+ SeenYes => '已觀賞',
+ SeenNo => '還沒看',
+
+ AgeUnrated => '未評級',
+ AgeAll => '全年齡',
+ AgeParent => '需要家長陪同',
+
+ Main => '主項目',
+ General => '一般',
+ Details => '細節',
+
+ Information => '資訊',
+ Languages => '語言',
+ Encoding => '編碼',
+
+ FilterAudienceAge => '觀眾年齡',
+ FilterSeenNo => '還沒看過(_N)',
+ FilterSeenYes => '已觀賞(_A)',
+ FilterRatingSelect => '評價至少到(_L)...',
+
+ ExtractSize => '尺寸',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCgames.pm b/lib/gcstar/GCLang/ZH/GCModels/GCgames.pm
new file mode 100644
index 0000000..5077a47
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCgames.pm
@@ -0,0 +1,82 @@
+{
+ package GCLang::ZH::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '電子遊戲收藏集',
+ Items => {0 => '個遊戲',
+ 1 => '個遊戲',
+ X => '個遊戲'},
+ NewItem => '新遊戲',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => '名稱',
+ Platform => '平台',
+ Players => '遊戲人數',
+ Released => '釋出日期',
+ Editor => '編輯者',
+ Developer => '開發者',
+ Genre => '類型',
+ Box => '遊戲盒圖片',
+ Case => '遊戲盒',
+ Manual => '說明手冊',
+ Completion => '完成度(%)',
+ Executable => '可執行檔',
+ Description => '說明',
+ Codes => '秘技',
+ Code => '秘技',
+ Effect => '效果',
+ Secrets => '遊戲中的秘密',
+ Screenshots => '畫面截圖',
+ Screenshot1 => '第一張截圖',
+ Screenshot2 => '第二張截圖',
+ Comments => '評論',
+ Url => '網頁',
+ Unlockables => '可被解鎖的隱藏項目',
+ Unlockable => '項目',
+ Howto => '作法',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => '一般',
+ Details => '遊戲細節',
+ Tips => '小技巧',
+ Information => '訊息',
+
+ FilterRatingSelect => '評價至少到(_L)...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/ZH/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..752e883
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCgeneric.pm
@@ -0,0 +1,44 @@
+{
+ package GCLang::ZH::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items',
+ lowercase1 => 'item',
+ lowercaseX => 'items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCminicars.pm b/lib/gcstar/GCLang/ZH/GCModels/GCminicars.pm
new file mode 100644
index 0000000..dd61624
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::ZH::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Nunmber of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCmusics.pm b/lib/gcstar/GCLang/ZH/GCModels/GCmusics.pm
new file mode 100644
index 0000000..cae9575
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCmusics.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::ZH::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '音樂收藏集',
+ Items => {0 => '張專輯',
+ 1 => '張專輯',
+ X => '張專輯'},
+ NewItem => '新專輯',
+
+ Unique => 'ISRC/EAN',
+ Title => '標題',
+ Cover => '封面',
+ Artist => '藝術家',
+ Format => '格式',
+ Running => '播放時間',
+ Release => '釋出日期',
+ Genre => '類型',
+ Origin => '原始作品',
+
+#For tracks list
+ Tracks => '曲目列表',
+ Number => '編號',
+ Track => '標題',
+ Time => '時間',
+
+ Composer => '作曲家',
+ Producer => '製片人',
+ Playlist => '播放列表',
+ Comments => '評論',
+ Label => '標籤',
+ Url => '網頁',
+
+ General => '一般',
+ Details => '專輯細節',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/ZH/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..ea87fcd
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCperiodicals.pm
@@ -0,0 +1,55 @@
+{
+ package GCLang::ZH::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals',
+ lowercase1 => 'periodical',
+ lowercaseX => 'periodicals'
+ },
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/ZH/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..87e449b
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::ZH::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/ZH/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..001abfd
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::ZH::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCstamps.pm b/lib/gcstar/GCLang/ZH/GCModels/GCstamps.pm
new file mode 100644
index 0000000..85a9974
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCstamps.pm
@@ -0,0 +1,192 @@
+{
+ package GCLang::ZH::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps',
+ lowercase1 => 'stamp',
+ lowercaseX => 'stamps'
+ },
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCwines.pm b/lib/gcstar/GCLang/ZH/GCModels/GCwines.pm
new file mode 100644
index 0000000..cc6e9df
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCwines.pm
@@ -0,0 +1,65 @@
+{
+ package GCLang::ZH::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '葡萄酒收藏',
+ Items => {0 => '葡萄酒',
+ 1 => '葡萄酒',
+ X => '葡萄酒'},
+ NewItem => '新的葡萄酒',
+
+ Name => '名稱',
+ Designation => '稱呼',
+ Vintage => '製造年份',
+ Vineyard => '釀造地',
+ Type => '種類',
+ Grapes => '葡萄品種',
+ Soil => '土壤類型',
+ Producer => '製造者',
+ Country => '國家',
+ Volume => '容量(毫升)',
+ Alcohol => '酒精濃度(%)',
+ Medal => '獎章',
+
+ Storage => '儲存',
+ Location => '位置',
+ ShelfIndex => '架上索引',
+ Quantity => '數量',
+ Acquisition => 'Acquisition',
+ PurchaseDate => '進貨日期',
+ PurchasePrice => '進貨價格',
+ Gift => '贈品',
+ BottleLabel => '瓶上的標籤',
+ Website => '網路上的參考資料',
+
+ Tasted => '已品嘗',
+ Comments => '評論',
+ Serving => '服務',
+ TastingField => '賞味筆記',
+
+ General => '一般',
+ Details => '細節',
+ Tasting => '賞味',
+
+ TastedNo => '未品嘗過',
+ TastedYes => '已品嘗',
+
+ FilterRange => '範圍',
+ FilterTastedNo => '還沒品嘗(_N)',
+ FilterTastedYes => '已經品嘗過了(_t)',
+ FilterRatingSelect => '評價至少到(_l)...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCstar.pm b/lib/gcstar/GCLang/ZH/GCstar.pm
new file mode 100644
index 0000000..93a2ac1
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCstar.pm
@@ -0,0 +1,654 @@
+{
+ package GCLang::ZH;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => '中文(繁體)',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>警告</b>:
+
+透過插件從網站上下載的資訊<b>僅限於個人使用</b>。
+
+沒有<b>獲取額外授權</b>的任何二次轉發行為都是非法的。
+
+若想確認哪個網站擁有這些資訊,你可以使用<b>項目細節下的按鈕</b>。',
+
+ 'AllItemsFiltered' => '沒有項目匹配過濾器要求',
+
+#Installation
+ 'InstallDirInfo' => '安裝到',
+ 'InstallMandatory' => '必要元件',
+ 'InstallOptional' => '選擇元件',
+ 'InstallErrorMissing' => '錯誤:以下Perl組件必須被安裝:',
+ 'InstallPrompt' => '安裝的基礎資料夾 [/usr/local]: ',
+ 'InstallEnd' => '安裝完畢',
+ 'InstallNoError' => '沒有錯誤',
+ 'InstallLaunch' => '想使用這個應用程式,請點擊一下',
+ 'InstallDirectory' => '基礎資料夾',
+ 'InstallTitle' => 'GCstar 安裝程式',
+ 'InstallDependencies' => '相依元件',
+ 'InstallPath' => '路徑',
+ 'InstallOptions' => '選項',
+ 'InstallSelectDirectory' => '選擇安裝用的基礎資料夾',
+ 'InstallWithClean' => '移除安裝資料夾中的檔案',
+ 'InstallWithMenu' => '將GCstar加入應用程式選單',
+ 'InstallNoPermission' => '錯誤:你沒有寫入指定資料夾的權限',
+ 'InstallMissingMandatory' => '必要相依元件不存在。在獲取這些元件前,你不能夠安裝GCstar。',
+ 'InstallMissingOptional' => '部份選擇相依元件不存在。詳細列表顯示於下。 GCstar或許可以安裝,但部份功能將會失效。',
+ 'InstallMissingNone' => '沒有任何相依問題,你可以繼續並安裝GCstar',
+ 'InstallOK' => '完成',
+ 'InstallMissing' => '不存在',
+ 'InstallMissingFor' => '不存在',
+ 'InstallCleanDirectory' => '移除資料夾中的GCstar檔案:',
+ 'InstallCopyDirectory' => '將檔案拷貝到資料夾:',
+ 'InstallCopyDesktop' => '複製桌面文件:',
+
+#Update
+ 'UpdateUseProxy' => '使用代理(如果沒有使用代理直接按下ENTER):',
+ 'UpdateNoPermission' => '這個資料夾沒有寫入權限:',
+ 'UpdateNone' => '沒有發現更新',
+ 'UpdateFileNotFound' => '檔案不存在',
+
+#Splash
+ 'SplashInit' => '初始化',
+ 'SplashLoad' => '載入收藏集',
+ 'SplashDisplay' => '正在顯示收藏集',
+ 'SplashSort' => '排序收藏集',
+ 'SplashDone' => '準備完成',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => '你似乎先前用過GCfilms,你想要匯入GCfilms資料到GCstar中嗎(這不會損傷你的GCfilms資料)?',
+ 'GCfilmsImportOptions' => '設定',
+ 'GCfilmsImportData' => '電影列表',
+
+#Menus
+ 'MenuFile' => '檔案(_F)',
+ 'MenuNewList' => '新收藏集(_N)',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '最近使用的收藏集(_R)',
+ 'MenuLend' => '顯示被借走的東西(_B)',
+ 'MenuImport' => '匯入(_I)',
+ 'MenuExport' => '匯出(_E)',
+ 'MenuAddItem' => '_Add {1}', # Accepts model codes
+
+ 'MenuEdit' => '編輯(_E)',
+ 'MenuDuplicate' => '複製項目(_p)',
+ 'MenuDuplicatePlural' => '複製項目(_p)',
+ 'MenuEditSelectAllItems' => 'Select _All {X}', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '移除項目(_R)',
+ 'MenuEditDeleteCurrentPlural' => '移除項目(_R)',
+ 'MenuEditFields' => '變更收藏集欄位(_C)',
+ 'MenuEditLockItems' => '鎖定收藏集(_L)',
+
+ 'MenuDisplay' => '過濾器(_i)',
+ 'MenuSavedSearches' => '儲存搜尋',
+ 'MenuSavedSearchesSave' => '儲存當前搜尋',
+ 'MenuSavedSearchesEdit' => '變更已經儲存的搜尋',
+ 'MenuAdvancedSearch' => '進階搜尋(_d)',
+ 'MenuViewAllItems' => '顯示全部項目(_A)',
+ 'MenuNoFilter' => '全部(_A)',
+
+ 'MenuConfiguration' => '設定(_S)',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '顯示資訊(_D)',
+ 'MenuBorrowers' => '出借對象(_B)',
+ 'MenuToolbarConfiguration' => '工具列控制(_T)',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '類型轉換(_C)',
+
+ 'MenuBookmarks' => '我的收藏集(_C)',
+ 'MenuBookmarksAdd' => '加入當前收藏集(_A)',
+ 'MenuBookmarksEdit' => '編輯被書籤的收藏集(_E)',
+
+ 'MenuHelp' => '幫助(_H)',
+ 'MenuHelpContent' => '內容(_C)',
+ 'MenuAllPlugins' => '檢視插件(_P)',
+ 'MenuBugReport' => '回報問題',
+ 'MenuAbout' => '關於GCstar(_A)',
+
+ 'MenuNewWindow' => '在新視窗中顯示項目(_N)',
+ 'MenuNewWindowPlural' => '在新視窗中顯示項目(_N)',
+
+ 'ContextExpandAll' => '展開全部',
+ 'ContextCollapseAll' => '收合全部',
+ 'ContextChooseImage' => '選擇圖片(_I)',
+ 'ContextOpenWith' => '以指定程式開啟(_h)...',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => '封面',
+ 'ContextImgBack' => '封底',
+ 'ContextChooseFile' => '請選擇要使用的檔案',
+ 'ContextChooseFolder' => '選擇一個資料夾',
+
+ 'DialogEnterNumber' => '請輸入數值',
+
+ 'RemoveConfirm' => '你確定要移除這個項目?',
+ 'RemoveConfirmPlural' => '你確定要移除這個項目?',
+ 'DefaultNewItem' => '新項目',
+ 'NewItemTooltip' => '加入一個新項目',
+ 'NoItemFound' => '沒有發現,想要搜尋其他站點嗎?',
+ 'OpenList' => '請選擇收藏集',
+ 'SaveList' => '請選擇要將這個收藏集保存在哪裡?',
+ 'SaveListTooltip' => '保存當前的收藏集',
+ 'SaveUnsavedChanges' => '你收藏集中的變更還未儲存,現在儲存嗎?',
+ 'SaveDontSave' => '不儲存',
+ 'PreferencesTooltip' => '設定偏好',
+ 'ViewTooltip' => '改變收藏集顯示',
+ 'PlayTooltip' => '針對項目啟動檔案關聯(通常是播放的意思)',
+ 'PlayFileNotFound' => '在指定位置上沒有發現目標檔案:',
+ 'PlayRetry' => '重試',
+
+ 'StatusSave' => '儲存中...',
+ 'StatusLoad' => '載入中...',
+ 'StatusSearch' => '搜尋正在進行...',
+ 'StatusGetInfo' => '取得資訊...',
+ 'StatusGetImage' => '取得圖片...',
+
+ 'SaveError' => '不能儲存項目列表,請檢查檔案存取權限與剩餘磁碟空間。',
+ 'OpenError' => '不能開啟項目列表,請檢查檔案存取權限。',
+ 'OpenFormatError' => '不能開啟項目列表,因為檔案格式不正確。',
+ 'OpenVersionWarning' => '本收藏集由更新版本的GCstar建立。如果你儲存,你可能會失去某些訊息。',
+ 'OpenVersionQuestion' => '你依然想繼續嗎?',
+ 'ImageError' => '選擇儲存圖片的資料夾不正確,請選擇另一個。',
+ 'OptionsCreationError'=> '不能建立設定檔。',
+ 'OptionsOpenError'=> '不能打開設定檔:',
+ 'OptionsSaveError'=> '不能儲存設定檔:',
+ 'ErrorModelNotFound' => '未發現模組:',
+ 'ErrorModelUserDir' => '使用者定義模組在:',
+
+ 'RandomTooltip' => 'What to see this evening ?',
+ 'RandomError'=> '沒有項目可供選擇',
+ 'RandomEnd'=> '沒有更多項目',
+ 'RandomNextTip'=> '下一個建議',
+ 'RandomOkTip'=> '接受這個項目',
+
+ 'AboutTitle' => '關於GCstar',
+ 'AboutDesc' => '個人收藏品管理器',
+ 'AboutVersion' => '版本',
+ 'AboutTeam' => '團隊',
+ 'AboutWho' => 'Christian Jodar (Tian): Project manager, Programmer
+Nyall Dawson (Zombiepig): Programmer
+TPF: Programmer
+Adolfo González: Programmer
+',
+ 'AboutLicense' => '以GNU GPL授權發佈
+Logos Copyright le Spektre',
+ 'AboutTranslation' => '中文翻譯由林雪凡製作
+http://wfst.blogspot.com',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): Skin Designer
+Logo和網路設計: le Spektre',
+
+ 'UnsavedCollection' => '未儲存的收藏集',
+ 'ModelsSelect' => '選擇一個收藏集類型',
+ 'ModelsPersonal' => '個人模組',
+ 'ModelsDefault' => '預設模組',
+ 'ModelsList' => '收藏集定義',
+ 'ModelSettings' => '收藏集設定',
+ 'ModelNewType' => '新的收藏集類型',
+ 'ModelName' => '收藏集類型的名字:',
+ 'ModelFields' => '欄位',
+ 'ModelOptions' => '選項',
+ 'ModelFilters' => '過濾器',
+ 'ModelNewField' => '新欄位',
+ 'ModelFieldInformation' => '資訊',
+ 'ModelFieldName' => '欄位名稱:',
+ 'ModelFieldType' => '類型:',
+ 'ModelFieldGroup' => '組別:',
+ 'ModelFieldValues' => '值',
+ 'ModelFieldInit' => '預設:',
+ 'ModelFieldMin' => '最小:',
+ 'ModelFieldMax' => '最大:',
+ 'ModelFieldList' => '列表:',
+ 'ModelFieldListLegend' => '<i>用半形逗號分隔</i>',
+ 'ModelFieldDisplayAs' => '顯示成:',
+ 'ModelFieldDisplayAsText' => '文字',
+ 'ModelFieldDisplayAsGraphical' => '評分條',
+ 'ModelFieldTypeShortText' => '短文字',
+ 'ModelFieldTypeLongText' => '長文字',
+ 'ModelFieldTypeYesNo' => '布林值',
+ 'ModelFieldTypeNumber' => '數字',
+ 'ModelFieldTypeDate' => '日期',
+ 'ModelFieldTypeOptions' => '預定義選擇列表',
+ 'ModelFieldTypeImage' => '圖片',
+ 'ModelFieldTypeSingleList' => '簡表',
+ 'ModelFieldTypeFile' => '檔案',
+ 'ModelFieldTypeFormatted' => '依賴其他欄位',
+ 'ModelFieldParameters' => '變數',
+ 'ModelFieldHasHistory' => '使用歷史資訊',
+ 'ModelFieldFlat' => '單行顯示',
+ 'ModelFieldStep' => '累進增加:',
+ 'ModelFieldFileFormat' => '檔案格式:',
+ 'ModelFieldFileFile' => '一般檔案',
+ 'ModelFieldFileImage' => '圖片',
+ 'ModelFieldFileVideo' => '影片',
+ 'ModelFieldFileAudio' => '音訊',
+ 'ModelFieldFileProgram' => '程式',
+ 'ModelFieldFileUrl' => '統一資源定義符(URL)',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => '使用欄位',
+ 'ModelOptionsFieldsAuto' => '自動',
+ 'ModelOptionsFieldsNone' => '無',
+ 'ModelOptionsFieldsTitle' => '作為標題',
+ 'ModelOptionsFieldsId' => '作為ID',
+ 'ModelOptionsFieldsCover' => '作為封面',
+ 'ModelOptionsFieldsPlay' => '連給播放按鈕',
+ 'ModelCollectionSettings' => '收藏集設定',
+ 'ModelCollectionSettingsLending' => '可被借出',
+ 'ModelCollectionSettingsTagging' => '可加標籤',
+ 'ModelFilterActivated' => '收錄進搜尋盒內',
+ 'ModelFilterComparison' => '比較',
+ 'ModelFilterContain' => '含有',
+ 'ModelFilterDoesNotContain' => '未含有',
+ 'ModelFilterRegexp' => '正則表示式',
+ 'ModelFilterRange' => '範圍',
+ 'ModelFilterNumeric' => '以數字比較',
+ 'ModelFilterQuick' => '建立一個快速過濾器',
+ 'ModelTooltipName' => '建立名字以供其他收藏集使用。如果空白,相關設定會直接儲存在收藏集裡面。',
+ 'ModelTooltipLabel' => '用來顯示的欄位名稱',
+ 'ModelTooltipGroup' => '供欄位的分組使用,不設定會將欄位歸入預設分組',
+ 'ModelTooltipHistory' => '過去的輸入值將會被建成列表供選擇',
+ 'ModelTooltipFormat' => '格式將會決定播放按鈕關聯到什麼程式',
+ 'ModelTooltipLending' => '這會在收藏集裡加入一些欄位來管理借出資訊',
+ 'ModelTooltipTagging' => '這會加入一些欄位來管理標籤',
+ 'ModelTooltipNumeric' => '這個值將會被當作數字來比較',
+ 'ModelTooltipQuick' => 'This will add a submenu in the Filters one',
+
+ 'ResultsTitle' => '選擇一個項目',
+ 'ResultsNextTip' => '搜尋下一個網站',
+ 'ResultsPreview' => '預覽',
+ 'ResultsInfo' => '藉由按住Ctrl或shift鍵,你可以加入多個項目到收藏集中',
+
+ 'OptionsTitle' => '偏好設定',
+ 'OptionsExpertMode' => '專家模式',
+ 'OptionsPrograms' => '對不同類型的檔案用不同的程式開啟,若留白則使用系統預設值',
+ 'OptionsBrowser' => '網頁瀏覽器',
+ 'OptionsPlayer' => '影片播放器',
+ 'OptionsAudio' => '音訊播放器',
+ 'OptionsImageEditor' => '影像編輯器',
+ 'OptionsCdDevice' => 'CD裝置',
+ 'OptionsImages' => '圖片資料夾',
+ 'OptionsUseRelativePaths' => '對圖片使用相對路徑',
+ 'OptionsLayout' => '視窗佈局方式',
+ 'OptionsStatus' => '顯示狀態條',
+ 'OptionsUseStars' => '使用星號來顯示評分',
+ 'OptionsWarning' => '警告:改變這個標籤頁後必須要重啟程式才會生效。',
+ 'OptionsRemoveConfirm' => '在項目刪除前要求確認',
+ 'OptionsAutoSave' => '自動儲存收藏集',
+ 'OptionsAutoLoad' => '在啟動時載入先前的收藏集',
+ 'OptionsSplash' => '顯示啟動畫面',
+ 'OptionsTearoffMenus' => '允許撕開選單',
+ 'OptionsSpellCheck' => '在長文字欄位使用語法檢查',
+ 'OptionsProgramTitle' => '選擇使用的程式',
+ 'OptionsPlugins' => '從哪些網站取得項目資料',
+ 'OptionsAskPlugins' => '詢問 (全部網站)',
+ 'OptionsPluginsMulti' => '多數網站',
+ 'OptionsPluginsMultiAsk' => '詢問 (多數網站)',
+ 'OptionsPluginsMultiPerField' => 'Many sites (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each field we will fill the field with the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => '設定列表',
+ 'OptionsAskImport' => '選擇欄位來匯入',
+ 'OptionsProxy' => '使用代理',
+ 'OptionsCookieJar' => '使用cookie jar檔案',
+ 'OptionsLang' => '語言',
+ 'OptionsMain' => '主要',
+ 'OptionsPaths' => '路徑',
+ 'OptionsInternet' => '網際網路',
+ 'OptionsConveniences' => '其他特徵',
+ 'OptionsDisplay' => '顯示',
+ 'OptionsToolbar' => '工具列',
+ 'OptionsToolbars' => {0 => '無', 1 => '小', 2 => '大', 3 => '系統設定'},
+ 'OptionsToolbarPosition' => '位置',
+ 'OptionsToolbarPositions' => {0 => '上', 1 => '下', 2 => '左', 3 => '右'},
+ 'OptionsExpandersMode' => '過長的文字',
+ 'OptionsExpandersModes' => {'asis' => '不管它', 'cut' => '切斷', 'wrap' => '自動換行'},
+ 'OptionsDateFormat' => '日期格式',
+ 'OptionsDateFormatTooltip' => '使用strftime(3)格式,預設值為%d/%m/%Y',
+ 'OptionsView' => '項目列表',
+ 'OptionsViews' => {0 => '文字', 1 => '圖片', 2 => '細節'},
+ 'OptionsColumns' => '欄',
+ 'OptionsMailer' => '寄件程式',
+ 'OptionsSMTP' => '伺服器',
+ 'OptionsFrom' => '你的e-mail',
+ 'OptionsTransform' => 'Place articles at the end of titles',
+ 'OptionsArticles' => 'Articles (用逗點分開)',
+ 'OptionsSearchStop' => '允許搜尋被放棄',
+ 'OptionsBigPics' => '在可以的狀況下使用大圖片',
+ 'OptionsAlwaysOriginal' => 'Use main title as the original title if none present',
+ 'OptionsRestoreAccelerators' => 'Restore accelerators',
+ 'OptionsHistory' => '歷史大小',
+ 'OptionsClearHistory' => '清除歷史',
+ 'OptionsStyle' => '面板',
+ 'OptionsDontAsk' => '別再詢問',
+ 'OptionsPathProgramsGroup' => 'Applications',
+ 'OptionsProgramsSystem' => '使用系統定義的程式',
+ 'OptionsProgramsUser' => '複寫預設的程式',
+ 'OptionsProgramsSet' => '設定程式',
+ 'OptionsPathImagesGroup' => '圖片',
+ 'OptionsInternetDataGroup' => '資料匯入',
+ 'OptionsInternetSettingsGroup' => '設定',
+ 'OptionsDisplayInformationGroup' => '訊息顯示方式',
+ 'OptionsDisplayArticlesGroup' => 'Articles',
+ 'OptionsImagesDisplayGroup' => '顯示',
+ 'OptionsImagesStyleGroup' => '風格',
+ 'OptionsDetailedPreferencesGroup' => '偏好設定',
+ 'OptionsFeaturesConveniencesGroup' => 'Conveniences',
+ 'OptionsPicturesFormat' => '圖片前綴:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => '關聯項目的標題或名字',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% 或 . 被用來代指收藏集資料夾(在路徑的開始處)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% 被用來代指沒有後綴的收藏集檔名(.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% 只能被用在圖片路徑的開頭',
+ 'OptionsConfigureMailers' => '設定郵件程式',
+
+ 'ImagesOptionsButton' => '設定',
+ 'ImagesOptionsTitle' => '設定圖片列表',
+ 'ImagesOptionsSelectColor' => '選擇一個顏色',
+ 'ImagesOptionsUseOverlays' => '使用圖像層疊',
+ 'ImagesOptionsBg' => '背景',
+ 'ImagesOptionsBgPicture' => '使用背景圖片',
+ 'ImagesOptionsFg'=> '選擇',
+ 'ImagesOptionsBgTooltip' => '改變背景色',
+ 'ImagesOptionsFgTooltip'=> '改變選擇顏色',
+ 'ImagesOptionsResizeImgList' => '自動改變欄的數字',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => '尺寸',
+ 'ImagesOptionsSizeList' => {0 => '極小', 1 => '小', 2 => '中', 3 => '大', 4 => '極大'},
+ 'ImagesOptionsSizeTooltip' => '選擇圖片尺寸',
+
+ 'DetailedOptionsTitle' => '設定細節列表',
+ 'DetailedOptionsImageSize' => '圖片尺寸',
+ 'DetailedOptionsGroupItems' => '項目分組依據',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'Select fields to display',
+ 'DetailedOptionsGroupedFirst' => 'Keep together orphaned items',
+ 'DetailedOptionsAddCount' => 'Add number of elements on categories',
+
+ 'ExtractButton' => '訊息',
+ 'ExtractTitle' => '檔案訊息',
+ 'ExtractImport' => '使用值',
+
+ 'FieldsListOpen' => '從檔案載入欄位列表',
+ 'FieldsListSave' => '儲存欄位列表到檔案',
+ 'FieldsListError' => '這個欄位列表不能被用在這個類型的收藏集上',
+ 'FieldsListIgnore' => '--- 忽略',
+
+ 'ExportTitle' => '匯出項目列表',
+ 'ExportFilter' => '僅匯出顯示的項目',
+ 'ExportFieldsTitle' => '欄位被匯出',
+ 'ExportFieldsTip' => '選擇你想匯出的欄位',
+ 'ExportWithPictures' => '複製子目錄中的圖片',
+ 'ExportSortBy' => '排序依據',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => '匯入另一個項目列表',
+ 'ImportExportData' => '資料',
+ 'ImportExportFile' => '檔案',
+ 'ImportExportFieldsUnused' => '未使用欄位',
+ 'ImportExportFieldsUsed' => '使用欄位',
+ 'ImportExportFieldsFill' => '添加全部',
+ 'ImportExportFieldsClear' => '移除全部',
+ 'ImportExportFieldsEmpty' => '你至少必須選擇一個欄位',
+ 'ImportExportFileEmpty' => '你必須指定一個檔案名稱',
+ 'ImportFieldsTitle' => '要導入的欄位',
+ 'ImportFieldsTip' => '選擇你想匯入的欄位',
+ 'ImportNewList' => '建立一個新的收藏集',
+ 'ImportCurrentList' => '加入當前的收藏集',
+ 'ImportDropError' => 'There was an error opening at least one file. Previous list will be reloaded.',
+ 'ImportGenerateId' => '對每個項目產生ID',
+
+ 'FileChooserOpenFile' => '請選擇要使用的檔案',
+ 'FileChooserDirectory' => '資料夾',
+ 'FileChooserOpenDirectory' => '選擇一個資料夾',
+ 'FileChooserOverwrite' => '這個檔案已經存在,你要複寫它嗎?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ #Some default panels
+ 'PanelCompact' => '緊密',
+ 'PanelReadOnly' => '唯讀',
+ 'PanelForm' => '分頁',
+
+ 'PanelSearchButton' => '獲取資訊',
+ 'PanelSearchTip' => '搜尋網路上關於這個名字的資訊',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => '點擊圖片以選擇另一個。',
+ 'PanelImageTipView' => '點擊圖片瀏覽真實尺寸。',
+ 'PanelImageTipMenu' => ' 更多選擇請按右鍵',
+ 'PanelImageTitle' => '選擇一張圖片',
+ 'PanelImageNoImage' => '沒有圖片',
+ 'PanelSelectFileTitle' => '選擇一個檔案',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => '復原到預設值',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'From',
+ 'PanelTo' =>'To',
+
+ 'PanelWeb' => '瀏覽資訊',
+ 'PanelWebTip' => '瀏覽網路上關於這個項目的資訊',
+ 'PanelRemoveTip' => '移除當前項目',
+
+ 'PanelDateSelect' => '選擇',
+ 'PanelNobody' => '沒有人',
+ 'PanelUnknown' => '未知',
+ 'PanelAdded' => '加入日期',
+ 'PanelRating' => '評價',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => '位置',
+
+ 'PanelLending' => '出借狀況',
+ 'PanelBorrower' => '借出對象',
+ 'PanelLendDate' => '出借日期',
+ 'PanelHistory' => '出借記錄',
+ 'PanelReturned' => '物品歸還',
+ 'PanelReturnDate' => '歸還日期',
+ 'PanelLendedYes' => '出借中',
+ 'PanelLendedNo' => '可用',
+
+ 'PanelTags' => '標籤',
+ 'PanelFavourite' => '最愛',
+ 'TagsAssigned' => '標籤',
+
+ 'PanelUser' => '使用者欄位',
+
+ 'CheckUndef' => '未定義',
+ 'CheckYes' => '是',
+ 'CheckNo' => '不是',
+
+ 'ToolbarRandom' => 'Tonight',
+ 'ToolbarAll' => '瀏覽全部',
+ 'ToolbarAllTooltip' => '瀏覽全部項目',
+ 'ToolbarGroupBy' => '分組依據',
+ 'ToolbarGroupByTooltip' => '選擇一個欄位給項目列表分組',
+ 'ToolbarQuickSearch' => '快速搜尋',
+ 'ToolbarQuickSearchLabel' => '搜尋',
+ 'ToolbarQuickSearchTooltip' => '選擇這個欄位來搜尋,輸入要搜尋的字串後按ENTER。',
+ 'ToolbarSeparator' => '分隔',
+
+ 'PluginsTitle' => '搜尋一個項目',
+ 'PluginsQuery' => '查詢',
+ 'PluginsFrame' => '搜尋站點',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => '名字',
+ 'PluginsSearchFields' => '搜尋欄位',
+ 'PluginsAuthor' => '作者',
+ 'PluginsLang' => '語言',
+ 'PluginsUseSite' => '使用被選擇的站點供未來搜尋',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => '出借對象設定',
+ 'BorrowersList' => '出借對象',
+ 'BorrowersName' => '名字',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => '加入',
+ 'BorrowersRemove' => '移除',
+ 'BorrowersEdit' => '編輯',
+ 'BorrowersTemplate' => '郵件模板',
+ 'BorrowersSubject' => '郵件主題',
+ 'BorrowersNotice1' => '%1 將會被取代為出借對象的名字',
+ 'BorrowersNotice2' => '%2 將會被取代為物品名稱',
+ 'BorrowersNotice3' => '%3 將會被取代為出借日期',
+
+ 'BorrowersImportTitle' => '匯入出借對象的資訊',
+ 'BorrowersImportType' => '檔案格式:',
+ 'BorrowersImportFile' => '檔案:',
+
+ 'BorrowedTitle' => '被借走的東西',
+ 'BorrowedDate' => '從',
+ 'BorrowedDisplayInPanel' => '在主視窗顯示物品',
+
+ 'MailTitle' => '發一封e-mail',
+ 'MailFrom' => '寄件人:',
+ 'MailTo' => '收件人:',
+ 'MailSubject' => '主旨:',
+ 'MailSmtpError' => '連線到SMTP伺服器時出現問題',
+ 'MailSendmailError' => '寄送信件時出現問題',
+
+ 'SearchTooltip' => '搜尋所有項目',
+ 'SearchTitle' => '項目搜尋',
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => '欄位取代',
+ 'QueryReplaceOld' => '當前值',
+ 'QueryReplaceNew' => '新值',
+ 'QueryReplaceLaunch' => '取代',
+
+ 'ImportWindowTitle' => '選擇要匯入的欄位',
+ 'ImportViewPicture' => '瀏覽圖片',
+ 'ImportSelectAll' => '全選',
+ 'ImportSelectNone' => '全部不選',
+
+ 'MultiSiteTitle' => '用來搜尋的網站',
+ 'MultiSiteUnused' => '未使用的插件',
+ 'MultiSiteUsed' => '被使用的插件',
+ 'MultiSiteLang' => 'Fill list with English plugins',
+ 'MultiSiteEmptyError' => '你的站點列表為空',
+ 'MultiSiteClear' => '清除列表',
+
+ 'DisplayOptionsTitle' => 'Items to display',
+ 'DisplayOptionsAll' => '全選',
+ 'DisplayOptionsSearch' => '選擇鈕',
+
+ 'GenresTitle' => 'Genre Conversion',
+ 'GenresCategoryName' => 'Genre to use',
+ 'GenresCategoryMembers' => 'Genre to replace',
+ 'GenresLoad' => '讀取一個列表',
+ 'GenresExport' => '將列表存到檔案',
+ 'GenresModify' => '編輯轉換',
+
+ 'PropertiesName' => '收藏集名稱',
+ 'PropertiesLang' => '語言編碼',
+ 'PropertiesOwner' => '擁有者',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => '描述',
+ 'PropertiesFile' => '檔案訊息',
+ 'PropertiesFilePath' => '完整路徑',
+ 'PropertiesItemsNumber' => '項目數目',
+ 'PropertiesFileSize' => '大小',
+ 'PropertiesFileSizeSymbols' => ['位元組', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => '收藏集屬性',
+ 'PropertiesDefaultPicture' => '預設圖片',
+
+ 'MailProgramsTitle' => '寄件軟體',
+ 'MailProgramsName' => '名字',
+ 'MailProgramsCommand' => '指令行',
+ 'MailProgramsRestore' => '回復預設值',
+ 'MailProgramsAdd' => '加入一個程式',
+ 'MailProgramsInstructions' => '在指令行中,你可以用下面的變數來替換:
+ %f 可被替換為使用者的電子郵件地址。
+ %t 可被替換為接收地址。
+ %s 可被替換為郵件主題。
+ %b 可被替換為郵件訊息。',
+
+ 'BookmarksBookmarks' => '書籤',
+ 'BookmarksFolder' => '資料夾',
+ 'BookmarksLabel' => '書籤名',
+ 'BookmarksPath' => '路徑',
+ 'BookmarksNewFolder' => '新資料夾',
+
+ 'AdvancedSearchType' => '搜尋類型',
+ 'AdvancedSearchTypeAnd' => '項目匹配所有條件',
+ 'AdvancedSearchTypeOr' => '項目匹配至少一個條件',
+ 'AdvancedSearchCriteria' => '條件',
+ 'AdvancedSearchAnyField' => '所有欄位',
+ 'AdvancedSearchSaveTitle' => '儲存搜尋',
+ 'AdvancedSearchSaveName' => '名稱',
+ 'AdvancedSearchSaveOverwrite' => '一個使用相同名字的搜尋已經存在,請使用另一個名字。',
+ 'AdvancedSearchUseCase' => '大小寫敏感',
+ 'AdvancedSearchIgnoreDiacritics' => '忽略重音等發音記號',
+
+ 'BugReportSubject' => 'GCstar產生錯誤回報',
+ 'BugReportVersion' => '版本',
+ 'BugReportPlatform' => '作業系統',
+ 'BugReportMessage' => '錯誤訊息',
+ 'BugReportInformation' => '附加資訊',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..e4c10d7
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::ZH_CN::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => '包含顶部的字段名称',
+ 'Separator' => '分隔符',
+ 'Replacement' => '替换分隔符',
+ 'Charset' => '编码',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..9f2fafc
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::ZH_CN::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => '外部磁盘',
+ 'ZipAll' => 'zip压缩(.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..c6adb7e
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::ZH_CN::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => '无效模板',
+ 'UseFile' => '使用文件',
+ 'WithJS' => '使用Javascript',
+ 'FileTemplate' => '模板',
+ 'Preview' => '预览',
+ 'NoPreview' => '没有预览',
+ 'TemplateExternalFile' => '模板文件',
+ 'Title' => '页面标题',
+ 'InfoFile' => '列表所在文件:',
+ 'InfoDir' => '图片目录',
+ 'HeightImg' => '导出图片的高度(像素)',
+ 'OpenFileInBrowser' => '在浏览器中打开生成的文件',
+ 'Note' => '本列表由<a href="http://www.gcstar.org/">GCstar</a>生成',
+ 'InputTitle' => '输入搜索文字',
+ 'SearchType1' => '只有标题',
+ 'SearchType2' => '全部信息',
+ 'SearchButton' => '搜索',
+ 'SearchTitle' => '只显示匹配条件的电影',
+ 'AllButton' => '全部',
+ 'AllTitle' => '显示全部电影',
+ 'Expand' => '展开全部',
+ 'ExpandTitle' => '显示所有电影信息',
+ 'Collapse' => '折叠全部',
+ 'CollapseTitle' => '折叠全部电影信息',
+ 'Borrowed' => '被谁借走:',
+ 'NotBorrowed' => '可用',
+ 'Top' => '顶部',
+ 'Bottom' => '底部',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..cf6e0a3
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::ZH_CN::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => '数据库名称',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..2be7405
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::ZH_CN::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => '包含DROP指引',
+ 'WithCreate' => '包含CREATE指引',
+ 'TableName' => '表格名称',
+ 'InfoFile' => 'SQL文件: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..df90790
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ZH_CN::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => '压缩到文件:',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..3a590ec
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::ZH_CN::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => '模板文件',
+ 'ModelText' => '模板文字',
+ 'Models' => '模板使用',
+ 'UseFile' => '使用文件',
+ 'UseModel' => '使用文字区域',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..3ac70f4
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::ZH_CN::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => '要搜索哪個位置',
+ 'Default' => '默认的Alexandria目录',
+ 'Specified' => '指定目录',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..6850d92
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::ZH_CN::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => '编码',
+ 'Header' => '忽略第一行',
+ 'Separator' => '分隔符',
+ 'Plugin' => '使用网站',
+ 'UseFirst' => '当结果太多时使用第一个',
+ 'SearchField' => '搜索项目时使用',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..33040c1
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportFolder.pm
@@ -0,0 +1,70 @@
+{
+ package GCLang::ZH_CN::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => '目录',
+ 'Recursive' => '递归搜索子目录',
+ 'Suffixes' => '后缀名',
+ 'SuffixesTooltip' => '用逗号分隔打算处理的后缀列表',
+ 'Remove' => '从名称中删除',
+ 'RemoveTooltip' => '用逗号分隔要从名称中删除的文字列表',
+ 'Ask'=> '询问',
+ 'AskEnd'=> '最后一起询问',
+ 'AddWithoutInfo'=> '添加,不包括信息',
+ 'DontAdd'=> '不添加',
+ 'TakeFirst' => '优先选择',
+ 'MultipleResult'=> '多个结果',
+ 'MultipleResultTooltip'=> '当插件有多个返回结果时怎么办?',
+ 'RemoveWholeWord' => '只有一个单词时删除',
+ 'NoResult'=> '没有结果',
+ 'NoResultTooltip'=> '当插件没有返回结果时怎么办?',
+ 'RemoveTooltipWholeWord' => '只有当只出现一个单词时删除单词',
+ 'RemoveRegularExpr' => '正则表达式',
+ 'RemoveTooltipRegularExpr' => '将\'从名称中删除\'作为perl正则表达式',
+ 'SkipFileAlreadyInCollection' => '只添加新文件',
+ 'SkipFileAlreadyInCollectionTooltip' => '只添加没有在收藏中的文件',
+ 'SkipFileNo' => '否',
+ 'SkipFileFullPath' => '基于完整路径',
+ 'SkipFileFileName' => '基于文件名',
+ 'SkipFileFileNameAndUpdate' => '基于文件名(但更新收藏中的路径)',
+ 'InfoFromFileNameRegExp' => '用正则表达式分析文件名',
+ 'InfoFromFileNameRegExpTooltip' => '从文件名(删除后缀名)中提取提取信息.\n如不需要留空.\n已知字段:\n$T:标题,$A:字母表示标题, $Y:发行日期,$S:季,$E:集,$N:字母表示系列名称,$x:部,$y:总部数',
+
+ 'InfoFromFileNameRegExp' => '用正则表达式分析文件名',
+ 'InfoFromFileNameRegExpTooltip' => '从文件名(删除后缀名)中提取提取信息.\n如不需要留空.\n已知字段:\n$T:标题,$A:文章, $Y:年份, $S:季, $E:期, $N:卷名'
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..276df8b
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ZH_CN::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => '复制图片',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportList.pm b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportList.pm
new file mode 100644
index 0000000..cce54b6
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::ZH_CN::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => '名称列表',
+ 'Plugin' => '使用网站',
+ 'UseFirst' => '结果太多时使用第一个',
+ 'CommentAuto' => '自动导入项目',
+ 'CommentSite' => '网站:',
+ 'CommentTitle' => '标题:',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..fb5a870
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::ZH_CN::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..46d1f61
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ZH_CN::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => '不是所支持的Tellico收藏',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..ae58678
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::ZH_CN::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '电视剧(集)收藏',
+ Items => '集',
+ NewItem => '新章节',
+ NewSeries => '新系列',
+ Episode => '集',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..f90605b
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::ZH_CN::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '电视剧(系列)收藏',
+ Items => '个系列',
+ NewItem => '新系列',
+ Name => '系列名称',
+ Season => '季',
+ Part => '部',
+ Episodes => '集',
+ FirstAired => '首播',
+ Time => '每集长度',
+ Producer => '制片商',
+ Music => '音乐',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..8a3fd8d
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::ZH_CN::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '桌面游戏收藏',
+ Items => {0 => '份游戏',
+ 1 => '份游戏',
+ X => '游戏'},
+ NewItem => '新遊戏',
+
+ Id => 'Id',
+ Name => '名称',
+ Original => '原名',
+ Box => '遊戏盒图片',
+ DesignedBy => '设计者',
+ PublishedBy => '出版商',
+ Players => '玩家人数',
+ PlayingTime => '遊戏时间',
+ SuggestedAge => '建议年龄',
+ Released => '发布',
+ Description => '描述',
+ Category => '分类',
+ Mechanics => '遊戏机制',
+ ExpandedBy => '有哪些扩充',
+ ExpansionFor => '扩充对象',
+ GameFamily => '遊戏家族',
+ IllustratedBy => '美工',
+ Url => '网页',
+ TimesPlayed => '所玩次数',
+ CompleteContents => '內容完整',
+ Copies => '序列号',
+ Condition => '保存状态',
+ Photos => '照片',
+ Photo1 => '第一張图片',
+ Photo2 => '第二張图片',
+ Photo3 => '第三張图片',
+ Photo4 => '第四張图片',
+ Comments => '评论',
+
+ Perfect => '完美',
+ Good => '良好',
+ Average => '普通',
+ Poor => '糟糕',
+
+ CompleteYes => '內容完整',
+ CompleteNo => '丢失一部份',
+
+ General => '一般',
+ Details => '项目细节',
+ Personal => '个人',
+ Information => '信息',
+
+ FilterRatingSelect => '评价至少到(_L)...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCbooks.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCbooks.pm
new file mode 100644
index 0000000..63860c8
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCbooks.pm
@@ -0,0 +1,70 @@
+{
+ package GCLang::ZH_CN::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '书本收藏',
+ Items => {0 => '本书',
+ 1 => '本书',
+ X => '书'},
+ NewItem => '新书',
+
+ Isbn => 'ISBN',
+ Title => '標題',
+ Cover => '封皮',
+ Authors => '作者',
+ Publisher => '出版商',
+ Publication => '出版日期',
+ Language => '语言',
+ Genre => '类型',
+ Serie => '系列',
+ Rank => '等級',
+ Bookdescription => '书籍描述',
+ Pages => '页數',
+ Read => '已读',
+ Acquisition => '取得日期',
+ Edition => '版本',
+ Format => '格式',
+ Comments => '评论',
+ Url => '网页',
+ Translator => '译者',
+ Artist => '插画家',
+ DigitalFile => '电子版',
+
+ General => '一般',
+ Details => '详细',
+
+ ReadNo => '未读',
+ ReadYes => '已读',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCcoins.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCcoins.pm
new file mode 100644
index 0000000..01ad245
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCcoins.pm
@@ -0,0 +1,104 @@
+{
+ package GCLang::ZH_CN::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '钱币收藏',
+ Items => {0 => '份钱币',
+ 1 => '份钱币',
+ X => '钱币'},
+ NewItem => '新钱币',
+
+ Name => '名称',
+ Country => '国家',
+ Year => '年份',
+ Currency => '货币',
+ Value => '价值',
+ Picture => '主要图片',
+ Diameter => '直径',
+ Metal => '金属',
+ Edge => '边缘',
+ Edge1 => '边缘1',
+ Edge2 => '边缘2',
+ Edge3 => '边缘3',
+ Edge4 => '边缘4',
+ Head => '正面(人頭)',
+ Tail => '反面',
+ Comments => '评论',
+ History => '历史',
+ Website => '网站',
+ Estimate => '估价',
+ References => '参考资料',
+ Type => '类型',
+ Coin => '硬币',
+ Banknote => '钞票',
+
+ Main => '主要',
+ Description => '描述',
+ Other => '其他信息',
+ Pictures => '图片',
+
+ Condition => 'PCGS状态分级',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCcomics.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCcomics.pm
new file mode 100644
index 0000000..e224388
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::ZH_CN::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '漫画收藏',
+ Items => {0 => '本漫画',
+ 1 => '本漫画',
+ X => '漫画'},
+ NewItem => '新漫画',
+
+
+ Id => 'Id',
+ Name => '名称',
+ Series => '书名',
+ Volume => '卷号',
+ Title => '标题',
+ Writer => '脚本作者',
+ Illustrator => '绘师',
+ Colourist => '著色师',
+ Publisher => '出版商',
+ Synopsis => '故事提要',
+ Collection => '收藏',
+ PublishDate => '出版日期',
+ PrintingDate => '印刷日期',
+ ISBN => 'ISBN',
+ Type => '印刷版本',
+ Category => '分类',
+ Format => '格式',
+ NumberBoards => '印刷批号',
+ Signing => '签名',
+ Cost => '售价',
+ Rating => '评价',
+ Comment => '意见',
+ Url => '网页',
+
+ FilterRatingSelect => '评价至少到(_L)...',
+
+ Main => '主项目',
+ General => '一般信息',
+ Details => '详细',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCfilms.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCfilms.pm
new file mode 100644
index 0000000..3ce30ab
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCfilms.pm
@@ -0,0 +1,93 @@
+{
+ package GCLang::ZH_CN::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '电影收藏',
+ Items => {0 => '部电影',
+ 1 => '部电影',
+ X => '电影'},
+ NewItem => '新电影',
+
+
+ Id => 'Id',
+ Title => '名称',
+ Date => '日期',
+ Time => '片长',
+ Director => '导演',
+ Country => '国家',
+ MinimumAge => '最小年龄限制',
+ Genre => '类型',
+ Image => '图片',
+ Original => '原名',
+ Actors => '演员',
+ Actor => '演员',
+ Role => '角色',
+ Comment => '评论',
+ Synopsis => '故事概览',
+ Seen => '已观赏',
+ Number => '媒体数量',
+ Format => '媒体格式',
+ Region => '地区',
+ Identifier => 'ID',
+ Url => '网页',
+ Audio => '声音',
+ Video => '影片格式',
+ Trailer => '预告片',
+ Serie => '系列',
+ Rank => '等级',
+ Subtitles => '字幕',
+
+ SeenYes => '已观赏',
+ SeenNo => '还没看',
+
+ AgeUnrated => '未评级',
+ AgeAll => '全年龄',
+ AgeParent => '需要家长陪同',
+
+ Main => '主项目',
+ General => '一般',
+ Details => '细节',
+
+ Information => '资讯',
+ Languages => '语言',
+ Encoding => '编码',
+
+ FilterAudienceAge => '观众年龄',
+ FilterSeenNo => '还没看过(_N)',
+ FilterSeenYes => '已观赏(_A)',
+ FilterRatingSelect => '评价至少到(_L)...',
+
+ ExtractSize => '尺寸',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCgames.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCgames.pm
new file mode 100644
index 0000000..0fb790a
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCgames.pm
@@ -0,0 +1,82 @@
+{
+ package GCLang::ZH_CN::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '电子游戏收藏',
+ Items => {0 => '个游戏',
+ 1 => '个游戏',
+ X => '游戏'},
+ NewItem => '新游戏',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => '名称',
+ Platform => '平台',
+ Players => '游戏人数',
+ Released => '释出日期',
+ Editor => '编辑者',
+ Developer => '开发者',
+ Genre => '类型',
+ Box => '游戏盒图片',
+ Case => '游戏盒',
+ Manual => '说明手册',
+ Completion => '完成度(%)',
+ Executable => '可可执行文件',
+ Description => '说明',
+ Codes => '秘技',
+ Code => '秘技',
+ Effect => '效果',
+ Secrets => '游戏中的秘密',
+ Screenshots => '画面截图',
+ Screenshot1 => '第一张截图',
+ Screenshot2 => '第二张截图',
+ Comments => '评论',
+ Url => '网页',
+ Unlockables => '可解锁的隐藏项目',
+ Unlockable => '可解锁',
+ Howto => '操作方法',
+ Exclusive => '精选',
+ Resolutions => '显示分辨率',
+ InstallationSize => '大小',
+ Region => '地区',
+ SerialNumber => '序列号',
+
+ General => '概况',
+ Details => '游戏细节',
+ Tips => '小技巧',
+ Information => '信息',
+
+ FilterRatingSelect => '评价至少到(_L)...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..299e46e
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCgeneric.pm
@@ -0,0 +1,44 @@
+{
+ package GCLang::ZH_CN::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => '项',
+ 1 => '项',
+ X => '项目',
+ lowercase1 => '项',
+ lowercaseX => '项'
+ },
+ NewItem => '新项',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCminicars.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCminicars.pm
new file mode 100644
index 0000000..3fabc3c
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::ZH_CN::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '小车收藏',
+ Items => {0 => '辆汽车',
+ 1 => '辆汽车',
+ X => '汽车',
+ lowercase1 => '辆汽车',
+ lowercaseX => '汽车'
+ },
+ NewItem => '新汽车',
+ Currency => '通用性',
+
+# Main fields
+
+ Main => '主要信息',
+
+ Name => '名称',
+ Exchange => '待售或待换',
+ Wanted => '需要',
+ Rating1 => '主评价',
+ Picture1 => '主图片',
+ Scale => '尺寸',
+ Manufacturer => '制造商',
+ Constructor => '设计师',
+ Type1 => '类型',
+ Modele => '型号',
+ Version => '版本',
+ Color => '型号颜色',
+ Pub => '广告',
+ Year => '年份',
+ Reference => '参考',
+ Kit => '工具列表',
+ Transformation => '个性变化',
+ Comments1 => '注释',
+
+# Details fields
+
+ Details => '详细',
+
+ MiscCharacteristics => '多方面特性',
+ Material => '材料',
+ Molding => '模制',
+ Condition => '状态',
+ Edition => '版本',
+ Collectiontype => '收集名称',
+ Serial => '系列',
+ Serialnumber => '序列号',
+ Designed => '设计日期',
+ Madein => '制造日期',
+ Box1 => 'Box种类',
+ Box2 => 'Box描述',
+ Containbox => 'Box内容',
+ Rating2 => '实用',
+ Rating3 => '完美',
+ Acquisition => '获得日期',
+ Location => '获得地点',
+ Buyprice => '获得价格',
+ Estimate => '估价',
+ Comments2 => '评论',
+ Decorationset => '装饰',
+ Characters => '性质',
+ CarFromFilm => '电影汽车',
+ Filmcar => '与汽车相关电影',
+ Filmpart => '电影部/集',
+ Parts => '数目',
+ VehiculeDetails => '详细',
+ Detailsparts => '细节部分',
+ Detailsdecorations => '装饰种类',
+ Decorations => '装饰数量',
+ Lwh => '长/宽/高',
+ Weight => '重量',
+ Framecar => '底盘',
+ Bodycar => '车身',
+ Colormirror => '型号颜色',
+ Interior => '内部',
+ Wheels => '车轮',
+ Registrationnumber1 => '前方注册号',
+ Registrationnumber2 => '后部注册号',
+ RacingCar => '赛车',
+ Course => '比赛',
+ Courselocation => '比赛地点',
+ Courseyear => '比赛日期',
+ Team => '团队',
+ Pilots => '赛车手',
+ Copilots => '副驾',
+ Carnumber => '车号',
+ Pub2 => '广告商',
+ Finishline => '完美等级',
+ Steeringwheel => '方向盘位置',
+
+
+# Catalogs fields
+
+ Catalogs => '目录',
+
+ OfficialPicture => '官方图片',
+ Barcode => '条形码',
+ Referencemirror => '参考',
+ Year3 => '可得日期',
+ CatalogCoverPicture => '封面',
+ CatalogPagePicture => '页数',
+ Catalogyear => '目录年份',
+ Catalogedition => '目录版本',
+ Catalogpage => '目录页数',
+ Catalogprice => '目录价格',
+ Personalref => '个人参考',
+ Websitem => '汽车制造商网站',
+ Websitec => '实际制造商网站',
+ Websiteo => '有用链接',
+ Comments3 => '注释',
+
+# Pictures fields
+
+ Pictures => '图片',
+
+ OthersComments => '总评分',
+ OthersDetails => '其它细节',
+ Top1 => '上',
+ Back1 => '下',
+ AVG => '左前',
+ AV => '前',
+ AVD => '右前',
+ G => '左',
+ BOX => 'Box',
+ D => '右',
+ ARG => '左后',
+ AR => '后',
+ ARD => '右后',
+ Others => '杂项',
+
+# PanelLending fields
+
+ LendingExplanation => '临时展览中的有用交换',
+ PanelLending => '租借(展览用)',
+ Comments4 => '注释',
+
+# Realmodel fields
+
+ Realmodel => '真实汽车',
+
+ Difference => '与小图的不同',
+ Front2 => '前',
+ Back2 => '后',
+ Comments5 => '注释',
+
+ References => '参考',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCmusics.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCmusics.pm
new file mode 100644
index 0000000..f6f67ff
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCmusics.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::ZH_CN::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '音乐收藏',
+ Items => {0 => '张专辑',
+ 1 => '张专辑',
+ X => '专辑'},
+ NewItem => '新专辑',
+
+ Unique => 'ISRC/EAN',
+ Title => '标题',
+ Cover => '封面',
+ Artist => '艺术家',
+ Format => '格式',
+ Running => '播放时间',
+ Release => '发布日期',
+ Genre => '类型',
+ Origin => '原始作品',
+
+#For tracks list
+ Tracks => '曲目列表',
+ Number => '编号',
+ Track => '标题',
+ Time => '时间',
+
+ Composer => '作曲家',
+ Producer => '制作人',
+ Playlist => '播放列表',
+ Comments => '评论',
+ Label => '标签',
+ Url => '网页',
+
+ General => '一般',
+ Details => '专辑细节',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..4397183
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCperiodicals.pm
@@ -0,0 +1,55 @@
+{
+ package GCLang::ZH_CN::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '期刊收藏',
+ Items => {0 => '期刊',
+ 1 => '本期刊',
+ X => '期刊',
+ lowercase1 => '本期刊',
+ lowercaseX => '期刊'
+ },
+ NewItem => '新期刊',
+
+ Title => '名称',
+ Cover => '封面',
+ Periodical => '周期',
+ Number => '数',
+ Date => '日期',
+ Subject => '主题',
+ Articles => '文章',
+
+ General => '一般',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..f46b0e8
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::ZH_CN::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '智能卡收藏',
+ Items => {0 => '张智能卡',
+ 1 => '张智能卡',
+ X => '智能卡'},
+ NewItem => '新智能卡',
+ Currency => '通用',
+
+ Help => '字段帮助',
+ Help1 => '帮助',
+
+# Traduction des Champs "Main"
+
+ Main => '智能卡',
+
+ Cover => '图片',
+
+ Name => '名称',
+ Exchange => '将卖出或交换',
+ Wanted => '需要',
+ Rating1 => '总体需求',
+ TheSmartCard => '智能卡,前/后',
+
+ Country => '国家',
+ Color => '颜色',
+ Type1 => '卡类型',
+ Type2 => '芯片类型',
+ Dimension => '长/宽/厚',
+
+ Box => '盒',
+ Chip => '芯片',
+ Year1 => '版本年份',
+ Year2 => '有效年份',
+ Condition => '状态',
+ Charge => '可充电卡',
+ Variety => '变种',
+
+ Edition => '样品数目',
+ Serial => '序列号',
+ Theme => '主题',
+
+ Acquisition => '获得',
+
+ Catalog0 => '目录',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => '参考',
+ Reference1 => 'Phonecote / Infopuce (YT)参考',
+ Reference2 => 'La Cote en Poche参考',
+ Reference3 => '其它参考',
+
+ Quotationnew00 => '新卡报价',
+ Quotationnew10 => 'Phonecote / Infopuce (YT)报价',
+ Quotationnew20 => 'La Cote en Poche报价',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => '二手卡报价',
+ Quotationold10 => 'Phonecote / Infopuce (YT)报价',
+ Quotationold20 => 'La Cote en Poche报价',
+ Quotationold30 => '其它报价',
+
+ Title1 => '名称',
+
+ Unit => '单元/微粒数',
+
+ Pressed => '压模类型',
+ Location => '压模地点',
+
+ Comments1 => '注释',
+
+ Others => '杂项',
+ Weight => '重量',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..6302fd4
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::ZH_CN::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '计算机软件收藏',
+ Items => {0 => '个软件',
+ 1 => '个软件',
+ X => '软件',
+ lowercase1 => '个软件',
+ lowercaseX => '软件'},
+ NewItem => '新软件',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => '名称',
+ Platform => '平台',
+ Released => '发布日期',
+ Homepage => '主页',
+ Editor => '编辑',
+ Developer => '开发人员',
+ Category => '类型',
+ NumberOfCopies => '个数',
+ Price => '价格',
+ Box => '盒装图片',
+ Case => '例子',
+ Manual => '操作指南',
+ Executable => '可执行',
+ Description => '描述',
+ License => '版权',
+ Commercial => '商业软件',
+ FreewareNoncommercial => '免费软件',
+ OtherOpenSource => '其它开源软件',
+ PublicDomain => '公共软件',
+ OtherLicense => '其它',
+ Registration => '注册',
+ RegistrationInfo => '注册信息',
+ RegInfo => '注册信息',
+ RegistrationName => '用户名',
+ RegistrationNumber => '注册号',
+ PanelRegistration => '注册信息',
+ RegistrationComments => '添加信息或注释',
+ Screenshots => '截图',
+ Screenshot1 => '截图1',
+ Screenshot2 => '截图2',
+ Comments => '注释',
+ Url => '网页',
+ General => '一般',
+ Details => '详细',
+ Information => '信息',
+
+ FilterRatingSelect => '评价至少(_L)...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCstamps.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCstamps.pm
new file mode 100644
index 0000000..294adac
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCstamps.pm
@@ -0,0 +1,192 @@
+{
+ package GCLang::ZH_CN::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '邮票收藏',
+ Items => {0 => '邮票',
+ 1 => '张邮票',
+ X => '邮票',
+ lowercase1 => '张邮票',
+ lowercaseX => '邮票'
+ },
+ NewItem => '新邮票',
+
+ General => '一般',
+ Detail => '详细',
+ Value => '价值',
+ Notes => '笔记',
+ Views => '观察',
+
+ Name => '名称',
+ Country => '国家',
+ Year => '年份',
+ Catalog => '类型',
+ Number => '数目',
+ Topic => '主题',
+ Serie => '系列',
+ Designer => '设计者',
+ Engraver => '雕刻师',
+ Type => '类型',
+ Format => '形式',
+ Description => '描述',
+ Color => '颜色',
+ Gum => '背胶',
+ Paper => '纸张',
+ Perforation => '穿孔',
+ PerforationSize => '穿孔大小',
+ CancellationType => '注销戳类型',
+ Comments => '注释',
+ PrintingVariety => '印刷变种',
+ IssueDate => '发行日期',
+ EndOfIssue => '结束发行',
+ Issue => '发行',
+ Grade => '分级',
+ Status => '状态',
+ Adjusted => '调整',
+ Cancellation => '注销戳',
+ CancellationCondition => '注销戳情况',
+ GumCondition => '背胶情况',
+ PerforationCondition => '穿孔情况',
+ ConditionNotes => '状态笔记',
+ Error => '错误',
+ ErrorNotes => '错误记录',
+ FaceValue => '面值',
+ MintValue => '制造值',
+ UsedValue => '使用值',
+ PurchasedDate => '购买日期',
+ Quantity => '数量',
+ History => '历史',
+ Picture1 => '图片1',
+ Picture2 => '图片2',
+ Picture3 => '图片3',
+
+ AirMail => '航空邮件',
+ MilitaryStamp => '军邮',
+ Official => '公务邮件',
+ PostageDue => '应付邮资类',
+ Regular => '常规',
+ Revenue => '税收',
+ SpecialDelivery => '特别投递',
+ StrikeStamp => '罢工邮票',
+ TelegraphStamp => '电报邮票',
+ WarStamp => '战争邮票',
+ WarTaxStamp => '战争税邮票',
+
+ Booklet => '小型张',
+ BookletPane => '单张小型张',
+ Card => '明信片',
+ Coil => '卷状',
+ Envelope => '信封',
+ FirstDayCover => '首日封',
+ Sheet => '联张',
+ Single => '单张',
+
+ Heliogravure => '凹版照相',
+ Lithography => '平版',
+ Offset => '胶印',
+ Photogravure => '凹版印刷',
+ RecessPrinting => '凹口印刷',
+ Typography => '凸版印刷',
+
+ OriginalGum => '原始背胶',
+ Ungummed => '无胶',
+ Regummed => '后加背胶',
+
+ Chalky => '粉笔状',
+ ChinaPaper => '瓷器般的',
+ Coarsed => '粗糙',
+ Glossy => '有光泽的',
+ Granite => '花岗岩状',
+ Laid => 'Laid纸',
+ Manila => '马尼拉纸',
+ Native => '本地纸',
+ Pelure => 'Pelure纸',
+ Quadrille => 'Quadrille纸',
+ Ribbed => '棱纹纸',
+ Rice => '宣纸',
+ Silk => '丝纸',
+ Smoothed => '光滑的',
+ Thick => '厚',
+ Thin => '薄',
+ Wove => '布纹纸',
+
+ CoarsedPerforation => '粗糙穿孔',
+ CombPerforation => '梳状穿孔',
+ CompoundPerforation => '混合穿孔',
+ DamagedPerforation => '破坏了的穿孔',
+ DoublePerforation => '双孔',
+ HarrowPerforation => '耙状孔',
+ LinePerforation => '线孔',
+ NoPerforation => '无孔',
+
+ CancellationToOrder => '整理注销戳',
+ FancyCancellation => '精致注销戳',
+ FirstDayCancellation => '首日戳',
+ NumeralCancellation => '数字戳',
+ PenMarked => '笔戳',
+ RailroadCancellation => '铁路戳',
+ SpecialCancellation => '特殊戳',
+
+ Superb => '华丽',
+ ExtraFine => '极精致',
+ VeryFine => '非常精致',
+ FineVeryFine => '精致/很精致',
+ Fine => '精致',
+ Average => '一般',
+ Poor => '差',
+
+ Owned => '持有者',
+ Ordered => '已排序',
+ Sold => '已售',
+ ToSell => '待售',
+ Wanted => '需要',
+
+ LightCancellation => '轻戳',
+ HeavyCancellation => '重戳',
+ ModerateCancellation => '中等戳',
+
+ MintNeverHinged => '未铰',
+ MintLightHinged => '轻铰',
+ HingedRemnant => '残余铰',
+ HeavilyHinged => '重铰',
+ LargePartOriginalGum => '大面积原始胶',
+ SmallPartOriginalGum => '小面积原始胶',
+ NoGum => '无胶',
+
+ Perfect => '完美',
+ VeryNice => '非常好',
+ Nice => '好',
+ Incomplete => '不完整',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCwines.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCwines.pm
new file mode 100644
index 0000000..536c543
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCwines.pm
@@ -0,0 +1,65 @@
+{
+ package GCLang::ZH_CN::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '葡萄酒收藏',
+ Items => {0 => '瓶葡萄酒',
+ 1 => '瓶葡萄酒',
+ X => '葡萄酒'},
+ NewItem => '新的葡萄酒',
+
+ Name => '名称',
+ Designation => '称呼',
+ Vintage => '制造年份',
+ Vineyard => '酿造地',
+ Type => '种类',
+ Grapes => '葡萄品种',
+ Soil => '土壤类型',
+ Producer => '制造者',
+ Country => '国家',
+ Volume => '容量(毫升)',
+ Alcohol => '酒精浓度(%)',
+ Medal => '奖章',
+
+ Storage => '储存',
+ Location => '位置',
+ ShelfIndex => '架上索引',
+ Quantity => '数量',
+ Acquisition => '获得',
+ PurchaseDate => '进货日期',
+ PurchasePrice => '进货价格',
+ Gift => '赠品',
+ BottleLabel => '瓶上的标签',
+ Website => '网路上的参考资料',
+
+ Tasted => '已品尝',
+ Comments => '评论',
+ Serving => '服务',
+ TastingField => '赏味笔记',
+
+ General => '一般',
+ Details => '细节',
+ Tasting => '赏味',
+
+ TastedNo => '未品尝过',
+ TastedYes => '已品尝',
+
+ FilterRange => '范围',
+ FilterTastedNo => '还没品尝(_N)',
+ FilterTastedYes => '已经品尝过了(_t)',
+ FilterRatingSelect => '评价至少到(_l)...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCstar.pm b/lib/gcstar/GCLang/ZH_CN/GCstar.pm
new file mode 100644
index 0000000..9346a51
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCstar.pm
@@ -0,0 +1,653 @@
+{
+ package GCLang::ZH_CN;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => '中文(简体)',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>警告</b>:
+
+透过插件从网站上下载的资讯<b>仅限於个人使用</b>。
+
+没有<b>获取额外授权</b>的任何二次转发行为都是非法的。
+
+若想确认哪个网站拥有这些资讯,您可以使用<b>项目细节下的按钮</b>。',
+
+ 'AllItemsFiltered' => '没有{X}匹配过滤器要求',
+
+#Installation
+ 'InstallDirInfo' => '安装到',
+ 'InstallMandatory' => '必要组件',
+ 'InstallOptional' => '可选组件',
+ 'InstallErrorMissing' => '错误:以下Perl组件必须被安装:',
+ 'InstallPrompt' => '安装的根目录[/usr/local]: ',
+ 'InstallEnd' => '安装完毕',
+ 'InstallNoError' => '没有错误',
+ 'InstallLaunch' => '想使用这个应用程序,请点击一下',
+ 'InstallDirectory' => '安装目录',
+ 'InstallTitle' => 'GCstar 安装程序',
+ 'InstallDependencies' => '依赖组件',
+ 'InstallPath' => '路径',
+ 'InstallOptions' => '选项',
+ 'InstallSelectDirectory' => '选择安装目录',
+ 'InstallWithClean' => '删除安装目录中的文件',
+ 'InstallWithMenu' => '将GCstar添加到应用程序菜单',
+ 'InstallNoPermission' => '错误:您没有写入指定目录的权限',
+ 'InstallMissingMandatory' => '必要依赖组件不存在。在获取这些组件前,您不能够安装GCstar。',
+ 'InstallMissingOptional' => '部份选择依赖组件不存在。详细列表显示于下。 GCstar或许可以安装,但部份功能将会失效。',
+ 'InstallMissingNone' => '没有任何依赖问题,您可以继续并安装GCstar',
+ 'InstallOK' => '完成',
+ 'InstallMissing' => '不存在',
+ 'InstallMissingFor' => '不存在',
+ 'InstallCleanDirectory' => '删除目录中的GCstar文件:',
+ 'InstallCopyDirectory' => '将文件复制到目录:',
+ 'InstallCopyDesktop' => '复制桌面文件:',
+
+#Update
+ 'UpdateUseProxy' => '使用代理(如果没有使用代理直接按下ENTER):',
+ 'UpdateNoPermission' => '这个目录没有写入权限:',
+ 'UpdateNone' => '没有发现更新',
+ 'UpdateFileNotFound' => '文件不存在',
+
+#Splash
+ 'SplashInit' => '初始化',
+ 'SplashLoad' => '加载收藏',
+ 'SplashDisplay' => '正在显示收藏',
+ 'SplashSort' => '排序收藏',
+ 'SplashDone' => '准备完成',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => '您似乎以前用过GCfilms,您想要导入GCfilms资料到GCstar中吗(这不会破坏您的GCfilms资料)?',
+ 'GCfilmsImportOptions' => '设置',
+ 'GCfilmsImportData' => '电影列表',
+
+#Menus
+ 'MenuFile' => '文件(_F)',
+ 'MenuNewList' => '新收藏(_N)',
+ 'MenuStats' => '统计',
+ 'MenuHistory' => '最近使用的收藏(_R)',
+ 'MenuLend' => '显示被借走的东西(_B)',
+ 'MenuImport' => '导入(_I)',
+ 'MenuExport' => '导出(_E)',
+ 'MenuAddItem' => '添加{1}(_A)', # Accepts model codes
+
+ 'MenuEdit' => '编辑(_E)',
+ 'MenuDuplicate' => '复制{1}(_p)',
+ 'MenuDuplicatePlural' => '复制{X}(_p)',
+ 'MenuEditSelectAllItems' => '选择所有{X}(_A)', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '删除{1}(_R)',
+ 'MenuEditDeleteCurrentPlural' => '删除{X}(_R)',
+ 'MenuEditFields' => '变更收藏字段(_C)',
+ 'MenuEditLockItems' => '锁定收藏(_L)',
+
+ 'MenuDisplay' => '过滤器(_i)',
+ 'MenuSavedSearches' => '保存搜索',
+ 'MenuSavedSearchesSave' => '保存当前搜索',
+ 'MenuSavedSearchesEdit' => '变更已经保存的搜索',
+ 'MenuAdvancedSearch' => '高级搜索(_d)',
+ 'MenuViewAllItems' => '显示全部{X}(_A)',
+ 'MenuNoFilter' => '全部(_A)',
+
+ 'MenuConfiguration' => '设置(_S)',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '显示信息(_D)',
+ 'MenuBorrowers' => '出借对象(_B)',
+ 'MenuToolbarConfiguration' => '工具栏控制(_T)',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '类型转换(_C)',
+
+ 'MenuBookmarks' => '我的收藏(_C)',
+ 'MenuBookmarksAdd' => '添加到当前收藏(_A)',
+ 'MenuBookmarksEdit' => '编辑添加到书签的收藏(_E)',
+
+ 'MenuHelp' => '帮助(_H)',
+ 'MenuHelpContent' => '内容(_C)',
+ 'MenuAllPlugins' => '查看插件(_P)',
+ 'MenuBugReport' => '报告问题',
+ 'MenuAbout' => '关于GCstar(_A)',
+
+ 'MenuNewWindow' => '在新窗口中显示{1}(_N)',
+ 'MenuNewWindowPlural' => '在新窗口中显示{X}(_N)',
+
+ 'ContextExpandAll' => '展开全部',
+ 'ContextCollapseAll' => '折叠全部',
+ 'ContextChooseImage' => '选择图片(_I)',
+ 'ContextOpenWith' => '用指定程序打开(_h)...',
+ 'ContextImageEditor' => '图像编辑器',
+ 'ContextImgFront' => '封面',
+ 'ContextImgBack' => '封底',
+ 'ContextChooseFile' => '请选择要使用的文件',
+ 'ContextChooseFolder' => '选择一个目录',
+
+ 'DialogEnterNumber' => '请输入数值',
+
+ 'RemoveConfirm' => '您确定要删除这个{X}?',
+ 'RemoveConfirmPlural' => '您确定要删除这个{X}?',
+ 'DefaultNewItem' => '新{X}',
+ 'NewItemTooltip' => '添加一个新{1}',
+ 'NoItemFound' => '没有发现,想要搜索其他站点吗?',
+ 'OpenList' => '请选择收藏',
+ 'SaveList' => '请选择要将这个收藏保存在哪里?',
+ 'SaveListTooltip' => '保存当前的收藏',
+ 'SaveUnsavedChanges' => '您收藏中的变更还未保存,现在保存吗?',
+ 'SaveDontSave' => '不保存',
+ 'PreferencesTooltip' => '设置',
+ 'ViewTooltip' => '改变收藏显示',
+ 'PlayTooltip' => '针对{1}启动文件关联',
+ 'PlayFileNotFound' => '在指定位置上没有发现目标文件:',
+ 'PlayRetry' => '重试',
+
+ 'StatusSave' => '保存中...',
+ 'StatusLoad' => '载入中...',
+ 'StatusSearch' => '搜索正在进行...',
+ 'StatusGetInfo' => '取得资讯...',
+ 'StatusGetImage' => '取得图片...',
+
+ 'SaveError' => '不能保存项目列表,请检查文件存取权限与剩余软盘空间。',
+ 'OpenError' => '不能开启项目列表,请检查文件存取权限。',
+ 'OpenFormatError' => '不能开启项目列表,因为文件格式不正确。',
+ 'OpenVersionWarning' => '本收藏由更新版本的GCstar建立。如果您保存,您可能会失去某些信息。',
+ 'OpenVersionQuestion' => '您依然想继续吗?',
+ 'ImageError' => '选择保存图片的目录不正确,请选择另一个。',
+ 'OptionsCreationError'=> '不能建立设置档。',
+ 'OptionsOpenError'=> '不能打开设置档:',
+ 'OptionsSaveError'=> '不能保存设置档:',
+ 'ErrorModelNotFound' => '未发现模块:',
+ 'ErrorModelUserDir' => '使用者定义模块在:',
+
+ 'RandomTooltip' => '今天晚上看什么?',
+ 'RandomError'=> '没有{X}可供选择',
+ 'RandomEnd'=> '没有更多{X}',
+ 'RandomNextTip'=> '下一个建议',
+ 'RandomOkTip'=> '接受这个建议',
+
+ 'AboutTitle' => '关于GCstar',
+ 'AboutDesc' => '个人收藏品管理器',
+ 'AboutVersion' => '版本',
+ 'AboutTeam' => '团队',
+ 'AboutWho' => 'Christian Jodar (Tian): 项目管理, 程序员
+Nyall Dawson (Zombiepig): 程序员
+TPF: 程序员
+Adolfo González: 程序员
+',
+ 'AboutLicense' => '以GNU GPL授权发佈
+Logos Copyright le Spektre',
+ 'AboutTranslation' => '简体中文翻译由白文斯密制作',
+ 'AboutDesign' => 'Łukasz Kowalczk (Qoolman): 皮肤设计
+Logo和网络设计: le Spektre',
+
+ 'UnsavedCollection' => '未保存的收藏',
+ 'ModelsSelect' => '选择一个收藏类型',
+ 'ModelsPersonal' => '个人模块',
+ 'ModelsDefault' => '默认模块',
+ 'ModelsList' => '收藏定义',
+ 'ModelSettings' => '收藏设置',
+ 'ModelNewType' => '新的收藏类型',
+ 'ModelName' => '收藏类型的名字:',
+ 'ModelFields' => '字段',
+ 'ModelOptions' => '选项',
+ 'ModelFilters' => '过滤器',
+ 'ModelNewField' => '新字段',
+ 'ModelFieldInformation' => '资讯',
+ 'ModelFieldName' => '字段名称:',
+ 'ModelFieldType' => '类型:',
+ 'ModelFieldGroup' => '组別:',
+ 'ModelFieldValues' => '值',
+ 'ModelFieldInit' => '默认:',
+ 'ModelFieldMin' => '最小:',
+ 'ModelFieldMax' => '最大:',
+ 'ModelFieldList' => '列表:',
+ 'ModelFieldListLegend' => '<i>用半角逗号分隔</i>',
+ 'ModelFieldDisplayAs' => '显示成:',
+ 'ModelFieldDisplayAsText' => '文字',
+ 'ModelFieldDisplayAsGraphical' => '评分条',
+ 'ModelFieldTypeShortText' => '短文字',
+ 'ModelFieldTypeLongText' => '长文字',
+ 'ModelFieldTypeYesNo' => '布尔值',
+ 'ModelFieldTypeNumber' => '数字',
+ 'ModelFieldTypeDate' => '日期',
+ 'ModelFieldTypeOptions' => '预定义选择列表',
+ 'ModelFieldTypeImage' => '图片',
+ 'ModelFieldTypeSingleList' => '简表',
+ 'ModelFieldTypeFile' => '文件',
+ 'ModelFieldTypeFormatted' => '依赖其他字段',
+ 'ModelFieldParameters' => '变量',
+ 'ModelFieldHasHistory' => '使用历史信息',
+ 'ModelFieldFlat' => '单行显示',
+ 'ModelFieldStep' => '步长:',
+ 'ModelFieldFileFormat' => '文件格式:',
+ 'ModelFieldFileFile' => '一般文件',
+ 'ModelFieldFileImage' => '图片',
+ 'ModelFieldFileVideo' => '影片',
+ 'ModelFieldFileAudio' => '音频',
+ 'ModelFieldFileProgram' => '程序',
+ 'ModelFieldFileUrl' => '统一资源定义符(URL)',
+ 'ModelFieldFileEbook' => '电子书',
+ 'ModelOptionsFields' => '使用字段',
+ 'ModelOptionsFieldsAuto' => '自动',
+ 'ModelOptionsFieldsNone' => '无',
+ 'ModelOptionsFieldsTitle' => '作为标题',
+ 'ModelOptionsFieldsId' => '作为ID',
+ 'ModelOptionsFieldsCover' => '作为封面',
+ 'ModelOptionsFieldsPlay' => '连接播放按钮',
+ 'ModelCollectionSettings' => '收藏设置',
+ 'ModelCollectionSettingsLending' => '可被借出',
+ 'ModelCollectionSettingsTagging' => '可加标签',
+ 'ModelFilterActivated' => '收录进搜索框内',
+ 'ModelFilterComparison' => '比较',
+ 'ModelFilterContain' => '含有',
+ 'ModelFilterDoesNotContain' => '未含有',
+ 'ModelFilterRegexp' => '正则表示式',
+ 'ModelFilterRange' => '范围',
+ 'ModelFilterNumeric' => '以数字比较',
+ 'ModelFilterQuick' => '建立一个快速过滤器',
+ 'ModelTooltipName' => '建立名字以供其他收藏使用。如果空白,相关设置会直接保存在收藏里面。',
+ 'ModelTooltipLabel' => '用来显示的字段名称',
+ 'ModelTooltipGroup' => '供字段的分组使用,不设置会将字段归入默认分组',
+ 'ModelTooltipHistory' => '过去的输入值将会被建成列表供选择',
+ 'ModelTooltipFormat' => '格式将会决定播放按钮关联到什么程序',
+ 'ModelTooltipLending' => '这会在收藏里添加一些字段来管理借出资讯',
+ 'ModelTooltipTagging' => '这会添加一些字段来管理标签',
+ 'ModelTooltipNumeric' => '这个值将会被当作数字来比较',
+ 'ModelTooltipQuick' => '这将会在“过滤器”下添加一个子菜单',
+
+ 'ResultsTitle' => '选择一个{X}',
+ 'ResultsNextTip' => '搜索下一个网站',
+ 'ResultsPreview' => '预览',
+ 'ResultsInfo' => '借由按住Ctrl或shift键,您可以添加多个项目到收藏中',
+
+ 'OptionsTitle' => '设置',
+ 'OptionsExpertMode' => '专家模式',
+ 'OptionsPrograms' => '对不同类型的文件用不同的程序开启,若留白则使用系统默认值',
+ 'OptionsBrowser' => '网页浏览器',
+ 'OptionsPlayer' => '影片播放器',
+ 'OptionsAudio' => '音频播放器',
+ 'OptionsImageEditor' => '图像编辑器',
+ 'OptionsCdDevice' => 'CD设备',
+ 'OptionsImages' => '图片目录',
+ 'OptionsUseRelativePaths' => '对图片使用相对路径',
+ 'OptionsLayout' => '窗口布局方式',
+ 'OptionsStatus' => '显示状态条',
+ 'OptionsUseStars' => '使用星号来显示评分',
+ 'OptionsWarning' => '警告:改变这个标签页后必须要重启程序才会生效。',
+ 'OptionsRemoveConfirm' => '在项目删除前要求确认',
+ 'OptionsAutoSave' => '自动保存收藏',
+ 'OptionsAutoLoad' => '在启动时载入先前的收藏',
+ 'OptionsSplash' => '显示启动画面',
+ 'OptionsTearoffMenus' => '允许撕开菜单',
+ 'OptionsSpellCheck' => '在长文字字段使用语法检查',
+ 'OptionsProgramTitle' => '选择使用的程序',
+ 'OptionsPlugins' => '从哪些网站取得项目资料',
+ 'OptionsAskPlugins' => '询问 (全部网站)',
+ 'OptionsPluginsMulti' => '多数网站',
+ 'OptionsPluginsMultiAsk' => '询问 (多数网站)',
+ 'OptionsPluginsMultiPerField' => '多个网站(每个字段)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => '多个网站的顺序',
+ 'OptionsPluginsMultiPerFieldDesc' => '每个字段将填入从左开始第一个非空信息',
+ 'OptionsPluginsMultiPerFieldFirst' => '第一',
+ 'OptionsPluginsMultiPerFieldLast' => '最后',
+ 'OptionsPluginsMultiPerFieldRemove' => '删除',
+ 'OptionsPluginsMultiPerFieldClearSelected' => '清空选择字段列表',
+ 'OptionsPluginsList' => '设置列表',
+ 'OptionsAskImport' => '选择字段来汇入',
+ 'OptionsProxy' => '使用代理',
+ 'OptionsCookieJar' => '使用cookie jar文件',
+ 'OptionsLang' => '语言',
+ 'OptionsMain' => '主要',
+ 'OptionsPaths' => '路径',
+ 'OptionsInternet' => '网络',
+ 'OptionsConveniences' => '其他特征',
+ 'OptionsDisplay' => '显示',
+ 'OptionsToolbar' => '工具列',
+ 'OptionsToolbars' => {0 => '无', 1 => '小', 2 => '大', 3 => '系统设置'},
+ 'OptionsToolbarPosition' => '位置',
+ 'OptionsToolbarPositions' => {0 => '上', 1 => '下', 2 => '左', 3 => '右'},
+ 'OptionsExpandersMode' => '过长的文字',
+ 'OptionsExpandersModes' => {'asis' => '不管它', 'cut' => '切断', 'wrap' => '自动换行'},
+ 'OptionsDateFormat' => '日期格式',
+ 'OptionsDateFormatTooltip' => '使用strftime(3)格式,默认值为%d/%m/%Y',
+ 'OptionsView' => '项目列表',
+ 'OptionsViews' => {0 => '文字', 1 => '图片', 2 => '细节'},
+ 'OptionsColumns' => '栏',
+ 'OptionsMailer' => '寄信程序',
+ 'OptionsSMTP' => '服务器',
+ 'OptionsFrom' => '您的e-mail',
+ 'OptionsTransform' => '将冠词放在标题的末尾',
+ 'OptionsArticles' => '冠词(用逗点分开)',
+ 'OptionsSearchStop' => '允许搜索被放弃',
+ 'OptionsBigPics' => '在可以的状况下使用大图片',
+ 'OptionsAlwaysOriginal' => '如果没有原始标题用主要标题代替',
+ 'OptionsRestoreAccelerators' => '恢复加速',
+ 'OptionsHistory' => '历史大小',
+ 'OptionsClearHistory' => '清除历史',
+ 'OptionsStyle' => '面板',
+ 'OptionsDontAsk' => '別再询问',
+ 'OptionsPathProgramsGroup' => '程序',
+ 'OptionsProgramsSystem' => '使用系统定义的程序',
+ 'OptionsProgramsUser' => '复写默认的程序',
+ 'OptionsProgramsSet' => '设置程序',
+ 'OptionsPathImagesGroup' => '图片',
+ 'OptionsInternetDataGroup' => '资料汇入',
+ 'OptionsInternetSettingsGroup' => '设置',
+ 'OptionsDisplayInformationGroup' => '信息显示方式',
+ 'OptionsDisplayArticlesGroup' => '冠词',
+ 'OptionsImagesDisplayGroup' => '显示',
+ 'OptionsImagesStyleGroup' => '风格',
+ 'OptionsDetailedPreferencesGroup' => '设置',
+ 'OptionsFeaturesConveniencesGroup' => '便利',
+ 'OptionsPicturesFormat' => '图片前缀:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => '关联项目的标题或名字',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% 或 . 被用来代指收藏目录(在路径的开始处)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% 被用来代指没有后缀的收藏档名(.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% 只能被用在图片路径的开头',
+ 'OptionsConfigureMailers' => '设置邮件程序',
+
+ 'ImagesOptionsButton' => '设置',
+ 'ImagesOptionsTitle' => '设置图片列表',
+ 'ImagesOptionsSelectColor' => '选择一个颜色',
+ 'ImagesOptionsUseOverlays' => '使用图像层叠',
+ 'ImagesOptionsBg' => '背景',
+ 'ImagesOptionsBgPicture' => '使用背景图片',
+ 'ImagesOptionsFg'=> '选择',
+ 'ImagesOptionsBgTooltip' => '改变背景色',
+ 'ImagesOptionsFgTooltip'=> '改变选择颜色',
+ 'ImagesOptionsResizeImgList' => '自动改变栏的数字',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => '尺寸',
+ 'ImagesOptionsSizeList' => {0 => '极小', 1 => '小', 2 => '中', 3 => '大', 4 => '极大'},
+ 'ImagesOptionsSizeTooltip' => '选择图片尺寸',
+
+ 'DetailedOptionsTitle' => '设置细节列表',
+ 'DetailedOptionsImageSize' => '图片尺寸',
+ 'DetailedOptionsGroupItems' => '项目分组依据',
+ 'DetailedOptionsSecondarySort' => '为子字段排序',
+ 'DetailedOptionsFields' => '选择显示字段',
+ 'DetailedOptionsGroupedFirst' => '将孤儿项目放在一起',
+ 'DetailedOptionsAddCount' => '显示类型中项目的数目',
+
+ 'ExtractButton' => '信息',
+ 'ExtractTitle' => '文件信息',
+ 'ExtractImport' => '使用值',
+
+ 'FieldsListOpen' => '从文件载入字段列表',
+ 'FieldsListSave' => '保存字段列表到文件',
+ 'FieldsListError' => '这个字段列表不能被用在这个类型的收藏上',
+ 'FieldsListIgnore' => '--- 忽略',
+
+ 'ExportTitle' => '汇出项目列表',
+ 'ExportFilter' => '仅汇出显示的项目',
+ 'ExportFieldsTitle' => '字段被汇出',
+ 'ExportFieldsTip' => '选择您想汇出的字段',
+ 'ExportWithPictures' => '复制子目录中的图片',
+ 'ExportSortBy' => '排序依据',
+ 'ExportOrder' => '次序',
+
+ 'ImportListTitle' => '汇入另一个项目列表',
+ 'ImportExportData' => '资料',
+ 'ImportExportFile' => '文件',
+ 'ImportExportFieldsUnused' => '未使用字段',
+ 'ImportExportFieldsUsed' => '使用字段',
+ 'ImportExportFieldsFill' => '添加全部',
+ 'ImportExportFieldsClear' => '删除全部',
+ 'ImportExportFieldsEmpty' => '您至少必须选择一个字段',
+ 'ImportExportFileEmpty' => '您必须指定一个文件名称',
+ 'ImportFieldsTitle' => '要导入的字段',
+ 'ImportFieldsTip' => '选择您想汇入的字段',
+ 'ImportNewList' => '建立一个新的收藏',
+ 'ImportCurrentList' => '添加到当前的收藏',
+ 'ImportDropError' => '至少有一个文件打开错误,将加载之前的列表。',
+ 'ImportGenerateId' => '对每个项目产生ID',
+
+ 'FileChooserOpenFile' => '请选择要使用的文件',
+ 'FileChooserDirectory' => '目录',
+ 'FileChooserOpenDirectory' => '选择一个目录',
+ 'FileChooserOverwrite' => '这个文件已经存在,您要覆盖它吗?',
+ 'FileAllFiles' => '所有文件',
+ 'FileVideoFiles' => '视频文件',
+ 'FileEbookFiles' => '电子书',
+ 'FileAudioFiles' => '音频文件',
+ 'FileGCstarFiles' => 'GCstar收藏',
+
+ #Some default panels
+ 'PanelCompact' => '简洁',
+ 'PanelReadOnly' => '只读',
+ 'PanelForm' => '分页',
+
+ 'PanelSearchButton' => '获取资讯',
+ 'PanelSearchTip' => '搜索网路上关于这个名字的资讯',
+ 'PanelSearchContextChooseOne' => '选择一个网站...',
+ 'PanelSearchContextMultiSite' => '使用"多网站"',
+ 'PanelSearchContextMultiSitePerField' => '使用"每个字段多个网站"',
+ 'PanelSearchContextOptions' => '改变选项...',
+ 'PanelImageTipOpen' => '点击图片以选择另一个。',
+ 'PanelImageTipView' => '点击图片浏览真实尺寸。',
+ 'PanelImageTipMenu' => ' 更多选择请按右键',
+ 'PanelImageTitle' => '选择一张图片',
+ 'PanelImageNoImage' => '没有图片',
+ 'PanelSelectFileTitle' => '选择一个文件',
+ 'PanelLaunch' => '打开',
+ 'PanelRestoreDefault' => '复原到默认值',
+ 'PanelRefresh' => '更新',
+ 'PanelRefreshTip' => '从网络上更新',
+
+ 'PanelFrom' =>'从',
+ 'PanelTo' =>'至',
+
+ 'PanelWeb' => '浏览资讯',
+ 'PanelWebTip' => '浏览网路上关于这个项目的资讯',
+ 'PanelRemoveTip' => '删除当前项目',
+
+ 'PanelDateSelect' => '选择',
+ 'PanelNobody' => '没有人',
+ 'PanelUnknown' => '未知',
+ 'PanelAdded' => '添加日期',
+ 'PanelRating' => '评价',
+ 'PanelPressRating' => '媒体评价',
+ 'PanelLocation' => '位置',
+
+ 'PanelLending' => '出借状况',
+ 'PanelBorrower' => '借出对象',
+ 'PanelLendDate' => '出借日期',
+ 'PanelHistory' => '出借记录',
+ 'PanelReturned' => '物品归还',
+ 'PanelReturnDate' => '归还日期',
+ 'PanelLendedYes' => '出借中',
+ 'PanelLendedNo' => '可用',
+
+ 'PanelTags' => '标签',
+ 'PanelFavourite' => '最爱',
+ 'TagsAssigned' => '标签',
+
+ 'PanelUser' => '使用者字段',
+
+ 'CheckUndef' => '未定义',
+ 'CheckYes' => '是',
+ 'CheckNo' => '不是',
+
+ 'ToolbarRandom' => '随机选取',
+ 'ToolbarAll' => '浏览全部',
+ 'ToolbarAllTooltip' => '浏览全部项目',
+ 'ToolbarGroupBy' => '分组依据',
+ 'ToolbarGroupByTooltip' => '选择一个字段给项目列表分组',
+ 'ToolbarQuickSearch' => '快速搜索',
+ 'ToolbarQuickSearchLabel' => '搜索',
+ 'ToolbarQuickSearchTooltip' => '选择这个字段来搜索,输入要搜索的字串后按ENTER。',
+ 'ToolbarSeparator' => '分隔',
+
+ 'PluginsTitle' => '搜索一个项目',
+ 'PluginsQuery' => '查询',
+ 'PluginsFrame' => '搜索站点',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => '名字',
+ 'PluginsSearchFields' => '搜索字段',
+ 'PluginsAuthor' => '作者',
+ 'PluginsLang' => '语言',
+ 'PluginsUseSite' => '使用被选择的站点供未来搜索',
+ 'PluginsPreferredTooltip' => 'GCstar推荐站点',
+ 'PluginDisabled' => '无效',
+
+ 'BorrowersTitle' => '出借对象设置',
+ 'BorrowersList' => '出借对象',
+ 'BorrowersName' => '名字',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => '添加',
+ 'BorrowersRemove' => '删除',
+ 'BorrowersEdit' => '编辑',
+ 'BorrowersTemplate' => '邮件模板',
+ 'BorrowersSubject' => '邮件主题',
+ 'BorrowersNotice1' => '%1 将会被取代为出借对象的名字',
+ 'BorrowersNotice2' => '%2 将会被取代为物品名称',
+ 'BorrowersNotice3' => '%3 将会被取代为出借日期',
+
+ 'BorrowersImportTitle' => '导入出借对象的信息',
+ 'BorrowersImportType' => '文件格式:',
+ 'BorrowersImportFile' => '文件:',
+
+ 'BorrowedTitle' => '被借走的东西',
+ 'BorrowedDate' => '从',
+ 'BorrowedDisplayInPanel' => '在主窗口显示物品',
+
+ 'MailTitle' => '发一封email',
+ 'MailFrom' => '寄信人:',
+ 'MailTo' => '收信人:',
+ 'MailSubject' => '主题:',
+ 'MailSmtpError' => '连线到SMTP服务器时出现问题',
+ 'MailSendmailError' => '寄送信件时出现问题',
+
+ 'SearchTooltip' => '搜索所有项目',
+ 'SearchTitle' => '项目搜索',
+ 'SearchNoField' => '搜索没有选择任何字段。
+在收藏设置中的过滤器标签中加入。',
+
+ 'QueryReplaceField' => '替换字段',
+ 'QueryReplaceOld' => '当前值',
+ 'QueryReplaceNew' => '新值',
+ 'QueryReplaceLaunch' => '替换',
+
+ 'ImportWindowTitle' => '选择要导入的字段',
+ 'ImportViewPicture' => '浏览图片',
+ 'ImportSelectAll' => '全选',
+ 'ImportSelectNone' => '全部不选',
+
+ 'MultiSiteTitle' => '用来搜索的网站',
+ 'MultiSiteUnused' => '未使用的插件',
+ 'MultiSiteUsed' => '被使用的插件',
+ 'MultiSiteLang' => '添加英语插件至列表',
+ 'MultiSiteEmptyError' => '您的站点列表为空',
+ 'MultiSiteClear' => '清除列表',
+
+ 'DisplayOptionsTitle' => '显示项目',
+ 'DisplayOptionsAll' => '全选',
+ 'DisplayOptionsSearch' => '选择按钮',
+
+ 'GenresTitle' => '类型转换',
+ 'GenresCategoryName' => '使用类型',
+ 'GenresCategoryMembers' => '替换类型',
+ 'GenresLoad' => '读取一个列表',
+ 'GenresExport' => '将列表存到文件',
+ 'GenresModify' => '编辑转换',
+
+ 'PropertiesName' => '收藏名称',
+ 'PropertiesLang' => '语言编码',
+ 'PropertiesOwner' => '拥有者',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => '描述',
+ 'PropertiesFile' => '文件信息',
+ 'PropertiesFilePath' => '完整路径',
+ 'PropertiesItemsNumber' => '项目数目',
+ 'PropertiesFileSize' => '大小',
+ 'PropertiesFileSizeSymbols' => ['字节', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => '收藏属性',
+ 'PropertiesDefaultPicture' => '默认图片',
+
+ 'MailProgramsTitle' => '寄件软体',
+ 'MailProgramsName' => '名字',
+ 'MailProgramsCommand' => '指令行',
+ 'MailProgramsRestore' => '回复默认值',
+ 'MailProgramsAdd' => '添加一个程序',
+ 'MailProgramsInstructions' => '在指令行中,您可以用下面的变量来替换:
+ %f 可被替换为使用者的电子邮件地址。
+ %t 可被替换为接收地址。
+ %s 可被替换为邮件主题。
+ %b 可被替换为邮件信息。',
+
+ 'BookmarksBookmarks' => '书签',
+ 'BookmarksFolder' => '目录',
+ 'BookmarksLabel' => '书签名',
+ 'BookmarksPath' => '路径',
+ 'BookmarksNewFolder' => '新目录',
+
+ 'AdvancedSearchType' => '搜索类型',
+ 'AdvancedSearchTypeAnd' => '项目匹配所有条件',
+ 'AdvancedSearchTypeOr' => '项目匹配至少一个条件',
+ 'AdvancedSearchCriteria' => '条件',
+ 'AdvancedSearchAnyField' => '所有字段',
+ 'AdvancedSearchSaveTitle' => '保存搜索',
+ 'AdvancedSearchSaveName' => '名称',
+ 'AdvancedSearchSaveOverwrite' => '一个使用相同名字的搜索已经存在,请使用另一个名字。',
+ 'AdvancedSearchUseCase' => '大小写敏感',
+ 'AdvancedSearchIgnoreDiacritics' => '忽略重音等发音记号',
+
+ 'BugReportSubject' => 'GCstar生成错误报告',
+ 'BugReportVersion' => '版本',
+ 'BugReportPlatform' => '操作系统',
+ 'BugReportMessage' => '错误信息',
+ 'BugReportInformation' => '附加资讯',
+
+#Statistics
+ 'StatsFieldToUse' => '使用字段',
+ 'StatsSortByNumber' => '按{lowercaseX}数目排序',
+ 'StatsGenerate' => '生成',
+ 'StatsKindOfGraph' => '统计图类型',
+ 'StatsBars' => '柱状',
+ 'StatsPie' => '饼状',
+ 'Stats3DPie' => '三维饼状',
+ 'StatsArea' => '范围',
+ 'StatsHistory' => '历史',
+ 'StatsWidth' => '宽度',
+ 'StatsHeight' => '高度',
+ 'StatsFontSize' => '字体大小',
+ 'StatsDisplayNumber' => '显示数字',
+ 'StatsSave' => '保存统计图',
+ 'StatsAccumulate' => '累计值',
+ 'StatsShowAllDates' => '显示所有数据',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCMail.pm b/lib/gcstar/GCMail.pm
new file mode 100644
index 0000000..a6c4649
--- /dev/null
+++ b/lib/gcstar/GCMail.pm
@@ -0,0 +1,474 @@
+package GCMail;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+our $muas = 0;
+
+our %defaultMua = (
+ 'Evolution' => 'evolution "mailto:%t?subject=%s&body=%b"',
+ 'Claws Mail' => 'sylpheed-claws --compose "mailto:%t?subject=%s&body=%b"',
+ 'Thunderbird' => 'thunderbird -compose "mailto:%t?subject=%s&body=%b"',
+);
+
+our $mailersConfigurationFile = 'GCmailers.conf';
+
+sub getMailers
+{
+ my $mailers;
+ if (!$muas)
+ {
+ if (-f $ENV{GCS_CONFIG_HOME}."/$mailersConfigurationFile")
+ {
+ open MAILERS, $ENV{GCS_CONFIG_HOME}."/$mailersConfigurationFile";
+ my $xmlString = do {local $/; <MAILERS>};
+ close MAILERS;
+ my $xs = XML::Simple->new;
+ $mailers = $xs->XMLin($xmlString,
+ ContentKey => '-content');
+ $muas = $mailers->{mailer};
+ }
+ else
+ {
+ $muas = \%defaultMua;
+ }
+ }
+ return $muas;
+}
+
+{
+ package GCMailDialog;
+ use base "Gtk2::Dialog";
+ use Net::SMTP;
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show();
+ $self->show_all;
+
+ if ($self->run eq 'ok')
+ {
+ my $mail = $self->formatMail;
+
+ $self->sendMail($self->{from}->get_text, $self->{to}->get_text, $mail);
+ }
+ $self->hide;
+ }
+
+ sub sendMail
+ {
+ my ($self, $from, $to, $mail) = @_;
+
+ $to =~ s/.*?<|>.*?//g;
+
+ if ($self->{options}->mailer eq 'Sendmail')
+ {
+ $! = '';
+ if (open(MAILER, "| sendmail -t -ba"))
+ {
+ print MAILER "$mail\r\n.\r\n";
+ close MAILER;
+ }
+ else
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{parent}->{lang}->{MailSendmailError}."\n\n$!");
+
+ $dialog->set_position('center-on-parent');
+ $dialog->run;
+ $dialog->destroy;
+ }
+ }
+ else
+ {
+ my $smtp = Net::SMTP->new($self->{options}->smtp);
+ if (!$smtp)
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{parent}->{lang}->{MailSmtpError});
+
+ $dialog->set_position('center-on-parent');
+ $dialog->run;
+ $dialog->destroy;
+ return;
+ }
+ $smtp->mail($from);
+ $smtp->to($to);
+ $smtp->data;
+ $smtp->datasend($mail);
+ $smtp->dataend;
+ $smtp->quit;
+ }
+ }
+
+ sub formatMail
+ {
+ my $self = shift;
+
+ my $mail = '';
+
+ $mail .= "From: ".$self->{from}->get_text."\r\n";
+ $mail .= "To: ".$self->{to}->get_text."\r\n";
+ $mail .= "Subject: ".$self->{subject}->get_text."\r\n\r\n";
+
+ my $buffer = $self->{mailContent}->get_buffer;
+
+ $mail .= $buffer->get_text($buffer->get_start_iter, $buffer->get_end_iter, 1);
+
+ $mail .= "\r\n";
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $from, $to, $subject, $body) = @_;
+ my $class = ref($proto) || $proto;
+ (my $title = $parent->{lang}->{MailTitle}) =~ s/_//;
+ my $self = $class->SUPER::new($title,
+ $parent,
+ [qw/modal destroy-with-parent/],
+ @GCDialogs::okCancelButtons
+ );
+
+ bless ($self, $class);
+
+ $self->set_modal(1);
+ $self->set_position('center');
+ $self->set_default_size(400,400);
+
+ $self->{parent} = $parent;
+ $self->{options} = $parent->{options};
+ my $items = $self->{parent}->{items};
+
+ my $table = new Gtk2::Table(2,2,0);
+ $table->set_row_spacings($GCUtils::margin);
+ $table->set_col_spacings(0);
+ $table->set_border_width($GCUtils::margin);
+
+ my $labelFrom = new Gtk2::Label($parent->{lang}->{MailFrom});
+ $labelFrom->set_alignment(0,0.5);
+ $self->{from} = new Gtk2::Entry;
+ $self->{from}->set_text($from);
+ my $labelTo = new Gtk2::Label($parent->{lang}->{MailTo});
+ $labelTo->set_alignment(0,0.5);
+ $self->{to} = new Gtk2::Entry;
+ $self->{to}->set_text($to);
+ my $labelSubject = new Gtk2::Label($parent->{lang}->{MailSubject});
+ $labelSubject->set_alignment(0,0.5);
+ $self->{subject} = new Gtk2::Entry;
+ $self->{subject}->set_text($subject);
+
+ $table->attach($labelFrom, 0, 1, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{from}, 1, 2, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($labelTo, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{to}, 1, 2, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($labelSubject, 0, 1, 2, 3, 'fill', 'fill', 0, 0);
+ $table->attach($self->{subject}, 1, 2, 2, 3, 'fill', 'fill', 0, 0);
+
+ $self->{mailContent} = new Gtk2::TextView;
+ $self->{mailContent}->set_editable(1);
+ $self->{mailContent}->set_wrap_mode('word');
+ $self->{mailContent}->get_buffer->set_text($body);
+ my $scrollContent = new Gtk2::ScrolledWindow;
+ $scrollContent->set_border_width(10);
+ $scrollContent->set_shadow_type('in');
+ $scrollContent->set_policy('automatic', 'automatic');
+ $scrollContent->set_size_request(-1,80);
+ $scrollContent->add($self->{mailContent});
+
+ $self->vbox->pack_start($table,0,0,10);
+ $self->vbox->pack_start($scrollContent,1,1,10);
+
+ return $self;
+ }
+
+}
+
+{
+ package GCMailer;
+
+ use URI::Escape qw(uri_escape_utf8);
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {parent => $parent};
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub sendBorrowerEmail
+ {
+ my ($self, $info) = @_;
+
+ my %mail = ();
+ my $options = $self->{parent}->{options};
+ $mail{from} = $options->from;
+
+ my @borrowers = split m/\|/, $options->borrowers;
+ my @emails = split m/\|/, $options->emails;
+ my $email;
+ for (my $i = 0; $i < scalar(@borrowers); $i++)
+ {
+ $email = $emails[$i];
+ last if $borrowers[$i] eq $info->{borrower};
+ }
+ $mail{to} = $info->{borrower}." <$email>";
+
+ $mail{subject} = $options->subject;
+ $mail{subject} =~ s/%1/$info->{borrower}/g;
+ $mail{subject} =~ s/%2/"$info->{title}"/g;
+ $mail{subject} =~ s/%3/$info->{lendDate}/g;
+
+ $mail{body} = $options->template;
+ $mail{body} =~ s/<br\/>/\n/g;
+ $mail{body} =~ s/%1/$info->{borrower}/g;
+ $mail{body} =~ s/%2/"$info->{title}"/g;
+ $mail{body} =~ s/%3/$info->{lendDate}/g;
+
+ $self->prepareEmailSending(\%mail);
+
+ #$self->showMe;
+ }
+
+ sub prepareEmailSending
+ {
+ my ($self, $mail) = @_;
+ if (($self->{parent}->{options}->mailer eq 'Sendmail')
+ || ($self->{parent}->{options}->mailer eq 'SMTP'))
+ {
+ my $dialog = new GCMailDialog($self->{parent}, $mail->{from}, $mail->{to},
+ $mail->{subject}, $mail->{body});
+ $dialog->show;
+ }
+ else
+ {
+ $mail->{body} = uri_escape_utf8($mail->{body});
+ my $clients = GCMail::getMailers();
+ my $command = $clients->{$self->{parent}->{options}->mailer};
+ $command =~ s/%f/$mail->{from}/gx;
+ $command =~ s/%t/$mail->{to}/gx;
+ $command =~ s/%s/$mail->{subject}/gx;
+ $command =~ s/%b/$mail->{body}/gx;
+ #system $command;
+ $self->{parent}->launch($command, 'program', 1);
+ }
+ }
+
+}
+
+{
+ package GCMailProgramsDialog;
+ use base 'GCModalDialog';
+ use XML::Simple;
+
+ sub initValues
+ {
+ my $self = shift;
+ use locale;
+
+ my $mailers = GCMail::getMailers;
+ @{$self->{mailers}->{data}} = ();
+ foreach (sort keys %$mailers)
+ {
+ my @infos = [$_, $mailers->{$_}];
+ push @{$self->{mailers}->{data}}, @infos;
+ }
+ $self->{mailers}->select(0);
+ }
+
+ sub saveValues
+ {
+ my $self = shift;
+
+ $muas = {};
+ my $mailers;
+ foreach (@{$self->{mailers}->{data}})
+ {
+ push @{$mailers->{mailer}}, {name => $_->[0], content => $_->[1]};
+ $muas->{$_->[0]} = $_->[1];
+ }
+ my $xs = XML::Simple->new;
+ my $xmlData = $xs->XMLout($mailers,
+ XMLDecl => '<?xml version="1.0" encoding="UTF-8"?>',
+ RootName => 'mailers'
+ );
+ open MAILERS, '>'.$ENV{GCS_CONFIG_HOME}."/$mailersConfigurationFile";
+ print MAILERS $xmlData;
+ close MAILERS;
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->initValues;
+
+ $self->SUPER::show();
+ $self->show_all;
+
+ my $result = $self->run;
+ $self->saveValues if $result eq 'ok';
+ {
+ $self->saveValues;
+ }
+ $self->hide;
+ return ($result eq 'ok');
+ }
+
+ sub restoreDefault
+ {
+ my $self = shift;
+ $muas = \%defaultMua;
+ $self->initValues;
+ }
+
+ sub removeCurrent
+ {
+ my $self = shift;
+ my @idx = $self->{mailers}->get_selected_indices;
+ splice @{$self->{mailers}->{data}}, $idx[0], 1;
+ }
+
+ sub add
+ {
+ my $self = shift;
+
+ my $dialog = new Gtk2::Dialog($self->{parent}->{lang}->{MailProgramsAdd},
+ $self,
+ [qw/modal destroy-with-parent/],
+ @GCDialogs::okCancelButtons
+ );
+
+ my $table = new Gtk2::Table(2,2,0);
+
+ my $labelName = new GCLabel($self->{parent}->{lang}->{MailProgramsName});
+ $table->attach($labelName, 0, 1, 0, 1, 'fill', 'fill', 5, 5);
+ my $name = new Gtk2::Entry;
+ $table->attach($name, 1, 2, 0, 1, 'expand', 'fill', 5, 5);
+
+ my $labelEmail = new GCLabel($self->{parent}->{lang}->{MailProgramsCommand});
+ $table->attach($labelEmail, 0, 1, 1, 2, 'fill', 'fill', 5, 5);
+ my $email = new Gtk2::Entry;
+ $table->attach($email, 1, 2, 1, 2, 'expand', 'fill', 5, 5);
+
+ $dialog->vbox->pack_start($table,1,1,0);
+ $dialog->vbox->show_all;
+
+ if ($dialog->run eq 'ok')
+ {
+ unshift @{$self->{mailers}->{data}}, [$name->get_text, $email->get_text];
+ }
+
+ $dialog->destroy;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{MailProgramsTitle},
+ );
+
+ bless ($self, $class);
+
+ #$self->set_modal(1);
+ $self->set_position('center');
+ $self->set_default_size(400,400);
+
+ $self->{reverse} = 0;
+
+ $self->{parent} = $parent;
+ $self->{lang} = $parent->{lang};
+ $self->{options} = $parent->{options};
+
+ my $hbox = new Gtk2::HBox(0,0);
+
+ $self->{mailers} = new Gtk2::SimpleList($parent->{lang}->{MailProgramsName} => "text",
+ $parent->{lang}->{MailProgramsCommand} => "text");
+ $self->{mailers}->set_column_editable(0, 1);
+ $self->{mailers}->set_column_editable(1, 1);
+ $self->{mailers}->set_rules_hint(1);
+
+ $self->{mailers}->get_column(0)->set_sort_column_id(0);
+ $self->{mailers}->get_model->set_sort_column_id(0, 'ascending');
+
+ for my $i (0..1)
+ {
+ $self->{mailers}->get_column($i)->set_resizable(1);
+ }
+ $self->{order} = 1;
+ $self->{sort} = -1;
+
+ my $scrollPanelList = new Gtk2::ScrolledWindow;
+ $scrollPanelList->set_policy ('never', 'automatic');
+ $scrollPanelList->set_shadow_type('etched-in');
+ $scrollPanelList->set_border_width(0);
+ $scrollPanelList->add($self->{mailers});
+
+ my $vboxButtons = new Gtk2::VBox(0,0);
+ my $addButton = Gtk2::Button->new_from_stock('gtk-add');
+ $addButton->signal_connect('clicked' => sub {
+ $self->add;
+ });
+ my $removeButton = Gtk2::Button->new_from_stock('gtk-remove');
+ $removeButton->signal_connect('clicked' => sub {
+ $self->removeCurrent;
+ });
+
+ my $restoreButton = Gtk2::Button->new($parent->{lang}->{MailProgramsRestore});
+ $restoreButton->signal_connect('clicked' => sub {
+ $self->restoreDefault;
+ });
+
+ $vboxButtons->pack_start($addButton,0,0,$GCUtils::halfMargin);
+ $vboxButtons->pack_start($removeButton,0,0,$GCUtils::halfMargin);
+ $vboxButtons->pack_start($restoreButton,0,0,$GCUtils::halfMargin);
+
+ my $instructions = new GCLabel($parent->{lang}->{MailProgramsInstructions});
+ $instructions->set_padding($GCUtils::margin, $GCUtils::halfMargin);
+
+ $hbox->pack_start($scrollPanelList,1,1,0);
+ $hbox->pack_start($vboxButtons,0,0,$GCUtils::margin);
+ $hbox->set_border_width($GCUtils::margin);
+ $self->vbox->pack_start($hbox,1,1,0);
+ $self->vbox->pack_start($instructions,0,0,0);
+
+ return $self;
+ }
+
+}
+
+
+1;
diff --git a/lib/gcstar/GCMainWindow.pm b/lib/gcstar/GCMainWindow.pm
new file mode 100644
index 0000000..b08bd40
--- /dev/null
+++ b/lib/gcstar/GCMainWindow.pm
@@ -0,0 +1,4124 @@
+package GCMainWindow;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use utf8;
+
+use strict;
+use Gtk2;
+
+{
+ package GCFrame;
+
+ use Glib::Object::Subclass
+ Gtk2::Window::
+ ;
+
+ @GCFrame::ISA = ('Gtk2::Window');
+
+ # Internal modules
+ use GCDialogs;
+ use GCPlugins;
+ use GCModel;
+ use GCGraphicComponents::GCBaseWidgets;
+ use GCMenu;
+ use GCPanel;
+ use GCUtils 'glob';
+ use GCOptions;
+ use GCStyle;
+ use GCBorrowings;
+ use GCExtract;
+ use GCExport;
+ use GCImport;
+ use GCSplash;
+ use GCLang;
+ use GCDisplay;
+ use GCData;
+ use GCMail;
+ use GCBookmarks;
+ use GCStats;
+
+ use GCItemsLists::GCTextLists;
+ use GCItemsLists::GCImageLists;
+
+ #use GCGenres;
+
+ # Pragmas
+ use filetest 'access';
+
+ # External modules
+ use LWP;
+ use URI::Escape;
+ use File::Basename;
+ use File::Spec;
+ use File::Copy;
+ use File::Path;
+ use IO::Handle;
+ use Storable qw(store_fd fd_retrieve);
+ use File::Temp qw(tempdir);
+ use Encode;
+
+ sub showMe
+ {
+ my $self = shift;
+ $self->present;
+ }
+
+ sub beforeDestroy
+ {
+ my $self = shift;
+ $self->leave;
+ return 1;
+ }
+
+ sub savePreferences
+ {
+ my $self = shift;
+ $self->{itemsView}->savePreferences($self->{model}->{preferences})
+ if $self->{itemsView} && $self->{model} && $self->{model}->{preferences};
+ }
+
+ sub leave
+ {
+ my $self = shift;
+
+ return if !$self->checkAndSave;
+
+ my ($width, $height) = $self->get_size;
+ $self->{options}->file('')
+ if $self->{options}->noautoload;
+ $self->{options}->width($width);
+ $self->{options}->height($height);
+ $self->{options}->split($self->{pane}->get_position) if ($self->{pane});
+ $self->{options}->listPaneSplit($self->{listPane}->get_position) if ($self->{listPane});
+
+ $self->{options}->save;
+ $self->savePreferences;
+ $self->{model}->save
+ if $self->{model};
+
+ $self->{items}->clean;
+
+ if (($^O !~ /win32/i) && ($self->{searchJob}->{pid}))
+ {
+ store_fd {type => 'exit'}, $self->{searchJob}->{command};
+ my $command = $self->{searchJob}->{command};
+ print $command "EXIT\n";
+ close $self->{searchJob}->{command};
+ close $self->{searchJob}->{data};
+ kill 9, $self->{searchJob}->{pid};
+ wait;
+ }
+ $self->{menubar}->save();
+ $self->destroy;
+ }
+
+ sub deleteCurrentItem
+ {
+ my $self = shift;
+ my $response = 'yes';
+ my $confirm = 0;
+
+ if ($self->{options}->confirm)
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'question',
+ 'cancel',
+ $self->{items}->{multipleMode} ? $self->{lang}->{RemoveConfirmPlural} :
+ $self->{lang}->{RemoveConfirm});
+
+ my $delButton = Gtk2::Button->new_from_stock('gtk-delete');
+ $delButton->can_default(1);
+ $dialog->add_action_widget($delButton, 'yes');
+ $delButton->show_all;
+ $dialog->set_default_response('yes');
+ $dialog->set_position('center-on-parent');
+ my $check = new Gtk2::CheckButton($self->{lang}->{OptionsDontAsk});
+ $dialog->vbox->pack_start($check,0,0,5);
+ $dialog->vbox->pack_start(Gtk2::HSeparator->new,0,0,5);
+ $dialog->vbox->show_all;
+ $response = $dialog->run;
+ $confirm = ($check->get_active ? 0 : 1);
+ $dialog->destroy;
+ }
+
+ if ($response eq 'yes')
+ {
+ $self->markAsUpdated;
+ $self->{items}->removeCurrentItems;
+ $self->setNbItems;
+ $self->{options}->confirm($confirm);
+ $self->{panel}->hide if ! $self->{itemsView}->getNbItems;
+ }
+ }
+
+ sub newItem
+ {
+
+ my ($self, $self2, $noDisplay) = @_;
+ $self = $self2 if $self2;
+
+ #$self->{options}->lockPanel(0);
+ # Uncomment to memorize
+ #$self->{panel}->changeState($self->{panel}, 0);
+ $self->{menubar}->setCollectionLock(0);
+
+ my $info = $self->{model}->getDefaultValues;
+ $self->addItem($info, 1, undef, 1);
+
+ $self->displayInWindow(undef, 'item', 1)
+ if $self->{panel}->isReadOnly && !$noDisplay;
+ }
+
+ sub selectAll
+ {
+ my $self = shift;
+
+ $self->{itemsView}->selectAll;
+ }
+
+ sub duplicateItem
+ {
+
+ my ($self, $self2) = @_;
+ $self = $self2 if $self2;
+
+ my @added;
+ my $indexes = $self->{itemsView}->getCurrentItems;
+ foreach my $idx(@$indexes)
+ {
+ my $newItem = Storable::dclone(($self->{items}->getItemsListFiltered)->[$idx]);
+ # Duplicate all the managed pictures
+ foreach (@{$self->{model}->{managedImages}})
+ {
+ (my $origPic = $newItem->{$_}) =~ /^(.*)(\.[^\.]*)$/;
+ next if !$origPic;
+ my ($base, $suffix) = ($1, $2);
+ my $newPic;
+ my $count = 0;
+ $count++ while (-e ($newPic = $base.'_'.$count.$suffix));
+ copy($origPic,$newPic);
+ $self->{items}->markToBeAdded($newPic);
+ $newItem->{$_} = $newPic;
+ }
+ push @added, $newItem;
+ }
+
+ foreach my $info(@added)
+ {
+ $self->addItem($info, 1);
+ }
+ }
+
+ sub loadUrl
+ {
+ my ($self, $url, $existing) = @_;
+
+ my $baseUrl;
+ my $plugin;
+
+ foreach (values %{$self->{model}->getAllPlugins})
+ {
+ ($baseUrl = $_->getItemUrl) =~ s/http:\/\/(w{3})?//;
+ $plugin = $_;
+
+ last if ((($baseUrl) && ($url =~ m/$baseUrl/))
+ && (($plugin->testURL($url)) || (!$plugin->needsLanguageTest())));
+ }
+
+ return unless $url =~ m/$baseUrl/;
+ $self->setWaitCursor($self->{lang}->{StatusGetInfo});
+
+ # Create a new item if we're not wanting to update the existing one
+ $self->newItem
+ if (!$existing);
+ $plugin->{bigPics} = $self->{options}->bigPics;
+ my $info = $plugin->loadUrl($url);
+ $self->restoreCursor;
+ return if ! $info->{$self->{model}->{commonFields}->{title}};
+
+ if ($existing)
+ {
+ # We only want to update blank fields during the refresh
+ foreach my $field (keys(%{$info}))
+ {
+ # Loop through fields returned and check if they were previously blank
+ # or an empty array. Only exception is the press rating field,
+ # which we'll always want to update
+ if ((($self->{panel}->$field) && ($field ne 'ratingpress'))
+ && !((ref($self->{panel}->$field)) && ( @{$self->{panel}->$field} == 0)))
+ {
+ # Ignore field
+ $info->{$field} = $self->{ignoreString};
+ }
+ }
+
+ }
+
+ $self->addItem($info, 0);
+ }
+
+ sub refreshItemForPanel
+ {
+ my ($self, $panel, $url) = @_;
+
+ $self->{previousPanel} = $self->{panel};
+ $self->{panel} = $panel;
+
+ # Clear the ## part off the end of stored urls
+ $url =~ s/#.*$//;
+
+ # Fetch information from the stored url
+ $self->loadUrl($url, 1);
+
+ $self->{panel} = $self->{previousPanel} if ($panel);
+ delete $self->{previousPanel};
+ }
+
+ sub searchItemForPanel
+ {
+ my ($self, $panel, $pluginType) = @_;
+
+ if ($panel)
+ {
+ $self->{previousPanel} = $self->{panel};
+ $self->{panel} = $panel;
+ }
+ my $query;
+ my $field;
+ my %queries;
+ foreach (@{$self->{model}->getSearchFields})
+ {
+ $queries{$_} = $self->{panel}->getValue($_);
+ if (!$query)
+ {
+ $query = $queries{$_};
+ $field = $_;
+ }
+ }
+ $self->searchItem($query, $pluginType, 0, $field, \%queries);
+ $self->{panel} = $self->{previousPanel} if ($panel);
+ delete $self->{previousPanel};
+ }
+
+ sub searchItem
+ {
+ my ($self, $query, $pluginType, $currentPlugin, $searchField, $queries) = @_;
+
+ # Search for information on websites thanks to plugins
+
+ # This will contain the plugin that should be used to fetch the information
+ my $plugin;
+ # When information are previewed, they are stored in this map to avoid getting twice
+ # the same information. The key is the index in the list of results.
+ $self->{previewCache} = {};
+
+ # Fetch mode, if not forced take it from prefs
+ $pluginType=$self->{model}->{preferences}->plugin if !$pluginType;
+
+ # Many sites per field
+ if ($pluginType eq 'multiperfield')
+ {
+ my $whenMultiple='Ask';
+ my $info=$self->searchItemInfoWithPluginList($query, $whenMultiple, $currentPlugin, $searchField, $queries);
+ $self->addItem($info, 0);
+ return;
+ }
+ # Many sites
+ elsif ($pluginType eq 'multi')
+ {
+ # Here we get the next plugin in the list if the user set a list
+ my $pluginName = $self->getDialog('MultiSite')->getPlugin($currentPlugin);
+ $plugin = $self->{model}->getPlugin($pluginName);
+ if (!$plugin)
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{lang}->{MultiSiteEmptyError});
+
+ $dialog->set_position('center-on-parent');
+ my $response = $dialog->run;
+ $dialog->destroy;
+ return;
+ }
+ }
+ # Ask (within in a specific list)
+ elsif ($pluginType eq 'multiask')
+ {
+ # Display the list of plugins to use
+ $self->getDialog('PluginsAsk')->setModel($self->{model},
+ $self->{model}->{preferences}->multisite);
+ $self->getDialog('PluginsAsk')->query($query, $searchField, $queries);
+ $self->getDialog('PluginsAsk')->show;
+ $plugin = $self->getDialog('PluginsAsk')->plugin;
+ return if !$plugin;
+ ($query, $searchField) = $self->getDialog('PluginsAsk')->query;
+ }
+ # Ask (All sites)
+ # Also activated if forced by user (e.g. if a search returned no result)
+ elsif ($pluginType eq 'ask' || ! $self->{plugin})
+ {
+ $self->getDialog('Plugins')->query($query, $searchField, $queries);
+ $self->getDialog('Plugins')->show;
+ $plugin = $self->getDialog('Plugins')->plugin;
+ return if !$plugin;
+ ($query, $searchField) = $self->getDialog('Plugins')->query;
+ }
+ # Explicit plugin
+ else
+ {
+ $plugin = $self->{plugin};
+ }
+
+ # Loop through search/select routine for plugin's desired number of passes
+ for (my $pass = 1; $pass <= $plugin->getNumberPasses; $pass++)
+ {
+ # Force values of query and search field if they are incompatible with current plugin
+ my $compatible = 1;
+ $compatible = grep /^$searchField$/, @{$plugin->getSearchFieldsArray}
+ if $searchField;
+ if (!$compatible)
+ {
+ # If it is not, we use the 1st compatible one
+ $searchField = $plugin->getSearchFieldsArray->[0];
+ $query = $queries->{$searchField};
+ }
+
+ # If the search cannot be stopped
+ if (! $self->{options}->searchStop)
+ {
+ # Prepare the plugin with required information
+ $plugin->setProxy($self->{options}->proxy);
+ $plugin->setCookieJar($self->{options}->cookieJar);
+
+ # Title to search
+ $plugin->{title} = $query;
+ $plugin->{pass} = $pass;
+ # Type set to load means a search on the website
+ $plugin->{type} = 'load';
+ $plugin->{urlField} = $self->{model}->{commonFields}->{url};
+ $plugin->{bigPics} = $self->{options}->bigPics;
+ $plugin->{searchField} = $searchField;
+
+ $self->setWaitCursor($self->{lang}->{StatusSearch}.' ('.$plugin->getName.')');
+ # Perform the load
+ $plugin->load;
+ $self->restoreCursor;
+ }
+ else
+ {
+ # Prepare the information for search
+ # Nearly the same as the ones set directly on plugin when search cannot be stopped
+ my $info = {
+ name => $plugin->getName,
+ model => $self->{model}->getName,
+ proxy => $self->{options}->proxy,
+ cookieJar => $self->{options}->cookieJar,
+ query => $query,
+ field => $searchField,
+ type => 'load',
+ urlField => $self->{model}->{commonFields}->{url},
+ bigPics => $self->{options}->bigPics,
+ pass => $pass,
+ nextUrl => $plugin->{nextUrl}
+ };
+ # Send the information to the other process that will perform the actual search
+ store_fd $info, $self->{searchJob}->{command};
+ my $getInfo = 0;
+ # Dialog with progress bar and cancel button
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'info',
+ 'cancel',
+ $self->{lang}->{StatusSearch} . "\n" . $plugin->getName);
+
+ my $progress = new Gtk2::ProgressBar;
+ $dialog->vbox->pack_start($progress,1,1,10);
+ $progress->set_pulse_step(0.05);
+ $progress->show_all;
+ my $pulseTimeout = Glib::Timeout->add(50 , sub {
+ # $getInfo will be set by the watcher that looks for data from the other process
+ return 0 if $getInfo;
+ $progress->pulse;
+ return 1;
+ });
+
+ # If there is already something in the pipe...
+ my $rin = '';
+ vec($rin,fileno($self->{searchJob}->{data}),1) = 1;
+ if (select($rin,undef,undef,0.01))
+ {
+ # ... We just get it to empty the pipe
+ my $trash = fd_retrieve($self->{searchJob}->{data});
+ }
+ # Monitor the pipe from process
+ my $watch = Glib::IO->add_watch(fileno($self->{searchJob}->{data}),
+ 'in',
+ sub {
+ return if !$dialog;
+ # Close the dialog window
+ $dialog->response('cancel');
+ # Set variable to indicate we got some data
+ $getInfo = 1;
+ return 0;
+ });
+
+ $dialog->set_position('center-on-parent');
+ # It will run until we get some information, or the user press cancel
+ $dialog->run if !$getInfo;
+ # Stop everything
+ Glib::Source->remove($watch);
+ Glib::Source->remove($pulseTimeout);
+ $dialog->destroy;
+ my $command = $self->{searchJob}->{command};
+ # Did we get something?
+ if ($getInfo)
+ {
+ # Then we read the data from pipe
+ $plugin = fd_retrieve($self->{searchJob}->{data});
+ # And we inform the process we got it
+ print $command "OK\n";
+ }
+ else
+ {
+ # Tell the process the information is no more required
+ print $command "STOP\n";
+ return;
+ }
+ }
+
+ # Get the number of retrieved items
+ my $itemNumber = $plugin->getItemsNumber();
+ $self->{defaultPictureSuffix} = $plugin->getDefaultPictureSuffix;
+
+ # If there is none, we will use next plugin ('multi' mode) or ask the user
+ # to select another one
+ if ($itemNumber == 0)
+ {
+ my $force = 0;
+ my $idx = 0;
+ if (($pluginType eq 'multi') && (($currentPlugin + 1) < $self->getDialog('MultiSite')->getPluginsNumber))
+ {
+ $idx = $currentPlugin + 1;
+ }
+ else
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'yes-no',
+ $self->{lang}->{NoItemFound});
+
+ $dialog->set_position('center-on-parent');
+ my $response = $dialog->run;
+ $dialog->destroy;
+ return if $response ne 'yes';
+ $pluginType = 'ask';
+ }
+ # Call the same method again with new plugin
+ $self->searchItem($query, $pluginType, $idx, $searchField, $queries);
+ }
+ # Just one item, directly fetch its information
+ elsif ($itemNumber == 1)
+ {
+ if ($pass == $plugin->getNumberPasses)
+ {
+ # Final pass, so grab item info
+ $self->downloadItemInfoFromPlugin($plugin, 0);
+ }
+ else
+ {
+ # Still have more passes to do, find the next url to parse
+ my @items = $plugin->getItems();
+ $plugin->{nextUrl} = $items[0]->{nextUrl};
+ }
+ }
+ else
+ {
+ # Should we display the Next button to perform the search on the next website?
+ my $withNext = 0;
+ $withNext = 1 if ($pluginType eq 'multi') && (($currentPlugin + 1) < $self->getDialog('MultiSite')->getPluginsNumber);
+
+ # Get an array with all the results
+ my @items = $plugin->getItems();
+ # Dialog that will contain them
+ my $resultsDialog = $self->getDialog('Results');
+ $resultsDialog->setModel($self->{model}, $self->{model}->{fieldsInfo});
+ $resultsDialog->setMultipleSelection($pass == $plugin->getNumberPasses);
+ $resultsDialog->setWithNext($withNext);
+ $resultsDialog->setSearchPlugin($plugin);
+ $resultsDialog->setList('', @items);
+ my $next = $resultsDialog->show;
+ # If the user selected one of the results
+ if ($resultsDialog->{validated})
+ {
+ if ($pass == $plugin->getNumberPasses)
+ {
+ # Final pass, so grab item information
+
+ my $indexes = $resultsDialog->getItemsIndexes;
+ # Fetch the information from the website
+ $self->downloadItemInfoFromPlugin($plugin, $indexes->[0]);
+ # If more than one were selected, other items are automatically created
+ # and their information fetched
+ if (scalar(@$indexes) > 1)
+ {
+ shift @$indexes;
+ foreach my $idx(@$indexes)
+ {
+ if ((exists $self->{previousPanel})
+ && ($self->{previousPanel}->isReadOnly))
+ {
+ $self->updateSelectedItemInfoFromGivenPanelAndSelect($self->{panel}, $idx);
+ }
+ if ($pass == $plugin->getNumberPasses)
+ {
+ $self->newItem(undef, 0);
+ }
+ $self->downloadItemInfoFromPlugin($plugin, $idx);
+ }
+ }
+ }
+ else
+ {
+ # More passes to do, so find next url to parse
+ # TODO - make sure we stop users from selecting more than one item
+ # on anything but the last pass. At the moment this will ignore
+ # everything but the first item selected
+ if ($resultsDialog->{validated})
+ {
+ my $indexes = $resultsDialog->getItemsIndexes;
+ $plugin->{nextUrl} = @items[$indexes->[0]]->{nextUrl};
+ }
+ }
+ }
+ # If the user pressed Next button, call the same method again with next plugin
+ elsif ($next)
+ {
+ $self->searchItem($query, $pluginType, $currentPlugin + 1, $searchField, $queries);
+ }
+ }
+ }
+ }
+
+ sub searchItemInfoWithPluginList
+ {
+ my ($self, $query, $whenMultiple, $currentPlugin, $searchField, $queries, $otherSourcesNames,$otherSources) = @_;
+
+ # Search for information on websites thanks to plugins
+ # Get info for each fields in the priority asked by $pluginListOrderPerField
+
+ # Get the list of fields and plugin
+ my $myHelperSourcesPerField=$self->getDialog('MultiSitePerField');
+ $myHelperSourcesPerField->setModel($self->{model});
+ my $otherSourcesMenu;
+ $otherSourcesMenu=map { value=>$_,displayed =>$otherSourcesNames->{$_} }, keys %$otherSourcesNames if ($otherSourcesNames);
+ $myHelperSourcesPerField->setSourceList(1, $otherSourcesMenu);
+
+ $myHelperSourcesPerField->resetCurrentFetchingStatus;
+ my $infoPerPlugin={};
+ PLUGIN: while(1){
+ # This will contain the plugin that should be used to fetch the information
+ my $pluginName=$myHelperSourcesPerField->getNextSourceNeeded;
+ last PLUGIN unless ($pluginName);
+ if(grep /$pluginName/, keys %$otherSources)
+ {
+ $infoPerPlugin->{$pluginName}=$otherSources->{$pluginName};
+ }
+ else
+ {
+ my $plugin=$myHelperSourcesPerField->getPlugin($pluginName);
+ # Now we have the plugin to use
+ $infoPerPlugin->{$pluginName} = $self->searchOneItemInfoWithPlugin($query, $whenMultiple, $plugin, $searchField, $queries);
+ }
+ # TODO update the query to avoid re asking if multiple results for next plugin i.e. add info from fetched data to the query
+
+ # Update fields fetched with this plugin
+ $myHelperSourcesPerField->doneWithSourceName($pluginName,$infoPerPlugin->{$pluginName});
+ }
+ my $info=$myHelperSourcesPerField->joinInfo($infoPerPlugin);
+ # TODO manage multiple url, for instance we throw them
+ return $info;
+ }
+
+ sub searchOneItemInfoWithPlugin
+ {
+ my ($self, $query, $whenMultiple, $plugin, $searchField, $queries) = @_;
+ # Search for information on websites thanks to plugins
+ # Return $info
+
+ # When information are previewed, they are stored in this map to avoid getting twice
+ # the same information. The key is the index in the list of results.
+ $self->{previewCache} = {};
+ my $info={};
+ # Loop through search/select routine for plugin's desired number of passes
+ for (my $pass = 1; $pass <= $plugin->getNumberPasses; $pass++)
+ {
+ # Force values of query and search field if they are incompatible with current plugin
+ my $compatible = grep /^$searchField$/, @{$plugin->getSearchFieldsArray};
+ if (!$compatible)
+ {
+ # If it is not, we use the 1st compatible one
+ $searchField = $plugin->getSearchFieldsArray->[0];
+ $query = $queries->{$searchField};
+ }
+
+ # If the search cannot be stopped
+ if (! $self->{options}->searchStop)
+ {
+ # Prepare the plugin with required information
+ $plugin->setProxy($self->{options}->proxy);
+ $plugin->setCookieJar($self->{options}->cookieJar);
+
+ # Title to search
+ $plugin->{title} = $query;
+ $plugin->{pass} = $pass;
+ # Type set to load means a search on the website
+ $plugin->{type} = 'load';
+ $plugin->{urlField} = $self->{model}->{commonFields}->{url};
+ $plugin->{bigPics} = $self->{options}->bigPics;
+ $plugin->{searchField} = $searchField;
+
+ $self->setWaitCursor($self->{lang}->{StatusSearch}.' ('.$plugin->getName.')');
+ # Perform the load
+ $plugin->load;
+ $self->restoreCursor;
+ }
+ else
+ {
+ # Prepare the information for search
+ # Nearly the same as the ones set directly on plugin when search cannot be stopped
+ my $info = {
+ name => $plugin->getName,
+ model => $self->{model}->getName,
+ proxy => $self->{options}->proxy,
+ cookieJar => $self->{options}->cookieJar,
+ query => $query,
+ field => $searchField,
+ type => 'load',
+ urlField => $self->{model}->{commonFields}->{url},
+ bigPics => $self->{options}->bigPics,
+ pass => $pass,
+ nextUrl => $plugin->{nextUrl}
+ };
+ # Send the information to the other process that will perform the actual search
+ store_fd $info, $self->{searchJob}->{command};
+ my $getInfo = 0;
+ # Dialog with progress bar and cancel button
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'info',
+ 'cancel',
+ $self->{lang}->{StatusSearch} . "\n" . $plugin->getName);
+
+ my $progress = new Gtk2::ProgressBar;
+ $dialog->vbox->pack_start($progress,1,1,10);
+ $progress->set_pulse_step(0.05);
+ $progress->show_all;
+ my $pulseTimeout = Glib::Timeout->add(50 , sub {
+ # $getInfo will be set by the watcher that looks for data from the other process
+ return 0 if $getInfo;
+ $progress->pulse;
+ return 1;
+ });
+
+ # If there is already something in the pipe...
+ my $rin = '';
+ vec($rin,fileno($self->{searchJob}->{data}),1) = 1;
+ if (select($rin,undef,undef,0.01))
+ {
+ # ... We just get it to empty the pipe
+ my $trash = fd_retrieve($self->{searchJob}->{data});
+ }
+ # Monitor the pipe from process
+ my $watch = Glib::IO->add_watch(fileno($self->{searchJob}->{data}),
+ 'in',
+ sub {
+ return if !$dialog;
+ # Close the dialog window
+ $dialog->response('cancel');
+ # Set variable to indicate we got some data
+ $getInfo = 1;
+ return 0;
+ });
+
+ $dialog->set_position('center-on-parent');
+ # It will run until we get some information, or the user press cancel
+ $dialog->run if !$getInfo;
+ # Stop everything
+ Glib::Source->remove($watch);
+ Glib::Source->remove($pulseTimeout);
+ $dialog->destroy;
+ my $command = $self->{searchJob}->{command};
+ # Did we get something?
+ if ($getInfo)
+ {
+ # Then we read the data from pipe
+ $plugin = fd_retrieve($self->{searchJob}->{data});
+ # And we inform the process we got it
+ print $command "OK\n";
+ }
+ else
+ {
+ # Tell the process the information is no more required
+ print $command "STOP\n";
+ return;
+ }
+ }
+
+ # Get the number of retrieved items
+ my $itemNumber = $plugin->getItemsNumber();
+ $self->{defaultPictureSuffix} = $plugin->getDefaultPictureSuffix;
+ # If there is none, we will use next plugin ('multi' mode) or ask the user
+ # to select another one
+ if ($itemNumber == 0)
+ {
+
+ }
+ # Just one item, directly fetch its information
+ elsif ($itemNumber == 1 || $whenMultiple eq 'TakeFirst')
+ {
+ if ($pass == $plugin->getNumberPasses)
+ {
+ # Final pass, so grab item info
+ $info=$self->fetchItemInfoFromPlugin($plugin, 0);
+ }
+ else
+ {
+ # Still have more passes to do, find the next url to parse
+ my @items = $plugin->getItems();
+ $plugin->{nextUrl} = $items[0]->{nextUrl};
+ }
+ }
+ else
+ {
+ if($whenMultiple eq 'Ask')
+ {
+ # Get an array with all the results
+ my @items = $plugin->getItems();
+ # Dialog that will contain them
+ my $resultsDialog = $self->getDialog('Results');
+ $resultsDialog->setModel($self->{model}, $self->{model}->{fieldsInfo});
+ $resultsDialog->setMultipleSelection(0);
+ $resultsDialog->setWithNext(0);
+ $resultsDialog->setSearchPlugin($plugin);
+ $resultsDialog->setList('', @items);
+ my $next = $resultsDialog->show;
+ # If the user selected one of the results
+ if ($resultsDialog->{validated})
+ {
+ if ($pass == $plugin->getNumberPasses)
+ {
+ # Final pass, so grab item information
+ my $indexes = $resultsDialog->getItemsIndexes;
+ # Fetch the information from the website
+ $info=$self->fetchItemInfoFromPlugin($plugin, $indexes->[0]);
+ }
+ else
+ {
+ # More passes to do, so find next url to parse
+ if ($resultsDialog->{validated})
+ {
+ my $indexes = $resultsDialog->getItemsIndexes;
+ $plugin->{nextUrl} = @items[$indexes->[0]]->{nextUrl};
+ }
+ }
+ }
+ }
+ }
+ }
+ return $info;
+ }
+
+ sub fetchItemInfoFromPlugin
+ {
+ my ($self, $plugin, $idx) = @_;
+
+ my $info;
+
+ # Gets from cache if we already previewed it
+ if ($self->{previewCache}->{$idx})
+ {
+ $info = $self->{previewCache}->{$idx};
+ }
+ else
+ {
+ # Tell the plugin what we want
+ $plugin->{wantedIdx} = $idx;
+ $plugin->{type} = 'info';
+
+ if (! $self->{options}->searchStop)
+ {
+ $self->setWaitCursor($self->{lang}->{StatusGetInfo});
+ # Fetch the information
+ $info = $plugin->getItemInfo;
+ $self->restoreCursor;
+ }
+ else
+ {
+ # Send directly the plugin to the other process
+ store_fd $plugin, $self->{searchJob}->{command};
+ # Indicates if something was returned by plugin
+ my $getInfo = 0;
+ my $dialogGet = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'info',
+ 'cancel',
+ $self->{lang}->{StatusGetInfo});
+
+ my $progress = new Gtk2::ProgressBar;
+ $dialogGet->vbox->pack_start($progress,1,1,10);
+ $progress->set_pulse_step(0.05);
+ $progress->show_all;
+ my $pulseTimeout = Glib::Timeout->add(50 , sub {
+ # $getInfo will be set by the watcher that looks for data from the other process
+ return 0 if $getInfo;
+ $progress->pulse;
+ return 1;
+ });
+
+ # Monitor the pipe from process
+ my $watch = Glib::IO->add_watch(fileno($self->{searchJob}->{data}),
+ 'in',
+ sub {
+ return if !$dialogGet;
+ $dialogGet->response('cancel');
+ # Set the flag when we got something
+ $getInfo = 1;
+ return 0;
+ });
+
+ $dialogGet->set_position('center-on-parent');
+ # It will run until we get some information, or the user press cancel
+ $dialogGet->run if !$getInfo;
+ # Stop everything
+ Glib::Source->remove($watch);
+ Glib::Source->remove($pulseTimeout);
+ $dialogGet->destroy;
+ my $command = $self->{searchJob}->{command};
+ # Did we get something?
+ if ($getInfo)
+ {
+ # Then we read the data from pipe
+ $info = fd_retrieve($self->{searchJob}->{data});
+ # And we inform the process we got it
+ print $command "OK\n";
+ }
+ else
+ {
+ # Tell the process the information is no more required
+ print $command "STOP\n";
+ }
+ }
+ }
+ return $info;
+ }
+
+ sub downloadItemInfoFromPlugin
+ {
+ my ($self, $plugin, $idx, $withPreview) = @_;
+
+ my $info;
+
+ # Gets from cache if we already previewed it
+ if ($self->{previewCache}->{$idx})
+ {
+ $info = $self->{previewCache}->{$idx};
+ }
+ else
+ {
+ # Tell the plugin what we want
+ $plugin->{wantedIdx} = $idx;
+ $plugin->{type} = 'info';
+
+ if (! $self->{options}->searchStop)
+ {
+ $self->setWaitCursor($self->{lang}->{StatusGetInfo});
+ # Fetch the information
+ $info = $plugin->getItemInfo;
+ $self->restoreCursor;
+ }
+ else
+ {
+ # Send directly the plugin to the other process
+ store_fd $plugin, $self->{searchJob}->{command};
+ # Indicates if something was returned by plugin
+ my $getInfo = 0;
+ my $dialogGet = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'info',
+ 'cancel',
+ $self->{lang}->{StatusGetInfo});
+
+ my $progress = new Gtk2::ProgressBar;
+ $dialogGet->vbox->pack_start($progress,1,1,10);
+ $progress->set_pulse_step(0.05);
+ $progress->show_all;
+ my $pulseTimeout = Glib::Timeout->add(50 , sub {
+ # $getInfo will be set by the watcher that looks for data from the other process
+ return 0 if $getInfo;
+ $progress->pulse;
+ return 1;
+ });
+
+ # Monitor the pipe from process
+ my $watch = Glib::IO->add_watch(fileno($self->{searchJob}->{data}),
+ 'in',
+ sub {
+ return if !$dialogGet;
+ $dialogGet->response('cancel');
+ # Set the flag when we got something
+ $getInfo = 1;
+ return 0;
+ });
+
+ $dialogGet->set_position('center-on-parent');
+ # It will run until we get some information, or the user press cancel
+ $dialogGet->run if !$getInfo;
+ # Stop everything
+ Glib::Source->remove($watch);
+ Glib::Source->remove($pulseTimeout);
+ $dialogGet->destroy;
+ my $command = $self->{searchJob}->{command};
+ # Did we get something?
+ if ($getInfo)
+ {
+ # Then we read the data from pipe
+ $info = fd_retrieve($self->{searchJob}->{data});
+ # And we inform the process we got it
+ print $command "OK\n";
+ }
+ else
+ {
+ # Tell the process the information is no more required
+ print $command "STOP\n";
+ return;
+ }
+ }
+ }
+
+ # If we are doing a preview instead of really fetching the data
+ if ($withPreview)
+ {
+ # Stores in cache
+ $self->{previewCache}->{$idx} = $info;
+ $self->getDialog('ImportFields')->info($info);
+ $self->getDialog('ImportFields')->setReadOnly(1);
+ $self->getDialog('ImportFields')->show;
+ }
+ else
+ {
+ # If user want to select the fields to fetch
+ if ($self->{options}->askImport)
+ {
+ $self->getDialog('ImportFields')->info($info);
+ $self->getDialog('ImportFields')->setReadOnly(0);
+ return if ! $self->getDialog('ImportFields')->show;
+ $info = $self->getDialog('ImportFields')->info;
+ }
+ # Set the information (2nd parameter set to 0 means no item creation).
+ $self->addItem($info, 0);
+ }
+ }
+
+ sub checkDefaultImage
+ {
+ my $self = shift;
+ my $previous = $self->{defaultImage};
+ my $specific = $self->{items}->getInformation->{defaultImage};
+ if ($specific && (-f $specific))
+ {
+ $self->{defaultImage} = $specific;
+ }
+ elsif (-f $self->{model}->{defaultImage})
+ {
+ $self->{defaultImage} = $self->{model}->{defaultImage};
+ }
+ else
+ {
+ if (-f $self->{logosDir}.'no.png')
+ {
+ $self->{defaultImage} = $self->{logosDir}.'no.png';
+ }
+ else
+ {
+ $self->{defaultImage} = $ENV{GCS_SHARE_DIR}.'/no.jpg';
+ }
+ }
+ $self->setItemsList
+ if !$self->{initializing} && $self->{itemsView} && ($previous ne $self->{defaultImage});
+ }
+
+ sub getImagesDir
+ {
+ my $self = shift;
+
+ my $imagesDir = '';
+ $imagesDir = $self->{items}->getInformation->{images}
+ if $self->{items};
+ my $i = 0;
+ #We use the global one if none exists in the collection
+ $imagesDir ||= $self->{options}->images;
+ if ($self->{options}->file)
+ {
+ $imagesDir =~ s/^(%WORKING_DIR%|\.)/dirname($self->{options}->file)/e;
+ $imagesDir =~ s/%FILE_BASE%/basename($self->{options}->file, '.gcs')/e;
+ }
+ else
+ {
+ # If value contains one of the variables and we don't have a directory name
+ # we store everything in the temporary directory
+ $imagesDir = $self->{tmpImageDir}
+ if ($imagesDir =~ m/^(%WORKING_DIR%|\.)/)
+ || ($imagesDir =~ m/%FILE_BASE%/);
+ }
+
+ return GCUtils::pathToUnix($imagesDir);
+ }
+
+ sub getUniqueImageFileName
+ {
+ my ($self, $suffix, $itemTitle, $imagesDir) = @_;
+
+ # If none specified, we use the default one
+ $imagesDir ||= $self->getImagesDir;
+ $imagesDir =~ s+([^/])$+$1/+;
+ my $imagePrefix;
+ if ($self->{options}->useTitleForPics)
+ {
+ $imagePrefix = GCUtils::getSafeFileName($itemTitle);
+ $imagePrefix .= '_';
+ }
+ else
+ {
+ $imagePrefix = $self->{imagePrefix};
+ }
+
+ if ( ! -e $imagesDir)
+ {
+ mkdir($imagesDir);
+ }
+
+ my $filePrefix = $imagesDir.$imagePrefix;
+ my @tmp_filenames;
+ @tmp_filenames = glob $filePrefix.'*.*';
+ my $sysPrefix = $filePrefix;
+ $sysPrefix =~ s/\\/\\\\/g if ($^O =~ /win32/i);
+ my @numbers = sort {$b <=> $a} map {
+ /$sysPrefix([0-9]*)\./ && $1;
+ } @tmp_filenames;
+ my $mostRecent = $numbers[0] || 0;
+
+ my $picture = $filePrefix.$mostRecent.$suffix;
+
+ while (-e $picture)
+ {
+ $mostRecent++;
+ $picture = $filePrefix.$mostRecent.$suffix;
+ }
+ return $picture;
+ }
+
+ sub isManagedPicture
+ {
+ my ($self, $pic) = @_;
+ my $file = GCUtils::getDisplayedImage($pic, '', $self->{options}->file);
+ my $imagePrefix = $self->{imagePrefix};
+ my $imageDir = $self->getImagesDir;
+ if (($file =~ /(\/|\\)$imagePrefix[0-9]*\./)
+ && ($file =~ m|^\Q$imageDir\E|))
+ {
+ return $file;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+ sub checkPictureToBeRemoved
+ {
+ my ($self, $pic) = @_;
+ if (my $file = $self->isManagedPicture($pic))
+ {
+ $self->{items}->markToBeRemoved($file);
+ }
+ }
+
+# sub changeInfo
+# {
+# my ($self, $info) = @_;
+#
+# my @genres = split /,/, $info->{type};
+# my $newGenres = '';
+#
+# foreach (@genres)
+# {
+# $newGenres .= $self->getDialog('GenresGroups')->{convertor}->convert($_).',';
+# }
+# $newGenres =~ s/.$//;
+#
+# $info->{type} = $newGenres;
+# }
+
+ sub addItem
+ {
+ my ($self, $info, $newItem, $keepId, $defaultValues) = @_;
+
+ #$self->changeInfo($info);
+ my $ignore = $self->{ignoreString};
+
+ if ($newItem)
+ {
+ $self->{items}->updateSelectedItemInfoFromPanel;
+ $self->markAsUpdated;
+ my $id = $self->{items}->addItem($info, $keepId);
+ my @picFields = ();
+ for my $field (@{$self->{model}->{fieldsNames}})
+ {
+ if ($self->{model}->{fieldsInfo}->{$field}->{type} eq 'image')
+ {
+ push @picFields, $field;
+ next;
+ }
+ $self->{panel}->$field($info->{$field});
+ }
+ $self->{panel}->selectTitle;
+ my $title = $info->{$self->{model}->{commonFields}->{title}};
+ my $imagePrefix = $self->{imagePrefix};
+ foreach my $pic(@picFields)
+ {
+ if ($info->{$pic} && ($info->{$pic} ne $ignore))
+ {
+ $self->checkPictureToBeRemoved($self->{panel}->$pic);
+ ($info->{$pic}, my $picture) = $self->downloadPicture($info->{$pic}, $title)
+ if !$defaultValues;
+
+ # Only set the picture if one was returned. Otherwise the download was rejected, so stick with
+ # the existing picture
+ if ($info->{$pic})
+ {
+ $self->{panel}->$pic($info->{$pic})
+ }
+ else
+ {
+ $info->{$pic} = $ignore;
+ }
+ }
+ }
+ $self->{items}->updateSelectedItemInfoFromPanel(1);
+ $self->{panel}->show if $self->{itemsView}->getNbItems;
+ $self->setNbItems;
+ my $idField = $self->{model}->{commonFields}->{id};
+ $self->{panel}->$idField($id);
+ }
+ else
+ {
+ my $previous = $self->{panel}->getAsHash;
+ my @picFields = ();
+ foreach my $field(@{$self->{model}->{fieldsNames}})
+ {
+ if ($self->{model}->{fieldsInfo}->{$field}->{type} eq 'image')
+ {
+ push @picFields, $field;
+ next;
+ }
+ #next if ($field eq $cover);
+ if (($self->{model}->{fieldsInfo}->{$field}->{imported} ne 'true')
+ || ($info->{$field} eq $ignore)
+ || ($info->{$field} eq ''))
+ {
+ $info->{$field} = $previous->{$field};
+ }
+ else
+ {
+ $self->{panel}->$field($info->{$field});
+ }
+ }
+ my $title = $info->{$self->{model}->{commonFields}->{title}};
+ my $imagePrefix = $self->{imagePrefix};
+ foreach my $pic(@picFields)
+ {
+ if ($info->{$pic} && ($info->{$pic} ne $ignore))
+ {
+ $self->checkPictureToBeRemoved($self->{panel}->$pic);
+ ($info->{$pic}, my $picture) = $self->downloadPicture($info->{$pic}, $title);
+
+ # Only set the picture if one was returned. Otherwise the download was rejected, so stick with
+ # the existing picture
+ if ($info->{$pic})
+ {
+ $self->{panel}->$pic($info->{$pic})
+ }
+ else
+ {
+ $info->{$pic} = $ignore;
+ }
+ }
+ $info->{$pic} = $previous->{$pic} if $info->{$pic} eq $ignore;
+ }
+
+ $self->{items}->updateSelectedItemInfoFromPanel(1);
+ $self->{itemsView}->showCurrent;
+ }
+ $self->{panel}->dataChanged;
+ }
+
+ sub downloadPicture
+ {
+ my ($self, $pictureUrl, $title) = @_;
+
+ $title ||= $self->{panel}->getValue($self->{model}->{commonFields}->{title});
+
+ my ($name,$path,$suffix) = fileparse($pictureUrl, "\.gif", "\.jpg", "\.jpeg", "\.png");
+ $suffix ||= $self->{defaultPictureSuffix};
+ my $picture = $self->getUniqueImageFileName($suffix, $title);
+
+ if ($pictureUrl =~ m|^http://|)
+ {
+ $self->setWaitCursor($self->{lang}->{StatusGetImage});
+ GCUtils::downloadFile($pictureUrl, $picture, $self);
+ $self->restoreCursor;
+
+ # Check for file size of returned file. If it's less than 1000, we'll reject it, since it's
+ # most likely a corrupt file
+ my $filesize = -s $picture;
+ if ($filesize < 1000)
+ {
+ unlink $picture;
+ $picture = "";
+ }
+ }
+ else
+ {
+ copy $pictureUrl, $picture;
+ }
+ $self->{items}->markToBeAdded($picture)
+ if ($picture);
+ return ($self->transformPicturePath($picture), $picture);
+ }
+
+ sub transformPicturePath
+ {
+ my ($self, $path, $file) = @_;
+ return '' if !$path;
+ $file ||= $self->{options}->file;
+ $path = GCUtils::getDisplayedImage($path, $path, $file);
+ my $dir = undef;
+ $dir = dirname($file) if $file;
+ return GCUtils::pathToUnix(File::Spec->rel2abs($path,$dir), 1)
+ if !$self->{options}->useRelativePaths;
+ return GCUtils::pathToUnix(File::Spec->abs2rel($path,$dir));
+ }
+
+ sub addBookmark
+ {
+ my $self = shift;
+
+ my $dialog = $self->getDialog('BookmarkAdder');
+ $dialog->setBookmark($self->{options}->file, $self->{items}->getInformation->{name});
+ $dialog->setBookmarksFolders($self->{bookmarksLoader}->{bookmarks});
+ if ($dialog->show)
+ {
+ $self->{bookmarksLoader}->save($dialog->getBookmarks);
+ }
+ }
+
+ sub editBookmark
+ {
+ my $self = shift;
+
+ #my $dialog = $self->getDialog('BookmarksEdit');
+ my $dialog = new GCBookmarksEditDialog($self);
+
+ $dialog->setBookmarksFolders($self->{bookmarksLoader}->{bookmarks});
+ if ($dialog->show)
+ {
+ $self->{bookmarksLoader}->save($dialog->getBookmarks);
+ }
+ }
+
+ sub addFileHistory
+ {
+ my ($self, $filename) = @_;
+
+ $filename =~ s|/|\\|g if $^O =~ /win32/i;
+ $self->{options}->historysize(5) if !$self->{options}->exists('historysize');
+ my $maxSize = $self->{options}->historysize;
+ my @historyArray = split(/\|/, $self->{options}->history);
+ my $idx = 0;
+ # Remove previous occurence in history if any
+ foreach my $file(@historyArray)
+ {
+ if ($filename eq $file)
+ {
+ splice @historyArray, $idx, 1;
+ last;
+ }
+ $idx++;
+ }
+ # Prepend filename
+ splice @historyArray, 0, 0, $filename;
+ # Shrink array if too big
+ if (scalar @historyArray > $maxSize)
+ {
+ $#historyArray = $maxSize - 1;
+ }
+ $self->{options}->history(join '|', @historyArray);
+ $self->{menubar}->{menuHistoryItem}->remove_submenu;
+ $self->{menubar}->{menuHistory} = new Gtk2::Menu;
+ $self->{menubar}->addHistoryMenu(\@historyArray);
+ }
+
+ sub openFile
+ {
+ my ($self, $filename) = @_;
+ return if !$self->checkAndSave;
+ my ($success, $error) = (1, undef);
+ $self->initProgress($self->{lang}->{StatusLoad});
+ $self->{openingFile} = 1;
+ my $previousFile = $self->{options}->file;
+ $self->setFile($filename);
+ $self->savePreferences;
+ my $previousModel;
+ $previousModel = $self->{model}->getName
+ if $self->{model};
+ my @collectionVersion = split(/\./, $self->{items}->getVersion($filename));
+ if (@collectionVersion)
+ {
+ my @softVersion = split (/\./, $self->{version});
+
+ # We only use 2 major numbers. Last one should not impact data
+ if (($collectionVersion[0] > $softVersion[0])
+ || (($collectionVersion[0] == $softVersion[0])
+ && ($collectionVersion[1] > $softVersion[1])))
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'warning',
+ 'yes-no',
+ $self->{lang}->{OpenVersionWarning}
+ ."\n\n"
+ .$self->{lang}->{OpenVersionQuestion});
+ $dialog->set_default_response('cancel');
+ $dialog->set_position('center-on-parent');
+ my $response = $dialog->run;
+ $success = 0 if $response eq 'no';
+ $dialog->destroy;
+ }
+ }
+
+ if ($success)
+ {
+ ($success, $error) = $self->{items}->load($filename, $self, 1);
+ if ($success)
+ {
+ $self->checkDefaultImage;
+ $self->{filterSearch}->clear if $previousModel ne $self->{model}->getName;
+ $self->refreshFilters;
+ $self->viewAllItems;
+ $self->addFileHistory($filename);
+ $self->{options}->save;
+ $self->selectFirst;
+ $self->refreshTitle;
+ $self->{menubar}->setLock($self->{items}->getLock);
+ $self->endProgress;
+ }
+ else
+ {
+ my $dialog = new GCCriticalErrorDialog(
+ $self,
+ GCUtils::formatOpenSaveError(
+ $self->{lang},
+ $filename,
+ $error
+ )
+ );
+ $dialog->show;
+ }
+ }
+
+ if (!$success)
+ {
+ if ($previousFile)
+ {
+ $self->openFile($previousFile);
+ }
+ else
+ {
+ $self->endProgress;
+ }
+ }
+ $self->{openingFile} = 0;
+ # Just to be sure
+ $self->{saveIsNeeded} = 0;
+ }
+
+ sub openList
+ {
+ my $self = shift;
+ my $fileDialog = new GCFileChooserDialog($self->{lang}->{OpenList}, $self, 'open', 1);
+ $fileDialog->set_pattern_filter([$self->{lang}->{FileGCstarFiles}, '*.gcs']);
+
+ $fileDialog->set_filename($self->{options}->file);
+ my $response = $fileDialog->run;
+ if ($response eq 'ok')
+ {
+ my $fileName = $fileDialog->get_filename;
+ $fileDialog->destroy;
+ $self->openFile($fileName);
+ }
+ else
+ {
+ $fileDialog->destroy;
+ }
+ }
+
+ sub newList
+ {
+ my ($self, $modelName, $modelAlreadySet, $saveAlreadyDone) = @_;
+ return if !$saveAlreadyDone && !$self->checkAndSave;
+
+ if (!$modelAlreadySet)
+ {
+ if ($modelName)
+ {
+ $self->setCurrentModel(
+ $self->{modelsFactory}->getModel($modelName)
+ );
+ }
+ else
+ {
+ if ($self->getDialog('Models')->show)
+ {
+ if ($self->getDialog('Models')->isImporting)
+ {
+ $self->import($self->getDialog('Models')->getImporter);
+ return;
+ }
+ else
+ {
+ my $model = $self->getDialog('Models')->getModel;
+ if ($model->isEmpty)
+ {
+ $self->{model} = $model;
+ $self->editModel;
+ }
+ else
+ {
+ $self->setCurrentModel($model);
+ }
+ }
+ }
+ else
+ {
+ return if !$self->{initializing};
+ $self->setCurrentModel('GCfilms');
+ }
+ }
+ }
+
+ $self->{items}->clearList;
+ $self->reloadDone(1);
+ $self->setFile('');
+ $self->{menubar}->setAddBookmarkActive(0);
+ $self->refreshTitle;
+ }
+
+ sub saveAs
+ {
+ my $self = shift;
+ my $fileDialog = new GCFileChooserDialog($self->{lang}->{SaveList}, $self, 'save', 1, 1);
+ $fileDialog->set_pattern_filter([$self->{lang}->{FileGCstarFiles}, '*.gcs']);
+ $fileDialog->set_filename($self->{options}->file);
+ my $response;
+ while (1)
+ {
+ $response = $fileDialog->run;
+ if ($response eq 'ok')
+ {
+ my $filename = $fileDialog->get_filename;
+ my $previousFile = $self->{options}->file;
+ my $prevImages = $self->getImagesDir;
+ $self->setFile($filename);
+ # We re-generate it because it could have changed with new file name
+ my $newImages = $self->getImagesDir;
+ if (($prevImages ne $newImages) || ($previousFile && ($previousFile ne $filename)))
+ {
+ # The last parameter is for copy. When saving a new file, we move.
+ $self->{items}->setNewImagesDirectory($newImages, $prevImages,
+ $previousFile ? 1 : 0);
+ $self->{items}->setPreviousFile($previousFile)
+ if ($previousFile ne $filename);
+ }
+ if ($self->saveList)
+ {
+ $self->addFileHistory($filename);
+ $self->{options}->save;
+ $self->refreshTitle;
+ last;
+ }
+ else
+ {
+ $self->setFile($previousFile);
+ }
+ }
+ last if ($response ne 'ok')
+ }
+ $fileDialog->destroy;
+
+ # Check if the user has cancelled the dialog without giving a filename, if so
+ # return false to the save as request
+ if ($response eq 'ok')
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+ sub checkAndSave
+ {
+ my $self = shift;
+ # Return value 1 means everything is OK.
+ # 0 means the user clicked cancel for save confirmation and then
+ # the process should be stopped.
+ if (!$self->{items}->getNbItems)
+ {
+ $self->removeUpdatedMark;
+ return 1;
+ }
+ $self->{items}->updateSelectedItemInfoFromPanel;
+ return 1 if !$self->{saveIsNeeded};
+ if (($self->{options}->autosave) && ($self->{options}->file))
+ {
+ $self->saveList;
+ return 1;
+ }
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'warning',
+ 'none',
+ $self->{lang}->{SaveUnsavedChanges});
+ my $noButton = Gtk2::Button->new($self->{lang}->{SaveDontSave});
+ $dialog->add_action_widget($noButton, 'no');
+ my $cancelButton = Gtk2::Button->new_from_stock('gtk-cancel');
+ $dialog->add_action_widget($cancelButton, 'cancel');
+ my $saveButton = Gtk2::Button->new_from_stock('gtk-save');
+ $saveButton->can_default(1);
+ $dialog->add_action_widget($saveButton, 'yes');
+ $noButton->show_all;
+ $cancelButton->show_all;
+ $saveButton->show_all;
+ $dialog->set_default_response('yes');
+ $dialog->set_position('center-on-parent');
+ my $response = $dialog->run();
+ $dialog->destroy;
+
+ if ($response eq 'yes')
+ {
+ my $saveResponse = $self->saveList;
+ # If save request has returned false, we need to cancel the current operation
+ return 0 if (!$saveResponse);
+ }
+
+
+ return 0 if $response eq 'cancel';
+ $self->removeUpdatedMark;
+
+ return 1;
+ }
+
+ sub saveList
+ {
+ my ($self, $self2) = @_;
+ $self = $self2 if $self2;
+ my $response = 'yes';
+ #$self->{itemsView}->{filter}->refilter;
+ if ($self->{options}->file)
+ {
+ my ($success, $error) = $self->{items}->save($self);
+ if ($success)
+ {
+ return 1;
+ }
+ else
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ GCUtils::formatOpenSaveError(
+ $self->{lang},
+ $self->{options}->file,
+ $error
+ ));
+ $dialog->set_position('center-on-parent');
+ $dialog->run();
+ $dialog->destroy ;
+ return 0;
+ }
+# $self->{items}->save($self);
+ }
+ else
+ {
+ # Run save as dialog
+ my $result = $self->saveAs;
+ # If result of dialog is false, user has cancelled without choosing a filename, so we return false
+ # to the save request to cancel operation
+ if ($result)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ }
+
+ sub selectFirst
+ {
+ my $self = shift;
+
+ $self->{items}->display($self->{items}->select(-1));
+ }
+
+ sub removeSearch
+ {
+ my ($self, $noRefresh) = @_;
+ $self->setFilter('', '', $noRefresh);
+ # Clear search mode
+ $self->{filterSearch}->setMode;
+ $self->{toolbar}->removeSearch
+ if $self->{toolbar};
+ }
+
+ sub search
+ {
+ my ($self, $self2, $value) = @_;
+ $self = $self2 if ($self2 ne 'all') && ($self2 ne 'displayed');
+ $self->{items}->updateSelectedItemInfoFromPanel;
+ $self->{items}->displayCurrent;
+ my $type = 'all';
+ $type = $value if ($self != $self2);
+
+ $self->getDialog('Search')->show;
+
+ my $info = $self->getDialog('Search')->search;
+ return if ! $info;
+
+ $self->{menubar}->selectAll if $type eq 'all';
+ $self->setSearch($info);
+ }
+
+ sub advancedSearch
+ {
+ my $self = shift;
+ my $dialog = $self->getDialog('AdvancedSearch');
+ $dialog->initSearch($self->{filterSearch}->getCurrentSearch);
+ $dialog->show;
+ my $info = $dialog->search;
+ return if ! $info;
+ $self->setSearchWithTypes(info => $info,
+ mode => $dialog->getMode,
+ case => $dialog->getCase,
+ ignoreDiacritics => $dialog->getIgnoreDiacritics);
+ }
+
+ sub addUserFilter
+ {
+ my ($self, $filter) = @_;
+ $self->{model}->addUserFilter($filter);
+ $self->{menubar}->createUserFilters($self->{model});
+ $self->{toolbar}->createUserFilters($self->{model});
+ }
+
+ sub saveCurrentSearch
+ {
+ my $self = shift;
+ my $dialog = $self->getDialog('AdvancedSearch');
+ $dialog->initSearch($self->{filterSearch}->getCurrentSearch);
+ $dialog->saveSearch;
+ }
+
+ sub editSavedSearches
+ {
+ my $self = shift;
+ my $dialog = $self->getDialog('UserFilters');
+ $self->{model}->saveUserFilters;
+ $dialog->setModel($self->{model});
+ if ($dialog->show)
+ {
+ $self->{model}->setUserFilters($dialog->getUserFilters);
+ $self->{model}->deleteUserFilters($dialog->getDeletedFilters);
+ $self->{menubar}->createUserFilters($self->{model});
+ $self->{toolbar}->createUserFilters($self->{model});
+ }
+ }
+
+ sub showBorrowed
+ {
+ my $self = shift;
+ $self->{items}->updateSelectedItemInfoFromPanel;
+ $self->getDialog('Borrowed')->setList($self->{items}, $self->{model});
+ $self->getDialog('Borrowed')->show;
+ }
+
+ sub export
+ {
+ my ($self, $exporter) = @_;
+ $self->getDialog('Export')->setModule($exporter);
+ $self->getDialog('Export')->show;
+ }
+
+ sub import
+ {
+ my ($self, $importer) = @_;
+ $self->getDialog('Import')->setModule($importer);
+ $self->getDialog('Import')->show;
+ }
+
+ sub importWithDetect
+ {
+ my ($self, $file, $realPath) = @_;
+
+ if (!$realPath)
+ {
+ $file =~ s/^file:\/\/(.*)\W*$/$1/;
+ $file =~ s/.$//ms;
+ }
+
+ foreach my $importer(@GCImport::importersArray)
+ {
+ my $current = $importer->getSuffix;
+ next if !$current;
+ #if ($current eq $suffix)
+ if ($file =~ /$current$/)
+ {
+ $self->setWaitCursor($self->{lang}->{StatusGetInfo});
+ my %options;
+ $options{parent} = $self;
+ $options{newList} = 0;
+ $options{file} = $file;
+ $options{lang} = $self->{lang};
+ $importer->process(\%options);
+ #$self->restoreCursor;
+ return 1;
+ }
+ }
+ return 0;
+ }
+
+ sub optionsError
+ {
+ my ($self, $type, $errmsg) = @_;
+
+ my $msg;
+ if ($type eq 'open')
+ {
+ $msg = $self->{lang}->{OptionsOpenError};
+ }
+ elsif ($type eq 'create')
+ {
+ $msg = $self->{lang}->{OptionsCreateError};
+ }
+ else
+ {
+ $msg = $self->{lang}->{OptionsSaveError};
+ }
+
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $msg.$self->{options}->{file}."\n$errmsg");
+
+ $dialog->set_position('center-on-parent');
+ $dialog->run();
+ $dialog->destroy ;
+
+ $self->destroy;
+ }
+
+ sub checkImagesDirectory
+ {
+ my ($self, $withDialog) = @_;
+ my $error = 0;
+ my $imagesDir = $self->getImagesDir;
+ if ( ! -e $imagesDir)
+ {
+ eval {mkpath $imagesDir};
+ $error = 1 if (! -e $imagesDir) && (-e $self->{options}->file);
+ }
+ else
+ {
+ #$error = 1 if !( -d _ && -r _ && -w _ && -x _ )
+ # _ cannot be used when filtest access is on
+ $error = 1 if !( -d $imagesDir && -r $imagesDir && -w $imagesDir && -x $imagesDir );
+ }
+ if ($error)
+ {
+ my $itemsImagesDir = '';
+ $itemsImagesDir = $self->{items}->getInformation->{images}
+ if $self->{items};
+ if ($itemsImagesDir)
+ {
+ # Problem was because of a specific image dir, we clear it
+ $self->{items}->getInformation->{images} = '';
+ # And we check again
+ $error = $self->checkImagesDirectory(0);
+ }
+ }
+ return $error if !$withDialog;
+ if ($error)
+ {
+ $self->{splash}->hide if $self->{splash};
+ my $fileDialog = new GCFileChooserDialog($self->{lang}->{FileChooserOpenDirectory}, $self, 'select-folder');
+ my $errorDialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{lang}->{ImageError});
+
+ $errorDialog->set_position('center-on-parent');
+ $fileDialog->set_filename($imagesDir);
+ my $response;
+ do
+ {
+ $errorDialog->run();
+ $errorDialog->hide();
+ $response = '';
+ $response = $fileDialog->run;
+ exit 1 if $response ne 'ok';
+ $self->{options}->images($fileDialog->get_filename);
+ } while ($self->checkImagesDirectory(0));
+ $errorDialog->destroy;
+ $fileDialog->destroy;
+ }
+ return $error;
+ }
+
+ sub setFile
+ {
+ my ($self, $filename) = @_;
+
+ $self->{options}->file($filename);
+ $self->{menubar}->setAddBookmarkActive($filename ne '');
+ }
+
+ sub refreshTitle
+ {
+ my $self = shift;
+ my $name = '';
+ if ($self->{options}->file)
+ {
+ $name = $self->{items}->getInformation->{name}
+ if $self->{items};
+ $name ||= basename($self->{options}->file);
+ }
+ else
+ {
+ $name = $self->{lang}->{UnsavedCollection};
+ }
+ $self->{windowTitle} = $name.' - GCstar';
+ $self->set_title($self->{windowTitle});
+ }
+
+ sub properties
+ {
+ my $self = shift;
+
+ my $prevImages = $self->getImagesDir;
+
+ my $dialog = $self->getDialog('Properties');
+ $dialog->setProperties($self->{items}->getInformation,
+ $self->{options}->file,
+ $self->{items}->getNbItems);
+ if ($dialog->show)
+ {
+ $self->{items}->setInformation($dialog->getProperties);
+ $self->checkDefaultImage;
+ $self->refreshTitle;
+ # We check if it has changed
+ my $newImages = $self->getImagesDir;
+ if ($prevImages ne $newImages)
+ {
+ # Here we want to move pictures
+ $self->{items}->setNewImagesDirectory($newImages, $prevImages, 0);
+ }
+ $self->checkSpellChecking;
+ #$self->moveImages($prevImages, $self->{items}->getInformation->{images});
+ $self->markAsUpdated;
+ }
+ }
+
+ sub markAsUpdated
+ {
+ my $self = shift;
+ $self->{saveIsNeeded} = 1;
+ $self->set_title('*'.$self->{windowTitle});
+ $self->{menubar}->setSaveActive(1);
+ $self->{toolbar}->setSaveActive(1);
+ }
+
+ sub removeUpdatedMark
+ {
+ my $self = shift;
+ $self->{saveIsNeeded} = 0;
+ $self->set_title($self->{windowTitle});
+ $self->{menubar}->setSaveActive(0);
+ $self->{toolbar}->setSaveActive(0);
+
+ # Make sure the panel status is resetted
+ for my $field (@{$self->{model}->{fieldsNotFormatted}})
+ {
+ $self->{panel}->{$field}->resetChanged
+ if $self->{panel}->{$field};
+ }
+ $GCGraphicComponent::somethingChanged = 0;
+ }
+
+ sub refreshFilters
+ {
+ my $self = shift;
+ $self->{menubar}->refreshFilters;
+ }
+
+ sub setWaitCursor
+ {
+ my ($self, $message) = @_;
+ $self->setStatus($message);
+ $self->window->set_cursor(Gtk2::Gdk::Cursor->new('watch'));
+ GCUtils::updateUI;
+ }
+ sub restoreCursor
+ {
+ my $self = shift;
+ $self->restoreStatus;
+ $self->window->set_cursor(Gtk2::Gdk::Cursor->new('left_ptr'));
+ GCUtils::updateUI;
+ }
+
+ sub setFilter
+ {
+ my ($self, $filter, $parameter, $noRefresh) = @_;
+ $self->{items}->updateSelectedItemInfoFromPanel(1);
+ $self->{filterSearch}->setFilter($filter, $parameter,
+ $self->{model}->getFilterType($filter),
+ $self->{model});
+ $self->filter(1) unless $noRefresh;
+ }
+
+ sub setQuickSearch
+ {
+ my ($self, $field, $value) = @_;
+ $self->{items}->updateSelectedItemInfoFromPanel(1);
+ my $isNumeric = ($self->{model}->{fieldsInfo}->{$field}->{type} eq 'number');
+ $self->{filterSearch}->setFilter($field, $value,
+ ['contain', $isNumeric, undef],
+ $self->{model});
+ $self->filter(1);
+ }
+
+ sub setSearch
+ {
+ my ($self, $info) = @_;
+ $self->{filterSearch}->clear;
+ $self->{filterSearch}->setFilter($_,
+ $info->{$_},
+ $self->{model}->getFilterType($_),
+ $self->{model})
+ foreach (keys %$info);
+
+ $self->filter(1);
+ }
+
+ sub setSearchWithTypes
+ {
+ my ($self, %searchParameters) = @_;
+
+ $self->{filterSearch}->clear;
+ $self->{filterSearch}->setMode($searchParameters{mode});
+ $self->{filterSearch}->setCase($searchParameters{case});
+ $self->{filterSearch}->setIgnoreDiacritics($searchParameters{ignoreDiacritics});
+ foreach (@{$searchParameters{info}})
+ {
+ $self->{filterSearch}->setFilter($_->{field},
+ $_->{value},
+ $_->{filter},
+ $self->{model},
+ 1);
+ }
+ $self->filter(1);
+ #$self->{filterSearch}->removeTemporaryFilters;
+
+ # What's the point of this line? It clears the filter mode so all filters return to "and" types
+ # resulting in filtered exports giving unexpected results.
+ # Removed 28/10/2009 by zombiepig, but I'm not sure if there'll be unexpected side effects
+ # $self->{filterSearch}->setMode;
+ }
+
+ sub checkPanelVisibility
+ {
+ my $self = shift;
+ if ($self->{itemsView}->getNbItems)
+ {
+ $self->{panel}->show;
+ }
+ else
+ {
+ $self->{panel}->hide(1);
+ }
+ }
+
+ sub filter
+ {
+ my ($self, $refresh, $splash) = @_;
+ $self->{filterSearch}->setModel($self->{model});
+ my $current = $self->{itemsView}->setFilter($self->{filterSearch},
+ $self->{items}->getItemsListFiltered,
+ $refresh,
+ $splash);
+ $self->{items}->display($current);
+ $self->{itemsView}->select($current, 1);
+
+ $self->checkPanelVisibility;
+
+ $self->setNbItems;
+ }
+
+ sub reloadDone
+ {
+ my ($self, $noFilter, $splash) = @_;
+ my $reloadOnDone = $self->{initializing};
+ my $needFilter = ! ($reloadOnDone || $noFilter);
+ if ($self->{itemsView})
+ {
+ $self->{itemsView}->setSortOrder(undef, $splash, $needFilter);
+ $self->{itemsView}->done($splash, $reloadOnDone);
+ }
+ $self->filter(1, $splash) if $needFilter;
+ $self->setNbItems;
+ }
+
+ sub getDialog
+ {
+ my ($self, $name) = @_;
+
+ if ($name eq 'PluginsAsk')
+ {
+ $self->{PluginsAskDialog} = new GCPluginsDialog($self)
+ if !$self->{PluginsAskDialog};
+ }
+ elsif ($name eq 'MultiSite')
+ {
+ $self->{MultiSiteDialog}->{$self->{model}->getName} = new GCMultiSiteDialog($self, $self->{model})
+ if !$self->{MultiSiteDialog}->{$self->{model}->getName};
+ return $self->{MultiSiteDialog}->{$self->{model}->getName};
+ }
+
+ elsif ($name eq 'MultiSitePerField')
+ {
+ $self->{MultiSitePerFieldDialog}->{$self->{model}->getName} = new GCMultiSitePerFieldDialog($self, $self->{model},1)
+ if !$self->{MultiSitePerFieldDialog}->{$self->{model}->getName};
+ return $self->{MultiSitePerFieldDialog}->{$self->{model}->getName};
+ }
+ elsif ($name eq 'About')
+ {
+ $self->{AboutDialog} = new GCAboutDialog($self, $self->{version})
+ if ! $self->{AboutDialog};
+ }
+ elsif ($name eq 'Models')
+ {
+ $self->{ModelsDialog} = new GCModelsDialog($self,
+ $self->{modelsFactory},
+ 1)
+ if ! $self->{ModelsDialog};
+ }
+ else
+ {
+ my $className = 'GC'.$name.'Dialog';
+ if (! $self->{$name.'Dialog'})
+ {
+ $self->{$name.'Dialog'} = new $className($self);
+ # Actually Plugins, Export and Import don't need the parameter, but
+ # it has no impact and make the code more simple
+ $self->{$name.'Dialog'}->setModel($self->{model})
+ if $name =~ /^(AdvancedSearch|Search|Options|QueryReplace|Plugins|Export|Import)$/
+ && $self->{model};
+ }
+ }
+
+ return $self->{$name.'Dialog'};
+ }
+
+ sub options
+ {
+ my ($self, $self2,$tabToShow) = @_;
+ $self = $self2 if $self2;
+ my $transform = $self->{options}->transform;
+ my $articles = $self->{options}->articles;
+ my $formats = $self->{options}->formats;
+ my $layout = $self->{model}->{preferences}->layout;
+ my $panelStyle = $self->{options}->panelStyle;
+ my $toolbar = $self->{options}->toolbar;
+ my $toolbarPosition = $self->{options}->toolbarPosition;
+ my $prevImages = $self->getImagesDir;
+ my $expandersMode = $self->{options}->expandersMode;
+ my $dateFormat = $self->{options}->dateFormat;
+ my $spellCheck = $self->{options}->spellCheck;
+ my $imageEditor = $self->{options}->imageEditor;
+ my $programs = $self->{options}->programs;
+ my $useStars = $self->{options}->useStars;
+
+ $self->savePreferences;
+
+ $self->getDialog('Options')->show($tabToShow);
+
+ my $newImages = $self->getImagesDir;
+ if ($prevImages ne $newImages)
+ {
+ # Here we want to move pictures
+ $self->{items}->setNewImagesDirectory($newImages, $prevImages, 0);
+ $self->markAsUpdated;
+ }
+
+ $self->checkTransform
+ if ($self->{options}->articles ne $articles)
+ || ($self->{options}->transform != $transform);
+
+ # Need to reload the panel if the layout or style has changed
+ $self->changePanel(0,0)
+ if ($self->{model}->{preferences}->layout ne $layout)
+ || ($self->{options}->panelStyle ne $panelStyle)
+ || ($self->{options}->useStars ne $useStars);
+
+ $self->{panel}->setExpandersMode($self->{options}->expandersMode)
+ if $expandersMode ne $self->{options}->expandersMode;
+
+ if ($dateFormat ne $self->{options}->dateFormat)
+ {
+ $self->{panel}->setDateFormat($self->{options}->dateFormat);
+
+ # TODO We could optimize this with a method setDateFormat on
+ # items view that would only change what needed
+ if ($self->{itemsView} # We have a view
+ && ($self->{itemsView}->isUsingDate) # It uses the date format
+ && (!$self->getDialog('Options')->{viewChanged})) # And we didn't already change it
+ {
+ $self->setItemsList(0, 1); # Then we re-create it
+ }
+ }
+
+ if ($spellCheck ne $self->{options}->spellCheck)
+ {
+ $self->checkSpellChecking;
+ }
+
+ $self->checkToolbarPosition
+ if ($self->{options}->toolbarPosition ne $toolbarPosition) || ($self->{options}->toolbar ne $toolbar);
+
+ $self->{menubar}->setDisplayToolbarState($self->{options}->toolbar == 0 ? 0 : 1)
+ if $self->{options}->toolbar != $toolbar;
+
+ $self->checkPlugin;
+ $self->checkView;
+ #$self->checkToolbarOptions
+ }
+
+ sub displayOptions
+ {
+ my ($self, $self2) = @_;
+ $self = $self2 if $self2;
+
+ my $dialog = $self->getDialog('DisplayOptions');
+ my $hidden = $self->{model}->{preferences}->hidden;
+ $dialog->show;
+ if ($self->{model}->{preferences}->hidden ne $hidden)
+ {
+ $self->checkPanelContent;
+ $self->markAsUpdated
+ if $self->{model}->isInline;
+ }
+
+ }
+
+ sub toolbarOptions
+ {
+ my ($self, $self2) = @_;
+ $self = $self2 if $self2;
+
+ my $dialog = $self->getDialog('ToolbarOptions');
+ if ($dialog->show eq 'ok')
+ {
+ $self->removeToolbar;
+ $self->{toolbar}->destroy;
+ $self->{toolbar} = GCToolBar->new($self);
+ $self->{toolbar}->setModel($self->{model})
+ if $self->{model};
+ $self->checkToolbarOptions;
+ $self->checkToolbarPosition(1);
+ }
+ }
+
+ sub getUserModelsDirError
+ {
+ my $self = shift;
+ return $self->{lang}->{ErrorModelUserDir}
+ .$self->{modelsFactory}->{persoDirectory};
+ }
+
+ sub setCurrentModel
+ {
+ my ($self, $model) = @_;
+ $model = 'GCfilms' if ! $model;
+ $self->savePreferences;
+ $self->{model}->save if $self->{model} && (ref($self->{model}) ne 'HASH');
+ if ((ref $model) =~ /GCModelLoader/)
+ {
+ $self->{model} = $model;
+ }
+ else
+ {
+ $self->{model} = $self->{modelsFactory}->getModel($model)
+ }
+ if (!$self->{model})
+ {
+ return 0;
+ }
+ $self->{items}->initModel($self->{model});
+ return 1;
+ }
+
+ sub preloadModel
+ {
+ my ($self, $model) = @_;
+ # Preload the model into the factory cache
+ $self->{modelsFactory}->getModel($model);
+ }
+
+ sub setCurrentModelFromInline
+ {
+ my ($self, $container) = @_;
+ my $model = GCModelLoader->newFromInline($self, $container);
+ $self->setCurrentModel($model);
+ }
+
+ sub addFieldsToDefaultModel
+ {
+ my ($self, $inlineModel) = @_;
+ my $model = GCModelLoader->newFromInline($self, {inlineModel => $inlineModel, defaultModifier => 1});
+ $self->{model}->addFields($model);
+ $self->notifyModelChange;
+ }
+
+ sub setGrouping
+ {
+ my ($self, $field) = @_;
+ # Automatically switch to detailed list if the current one is text list
+ $self->{options}->view(2)
+ if $self->{options}->view == 0;
+ $self->{model}->{preferences}->groupBy($field);
+ $self->setItemsList(0);
+ }
+
+ sub setLock
+ {
+ my ($self, $value) = @_;
+ $self->{items}->setLock($value);
+ $self->{panel}->changeState($self->{panel}, $value);
+ $self->markAsUpdated;
+ }
+
+ sub notifyModelChange
+ {
+ my ($self, $modelUpdated) = @_;
+
+ # Might need to recreate the Tonight window
+ $self->{remakeItemWindow}->{random} = 1
+ if exists($self->{itemWindow}->{random});
+ $self->{remakeItemWindow}->{item} = 1
+ if exists($self->{itemWindow}->{item});
+ $self->{remakeItemWindow}->{defaultValues} = 1
+ if exists($self->{itemWindow}->{defaultValues});
+
+ # Update strings to reflect model change
+ $self->GCLang::updateModelSpecificStrings;
+
+ #We deactivate some updates
+ my $previousInitializing = $self->{initializing};
+ $self->{initializing} = 1;
+ $self->checkDefaultImage;
+ $self->setItemsList(1, 1);
+ $self->getDialog('DisplayOptions')->createContent($self->{model});
+ $self->changePanel(1, $modelUpdated);
+ if (%{$self->{panel}})
+ {
+ $self->{panel}->createContent($self->{model});
+ $self->{panel}->deactivate if $self->{items}->getLock;
+ }
+ $self->{menubar}->setModel($self->{model});
+ $self->{toolbar}->setModel($self->{model});
+ # Update strings in dialogs if needed
+ $self->updateDialogStrings;
+ $self->checkToolbarOptions;
+
+ $self->getDialog('Search')->setModel($self->{model})
+ if $self->{SearchDialog};
+ $self->getDialog('AdvancedSearch')->setModel($self->{model})
+ if $self->{AdvancedSearchDialog};
+ $self->getDialog('Options')->setModel($self->{model})
+ if $self->{OptionsDialog};
+ $self->getDialog('QueryReplace')->setModel($self->{model})
+ if $self->{QueryReplaceDialog};
+ $self->getDialog('Plugins')->setModel
+ if $self->{PluginsDialog};
+ $self->getDialog('ImportFields')->setModel($self->{model})
+ if $self->{ImportFieldsDialog};
+ $self->getDialog('Export')->setModel
+ if $self->{ExportDialog};
+ $self->getDialog('Import')->setModel
+ if $self->{ImportDialog};
+
+ $self->checkPlugin;
+
+ $self->{initializing} = $previousInitializing;
+ }
+
+ sub updateDialogStrings
+ {
+ my $self = shift;
+
+ # Update model-specific text strings in dialog boxes
+ $self->getDialog('Properties')->{info}->{itemsLabel}->set_label($self->{lang}->{PropertiesItemsNumber});
+ $self->getDialog('Borrowed')->set_title($self->{lang}->{BorrowedTitle});
+ $self->getDialog('Borrowed')->{returned}->get_children->set_label($self->{lang}->{PanelReturned});
+ $self->getDialog('Borrowed')->{display}->get_children->set_label($self->{lang}->{BorrowedDisplayInPanel});
+ $self->getDialog('Search')->set_title($self->{lang}->{SearchTitle});
+ $self->getDialog('AdvancedSearch')->set_title($self->{lang}->{SearchTitle});
+ }
+
+ sub editModel
+ {
+ my $self = shift;
+ my $dialog = $self->getDialog('ModelsSettings');
+ my $isPersonal = $self->{model}->isPersonal;
+ $dialog->setPersonalMode($isPersonal);
+ $dialog->setDescription($self->{model}->getDescription);
+ if ($isPersonal)
+ {
+ $dialog->initFields($self->{model}->getOriginalCollection->{fields}->{field},
+ $self->{model}->getGroups,
+ $self->{model}->getCommonFields,
+ $self->{model}->{hasLending},
+ $self->{model}->{hasTags});
+ $dialog->initFilters($self->{model}->{filters});
+ }
+ else
+ {
+ $dialog->initFields($self->{model}->getAddedFields,
+ $self->{model}->getAddedGroups);
+ }
+ if ($dialog->show)
+ {
+ $self->markAsUpdated;
+ if ($isPersonal)
+ {
+ my $file;
+ ($self->{model}->{collection}->{description}, $self->{model}->{collection}->{name}, $file)
+ = $dialog->getName;
+
+ my %fields = (
+ id => $dialog->getIdField,
+ title => $dialog->getTitleField,
+ cover => $dialog->getCoverField,
+ play => $dialog->getPlayField,
+ );
+ $self->{model}->setOptions(\%fields, 'no.png');
+ $self->{model}->setGroups($dialog->getGroups);
+ $self->{model}->setFields($dialog->{fields}, $dialog->hasLending, $dialog->hasTags);
+ $self->{model}->setFilters($dialog->getFilters($self->{model}->{fieldsInfo}));
+ if ($self->{model}->{collection}->{name})
+ {
+ $self->{model}->saveToFile($file);
+ # This is done twice, because the 1st time the model thought it is online
+ $self->{model}->loadPreferences;
+ }
+ }
+ else
+ {
+ $self->{model}->updateAddedFields($dialog->{fields}, $dialog->getGroups);
+ }
+ #$self->notifyModelChange;
+ $self->{items}->initModel($self->{model}, 1);
+ $self->reloadList;
+ }
+ }
+
+ sub borrowers
+ {
+ my ($self, $self2) = @_;
+ $self = $self2 if $self2;
+
+ $self->getDialog('Borrowers')->show;
+ $self->checkBorrowers;
+ # Some models could use the borrower as a filter
+ # TODO only refresh filters when needed (see previous line)
+ $self->refreshFilters;
+ }
+
+# sub genresConversion
+# {
+# my ($self, $self2) = @_;
+# $self = $self2 if $self2;
+#
+# $self->getDialog('GenresGroups')->show;
+# }
+
+ sub queryReplace
+ {
+ my ($self, $self2) = @_;
+ $self = $self2 if $self2;
+
+ if ($self->getDialog('QueryReplace')->show)
+ {
+ $self->{items}->queryReplace($self->getDialog('QueryReplace')->{field},
+ $self->getDialog('QueryReplace')->{oldValue},
+ $self->getDialog('QueryReplace')->{newValue},
+ $self->getDialog('QueryReplace')->{caseSensitive});
+ $self->markAsUpdated;
+ }
+ }
+
+ sub about
+ {
+ my $self = shift;
+
+ $self->getDialog('About')->show;
+ }
+
+ sub stats
+ {
+ my $self = shift;
+ my $dialog = $self->getDialog('Stats');
+ (my $title = $self->{windowTitle}) =~ s/ - GCstar$//;
+ $dialog->setData($self->{model}, $self->{items}->getItemsListFiltered, $title);
+ $dialog->show;
+ #my $dialog = new GCStatsDialog($self);
+ #$dialog->setData($self->{model}, $self->{items}->getItemsListFiltered);
+ #$dialog->show;
+ }
+
+ sub showDependencies
+ {
+ my $self = shift;
+ $self->getDialog('Dependencies')->show;
+ }
+
+ sub showAllPlugins
+ {
+ my $self = shift;
+ $self->getDialog('AllPlugins')->show;
+ }
+
+ sub help
+ {
+ my ($self, $self2) = @_;
+ $self = $self2 if $self2;
+
+ $self->launch('http://wiki.gcstar.org/', 'url');
+ }
+
+ sub reportBug
+ {
+ my ($self, $self2, $subject, $message) = @_;
+ $self = $self2 if $self2;
+
+ my %topicIds = (
+ EN => '4',
+ FR => '9'
+ );
+
+ my $id = $topicIds{$self->{options}->lang} || $topicIds{EN};
+
+ my $url;
+ if ($message)
+ {
+ # TODO: Move this part across to launchpad when https://bugs.launchpad.net/malone/+bug/552142 is fixed
+ $url = 'http://forums.gcstar.org/postbug.php?req_subject='.uri_escape($subject).'&req_message='.uri_escape($message).'&fid='.$id;
+ $url =~ s/\(/%28/g;
+ $url =~ s/\)/%29/g;
+ }
+ else
+ {
+ $url = 'https://bugs.launchpad.net/gcstar/+filebug';
+ }
+ $self->launch($url, 'url');
+ }
+
+ sub playItem
+ {
+ my $self = shift;
+ my $field = $self->{model}->{commonFields}->{play};
+ my $format = $self->{model}->{fieldsInfo}->{$field}->{format};
+ $self->launch($self->{panel}->$field, $format);
+ }
+
+ sub launch
+ {
+ my ($self, $file, $format, $withParams, $windowParent) = @_;
+
+ $format ||= 'program';
+ my $command;
+ # For image, we have an internal viewer
+ if ($format eq 'image')
+ {
+ $file = GCUtils::getDisplayedImage($file, '', $self->{options}->file);
+ my $dialog = new GCImageDialog($self, $file, $windowParent);
+ $dialog->show;
+ $dialog->destroy;
+
+ if ((exists $self->{itemWindow}->{item}) && ($self->{itemWindow}->{item}->visible))
+ {
+ $self->{itemWindow}->{item}->showMe;
+ }
+ return;
+ }
+ elsif ($format eq 'program')
+ {
+ if ($^O =~ /win32/i)
+ {
+ # Encode filename to work with foreign characters
+ $file = Encode::encode("iso-8859-1", $file);
+
+ if ($withParams)
+ {
+ $command = $file;
+ }
+ else
+ {
+ $file =~ s/([^\\])"/$1\\"/g;
+ $command = '"'.$file.'"';
+ }
+ }
+ else
+ {
+ $command = $file;
+ }
+ }
+ else
+ {
+ # For the other ones, we use external programs
+
+ if ($self->{options}->programs eq 'user')
+ {
+ $command = $self->{options}->browser if $format eq 'url';
+ $command = $self->{options}->player if $format eq 'video';
+ $command = $self->{options}->audio if $format eq 'audio';
+ }
+
+ # If using system default programs, or user has not overriden system default
+ if (( $self->{options}->programs eq 'system' ) || ( !$command ))
+ {
+ $command = ($^O =~ /win32/i) ? ''
+ : ($^O =~ /macos/i) ? '/usr/bin/open'
+ : $ENV{GCS_SHARE_DIR}.'/helpers/xdg-open';
+ }
+
+ if ($file && ($format ne 'url'))
+ {
+ if ($file !~ /^(http|ftp)/)
+ {
+ my $dialog;
+
+ # Encode filename to work with foreign characters under Win32
+ $file = Encode::encode("iso-8859-1", $file) if ($^O =~ /win32/i);
+
+ while (! -e $file)
+ {
+ if (!$dialog)
+ {
+ $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'warning',
+ 'none',
+ $self->{lang}->{PlayFileNotFound}."\n\n".$file);
+ my $cancelButton = Gtk2::Button->new_from_stock('gtk-cancel');
+ $dialog->add_action_widget($cancelButton, 'cancel');
+ my $retryButton = Gtk2::Button->new($self->{lang}->{PlayRetry});
+ $retryButton->can_default(1);
+ $dialog->add_action_widget($retryButton, 'yes');
+ $cancelButton->show_all;
+ $retryButton->show_all;
+ $dialog->set_default_response('yes');
+ $dialog->set_position('center-on-parent');
+ }
+ my $response = $dialog->run;
+ last if $response eq 'cancel';
+ }
+ $dialog->destroy if $dialog;
+ return if ! -e $file;
+ }
+ }
+
+ if ($^O =~ /win32/i)
+ {
+ $command = '"'.$command.'"' if $command;
+ $file =~ s/([^\\])"/$1\\"/g;
+ $command .= ' "'.$file.'"';
+ }
+ else
+ {
+ $file =~ s/([^\\])"/$1\\"/g;
+ #"
+ $command .= ' "'.$file.'"';
+ }
+
+ }
+
+ return if !$command;
+ # Finalize the command line
+ if ($^O =~ /win32/i)
+ {
+ system("start \"\" $command");
+ }
+ else
+ {
+ system "$command &";
+ }
+ if ($ENV{GCS_SET_FAVOURITE_AFTER_PLAY})
+ {
+ my $current = $self->{panel}->favourite;
+ $self->{panel}->favourite($current ? 0 : 1);
+ $self->{items}->updateSelectedItemInfoFromPanel(1);
+ }
+ }
+
+ sub sendBorrowerEmail
+ {
+ my ($self, $info) = @_;
+
+ $self->{mailer} = new GCMailer($self) if ! $self->{mailer};
+ $self->{mailer}->sendBorrowerEmail($info);
+ }
+
+ sub extractInfo
+ {
+ my ($self, $file, $panel) = @_;
+
+ my $infoExtractor = $self->{model}->getExtracter($self, $file, $panel, $self->{model});
+ #$self->getDialog('Extract')->setInfo($infoExtractor->getInfo, $panel);
+ #$self->getDialog('Extract')->show;
+ my $dialog = new GCExtractDialog($self, $self->{model}, $infoExtractor);
+ $dialog->setInfo($infoExtractor, $panel);
+ $dialog->show;
+ }
+
+ sub setStatus
+ {
+ my ($self, $status) = @_;
+ $self->{status}->push(1, $status) if ($self->{status});
+ }
+
+ sub restoreStatus
+ {
+ my $self = shift;
+ $self->{status}->pop(1);
+ }
+
+ sub setNbItems
+ {
+ my $self = shift;
+
+ return if !$self->{itemsView};
+ my $number = $self->{itemsView}->getNbItems;
+ my $status = " $number ".$self->{model}->getDisplayedItems($number);
+ $self->setStatus($status);
+ }
+
+ sub updateSelectedItemInfoFromGivenPanelAndSelect
+ {
+ my ($self, $panel, $idx) = @_;
+ $self->{items}->updateSelectedItemInfoFromGivenPanel($panel);
+ $self->{items}->displayInPanel($self->{panel}, $idx);
+ #Init combo boxes
+ foreach(@{$self->{model}->{fieldsHistory}})
+ {
+ $self->{panel}->{$_}->setValues($panel->getValues($_));
+ }
+ }
+
+ sub display
+ {
+ my ($self, @idx) = @_;
+ if ($self->{items}->display(@idx))
+ {
+ $self->setNbItems;
+ }
+ }
+
+ sub getItemWindow
+ {
+ my ($self, $type) = @_;
+
+ my $created = 0;
+
+ if ((! exists $self->{itemWindow}->{$type}) || ($self->{remakeItemWindow}->{$type}))
+ {
+ $self->{itemWindow}->{$type}->destroy
+ if exists $self->{itemWindow}->{$type};
+
+ $self->{itemWindow}->{$type} =
+ ($type eq 'item') ? new GCItemWindow($self, "") :
+ ($type eq 'random') ? new GCRandomItemWindow($self, "") :
+ ($type eq 'defaultValues') ? new GCDefaultValuesWindow($self, "") :
+ undef;
+ $created = 1;
+ $self->{remakeItemWindow}->{$type} = 0
+ }
+
+ my $window = $self->{itemWindow}->{$type};
+
+ if ($created && $self->{options}->exists('itemWindowWidth'))
+ {
+ $window->set_default_size(
+ $self->{options}->itemWindowWidth,
+ $self->{options}->itemWindowHeight
+ );
+ }
+
+ if ($self->{previousWindowPosition})
+ {
+ $window->move($self->{previousWindowPosition}->{x},
+ $self->{previousWindowPosition}->{y});
+ }
+ $window->{panel}->setBorrowers;
+ $window->{panel}->disableBorrowerChange;
+
+ return $window;
+ }
+
+ sub saveItemWindowSettings
+ {
+ my ($self, $window) = @_;
+
+ my ($width, $height) = $window->get_size;
+ $self->{options}->itemWindowWidth($width);
+ $self->{options}->itemWindowHeight($height);
+
+ ($self->{previousWindowPosition}->{x}, $self->{previousWindowPosition}->{y})
+ = $window->get_position;
+ }
+
+ sub displayInWindow
+ {
+ my ($self, $idx, $type, $select) = @_;
+
+ $type ||= 'item';
+
+ my $title = $self->{items}->getTitle($idx);
+
+ my $window = $self->getItemWindow($type);
+ $window->setTitle($title);
+
+ $self->{items}->displayInPanel($window->{panel}, $idx);
+ $window->{panel}->selectTitle if $select;
+
+ my $code = $window->show;
+
+ if (($type eq 'item') && ($code eq 'ok'))
+ {
+ $self->updateSelectedItemInfoFromGivenPanelAndSelect($window->{panel}, $idx);
+ $self->refreshFilters;
+ }
+
+ $self->saveItemWindowSettings($window);
+
+ $window->hide;
+
+ return $code;
+ }
+
+ sub randomItem
+ {
+ my ($self) = @_;
+ my @tmpArray = undef;
+ $self->{items}->updateSelectedItemInfoFromPanel;
+
+ my $message = '';
+
+ #Initialize items array.
+ $self->{randomPool} = [];
+ my $realId = 0;
+ my $filterSearch = new GCFilterSearch;
+ foreach my $filter(@{$self->{model}->{random}})
+ {
+ $filterSearch->setFilter($filter->{field},
+ $filter->{value},
+ [$filter->{comparison}, $filter->{numeric}],
+ $self->{model});
+ }
+
+ foreach (@{$self->{items}->getItemsListFiltered})
+ {
+ #if (!$_->{seen})
+ if ($filterSearch->test($_))
+ {
+ $_->{realId} = $realId;
+ push @{$self->{randomPool}}, $_;
+ }
+ $realId++;
+ }
+
+ if (scalar @{$self->{randomPool}} > 0)
+ {
+ my $code = 'no';
+ my $idx = 0;
+ while ($code eq 'no')
+ {
+ $idx = int rand(scalar @{$self->{randomPool}});
+ $realId = $self->{randomPool}->[$idx]->{realId};
+ $code = $self->displayInWindow($realId, 'random');
+ splice @{$self->{randomPool}}, $idx, 1;
+ last if ! @{$self->{randomPool}};
+ }
+ $message = $self->{lang}->{RandomEnd} if $code eq 'no';
+ if ($code eq 'ok')
+ {
+ foreach my $filter(@{$self->{model}->{random}})
+ {
+ next if !exists $filter->{after};
+ my $field = $filter->{field};
+ ($self->{items}->getItemsListFiltered)->[$realId]->{$field} = $filter->{after};
+ $self->{panel}->$field($filter->{after})
+ if $self->{items}->{currentItem} == $realId;
+ }
+ }
+ }
+ else
+ {
+ $message = $self->{lang}->{RandomError};
+ }
+
+ if ($message)
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'info',
+ 'ok',
+ $message);
+ $dialog->set_position('center-on-parent');
+ $dialog->run();
+ $dialog->destroy;
+ }
+
+ #Clean items array.
+ foreach (@{$self->{items}->getItemsListFiltered})
+ {
+ delete $_->{realId};
+ }
+ }
+
+ sub setSensitive
+ {
+ my ($self, $sensitive) = @_;
+ $self->{menubar}->set_sensitive($sensitive);
+ $self->{toolbar}->set_sensitive($sensitive);
+ $self->{pane}->set_sensitive($sensitive);
+ }
+
+ sub initProgress
+ {
+ my ($self, $label) = @_;
+ if ($label)
+ {
+ $self->setStatus($label);
+ $self->{restoreNeeded} = 1;
+ }
+ return if $self->{openingFile};
+ $self->setProgress(0.0);
+ $self->setSensitive(0);
+ }
+
+ sub endProgress
+ {
+ my $self = shift;
+ $self->setProgress(1.0);
+ if ($self->{restoreNeeded})
+ {
+ $self->{restoreNeeded} = 0;
+ $self->restoreStatus;
+ }
+ Glib::Timeout->add(500 , sub {
+ $self->setProgress(0.0);
+ return 0;
+ });
+ $self->checkSpellChecking;
+ $self->setSensitive(1);
+ }
+
+ sub setProgress
+ {
+ my ($self, $current) = @_;
+ $self->{progress}->set_fraction($current);
+ GCUtils::updateUI;
+ }
+
+ sub setItemsTotal
+ {
+ my ($self, $total) = @_;
+ $self->{step} = GCUtils::round($total / 7);
+ $self->{step} = 1 if $self->{step} < 1;
+ $self->{total} = $total;
+ }
+
+ sub setProgressForItemsLoad
+ {
+ my ($self, $current) = @_;
+ return if ! $self->{openingFile};
+ return if ($current % $self->{step});
+ if ($self->{total})
+ {
+ my $value = ($current / $self->{total}) / 2;
+ $value = 0.5 if $value > 0.5;
+ #$self->{progress}->set_fraction($value);
+ $self->setProgress($value);
+ }
+ else
+ {
+ #$self->{progress}->set_fraction(0.3);
+ $self->setProgress(0.3);
+ }
+ GCUtils::updateUI;
+ }
+
+ sub setProgressForItemsDisplay
+ {
+ my ($self, $current) = @_;
+ return if ($current % $self->{step});
+ if ($self->{total})
+ {
+ my $value = ($current / (2*$self->{total}));
+ $value = ($value / 2) + 0.5 if $self->{openingFile};
+ $value = 0.75 if $value > 0.75;
+ $self->setProgress($value);
+ #$self->{progress}->set_fraction($value);
+ }
+ else
+ {
+ $self->setProgress(0.5);
+ #$self->{progress}->set_fraction(0.5);
+ }
+ GCUtils::updateUI;
+ }
+
+ sub setProgressForItemsSort
+ {
+ my ($self, $current) = @_;
+ return if ($current % $self->{step});
+ if ($self->{total})
+ {
+ my $value = ($current / (2*$self->{total})) + 0.5;
+ $value = (($value - 0.5) / 2) + 0.75 if $self->{openingFile};
+ $value = 1.0 if $value > 1;
+ $self->setProgress($value);
+ $self->{progress}->set_fraction($value);
+ }
+ else
+ {
+ $self->setProgress(0.7);
+ $self->{progress}->set_fraction(0.7);
+ }
+ GCUtils::updateUI;
+ }
+
+ sub blockListUpdates
+ {
+ my ($self, $value) = @_;
+
+ $self->{items}->{block} = $value;
+ }
+
+ sub reloadList
+ {
+ my $self = shift;
+ $self->{items}->reloadList($self, 1);
+ $self->endProgress;
+ }
+
+ sub setItemsList
+ {
+ my ($self, $init, $doNotSavePreferences) = @_;
+
+ my $view = $self->{options}->view;
+ my $columns = $self->{options}->columns;
+ $columns = 0 if $self->{options}->resizeImgList;
+
+ my $current = -1;
+ if ($self->{itemsView})
+ {
+ $current = $self->{itemsView}->getCurrentIdx if !$init;
+ $self->{listPane}->remove($self->{itemsView}) if $self->{listPane};
+ $self->savePreferences if ! $doNotSavePreferences;
+ $self->{itemsView}->destroy;
+ }
+
+ if ($view == 0)
+ {
+ $self->{itemsView} = new GCTextList($self, $self->{model}->getDisplayedItems);
+ }
+ elsif ($view == 1)
+ {
+ $self->{itemsView} = new GCImageList($self, $columns);
+ }
+ else
+ {
+ $self->{itemsView} = new GCDetailedList($self);
+ }
+ $self->{itemsView}->{initializing} = 1;
+
+ $self->{listOptionsPanel}->setView($view);
+
+ $self->setExpandCollapseInContext($self->{itemsView}->couldExpandAll);
+
+ if ($self->{listPane})
+ {
+ $self->{listPane}->pack1($self->{itemsView},1,0);
+ $self->{itemsView}->show_all;
+ }
+ if ($self->{items})
+ {
+ $self->reloadList if ! $self->{initializing};
+ Glib::Timeout->add(100 ,\&showCurrent, $self);
+ }
+
+ #Change corresponding item in context menu
+ $self->{ignoreContextActivation} = 1;
+
+ if ($self->{options}->tearoffMenus)
+ {
+ $self->{context}->{menuDisplayType}->set_active($view + 1);
+ }
+ else
+ {
+ $self->{context}->{menuDisplayType}->set_active($view);
+ }
+ $self->{context}->{menuDisplayType}->get_active->set_active(1);
+ $self->{ignoreContextActivation} = 0;
+ #Assign context menu to items list that will be in charge of displaying it.
+
+ if (!$init)
+ {
+ $self->checkToolbarOptions; # if !$doNotSavePreferences;
+ $self->{items}->display($current);
+ $self->{itemsView}->select($current);
+ }
+ }
+
+ sub checkToolbarOptions
+ {
+ my $self = shift;
+ $self->{toolbar}->{blocked} = 1;
+ # Text list doesn't support grouping
+ if ($self->{options}->view == 0)
+ {
+ $self->{toolbar}->setGroupField('')
+ }
+ else
+ {
+ $self->{toolbar}->setGroupField($self->{model}->{preferences}->groupBy);
+ }
+ $self->{toolbar}->setItemsList($self->{options}->view);
+ $self->{toolbar}->setLayout($self->{model}->{preferences}->layout);
+ $self->{toolbar}->{blocked} = 0;
+ }
+
+ sub createContextMenu
+ {
+ my $self = shift;
+
+ # Context menu creation. It is displayed when right clicking on a list item.
+ $self->{context} = new Gtk2::Menu;
+
+ if ($self->{options}->tearoffMenus)
+ {
+ $self->{context}->append(Gtk2::TearoffMenuItem->new());
+ }
+
+ $self->{contextNewWindow} = Gtk2::MenuItem->new_with_mnemonic($self->{lang}->{MenuNewWindow});
+ $self->{contextNewWindow}->signal_connect("activate" , sub {
+ $self->displayInWindow(undef, 'item');
+ });
+ $self->{context}->append($self->{contextNewWindow});
+
+ $self->{contextExpand}->{expand} = Gtk2::MenuItem->new_with_mnemonic($self->{lang}->{ContextExpandAll});
+ $self->{contextExpand}->{expand}->signal_connect('activate', sub {
+ $self->{itemsView}->expandAll;
+ });
+ $self->{context}->append($self->{contextExpand}->{expand});
+
+ $self->{contextExpand}->{collapse} = Gtk2::MenuItem->new_with_mnemonic($self->{lang}->{ContextCollapseAll});
+ $self->{contextExpand}->{collapse}->signal_connect('activate', sub {
+ $self->{itemsView}->collapseAll;
+ });
+ $self->{context}->append($self->{contextExpand}->{collapse});
+
+
+ #$self->{contextExpand}->{separator} = new Gtk2::SeparatorMenuItem;
+ $self->{context}->append(Gtk2::SeparatorMenuItem->new);
+
+ $self->{contextDuplicateItem} = Gtk2::ImageMenuItem->new_from_stock('gtk-dnd');
+ $self->{contextDuplicateItem}->set_accel_path('<main>/Edit/gtk-dnd');
+ $self->{contextDuplicateItem}->signal_connect('activate' , sub {
+ $self->duplicateItem;
+ });
+ $self->{context}->append($self->{contextDuplicateItem});
+
+ $self->{contextSelectAllItem} = Gtk2::ImageMenuItem->new_from_stock('gtk-select-all',undef);
+ $self->{contextSelectAllItem}->signal_connect("activate" , sub {
+ $self->selectAll;
+ });
+ $self->{context}->append($self->{contextSelectAllItem});
+
+ $self->{contextItemDelete} = Gtk2::ImageMenuItem->new_from_stock('gtk-delete',undef);
+ $self->{contextItemDelete}->signal_connect("activate" , sub {
+ $self->deleteCurrentItem;
+ });
+ $self->{context}->append($self->{contextItemDelete});
+
+ $self->{context}->append(Gtk2::SeparatorMenuItem->new);
+ $self->{context}->{menuDisplayType} = new Gtk2::Menu;
+ if ($self->{options}->tearoffMenus)
+ {
+ $self->{context}->{menuDisplayType}->append(Gtk2::TearoffMenuItem->new());
+ }
+ my %views = %{$self->{lang}->{OptionsViews}};
+ my $displayGroup = undef;
+ foreach (0..(scalar(keys %views) - 1))
+ {
+ my $item = Gtk2::RadioMenuItem->new_with_mnemonic($displayGroup, $views{$_});
+ $item->signal_connect('activate', sub {
+ my ($widget, $self) = @_;
+ return if ($self->{ignoreContextActivation});
+ if ($widget->get_active)
+ {
+ my $group = $widget->get_group;
+ my $i = 0;
+ $i++ while ($views{$i} ne $widget->child->get_label);
+ $self->{options}->view($i);
+ $self->setItemsList(0)
+ if ! $self->{initializing};
+ $self->checkView;
+
+ }
+ }, $self);
+ $self->{context}->{menuDisplayType}->append($item);
+ $displayGroup = $item->get_group;
+ }
+
+ $self->{context}->{itemDisplayType} = Gtk2::MenuItem->new_with_mnemonic($self->{lang}->{OptionsView});
+ $self->{context}->{itemDisplayType}->set_submenu($self->{context}->{menuDisplayType});
+ $self->{context}->append($self->{context}->{itemDisplayType});
+
+ $self->{context}->{displayItem} = Gtk2::MenuItem->new_with_mnemonic($self->{lang}->{MenuDisplayMenu});
+ $self->{context}->append($self->{context}->{displayItem});
+
+ $self->{context}->append(Gtk2::SeparatorMenuItem->new);
+
+ # Filters selection
+
+ my $menuDisplay = Gtk2::Menu->new();
+ my $filterItem = Gtk2::MenuItem->new_with_mnemonic($self->{lang}->{MenuDisplay});
+
+ $self->{contextViewAllItems} = Gtk2::MenuItem->new_with_mnemonic($self->{lang}->{MenuViewAllItems});
+ $self->{contextViewAllItems}->signal_connect("activate" , sub {
+ $self->viewAllItems;
+ });
+ $menuDisplay->append($self->{contextViewAllItems});
+
+ my $searchSelectedItems = Gtk2::ImageMenuItem->new_from_stock('gtk-find',undef);
+ $searchSelectedItems->signal_connect("activate" , sub {
+ $self->search('displayed');
+ });
+ $menuDisplay->append($searchSelectedItems);
+
+ $filterItem->set_submenu($menuDisplay);
+ $self->{context}->append($filterItem);
+
+ $self->{context}->signal_connect('show' => sub {
+ $self->{menubar}->attachDisplayMenu($self->{context}->{displayItem});
+ });
+
+ $self->{context}->signal_connect('hide' => sub {
+ $self->{menubar}->attachDisplayMenu();
+ });
+
+ $self->{context}->show_all;
+
+ }
+
+ sub setExpandCollapseInContext
+ {
+ my ($self, $active) = @_;
+
+ foreach (keys %{$self->{contextExpand}})
+ {
+ $self->{contextExpand}->{$_}->set_sensitive($active);
+ }
+ }
+
+ sub contextDisplayChange
+ {
+ my ($self, $widget, $menuName, $number) = @_;
+
+ return if $widget && ! $widget->get_active;
+ return if $self->{menubar}->{contextUpdating};
+
+ $self->{menubar}->{contextUpdating} = 1;
+ $self->{menubar}->{$menuName}->set_active($number);
+ $self->{menubar}->{$menuName}->get_active->activate;
+ $self->{menubar}->{contextUpdating} = 0;
+ }
+
+ sub showCurrent
+ {
+ my $self = shift;
+ $self->{itemsView}->showCurrent;
+ return 0;
+ }
+
+ sub viewAllItems
+ {
+ my ($self, $self2) = @_;
+ $self = $self2 if $self2;
+
+ $self->{menubar}->selectAll;
+ }
+
+ sub transformTitle
+ {
+ my ($self, $title) = @_;
+
+ return $title if ! $self->{options}->{options}->{transform};
+
+ return $title if $title !~ $self->{articlesRegexp};
+ #'
+ #return $title if $title !~ /^($self->{articlesRegexp})(\s+|('))(.*)/i;
+ return ucfirst($4)." ($1$3)";
+ }
+
+ sub transformValue
+ {
+ my ($self, $value, $field, $withMulti) = @_;
+
+ my $type = '';
+ $type = $self->{model}->{fieldsInfo}->{$field}->{type}
+ if defined $self->{model}->{fieldsInfo}->{$field}->{type};
+ if ($field eq $self->{model}->{commonFields}->{borrower}->{name})
+ {
+ $value = $self->{lang}->{PanelNobody} if (! $value) || ($value eq 'none');
+ }
+ else
+ {
+ if ($type eq 'date')
+ {
+ $value = GCUtils::timeToStr($value, $self->{options}->dateFormat);
+ }
+ elsif ($type =~ /list$/o)
+ {
+ if ($withMulti)
+ {
+ $value = GCPreProcess::multipleListToArray($value);
+ }
+ else
+ {
+ $value = GCPreProcess::multipleList($value, $type);
+ }
+ }
+ elsif ($type eq 'options')
+ {
+ $value = $self->{items}->valueToDisplayed($value, $field) || $value;
+ }
+ if ($field eq $self->{model}->{commonFields}->{title})
+ {
+ $value = $self->transformTitle($value);
+ }
+ }
+ return $value;
+ }
+
+ sub new
+ {
+ my ($proto, $options, $version, $searchJob) = @_;
+
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new('toplevel');
+ bless ($self, $class);
+
+ $options->setParent($self);
+ $self->{options} = $options;
+ $self->{version} = $version;
+ $self->{searchJob} = $searchJob;
+
+ $self->{logosDir} = $ENV{GCS_SHARE_DIR}.'/logos/';
+ $self->{hasPictures} = (-f $self->{logosDir}.'splash.png');
+ $self->{tmpImageDir} = tempdir(CLEANUP => 1);
+
+ $self->{lang} = $GCLang::langs{$self->{options}->lang};
+
+ if (! $ENV{GCS_PROFILING})
+ {
+ #GCPlugins::loadPlugins;
+ GCExport::loadExporters;
+ GCImport::loadImporters;
+ }
+
+ if (! $options->exists('style'))
+ {
+ $options->style('Gtk') if ($^O !~ /win32/i);
+ $options->style('GCstar') if ($^O =~ /win32/i);
+ }
+ GCStyle::initStyles;
+ my $style = $GCStyle::styles{$options->style};
+
+ if ((! $options->exists('itemWindowWidth'))
+ || (! $options->exists('itemWindowHeight')))
+ {
+ $options->itemWindowWidth(600);
+ $options->itemWindowHeight(500);
+ }
+
+ $self->{style} = $style;
+
+ $self->{initializing} = 1;
+
+ if (($self->{options}->splash) || (! $self->{options}->exists('splash')))
+ {
+ $self->{splash} = new GCSplashWindow($self, $self->{version});
+ }
+ else
+ {
+ $self->init;
+ $self->loadPrevious;
+ $self->initEnd;
+ $self->{initializing} = 0;
+ $self->setSensitive(1);
+ }
+
+ return $self;
+ }
+
+ sub createStockItems
+ {
+ my $self = shift;
+
+ my $baseStock;
+ $baseStock->{translation_domain} = 'gtk20';
+ $baseStock->{keyval} = 0;
+ $baseStock->{modifier} = [ ];
+
+ $baseStock->{stock_id} = 'gtk-execute';
+ $baseStock->{label} = $self->{lang}->{ToolbarRandom};
+ Gtk2::Stock->add($baseStock);
+
+ $baseStock->{stock_id} = 'gtk-refresh';
+ $baseStock->{label} = $self->{lang}->{ToolbarAll};
+ Gtk2::Stock->add($baseStock);
+
+ $baseStock->{stock_id} = 'gtk-convert';
+ $baseStock->{label} = $self->{lang}->{MenuImport};
+ Gtk2::Stock->add($baseStock);
+
+ $baseStock->{stock_id} = 'gtk-revert-to-saved';
+ $baseStock->{label} = $self->{lang}->{MenuExport};
+ Gtk2::Stock->add($baseStock);
+
+ $baseStock->{stock_id} = 'gtk-dnd';
+ $baseStock->{label} = $self->{lang}->{MenuDuplicate};
+ Gtk2::Stock->add($baseStock);
+ my $iconFactory = Gtk2::IconFactory->new;
+ $iconFactory->add('gtk-dnd', (Gtk2::IconFactory->lookup_default ('gtk-copy')));
+ $iconFactory->add_default;
+
+ $baseStock->{stock_id} = 'gtk-jump-to';
+ $baseStock->{label} = $self->{lang}->{PanelSearchButton};
+ Gtk2::Stock->add($baseStock);
+
+ $baseStock->{stock_id} = 'gtk-help';
+ #$baseStock->{keyval} = 'F1';
+ #$baseStock->{modifier} = [];
+ $baseStock->{label} = $self->{lang}->{MenuHelpContent};
+ Gtk2::Stock->add($baseStock);
+
+ $baseStock->{stock_id} = 'gtk-about';
+ $baseStock->{label} = $self->{lang}->{MenuAbout};
+ Gtk2::Stock->add($baseStock);
+
+ $baseStock->{stock_id} = 'gtk-zoom-in';
+ $baseStock->{label} = $self->{lang}->{ResultsPreview};
+ Gtk2::Stock->add($baseStock);
+
+ my $addStock = Gtk2::Stock->lookup('gtk-add');
+ # Ctrl-T
+ $addStock->{keyval} = ord('T');
+ $addStock->{modifier} = [ 'control-mask' ];
+ Gtk2::Stock->add($addStock);
+
+ my $selectAllStock = Gtk2::Stock->lookup('gtk-select-all');
+ if (!$selectAllStock)
+ {
+ $baseStock->{stock_id} = 'gtk-select-all';
+ $baseStock->{label} = $self->{lang}->{DisplayOptionsAll};
+ $baseStock->{modifier} = [];
+ Gtk2::Stock->add($baseStock);
+ }
+
+ }
+
+ sub init
+ {
+ my $self = shift;
+ my $splash = shift;
+
+ $self->{options}->save if $self->checkImagesDirectory(1);
+
+ $self->createStockItems;
+ $splash->setProgress(0.01) if $splash;
+
+ $self->{modelsFactory} = new GCModelsCache($self);
+
+ Gtk2::Rc->parse($self->{style}->{rcFile});
+
+ $self->{AccelMapFile} = $ENV{GCS_CONFIG_HOME}.'/AccelMap';
+ $self->{agent} = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041111 Firefox/1.0';
+ $self->{ignoreString} = 'gcf_000_ignore';
+ $self->{imagePrefix} = 'gcstar_';
+
+ $self->{tooltips} = Gtk2::Tooltips->new();
+ if ($self->{searchJob}->{command})
+ {
+ $self->{searchJob}->{command}->autoflush(1);
+ $self->{searchJob}->{data}->autoflush(1);
+ }
+
+ $self->refreshTitle;
+ my $iconPrefix = $ENV{GCS_SHARE_DIR}.'/icons/gcstar_';
+ my $pixbuf16 = Gtk2::Gdk::Pixbuf->new_from_file($iconPrefix.'16x16.png');
+ my $pixbuf32 = Gtk2::Gdk::Pixbuf->new_from_file($iconPrefix.'32x32.png');
+ my $pixbuf48 = Gtk2::Gdk::Pixbuf->new_from_file($iconPrefix.'48x48.png');
+ my $pixbuf64 = Gtk2::Gdk::Pixbuf->new_from_file($iconPrefix.'64x64.png');
+ $self->set_default_icon_list($pixbuf16, $pixbuf32, $pixbuf48, $pixbuf64);
+
+ $self->signal_connect(delete_event => \&beforeDestroy, $self);
+ $self->signal_connect(destroy => sub { Gtk2->main_quit; });
+
+ $self->createContextMenu;
+
+ $splash->setProgress(0.03) if $splash;
+
+ $self->{items} = new GCItems($self);
+ $self->{panel} = 0;
+
+ $self->{menubar} = new GCMenuBar($self, $self->{AccelMapFile});
+ $self->{menubar}->set_name('GCMenubar');
+
+ $self->{bookmarksLoader} = new GCBookmarksLoader($self, $self->{menubar});
+ $self->{toolbar} = GCToolBar->new($self);
+
+ $self->{mainVbox} = new Gtk2::VBox(0, 0);
+ $self->{mainHbox} = new Gtk2::HBox(0, 0);
+ $self->{pane} = new Gtk2::HPaned;
+ $self->{listPane} = new Gtk2::VPaned;
+
+ $self->{pane}->set_position($self->{options}->split);
+ $self->{listPane}->set_position($self->{options}->listPaneSplit);
+ $self->{pane}->pack1($self->{listPane},1,0);
+ $self->{listOptionsPanel} = new GCListOptionsPanel($self->{options}, $self);
+ $self->{listPane}->pack2($self->{listOptionsPanel},1,1);
+
+ $self->{mainVbox}->pack_start($self->{menubar}, 0, 0, 0);
+ $self->{mainHbox}->pack_start($self->{pane},1,1,0);
+ $self->{mainVbox}->pack_start($self->{mainHbox}, 1, 1, 0);
+
+ $self->{status} = Gtk2::Statusbar->new;
+ $self->{status}->set_has_resize_grip(1);
+ $self->{progress} = new Gtk2::ProgressBar;
+ $self->{progress}->set_size_request(100,-1);
+ $self->{status}->pack_start($self->{progress}, 0, 0, 5);
+ $self->{mainVbox}->pack_start($self->{status},0,0,0);
+
+ $self->setSensitive(0);
+ $self->checkToolbarPosition;
+ $self->add($self->{mainVbox});
+
+ $splash->setProgress(0.05) if $splash;
+
+ $self->set_default_size($self->{options}->width,$self->{options}->height);
+
+ $self->drag_dest_set('all', ['copy','private','default','move','link','ask']);
+
+ $self->signal_connect(drag_data_received => \&drop_handler, $self);
+
+ my $target_list = Gtk2::TargetList->new();
+ my $atom1 = Gtk2::Gdk::Atom->new('text/uri-list');
+ my $atom2 = Gtk2::Gdk::Atom->new('text/plain');
+ $target_list->add($atom1, 0, 0);
+ $target_list->add($atom2, 0, 0);
+ if ($^O =~ /win32/i)
+ {
+ my $atom3 = Gtk2::Gdk::Atom->new('DROPFILES_DND');
+ $target_list->add($atom3, 0, 0);
+ }
+
+ $self->drag_dest_set_target_list($target_list);
+
+ sub drop_handler {
+ my ($widget, $context, $widget_x, $widget_y, $data, $info, $time, $self) = @_;
+ my $type = $data->type->name;
+
+ if (($type eq 'text/uri-list')
+ || ($type eq 'DROPFILES_DND'))
+ {
+ my @files = split /\n/, $data->data;
+ my $numbers = scalar @files;
+ $numbers-- if ($files[$#files] =~ /^\W*$/);
+
+ my ($filename, undef, $extension) = fileparse($files[0],qr{\..*});
+ $extension =~ s/[^\.\w]//g;
+ $extension = lc($extension);
+
+ if (($numbers == 1)
+ && ($files[0] =~ /\.gcs.?$/))
+ {
+ # Special case when only one .gcs file is dropped
+ (my $fileName = $files[0]) =~ s/^file:\/\/(.*)\W*$/$1/;
+ $fileName =~ s/.$//ms;
+ $self->openFile($fileName);
+ }
+ elsif (($numbers == 1)
+ && ($files[0] =~ /^http:\/\//))
+ {
+ # One url has been dropped, parse it for item data
+ $self->loadUrl($files[0]);
+ }
+ elsif ((grep {$_ eq $extension} @GCBaseWidgets::videoExtensions)
+ && ($self->{model}->{collection}->{name} eq 'GCfilms'))
+ {
+ # At least one video file was dropped and a movie collection is open
+ $self->handleDroppedFiles(\@files, \@GCBaseWidgets::videoExtensions, 'trailer');
+ }
+ elsif ((grep {$_ eq $extension} @GCBaseWidgets::ebookExtensions)
+ && ($self->{model}->{collection}->{name} eq 'GCbooks'))
+ {
+ # At least one ebook file was dropped and a book collection is open
+ $self->handleDroppedFiles(\@files, \@GCBaseWidgets::ebookExtensions, 'digitalfile');
+ }
+ elsif ((grep {$_ eq $extension} @GCBaseWidgets::audioExtensions)
+ && ($self->{model}->{collection}->{name} eq 'GCmusics'))
+ {
+ # At least one audio file was dropped and a music collection is open
+ $self->handleDroppedFiles(\@files, \@GCBaseWidgets::audioExtensions, 'playlist');
+ }
+ else
+ {
+ my $fileName = $self->{options}->file;
+ #$self->newList;
+ foreach (@files)
+ {
+ if (!$self->importWithDetect($_))
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{lang}->{ImportDropError});
+
+ $dialog->set_position('center-on-parent');
+ my $response = $dialog->run;
+ $dialog->destroy;
+
+ $self->openFile($fileName);
+ last;
+ }
+ }
+ #$self->{items}->setStatus;
+ $self->setNbItems;
+ }
+ }
+ elsif ((my $url = $data->data) =~ m/^http:\/\//)
+ {
+ $self->loadUrl($url);
+ }
+ }
+
+ $splash->setProgress(0.07) if $splash;
+
+ $self->show_all;
+
+ $self->checkDisplayed;
+ $self->checkView;
+ $self->checkTransform;
+
+ $self->{filterSearch} = new GCFilterSearch;
+
+ $splash->setProgress(0.09) if $splash;
+
+ $self->{options}->searchStop(0) if ($^O =~ /win32/i);
+ }
+
+ sub handleDroppedFiles
+ {
+ my ($self, $files, $acceptedExtensions, $field) = @_;
+
+ foreach (@$files)
+ {
+ # Split filename up into parts
+ my ($filename, undef, $extension) = fileparse($_,qr{\..*});
+ $extension =~ /(\.\w\w\w)/;
+ $extension = lc($1);
+
+ # Double check that the current file being handled is acceptable
+ if (grep {$_ eq $extension} @$acceptedExtensions)
+ {
+ # Extract a clean version of the filename
+ (my $file = $_) =~ s/\W*$//;
+ $file =~ s/^file:\/\///;
+
+ # Add a new item
+ $self->newItem;
+
+ # Set the file field to match the dropped filename
+ $self->{panel}->$field(uri_unescape($file));
+
+ # Fetch info
+ $filename = uri_unescape($filename);
+ $self->searchItem($filename, undef, 0, $self->{model}->{commonFields}->{title});
+ }
+ }
+ }
+
+ sub setPanel
+ {
+ my $self = shift;
+ my $panelInfo;
+ if (! $self->{model}->{preferences}->exists('layout') || (! $self->{model}->{preferences}->layout))
+ {
+ $panelInfo = $self->{model}->getDefaultPanel;
+ $self->{model}->{preferences}->layout($panelInfo->{name})
+ }
+ else
+ {
+ $panelInfo = $self->{model}->{panels}->{$self->{model}->{preferences}->layout};
+ }
+ if ($panelInfo->{editable} eq 'true')
+ {
+ $self->{panel} = new GCFormPanel($self, $self->{options}, $panelInfo);
+ }
+ else
+ {
+ $self->{panel} = new GCReadOnlyPanel($self, $self->{options}, $panelInfo);
+ }
+ $self->{panel}->setExpandersMode($self->{options}->expandersMode);
+ $self->{panel}->show_all;
+ }
+
+ sub changePanel
+ {
+ # $modelChanged means there was any change in the model and not that we are just
+ # changing the panel because the layout was changed in preferences
+ # $modelUpdated means the model is the same, but some fields were added/removed
+ my ($self, $modelChanged, $modelUpdated) = @_;
+
+ #Save previous histories
+ my %savedHistories;
+ if ($self->{panel})
+ {
+ # If there was no change or just an update, we save the history
+ if ((!$modelChanged) || $modelUpdated)
+ {
+ foreach(@{$self->{model}->{fieldsHistory}})
+ {
+ $savedHistories{$_} = $self->{panel}->getValues($_);
+ }
+ $self->{items}->updateSelectedItemInfoFromPanel if !$modelUpdated;
+ }
+ $self->{scrollPanelItem}->remove($self->{scrollPanelItem}->get_child);
+ $self->{panel}->destroy;
+ $self->{pane}->remove($self->{scrollPanelItem});
+ $self->{scrollPanelItem}->destroy;
+ }
+
+ $self->setPanel;
+ $self->{panel}->createContent($self->{model});
+
+ $self->{scrollPanelItem} = new Gtk2::ScrolledWindow;
+ $self->{scrollPanelItem}->set_policy ('automatic', 'automatic');
+ $self->{scrollPanelItem}->set_shadow_type('none');
+ $self->{scrollPanelItem}->add_with_viewport($self->{panel});
+ $self->{pane}->pack2($self->{scrollPanelItem},1,1);
+ $self->{scrollPanelItem}->show_all;
+ $self->{items}->setPanel($self->{panel});
+ $self->checkBorrowers;
+ $self->checkPanelContent;
+
+ if (%savedHistories)
+ {
+ #Restore histories
+ foreach(@{$self->{model}->{fieldsHistory}})
+ {
+ $self->{panel}->{$_}->setValues($savedHistories{$_});
+ }
+ }
+
+ $self->{items}->displayCurrent;
+ $self->checkToolbarOptions;
+ }
+
+ sub removeToolbar
+ {
+ my $self = shift;
+
+ #Remove previous if exists
+ if ($self->{toolbar})
+ {
+ $self->{mainHbox}->remove($self->{toolbar})
+ if ($self->{toolbar}->parent eq $self->{mainHbox});
+ $self->{mainVbox}->remove($self->{toolbar})
+ if ($self->{toolbar}->parent eq $self->{mainVbox});
+ };
+ }
+
+ sub checkToolbarPosition
+ {
+ my ($self, $deactivateRemoval) = @_;
+
+ $self->removeToolbar if !$deactivateRemoval;
+
+ my $position = $self->{options}->toolbarPosition;
+
+ # 0 => top
+ # 1 => bottom
+ # 2 => left
+ # 3 => right
+
+ if ($position > 1) # left or right
+ {
+ $self->{toolbar}->set_orientation('vertical');
+ $self->{mainHbox}->pack_start($self->{toolbar},0,0,0);
+ if ($position == 2) # left
+ {
+ $self->{mainHbox}->reorder_child($self->{toolbar},0);
+ }
+ else # right
+ {
+ $self->{mainHbox}->reorder_child($self->{toolbar},1);
+ }
+ }
+ else # top or bottom
+ {
+ $self->{toolbar}->set_orientation('horizontal');
+ $self->{mainVbox}->pack_start($self->{toolbar},0,0,0 );
+ if ($position == 1) # bottom
+ {
+ $self->{mainVbox}->reorder_child($self->{toolbar},2);
+ }
+ else # top
+ {
+ $self->{mainVbox}->reorder_child($self->{toolbar},1);
+ }
+ }
+ $self->{toolbar}->show_all;
+ $self->{toolbar}->setShowFieldsSelection($position <= 1);
+ }
+
+ sub checkDisplayed
+ {
+ my $self = shift;
+
+ $self->setDisplayMenuBar($self->{options}->displayMenuBar);
+ $self->setDisplayStatusBar($self->{options}->status);
+ $self->setDisplayToolBar($self->{options}->toolbar);
+ }
+
+ sub checkProxy
+ {
+ my $self= shift;
+
+ $self->{plugin}->setProxy($self->{options}->proxy) if ($self->{plugin});
+ }
+
+ sub checkCookieJar
+ {
+ my $self= shift;
+ $self->{plugin}->setCookieJar($self->{options}->cookieJar) if ($self->{plugin});
+ }
+
+ sub checkPlugin
+ {
+ my $self = shift;
+ $self->{plugin} = undef;
+ $self->{plugin} = $self->{model}->getPlugin($self->{model}->{preferences}->plugin);
+
+ $self->checkProxy;
+ $self->checkCookieJar;
+ }
+
+ sub checkBorrowers
+ {
+ my $self = shift;
+
+ #my @borrowers = split m/\|/, $self->{options}->borrowers;
+ $self->{panel}->setBorrowers;
+ }
+
+ sub checkView
+ {
+ my $self = shift;
+ if ($self->{options}->tearoffMenus)
+ {
+ $self->{context}->{menuDisplayType}->set_active($self->{options}->view + 1);
+ }
+ else
+ {
+ $self->{context}->{menuDisplayType}->set_active($self->{options}->view);
+ }
+ $self->{context}->{menuDisplayType}->get_active->set_active(1);
+ }
+
+ sub checkTransform
+ {
+ my $self = shift;
+
+ my @array = split m/,/, $self->{options}->articles;
+
+ my $tmpExpr = '';
+
+ foreach (@array)
+ {
+ s/^\s*//;
+ s/\s*$//;
+ $tmpExpr .= "\Q$_\E|";
+ }
+ chomp $tmpExpr;
+
+ $self->{articles} = \@array;
+ #$self->{articlesRegexp} = $tmpExpr;
+ $self->{articlesRegexp} = qr/^($tmpExpr)(\s+|('))(.*)/i;
+ #'
+ $self->reloadList if ! $self->{initializing};
+ }
+
+ sub checkPanelContent
+ {
+ my $self = shift;
+
+ my $hasToShow = 1;
+ $hasToShow = 0 if (! $self->{itemsView}->getNbItems);
+
+ $self->{panel}->setShowOption($self->getDialog('DisplayOptions')->{show}, $hasToShow);
+ }
+
+ sub checkSpellChecking
+ {
+ my $self = shift;
+ my $lang;
+ if ($self->{items})
+ {
+ $lang = $self->{items}->getInformation->{lang};
+ $lang =~ s/^(\w*).*$/$1/;
+ }
+ $self->{panel}->setSpellChecking($self->{options}->spellCheck,
+ $lang);
+ }
+
+ sub loadPrevious
+ {
+ my $self = shift;
+ my $splash = shift;
+ $self->{items}->setOptions($self->{options});
+ return if !$self->{options}->file;
+
+ #if ($self->{items}->setOptions($self->{options}, $splash))
+ my ($success, $error) = $self->{items}->load($self->{options}->file, $splash, 0);
+ if ($success)
+ {
+ $self->checkDefaultImage;
+ $self->refreshFilters;
+ $self->refreshTitle;
+ $self->{menubar}->setLock($self->{items}->getLock);
+ $self->addFileHistory($self->{options}->file);
+ $self->checkPanelContent;
+ $self->checkBorrowers;
+# $self->checkSpellChecking;
+ }
+ else
+ {
+ $splash->hide if $splash;
+ my $dialog = new GCCriticalErrorDialog(
+ $self,
+ GCUtils::formatOpenSaveError(
+ $self->{lang},
+ $self->{options}->file,
+ $error
+ )
+ );
+ $dialog->show;
+ $self->{options}->file('');
+
+ }
+
+ #$self->{itemsView}->setSortOrder;
+
+ #$splash->setProgress(0.99) if $splash;
+ }
+
+ sub initEnd
+ {
+ my $self = shift;
+
+ if ($self->{options}->{created})
+ {
+ $self->{options}->checkPreviousGCfilms($self);
+ }
+
+ if (! $self->{options}->file)
+ {
+ $self->{splash}->destroy
+ if $self->{splash};
+ $self->{splash} = 0;
+ $self->newList;
+ }
+
+ $self->reloadDone(0,$self->{splash});
+ #$self->{itemsView}->done;
+ $self->{items}->display($self->{items}->select(-1,1));
+
+ if ($ENV{GCS_PROFILING} > 2)
+ {
+ $self->leave;
+ }
+
+ $self->{changedChecked} = Glib::Timeout->add(2000 , sub {
+ if ($GCGraphicComponent::somethingChanged)
+ {
+ $self->markAsUpdated;
+ $GCGraphicComponent::somethingChanged = 0;
+ }
+ return 1;
+ });
+ }
+
+ sub setFullScreen
+ {
+ my ($self, $fullscreen) = @_;
+
+ if ($fullscreen)
+ {
+ $self->fullscreen;
+ }
+ else
+ {
+ $self->unfullscreen;
+ }
+ }
+
+ sub setDisplayMenuBar
+ {
+ my ($self, $show) = @_;
+
+ if ($show)
+ {
+ $self->{menubar}->show_all;
+ }
+ else
+ {
+ $self->{menubar}->hide;
+ }
+ $self->{options}->displayMenuBar($show);
+ }
+
+ sub setDisplayToolBar
+ {
+ my ($self, $show) = @_;
+
+ if ($show)
+ {
+ $self->{toolbar}->show_all;
+ }
+ else
+ {
+ $self->{toolbar}->hide;
+ }
+ $self->{options}->toolbar($show);
+ }
+
+ sub setDisplayStatusBar
+ {
+ my ($self, $show) = @_;
+
+ if ($show)
+ {
+ $self->{status}->show_all;
+ }
+ else
+ {
+ $self->{status}->hide;
+ }
+ $self->{options}->status($show);
+ }
+
+ sub setDefaultValues
+ {
+ my $self = shift;
+
+ my $window = $self->getItemWindow('defaultValues');
+ my $title = $self->{lang}->{MenuDefaultValues};
+
+ $window->setTitle($title);
+
+ my $info = $self->{model}->getDefaultValues;
+ $self->{items}->displayDataInPanel($window->{panel}, $info);
+ my $code = $window->show;
+
+ if ($code eq 'ok')
+ {
+ my ($changed, $info, $previous) = $self->{items}->getInfoFromPanel($window->{panel}, $info);
+ $self->{model}->setDefaultValues($info);
+ }
+
+ $self->saveItemWindowSettings($window);
+
+ $window->hide;
+
+ return $code;
+
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCMenu.pm b/lib/gcstar/GCMenu.pm
new file mode 100644
index 0000000..db6ebec
--- /dev/null
+++ b/lib/gcstar/GCMenu.pm
@@ -0,0 +1,1840 @@
+package GCMenu;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+use utf8;
+use Gtk2;
+
+use strict;
+{
+ package GCMenuBar;
+ use base 'Gtk2::MenuBar';
+
+ use GCExport;
+ use GCImport;
+ use GCStats;
+
+ sub addHistoryMenu
+ {
+ my ($self, $historyArray) = @_;
+ my $parent = $self->{parent};
+
+ my @tmpHistory;
+ if (! $historyArray)
+ {
+ my @tmpHistory = split(/\|/, $parent->{options}->history);
+ $historyArray = \@tmpHistory;
+ }
+ foreach my $filename(@$historyArray)
+ {
+ next if !$filename || ($filename eq 'none');
+ my $item = Gtk2::MenuItem->new_with_label($filename);
+ $item->signal_connect ('activate' => sub {
+ $parent->openFile($filename);
+ });
+ $self->{menuHistory}->append($item);
+ $item->show();
+ }
+ $self->{menuHistoryItem}->set_submenu($self->{menuHistory});
+ }
+
+ sub setBookmarks
+ {
+ my ($self, $bookmarks) = @_;
+ $self->{bookmarks} = $bookmarks;
+ $self->addBookmarksDir($self->{bookmarks}, undef);
+ $self->{menuBookmarks}->show_all;
+ }
+
+ sub clearBookmarks
+ {
+ my $self = shift;
+ my $i = 0;
+ foreach ($self->{menuBookmarks}->get_children)
+ {
+ $i++;
+ next if ($i < 4 + ($self->{parent}->{options}->tearoffMenus ? 1 : 0));
+ $self->{menuBookmarks}->remove($_);
+ $_->destroy;
+ }
+ }
+
+ sub addBookmarksDir
+ {
+ my ($self, $dir, $parent) = @_;
+ if ($parent)
+ {
+ my $subMenu = Gtk2::Menu->new();
+ my $item = Gtk2::MenuItem->new_with_mnemonic($dir->{name});
+ $item->set_submenu($subMenu);
+ $parent->append($item);
+ $parent = $subMenu;
+ $dir->{menu} = $subMenu;
+ }
+ else
+ {
+ $parent = $self->{menuBookmarks};
+ }
+ foreach my $sub(@{$dir->{dir}})
+ {
+ $self->addBookmarksDir($sub, $parent);
+ }
+ return if !$dir->{file};
+ foreach my $file(@{$dir->{file}})
+ {
+ $self->addBookmark($file, $parent);
+ }
+ }
+
+ sub addBookmark
+ {
+ my ($self, $bookmark, $parent) = @_;
+
+ my $item = Gtk2::MenuItem->new_with_mnemonic($bookmark->{name});
+ $item->signal_connect ('activate' => sub {
+ $self->{parent}->openFile($bookmark->{path});
+ });
+ $parent->append($item);
+
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+ $self->{model} = $model;
+ $self->createFilters($model,
+ $model->{fieldsInfo});
+ $self->initExportImportList($model);
+
+ # Update menu labels which are collection dependant
+ $self->updateMenus;
+
+ }
+
+ sub updateItem
+ {
+ my ($self, $item, $label) = @_;
+ foreach my $child($item->get_children)
+ {
+ if ($child->isa('Gtk2::Label'))
+ {
+ $child->set_label($self->{parent}->{lang}->{$label});
+ }
+ }
+ }
+
+ sub updateMenus
+ {
+ my ($self) = @_;
+
+ # Update labels which are collection dependant
+ # list for each item is: [parent, item name, label index in language]
+ foreach (
+ # Menu labels
+ [$self, 'viewAllItems', 'MenuViewAllItems'],
+ [$self, 'menuLend', 'MenuLend'],
+ [$self, 'duplicateItem', 'MenuDuplicate'],
+ [$self, 'newitem', 'MenuAddItem'],
+ [$self, 'deleteCurrentItem', 'MenuEditDeleteCurrent'],
+ [$self, 'selectAllItem', 'MenuEditSelectAllItems'],
+ [$self, 'defaultValues', 'MenuDefaultValues'],
+ # Context menu labels
+ [$self->{parent}, 'contextNewWindow', 'MenuNewWindow'],
+ [$self->{parent}, 'contextDuplicateItem', 'MenuDuplicate'],
+ [$self->{parent}, 'contextSelectAllItem', 'MenuEditSelectAllItems'],
+ [$self->{parent}, 'contextItemDelete', 'MenuEditDeleteCurrent'],
+ [$self->{parent}, 'contextViewAllItems', 'MenuViewAllItems'],
+ )
+ {
+ $self->updateItem($_->[0]->{$_->[1]}, $_->[2]);
+ }
+ }
+
+ sub initFilters
+ {
+ my ($self, $info) = @_;
+
+ $self->selectAll(1);
+ $self->block;
+ my $fieldsInfo = $self->{fieldsInfo};
+ foreach (keys %$info)
+ {
+ my $activeIdx = 0;
+ my $filtersInfo = $self->{filtersInfo}->{$_};
+ next if !$filtersInfo;
+
+ if ($fieldsInfo->{$_}->{type} eq 'options')
+ {
+ foreach my $valueInfo(@{$self->{model}->getValues($fieldsInfo->{$_}->{'values'})})
+ {
+ last if $valueInfo->{value} eq $info->{$_};
+ $activeIdx++;
+ }
+ $activeIdx++ if $activeIdx >= $fieldsInfo->{$_}->{separator};
+ }
+ elsif ($fieldsInfo->{$_}->{type} eq 'number')
+ {
+ #The value that means no check
+ my $boundary = $fieldsInfo->{$_}->{min};
+ $boundary = $fieldsInfo->{$_}->{max}
+ if ($filtersInfo->{type}->{comparison} =~ /^l/);
+ if ($info->{$_} != $boundary)
+ {
+ $activeIdx = 1;
+ $self->{numberValues}->{$_} = $info->{$_};
+ }
+ }
+ elsif ($fieldsInfo->{$_}->{type} eq 'date')
+ {
+ #The value that means no check
+ if ($info->{$_})
+ {
+ $activeIdx = 1;
+ $self->{dateValues}->{$_} = $info->{$_};
+ }
+ }
+ elsif (($fieldsInfo->{$_}->{type} eq 'history text')
+ || ($fieldsInfo->{$_}->{type} eq 'single list'))
+ {
+ my @values;
+ @values = @{$self->{parent}->{panel}->getValues($_)}
+ if ($fieldsInfo->{$_}->{type} eq 'history text');
+ @values = @{$self->{parent}->{panel}->getValues($_)->[0]}
+ if ($fieldsInfo->{$_}->{type} eq 'single list');
+ foreach my $value(@values)
+ {
+ last if $value eq $info->{$_};
+ $activeIdx++;
+ }
+ $activeIdx = 0 if $activeIdx >= $#values;
+ }
+ elsif ($fieldsInfo->{$_}->{type} eq 'yesno')
+ {
+ $activeIdx = 1;
+ $activeIdx = 0 if (($filtersInfo->{values} eq 'off') && ($info->{$_} == 1))
+ || (($filtersInfo->{values} eq 'on') && ($info->{$_} == 0));
+ $activeIdx = 2 if ($filtersInfo->{values} eq 'both') && ($info->{$_} == 0);
+ }
+
+ $self->{'menuFilter'.$_}->set_active($activeIdx);
+ $self->{'menuFilter'.$_}->get_active->set_active(1);
+ }
+
+ $self->unblock;
+ }
+
+ sub initExportImportList
+ {
+ my ($self, $model) = @_;
+
+ my $modelName = $model->getName;
+ #It will hide the export/import modules that don't support current model
+ # This code may be factorized.
+ foreach my $exporter(@GCExport::exportersArray)
+ {
+ my $item = $self->{exporters}->{$exporter->getName};
+ my @models = @{$exporter->getModels};
+ my $show = 0;
+ $show = 1 if !@models;
+ foreach (@models)
+ {
+ $show = 1 if $modelName eq $_;
+ last if $show;
+ }
+ $item->hide if !$show;
+ $item->show if $show;
+ }
+ foreach my $importer(@GCImport::importersArray)
+ {
+ my $item = $self->{importers}->{$importer->getName};
+ my @models = @{$importer->getModels};
+ my $show = 0;
+ $show = 1 if (!$importer->shouldBeHidden || !@models);
+ foreach (@models)
+ {
+ $show = 1 if $modelName eq $_;
+ last if $show;
+ }
+ $item->hide if !$show;
+ $item->show if $show;
+ }
+ }
+
+ sub createFilters
+ {
+ my ($self, $model, $fieldsInfo) = @_;
+ foreach (@{$self->{existingFilters}})
+ {
+ $self->{menuDisplay}->remove($_);
+ $_->destroy;
+ }
+
+ $self->{existingFilters} = [];
+ $self->{existingFiltersMenu} = [];
+ $self->{dynamicFilters} = {};
+ $self->{fieldsInfo} = $fieldsInfo;
+ $self->{filtersInfo} = {};
+ my $position = ($self->{parent}->{options}->tearoffMenus ? 1 : 0);
+ $self->createUserFilters($model, $position + 1);
+ foreach my $filter(@{$model->{filters}})
+ {
+ next if (!defined $filter->{quick}) || ($filter->{quick} ne 'true');
+ my $field = $filter->{field};
+ $self->{filtersInfo}->{$field} = $filter;
+ $self->{'menuFilter'.$field} = Gtk2::Menu->new;
+ $self->{'menuFilter'.$field}->set_accel_path("<main>/Filter/$field");
+ $self->{'menuFilter'.$field}->set_accel_group($self->{accel});
+
+ my $all = Gtk2::RadioMenuItem->new_with_mnemonic(undef,$self->{parent}->{lang}->{MenuNoFilter});
+ $self->{'group'.$field} = $all->get_group();
+ $self->{'menuFilter'.$field}->append($all);
+ $all->signal_connect('activate' => sub {
+ $self->changeFilter(shift, $field, '');
+ });
+
+ if (($fieldsInfo->{$field}->{type} eq 'history text') ||
+ ($fieldsInfo->{$field}->{type} eq 'single list'))
+ {
+ $self->{dynamicFilters}->{$field} = 1;
+ #$self->checkFilter($field);
+ }
+ elsif ($fieldsInfo->{$field}->{type} eq 'yesno')
+ {
+ $filter->{'values'} = 'both' if ! $filter->{'values'} ;
+ if (($filter->{'values'} eq 'on') || ($filter->{'values'} eq 'both'))
+ {
+ my $labelOn = $filter->{labelon} || 'CheckYes';
+ my $on = Gtk2::RadioMenuItem->new_with_mnemonic($self->{'group'.$field},
+ $model->getDisplayedText($labelOn));
+ $self->{'menuFilter'.$field}->append($on);
+ $on->signal_connect('activate' => sub {
+ $self->changeFilter(shift, $field, 1);
+ });
+ }
+ if (($filter->{'values'} eq 'off') || ($filter->{'values'} eq 'both'))
+ {
+ my $labelOff = $filter->{labeloff} || 'CheckNo';
+ my $off = Gtk2::RadioMenuItem->new_with_mnemonic($self->{'group'.$field},
+ $model->getDisplayedText($labelOff));
+ $self->{'menuFilter'.$field}->append($off);
+ $off->signal_connect('activate' => sub {
+ $self->changeFilter(shift, $field, 0);
+ });
+ }
+ }
+ elsif ($fieldsInfo->{$field}->{type} eq 'options')
+ {
+ $self->{dynamicFilters}->{$field} = 1
+ if $field eq $self->{parent}->{model}->{commonFields}->{borrower}->{name};
+ my $i = 0;
+ foreach my $valueInfo(@{$model->getValues($fieldsInfo->{$field}->{'values'})})
+ {
+ $self->{'menuFilter'.$field}->append(Gtk2::SeparatorMenuItem->new)
+ if (exists $fieldsInfo->{$field}->{separator})
+ && ($fieldsInfo->{$field}->{separator} == $i);
+ $i++;
+ next if $valueInfo->{displayed} eq '';
+ my $item = Gtk2::RadioMenuItem->new_with_mnemonic($self->{'group'.$field},
+ $valueInfo->{displayed});
+ $self->{'menuFilter'.$field}->append($item);
+ $item->signal_connect('activate' => sub {
+ $self->changeFilter(shift, $field, $valueInfo->{value});
+ });
+ }
+ }
+ elsif ($fieldsInfo->{$field}->{type} eq 'number')
+ {
+ my $item = Gtk2::RadioMenuItem->new_with_mnemonic($self->{'group'.$field},
+ $model->getDisplayedText($filter->{labelselect}));
+ $self->{'menuFilter'.$field}->append($item);
+ $item->signal_connect('activate' => sub {
+ my $widget = shift;
+ return if ! $widget->get_active;
+ return if $self->{deactivated};
+ my $title = $model->getDisplayedText($filter->{labelselect});
+ $title =~ s/_//g;
+ $title =~ s/\.\.\.//g;
+ my $dialog = new GCNumberEntryDialog($self->{parent},
+ $title,
+ $fieldsInfo->{$field}->{min},
+ $fieldsInfo->{$field}->{max},
+ $fieldsInfo->{$field}->{step});
+ $dialog->setValue($self->{numberValues}->{$field})
+ if $self->{numberValues} != undef;
+ my $value = $dialog->getUserValue;
+ if ($value >= 0)
+ {
+ $self->changeFilter($widget, $field, $value);
+ $self->{numberValues}->{$field} = $value;
+ }
+ });
+ }
+ elsif ($fieldsInfo->{$field}->{type} eq 'date')
+ {
+ my $item = Gtk2::RadioMenuItem->new_with_mnemonic($self->{'group'.$field},
+ $model->getDisplayedText($filter->{labelselect}));
+ $self->{'menuFilter'.$field}->append($item);
+ $item->signal_connect('activate' => sub {
+ my $widget = shift;
+ return if ! $widget->get_active;
+ return if $self->{deactivated};
+ my $title = $model->getDisplayedText($filter->{labelselect});
+ $title =~ s/_//g;
+ $title =~ s/\.\.\.//g;
+ my $dialog = new GCDateSelectionDialog($self->{parent});
+
+ $dialog->date(GCPreProcess::restoreDate($self->{dateValues}->{$field}))
+ if $self->{dateValues} != undef;
+ if ($dialog->show)
+ {
+ my $value = GCPreProcess::reverseDate($dialog->date);
+ $self->changeFilter($widget, $field, $value);
+ $self->{dateValues}->{$field} = $value;
+ }
+ });
+ }
+
+ my $label = $fieldsInfo->{$field}->{displayed};
+ $label = $model->getDisplayedText($filter->{label}) if $filter->{label};
+ $self->{'item'.$field} = Gtk2::MenuItem->new_with_mnemonic($label);
+ $self->{'item'.$field}->set_accel_path("<main>/Display/$field");
+ $self->{'item'.$field}->set_submenu($self->{'menuFilter'.$field});
+ $self->{menuDisplay}->insert($self->{'item'.$field}, $position);
+ $self->{'item'.$field}->show_all;
+
+ push @{$self->{existingFilters}}, $self->{'item'.$field};
+ push @{$self->{existingFiltersMenu}}, $self->{'menuFilter'.$field};
+
+ $position++;
+ }
+ }
+
+ sub createUserFilters
+ {
+ my ($self, $model, $position) = @_;
+ if (!defined $position)
+ {
+ # Here we need to find the correct position
+ $position = 0;
+ foreach ($self->{menuDisplay}->get_children)
+ {
+ $position++;
+ last if $_->isa('Gtk2::SeparatorMenuItem');
+ }
+ }
+ if ($self->{userFiltersMenu})
+ {
+ foreach ($self->{userFiltersMenu}->get_children)
+ {
+ $self->{userFiltersMenu}->remove($_);
+ $_->destroy;
+ }
+ $self->{menuDisplay}->remove($self->{userFiltersItem});
+ $self->{userFiltersMenu}->destroy;
+ $self->{userFiltersItem}->destroy;
+ $self->{userFiltersMenu} = 0;
+ }
+ return if !$model->getName;
+ my @userFilters = @{$model->getUserFilters};
+ $self->{userFiltersMenu} = new Gtk2::Menu;
+ # Setting the accel group to be able to use also shortcuts on user filters
+ $self->{userFiltersMenu}->set_accel_group($self->{accel});
+ $self->{userFiltersItem} = Gtk2::MenuItem->new_with_mnemonic($self->{parent}->{lang}->{MenuSavedSearches});
+ $self->{userFiltersItem}->set_accel_path('<main>/Display/SavedSearches');
+ $self->{userFiltersItem}->set_submenu($self->{userFiltersMenu});
+ $self->{menuDisplay}->insert($self->{userFiltersItem}, $position);
+ if (@userFilters)
+ {
+ foreach my $userFilter(@userFilters)
+ {
+ my $filter = Gtk2::MenuItem->new($userFilter->{name});
+ $filter->set_accel_path('<main>/Display/SavedSearches/'.$userFilter->{name});
+ $filter->signal_connect('activate' => sub {
+ my ($widget, $filter) = @_;
+ $self->selectAll(1);
+ $self->{parent}->setSearchWithTypes(info => $filter->{info},
+ mode => $filter->{mode},
+ regexp => $filter->{regexp},
+ case => $filter->{case},
+ ignoreDiacritics => $filter->{ignoreDiacritics});
+ }, $userFilter);
+ $self->{userFiltersMenu}->append($filter);
+ }
+ }
+ $self->{userFiltersMenu}->append(Gtk2::SeparatorMenuItem->new);
+ my $newUserFilter = Gtk2::MenuItem->new($self->{parent}->{lang}->{MenuSavedSearchesSave});
+ $newUserFilter->signal_connect('activate' => sub {
+ $self->{parent}->saveCurrentSearch;
+ });
+ $self->{userFiltersMenu}->append($newUserFilter);
+ my $editUserFilter = Gtk2::MenuItem->new($self->{parent}->{lang}->{MenuSavedSearchesEdit});
+ $editUserFilter->signal_connect('activate' => sub {
+ $self->{parent}->editSavedSearches;
+ });
+ $self->{userFiltersMenu}->append($editUserFilter);
+
+ $self->{userFiltersItem}->show_all;
+ $self->{menuDisplay}->show_all;
+ }
+
+ sub refreshFilters
+ {
+ my $self = shift;
+ foreach (keys %{$self->{dynamicFilters}})
+ {
+ $self->checkFilter($_);
+ }
+ }
+
+ sub checkFilter
+ {
+ my ($self, $field) = @_;
+ return if ! exists $self->{dynamicFilters}->{$field};
+ $self->{deactivated} = 1;
+ my $values = $self->{parent}->{panel}->getValues($field);
+ $values = $values->[0] if ref($values->[0]) eq 'ARRAY';
+ my $current = $self->{'menuFilter'.$field}->get_active->child->get_label;
+ my $first = 1;
+ foreach ($self->{'menuFilter'.$field}->get_children)
+ {
+ if ($first)
+ {
+ $first = 0;
+ $_->set_active(1);
+ }
+ else
+ {
+ $self->{'menuFilter'.$field}->remove($_);
+ }
+ }
+ my $active = 0;
+ my $i = 0;
+ foreach (@$values)
+ {
+ next if !$_;
+ my ($label, $value) = ($_, $_);
+ if (ref($_) eq 'HASH')
+ {
+ $label = $_->{displayed};
+ $value = $_->{value};
+ }
+ my $item = Gtk2::RadioMenuItem->new_with_mnemonic($self->{'group'.$field}, $label);
+ $self->{'menuFilter'.$field}->append($item);
+ $item->signal_connect('activate' => sub {
+ $self->changeFilter(shift, $field, $value);
+ });
+ if ($label eq $current)
+ {
+ $item->set_active(1);
+ $active = $i + 1;
+ }
+ $i++;
+ }
+ $self->{'menuFilter'.$field}->show_all;
+ $self->{'menuFilter'.$field}->set_active($active);
+
+ $self->{deactivated} = 0;
+ }
+
+ sub changeFilter
+ {
+ my ($self, $widget, $filter, $value) = @_;
+ return if $self->{deactivated};
+ return if ! $widget->get_active;
+ $self->{parent}->setFilter($filter, $value);
+ }
+
+ sub setSaveActive
+ {
+ my ($self, $value) = @_;
+ $self->{savedb}->set_sensitive($value);
+ }
+
+ sub setAddBookmarkActive
+ {
+ my ($self, $value) = @_;
+ $self->{addBookmark}->set_sensitive($value);
+ }
+
+ sub setCollectionLock
+ {
+ my ($self, $value) = @_;
+ $self->{menuEditLockItemsItem}->set_active(0);
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $accelMapFile) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{parent} = $parent;
+ $self->{accel} = Gtk2::AccelGroup->new();
+
+ ############################
+ # File Menu
+ ############################
+
+ $self->{menuFile} = Gtk2::Menu->new;
+ $self->{menuFile}->set_accel_path('<main>/File');
+ $self->{menuFile}->set_accel_group($self->{accel});
+
+ if ($parent->{options}->tearoffMenus)
+ {
+ my $fto = Gtk2::TearoffMenuItem->new();
+ $self->{menuFile}->append($fto);
+ }
+
+ my $newdb = Gtk2::ImageMenuItem->new_from_stock('gtk-new');
+ $newdb->set_accel_path('<main>/File/gtk-new');
+ $newdb->signal_connect ('activate' => sub {
+ $self->{parent}->newList;
+ });
+ $self->{menuFile}->append($newdb);
+
+ my $opendb = Gtk2::ImageMenuItem->new_from_stock('gtk-open');
+ $opendb->set_accel_path('<main>/File/gtk-open');
+ $opendb->signal_connect ('activate' => sub {
+ $self->{parent}->openList;
+ });
+ $self->{menuFile}->append($opendb);
+
+ $self->{menuFile}->append(Gtk2::SeparatorMenuItem->new);
+ ############################
+
+ $self->{savedb} = Gtk2::ImageMenuItem->new_from_stock('gtk-save');
+ $self->{savedb}->set_accel_path('<main>/File/gtk-save');
+ $self->{savedb}->signal_connect ('activate' => sub {
+ $self->{parent}->saveList;
+ });
+ $self->{menuFile}->append($self->{savedb});
+
+ my $saveasdb = Gtk2::ImageMenuItem->new_from_stock('gtk-save-as');
+ $saveasdb->set_accel_path('<main>/File/gtk-save-as');
+ $saveasdb->signal_connect ('activate' => sub {
+ $self->{parent}->saveAs;
+ });
+ $self->{menuFile}->append($saveasdb);
+
+
+ $self->{menuFile}->append(Gtk2::SeparatorMenuItem->new);
+ ############################
+
+ $self->{newitem} = Gtk2::ImageMenuItem->new_from_stock('gtk-add');
+ $self->{newitem}->set_accel_path('<main>/File/gtk-add');
+ $self->{newitem}->signal_connect ('activate' => sub {
+ $self->{parent}->newItem;
+ });
+ $self->{menuFile}->append($self->{newitem});
+
+ my $properties = Gtk2::ImageMenuItem->new_from_stock('gtk-properties');
+ $properties->set_accel_path('<main>/File/gtk-properties');
+ $properties->signal_connect ('activate' => sub {
+ $self->{parent}->properties;
+ });
+ $self->{menuFile}->append($properties);
+
+ if ($GCStats::statisticsActivated)
+ {
+ my $statistics = Gtk2::ImageMenuItem->new_with_mnemonic($parent->{lang}->{MenuStats});
+ $statistics->set_accel_path('<main>/File/Stats');
+ $statistics->signal_connect ('activate' => sub {
+ $self->{parent}->stats;
+ });
+ $self->{menuFile}->append($statistics);
+ }
+
+ $self->{menuLend} = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuLend});
+ $self->{menuLend}->set_accel_path('<main>/File/Borrowers');
+ $self->{menuLend}->signal_connect ('activate' => sub {
+ $self->{parent}->showBorrowed;
+ });
+ $self->{menuFile}->append($self->{menuLend});
+
+ $self->{menuFile}->append(Gtk2::SeparatorMenuItem->new);
+ ############################
+
+ $self->{menuHistoryItem} = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuHistory});
+ $self->{menuHistoryItem}->set_accel_path('<main>/File/History');
+ $self->{menuHistory} = Gtk2::Menu->new();
+ addHistoryMenu($self);
+ $self->{menuFile}->append($self->{menuHistoryItem});
+
+ $self->{menuFile}->append(Gtk2::SeparatorMenuItem->new);
+ ############################
+
+ my $importItem = Gtk2::ImageMenuItem->new_from_stock('gtk-convert');
+ $importItem->set_accel_path('<main>/File/gtk-convert');
+ $self->{menuImport} = Gtk2::Menu->new;
+ $self->{menuImport}->set_accel_path('<main>/Import');
+ $self->{menuImport}->set_accel_group($self->{accel});
+ $self->{importers} = {};
+ my $langName = $parent->{options}->lang;
+ foreach my $importer(@GCImport::importersArray)
+ {
+ $importer->setLangName($langName);
+ my $name = $importer->getName;
+ my $item = Gtk2::MenuItem->new_with_mnemonic($name);
+ $item->signal_connect ('activate' => sub {
+ $self->{parent}->import($importer);
+ });
+ $self->{importers}->{$name} = $item;
+ }
+ foreach my $importerName(sort keys %{$self->{importers}})
+ {
+ $self->{menuImport}->append($self->{importers}->{$importerName});
+ }
+ $importItem->set_submenu($self->{menuImport});
+ $self->{menuFile}->append($importItem);
+
+ my $exportItem = Gtk2::ImageMenuItem->new_from_stock('gtk-revert-to-saved');
+ $self->{menuExport} = Gtk2::Menu->new;
+ $self->{menuExport}->set_accel_path('<main>/Export');
+ $self->{menuExport}->set_accel_group($self->{accel});
+ $self->{exporters} = {};
+ foreach my $exporter(@GCExport::exportersArray)
+ {
+ $exporter->setLangName($langName);
+ my $item = Gtk2::MenuItem->new_with_mnemonic($exporter->getName);
+ $item->signal_connect ('activate' => sub {
+ $self->{parent}->export($exporter);
+ });
+ $self->{exporters}->{$exporter->getName} = $item;
+ }
+ foreach my $exportName(sort keys %{$self->{exporters}})
+ {
+ $self->{menuExport}->append($self->{exporters}->{$exportName});
+ }
+ $exportItem->set_submenu($self->{menuExport});
+ $self->{menuFile}->append($exportItem);
+
+ $self->{menuFile}->append(Gtk2::SeparatorMenuItem->new);
+ ############################
+
+ my $leave = Gtk2::ImageMenuItem->new_from_stock('gtk-quit');
+ $leave->set_accel_path('<main>/File/gtk-quit');
+ $self->{menuFile}->append($leave);
+ $leave->signal_connect('activate' ,sub {
+ $self->{parent}->leave;
+ });
+
+ my $fileitem = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuFile});
+ $fileitem->set_submenu($self->{menuFile});
+
+ $self->append($fileitem);
+
+ ############################
+ # Edit Menu
+ ############################
+ $self->{menuEdit} = Gtk2::Menu->new;
+ $self->{menuEdit}->set_accel_path('<main>/Edit');
+ $self->{menuEdit}->set_accel_group($self->{accel});
+
+ if ($parent->{options}->tearoffMenus)
+ {
+ my $eto = Gtk2::TearoffMenuItem->new();
+ $self->{menuEdit}->append($eto);
+ }
+
+ $self->{duplicateItem} = Gtk2::ImageMenuItem->new_from_stock('gtk-dnd');
+ $self->{duplicateItem}->set_accel_path('<main>/Edit/gtk-dnd');
+ $self->{duplicateItem}->signal_connect('activate' , sub {
+ $self->{parent}->duplicateItem;
+ });
+ $self->{menuEdit}->append($self->{duplicateItem});
+
+ $self->{selectAllItem} = Gtk2::ImageMenuItem->new_from_stock('gtk-select-all');
+ $self->{selectAllItem}->set_accel_path('<main>/Edit/gtk-select-all');
+ $self->{selectAllItem}->signal_connect('activate' , sub {
+ $self->{parent}->selectAll;
+ });
+ $self->{menuEdit}->append($self->{selectAllItem});
+
+ $self->{deleteCurrentItem} = Gtk2::ImageMenuItem->new_from_stock('gtk-delete');
+ $self->{deleteCurrentItem}->set_accel_path('<main>/Edit/gtk-delete');
+ $self->{deleteCurrentItem}->signal_connect('activate' , sub {
+ $self->{parent}->deleteCurrentItem;
+ });
+ $self->{menuEdit}->append($self->{deleteCurrentItem});
+
+ $self->{menuEdit}->append(Gtk2::SeparatorMenuItem->new);
+ ############################
+
+ $self->{editFieldsItem} = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuEditFields});
+ $self->{editFieldsItem}->set_accel_path('<main>/Edit/Collection');
+ $self->{editFieldsItem}->signal_connect('activate' , sub {
+ $self->{parent}->editModel;
+ });
+ $self->{menuEdit}->append($self->{editFieldsItem});
+
+ $self->{menuEdit}->append(Gtk2::SeparatorMenuItem->new);
+ ############################
+
+ my $queryReplaceItem = Gtk2::ImageMenuItem->new_from_stock('gtk-find-and-replace');
+ $queryReplaceItem->set_accel_path('<main>/Edit/gtk-find-and-replace');
+ $queryReplaceItem->signal_connect('activate' , sub {
+ $self->{parent}->queryReplace;
+ });
+ $self->{menuEdit}->append($queryReplaceItem);
+
+ $self->{menuEdit}->append(Gtk2::SeparatorMenuItem->new);
+ ############################
+
+ my $lockItemsItem = Gtk2::CheckMenuItem->new_with_mnemonic($parent->{lang}->{MenuEditLockItems});
+ $lockItemsItem->set_accel_path('<main>/Edit/Lock');
+ $self->{menuEdit}->append($lockItemsItem);
+ #$lockItemsItem->set_active($parent->{items}->getLock);
+ $lockItemsItem->signal_connect('activate' , sub {
+ my $parent = $self;
+ my $self = shift;
+ return if $parent->{deactivated};
+ $parent->{parent}->setLock($self->get_active);
+ $self->toggled();
+ },$lockItemsItem);
+ $self->{menuEditLockItemsItem}=$lockItemsItem;
+ $lockItemsItem->{parent}=$self->{menuEdit};
+
+ my $editItem = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuEdit});
+ $editItem->set_submenu($self->{menuEdit});
+ $self->append($editItem);
+
+ ############################
+ # Display Menu
+ ############################
+ $self->{menuDisplay} = Gtk2::Menu->new;
+ $self->{menuDisplay}->set_accel_path('<main>/Display');
+ $self->{menuDisplay}->set_accel_group($self->{accel});
+
+ if ($parent->{options}->tearoffMenus)
+ {
+ my $dto = Gtk2::TearoffMenuItem->new;
+ $self->{menuDisplay}->append($dto);
+ }
+ ############################
+
+ $self->{menuDisplay}->append(Gtk2::SeparatorMenuItem->new);
+
+ my $search = Gtk2::ImageMenuItem->new_from_stock('gtk-find');
+ $search->set_accel_path('<main>/Display/gtk-find');
+ $search->signal_connect('activate' , sub {
+ $self->{parent}->search('all');
+ });
+ $self->{menuDisplay}->append($search);
+
+ my $advancedSearch = Gtk2::ImageMenuItem->new_with_mnemonic($parent->{lang}->{MenuAdvancedSearch});
+ $advancedSearch->set_accel_path('<main>/Display/Advanced');
+ my $advancedImage = Gtk2::Image->new_from_stock('gtk-find', 'menu');
+ $advancedSearch->set_image($advancedImage);
+ $advancedSearch->signal_connect('activate' , sub {
+ $self->{parent}->advancedSearch;
+ });
+ $self->{menuDisplay}->append($advancedSearch);
+
+ my $random = Gtk2::ImageMenuItem->new_from_stock('gtk-execute');
+ $random->set_accel_path('<main>/Display/gtk-execute');
+ $random->signal_connect('activate' , sub {
+ $self->{parent}->randomItem;
+ });
+ $self->{menuDisplay}->append($random);
+
+ $self->{menuDisplay}->append(new Gtk2::SeparatorMenuItem);
+ ############################
+
+ $self->{'viewAllItems'} = Gtk2::ImageMenuItem->new_with_mnemonic($parent->{lang}->{MenuViewAllItems});
+ $self->{'viewAllItems'}->set_accel_path('<main>/Display/All');
+ my $refreshImage = Gtk2::Image->new_from_stock('gtk-refresh', 'menu');
+ $self->{'viewAllItems'}->set_image($refreshImage);
+ $self->{'viewAllItems'}->signal_connect('activate' , sub {
+ $self->selectAll
+ });
+ $self->{menuDisplay}->append($self->{'viewAllItems'});
+
+ $self->{displayItem} = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuDisplay});
+ $self->{displayItem}->set_submenu($self->{menuDisplay});
+
+ $self->append($self->{displayItem});
+
+ ############################
+ # Configuration Menu
+ ############################
+ $self->{menuConfig} = Gtk2::Menu->new;
+ $self->{menuConfig}->set_accel_path('<main>/Config');
+ $self->{menuConfig}->set_accel_group($self->{accel});
+
+ if ($parent->{options}->tearoffMenus)
+ {
+ my $cto = Gtk2::TearoffMenuItem->new;
+ $self->{menuConfig}->append($cto);
+ }
+
+ my $options = Gtk2::ImageMenuItem->new_from_stock('gtk-preferences');
+ $options->set_accel_path('<main>/Config/gtk-preferences');
+ $options->signal_connect('activate' , sub {
+ my ($widget, $window) = @_;
+ $window->options;
+ }, $self->{parent});
+ $self->{menuConfig}->append($options);
+
+ $self->{displayItem} = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuDisplayMenu});
+ $self->{displayItem}->set_accel_path('<main>/Config/DisplayItem');
+ #$self->{displayItem}->set_submenu($self->createDisplayMenu);
+ $self->attachDisplayMenu;
+ $self->{menuConfig}->append($self->{displayItem});
+
+ my $toolbarConfig = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuToolbarConfiguration});
+ $toolbarConfig->set_accel_path('<main>/Config/Toolbar');
+ $toolbarConfig->signal_connect ('activate' => sub {
+ $self->{parent}->toolbarOptions;
+ });
+ $self->{menuConfig}->append($toolbarConfig);
+
+ $self->{menuConfig}->append(new Gtk2::SeparatorMenuItem);
+
+ my $displayOptions = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuDisplayOptions});
+ $displayOptions->set_accel_path('<main>/Config/Display');
+ $displayOptions->signal_connect ('activate' => sub {
+ $self->{parent}->displayOptions;
+ });
+ $self->{menuConfig}->append($displayOptions);
+
+ $self->{defaultValues} = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuDefaultValues});
+ $self->{defaultValues}->set_accel_path('<main>/Config/DefaultValues');
+ $self->{defaultValues}->signal_connect ('activate' => sub {
+ $self->{parent}->setDefaultValues;
+ });
+ $self->{menuConfig}->append($self->{defaultValues});
+
+ my $borrowers = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuBorrowers});
+ $borrowers->set_accel_path('<main>/Config/Borrowers');
+ $borrowers->signal_connect ('activate' => sub {
+ $self->{parent}->borrowers;
+ });
+ $self->{menuConfig}->append($borrowers);
+
+ my $configitem = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuConfiguration});
+ $configitem->set_submenu($self->{menuConfig});
+ $self->append($configitem);
+
+ ############################
+ # Bookmarks Menu
+ ############################
+ $self->{menuBookmarks} = Gtk2::Menu->new;
+ $self->{menuBookmarks}->set_accel_path('<main>/Bookmarks');
+ $self->{menuBookmarks}->set_accel_group($self->{accel});
+
+ if ($parent->{options}->tearoffMenus)
+ {
+ my $bto = Gtk2::TearoffMenuItem->new;
+ $self->{menuBookmarks}->append($bto);
+ }
+
+ $self->{addBookmark} = Gtk2::ImageMenuItem->new_with_mnemonic($parent->{lang}->{MenuBookmarksAdd});
+ my $addBookmarkImage = Gtk2::Image->new_from_stock('gtk-add', 'menu');
+ $self->{addBookmark}->set_image($addBookmarkImage);
+ $self->{addBookmark}->set_accel_path('<main>/Bookmarks/Add');
+ $self->{addBookmark}->signal_connect('activate' , sub {
+ $self->{parent}->addBookmark;
+ });
+ $self->{menuBookmarks}->append($self->{addBookmark});
+
+ my $editBookmark = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuBookmarksEdit});
+ $editBookmark->set_accel_path('<main>/Bookmarks/Edit');
+ $editBookmark->signal_connect('activate' , sub {
+ $self->{parent}->editBookmark;
+ });
+ $self->{menuBookmarks}->append($editBookmark);
+
+ $self->{menuBookmarks}->append(new Gtk2::SeparatorMenuItem);
+
+ my $bookmarksitem = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuBookmarks});
+ $bookmarksitem->set_submenu($self->{menuBookmarks});
+ $self->append($bookmarksitem);
+
+ ############################
+ # Help Menu
+ ############################
+ $self->{menuHelp} = Gtk2::Menu->new;
+ $self->{menuHelp}->set_accel_path('<main>/Help');
+ $self->{menuHelp}->set_accel_group($self->{accel});
+
+ if ($parent->{options}->tearoffMenus)
+ {
+ my $hto = Gtk2::TearoffMenuItem->new;
+ $self->{menuHelp}->append($hto);
+ }
+
+ my $help = Gtk2::ImageMenuItem->new_from_stock('gtk-help');
+ $help->set_accel_path('<main>/Help/Content');
+ $help->signal_connect('activate' , sub {
+ my ($widget, $window) = @_;
+ $window->help;
+ }, $self->{parent});
+ $self->{menuHelp}->append($help);
+ my $plugins = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuAllPlugins});
+ $plugins->set_accel_path('<main>/Help/Plugins');
+ $plugins->signal_connect ('activate' => sub {
+ $self->{parent}->showAllPlugins;
+ });
+ $self->{menuHelp}->append($plugins);
+ my $depend = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{InstallDependencies});
+ $depend->set_accel_path('<main>/Help/Dependencies');
+ $depend->signal_connect ('activate' => sub {
+ $self->{parent}->showDependencies;
+ });
+ $self->{menuHelp}->append($depend);
+ my $bug = Gtk2::ImageMenuItem->new_with_mnemonic($parent->{lang}->{MenuBugReport});
+ $bug->set_accel_path('<main>/Help/Bug');
+ $bug->signal_connect('activate' , sub {
+ my ($widget, $window) = @_;
+ $window->reportBug;
+ }, $self->{parent});
+ $self->{menuHelp}->append($bug);
+ my $about = Gtk2::ImageMenuItem->new_from_stock('gtk-about');
+ $about->set_accel_path('<main>/Help/gtk-about');
+ $about->signal_connect('activate' , sub {
+ my ($widget, $window) = @_;
+ $window->about;
+ }, $self->{parent});
+ $self->{menuHelp}->append($about);
+
+ my $helpitem = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuHelp});
+ $helpitem->set_submenu($self->{menuHelp});
+ $self->append($helpitem);
+
+ $parent->add_accel_group($self->{accel});
+
+ $self->{deactivateFilters} = 0;
+ $self->{contextUpdating} = 0;
+
+ $self->setSaveActive(0);
+
+ $self->{AccelMapFile} = $accelMapFile;
+ if (-f $accelMapFile)
+ {
+ Gtk2::AccelMap->load($accelMapFile);
+ }
+ else
+ {
+ $self->restoreDefaultAccels;
+ }
+ $self->get_settings->set(gtk_can_change_accels => 1);
+
+ return $self;
+
+ }
+
+ sub save
+ {
+ my $self = shift;
+ Gtk2::AccelMap->save($self->{AccelMapFile});
+ }
+
+ sub restoreDefaultAccels
+ {
+ my $self = shift;
+
+ Gtk2::AccelMap->foreach(undef, sub {
+ my ($path, $key, $modifier, $changed) = @_;
+ if ($path =~ m|(gtk-.*?)$|)
+ {
+ my $stockItem = Gtk2::Stock->lookup($1);
+ Gtk2::AccelMap->change_entry($path,
+ $stockItem->{keyval},
+ $stockItem->{modifier},
+ 1);
+ }
+ else
+ {
+ Gtk2::AccelMap->change_entry($path,
+ undef,
+ [],
+ 1);
+ }
+ });
+
+ Gtk2::AccelMap->change_entry('<main>/Bookmarks/Add',
+ ord('d'),
+ 'control-mask',
+ 1);
+
+
+ return $self;
+ }
+
+ sub setLock
+ {
+ my ($self, $value) = @_;
+ $self->block;
+ $self->{menuEditLockItemsItem}->set_active($value);
+ $self->unblock;
+ }
+
+ sub selectAll
+ {
+ my ($self, $noRefresh) = @_;
+
+ $self->block;
+ $self->{parent}->removeSearch($noRefresh);
+
+ foreach (@{$self->{existingFiltersMenu}})
+ {
+ $_->set_active(0);
+ $_->get_active->set_active(1);
+ }
+ $self->unblock;
+ }
+
+ sub block
+ {
+ my $self = shift;
+
+ $self->{parent}->blockListUpdates(1);
+ $self->{deactivated} = 1;
+ }
+
+ sub unblock
+ {
+ my $self = shift;
+
+ $self->{deactivated} = 0;
+ $self->{parent}->blockListUpdates(0);
+ }
+
+ sub attachDisplayMenu
+ {
+ my ($self, $newParent) = @_;
+
+ $newParent = $self->{displayItem}
+ if !$newParent;
+
+ my $displayMenu;
+ if ($self->{displayMenu})
+ {
+ $displayMenu = $self->{displayMenu};
+ $displayMenu->detach;
+ }
+ else
+ {
+ $displayMenu = Gtk2::Menu->new;
+ $displayMenu->set_accel_path('<main>/Config/DisplayMenu');
+ $displayMenu->set_accel_group($self->{accel});
+
+ my $fullScreen = Gtk2::CheckMenuItem->new_with_mnemonic($self->{parent}->{lang}->{MenuDisplayFullScreen});
+ $fullScreen->set_accel_path('<main>/Config/DisplayMenu/Fullscreen');
+ $fullScreen->signal_connect ('activate' => sub {
+ my $parent = $self;
+ my $self = shift;
+ $parent->{parent}->setFullScreen($self->get_active);
+ $self->toggled();
+ }, $fullScreen);
+ $displayMenu->append($fullScreen);
+
+ $displayMenu->append(new Gtk2::SeparatorMenuItem);
+
+ my $menuBar = Gtk2::CheckMenuItem->new_with_mnemonic($self->{parent}->{lang}->{MenuDisplayMenuBar});
+ $menuBar->set_accel_path('<main>/Config/DisplayMenu/MenuBar');
+ $menuBar->set_active($self->{parent}->{options}->displayMenuBar);
+ $menuBar->signal_connect ('activate' => sub {
+ my $parent = $self;
+ my $self = shift;
+ $parent->{parent}->setDisplayMenuBar($self->get_active);
+ $self->toggled();
+ }, $menuBar);
+ $displayMenu->append($menuBar);
+
+ $self->{displayToolBar} = Gtk2::CheckMenuItem->new_with_mnemonic($self->{parent}->{lang}->{MenuDisplayToolBar});
+ $self->{displayToolBar}->set_accel_path('<main>/Config/DisplayMenu/ToolBar');
+ $self->{displayToolBar}->set_active($self->{parent}->{options}->toolbar);
+ $self->{displayToolBar}->signal_connect ('activate' => sub {
+ my $parent = $self;
+ my $self = shift;
+ return if !$self->{acceptEvents};
+ my $value = $self->get_active;
+ # If activated, we set it to the system setting
+ $value = 3
+ if $value;
+ $parent->{parent}->setDisplayToolBar($value);
+ $self->toggled();
+ }, $self->{displayToolBar});
+ $self->{displayToolBar}->{acceptEvents} = 1;
+ $displayMenu->append($self->{displayToolBar});
+
+ my $statusBar = Gtk2::CheckMenuItem->new_with_mnemonic($self->{parent}->{lang}->{MenuDisplayStatusBar});
+ $statusBar->set_accel_path('<main>/Config/DisplayMenu/StatusBar');
+ $statusBar->set_active($self->{parent}->{options}->status);
+ $statusBar->signal_connect ('activate' => sub {
+ my $parent = $self;
+ my $self = shift;
+ $parent->{parent}->setDisplayStatusBar($self->get_active);
+ $self->toggled();
+ }, $statusBar);
+ $displayMenu->append($statusBar);
+
+ $self->{displayMenu} = $displayMenu;
+ }
+
+ $newParent->set_submenu($displayMenu);
+ $newParent->show_all;
+ #return $self->{displayMenu};
+ }
+
+ sub setDisplayToolbarState
+ {
+ my ($self, $value) = @_;
+ #$self->{displayToolBar}->{acceptEvents} = 0;
+ $self->{displayToolBar}->set_active($value);
+ $self->{displayToolBar}->{acceptEvents} = 1;
+ }
+}
+
+{
+ package GCToolBar;
+ use base 'Gtk2::Toolbar';
+
+ our $CONFIGURATION_FILE = 'Toolbar';
+ our @DEFAULT_CONTROLS = (
+ 'gtk-add', 'gtk-save', 'gtk-preferences',
+ 'ToolbarSeparator',
+ 'gtk-find', 'gtk-refresh', 'gtk-execute', 'gtk-media-play',
+ 'ToolbarSeparator',
+ 'ToolbarGroupBy'
+ );
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless($self, $class);
+
+ $self->{parent} = $parent;
+ $self->{lang} = $parent->{lang};
+
+ $self->set_name('GCToolbar');
+ $self->set_show_arrow (1);
+
+ $self->{configFile} = $ENV{GCS_CONFIG_HOME}.'/'.$GCToolBar::CONFIGURATION_FILE;
+
+ $self->{stockIdToWidget} = {
+ 'gtk-add' => {
+ tooltip => $self->{lang}->{NewItemTooltip},
+ callback => sub {$parent->newItem}
+ },
+ 'gtk-save' => {
+ tooltip => $self->{lang}->{SaveListTooltip},
+ callback => sub {$parent->saveList}
+ },
+ 'gtk-preferences' => {
+ tooltip => $self->{lang}->{PreferencesTooltip},
+ callback => sub {$parent->options}
+ },
+ 'gtk-find' => {
+ tooltip => $self->{lang}->{SearchTooltip},
+ callback => sub {$parent->search('all')}
+ },
+ 'gtk-refresh' => {
+ tooltip => $self->{lang}->{ToolbarAllTooltip},
+ callback => sub {$parent->viewAllItems}
+ },
+ 'gtk-execute' => {
+ tooltip => $self->{lang}->{RandomTooltip},
+ callback => sub {$parent->randomItem}
+ },
+ 'gtk-media-play' => {
+ tooltip => $self->{lang}->{PlayTooltip},
+ callback => sub {$parent->playItem}
+ },
+ 'gtk-new' => {
+ tooltip => undef,
+ callback => sub {$parent->newList}
+ },
+ 'gtk-open' => {
+ tooltip => undef,
+ callback => sub {$parent->openList}
+ },
+ 'gtk-properties' => {
+ tooltip => undef,
+ callback => sub {$parent->properties}
+ },
+ 'gtk-quit' => {
+ tooltip => undef,
+ callback => sub {$parent->leave}
+ },
+ 'gtk-dnd' => {
+ tooltip => undef,
+ callback => sub {$parent->duplicateItem}
+ },
+ 'gtk-delete' => {
+ tooltip => undef,
+ callback => sub {$parent->deleteCurrentItem}
+ },
+ 'gtk-find-and-replace' => {
+ tooltip => undef,
+ callback => sub {$parent->queryReplace}
+ },
+ 'gtk-help' => {
+ tooltip => undef,
+ callback => sub {$parent->help}
+ },
+ };
+
+ $self->loadControls;
+
+ $self->{blocked} = 1;
+ $self->setSaveActive(0);
+ $self->{showFieldsSelection} = 1;
+
+ return $self;
+ }
+
+ sub loadControls
+ {
+ my $self = shift;
+ my @controls;
+ if (! -f $self->{configFile})
+ {
+ @controls = @GCToolBar::DEFAULT_CONTROLS;
+ }
+ else
+ {
+ open CONFIG, $self->{configFile};
+ my @array;
+ foreach (<CONFIG>)
+ {
+ s/\s+$//;
+ push @controls, $_;
+ }
+ close CONFIG;
+ }
+ foreach (@controls)
+ {
+ if (/^gtk-/)
+ {
+ $self->{controls}->{$_} = Gtk2::ToolButton->new_from_stock($_);
+
+ # Set the important property on the add and save buttons
+ # (shows text in toolbar, depending on gtk settings)
+ if (/add|save/)
+ {
+ $self->{controls}->{$_}->set_is_important(1);
+ }
+
+ $self->{controls}->{$_}->signal_connect('clicked' => $self->{stockIdToWidget}->{$_}->{callback});
+ $self->{parent}->{tooltips}->set_tip($self->{controls}->{$_}, $self->{stockIdToWidget}->{$_}->{tooltip}, '')
+ if $self->{stockIdToWidget}->{$_}->{tooltip};
+ $self->insert($self->{controls}->{$_}, -1);
+
+ }
+ elsif ($_ eq 'ToolbarSeparator')
+ {
+ $self->insert(Gtk2::SeparatorToolItem->new, -1);
+ }
+ else
+ {
+ if ($_ eq 'ToolbarGroupBy')
+ {
+ $self->{controls}->{groupLabel} = new Gtk2::Label($self->{lang}->{ToolbarGroupBy});
+ $self->{controls}->{groupOption} = new GCFieldSelector(0, undef, 1);
+ $self->{controls}->{groupOption}->set_focus_on_click(0);
+ $self->{controls}->{groupOption}->signal_connect('changed' => sub {
+ return if $self->{blocked};
+ my $field = $self->{controls}->{groupOption}->getValue;
+ return if $self->{currentGroupField} eq $field;
+ $self->{parent}->setGrouping($field);
+ });
+ my $groupVBox = new Gtk2::VBox(0,0);
+ $groupVBox->set_border_width(0);
+ $groupVBox->pack_start($self->{controls}->{groupOption}, 1, 0, 0);
+ $self->{parent}->{tooltips}->set_tip($self->{controls}->{groupOption}, $self->{lang}->{ToolbarGroupByTooltip}, '');
+ my $groupBox = new Gtk2::HBox(0,0);
+ $groupBox->pack_start($self->{controls}->{groupLabel}, 0, 0, 0);
+ $groupBox->pack_start($groupVBox, 1, 1, $GCUtils::halfMargin);
+ my $groupItem = new Gtk2::ToolItem;
+ $groupItem->add($groupBox);
+ $self->insert($groupItem, -1);
+ }
+ elsif ($_ eq 'OptionsView')
+ {
+ my %views = %{$self->{lang}->{OptionsViews}};
+ $self->{controls}->{viewOption} = new GCMenuList;
+ my @viewsOptions = map {{value => $_, displayed => $views{$_}}}
+ (sort keys %views);
+ $self->{controls}->{viewOption}->setValues(\@viewsOptions);
+ $self->{controls}->{viewOption}->signal_connect('changed' => sub {
+ return if $self->{blocked};
+ $self->{parent}->{options}->view($self->{controls}->{viewOption}->getValue);
+ $self->{parent}->setItemsList(0, 1);
+ });
+ my $listViewBox = new Gtk2::VBox(0,0);
+ $listViewBox->set_border_width(0);
+ $listViewBox->pack_start($self->{controls}->{viewOption}, 1, 0, 0);
+ my $viewItem = new Gtk2::ToolItem;
+ $viewItem->add($listViewBox);
+ $self->insert($viewItem, -1);
+ }
+ elsif ($_ eq 'OptionsLayout')
+ {
+ $self->{controls}->{layoutOption} = new GCMenuList;
+ $self->{controls}->{layoutOption}->signal_connect('changed' => sub {
+ return if $self->{blocked};
+ $self->{model}->{preferences}->layout($self->{controls}->{layoutOption}->getValue);
+ $self->{parent}->changePanel(0, 0);
+ });
+ my $layoutBox = new Gtk2::VBox(0,0);
+ $layoutBox->set_border_width(0);
+ $layoutBox->pack_start($self->{controls}->{layoutOption}, 1, 0, 0);
+ my $layoutItem = new Gtk2::ToolItem;
+ $layoutItem->add($layoutBox);
+ $self->insert($layoutItem, -1);
+ }
+ elsif ($_ eq 'MenuSavedSearches')
+ {
+ $self->{controls}->{userFiltersOption} = new GCMenuList;
+ $self->{controls}->{userFiltersOption}->setTitle($self->{parent}->{lang}->{MenuSavedSearches});
+ $self->{controls}->{userFiltersOption}->signal_connect('changed' => sub {
+ return if $self->{blocked};
+ my $idx = $self->{controls}->{userFiltersOption}->getValue;
+ $self->{controls}->{userFiltersOption}->{changeInProgress} = 1;
+ if ($idx == -1)
+ {
+ $self->{parent}->removeSearch(0);
+ }
+ else
+ {
+ $self->{parent}->removeSearch(1);
+ $self->{parent}->setSearchWithTypes(%{$self->{userFilters}->[$idx]});
+ }
+ $self->{controls}->{userFiltersOption}->{changeInProgress} = 0;
+ });
+
+ my $filterBox = new Gtk2::VBox(0,0);
+ $filterBox->set_border_width(0);
+ $filterBox->pack_start($self->{controls}->{userFiltersOption}, 1, 0, 0);
+ my $filterItem = new Gtk2::ToolItem;
+ $filterItem->add($filterBox);
+ $self->insert($filterItem, -1);
+ }
+ elsif ($_ eq 'ToolbarQuickSearch')
+ {
+ my $quickBox = new Gtk2::HBox(0,0);
+ $self->{controls}->{quickLabel} = new Gtk2::Label($self->{lang}->{ToolbarQuickSearchLabel});
+ $quickBox->pack_start($self->{controls}->{quickLabel}, 0, 0, 0);
+
+ $self->{controls}->{quickEntry} = new GCShortText;
+ $self->{controls}->{quickEntry}->signal_connect('activate' => sub {
+ $self->{parent}->setQuickSearch($self->{controls}->{quickFields}->getValue,
+ $self->{controls}->{quickEntry}->getValue);
+ $self->{controls}->{quickEntry}->grab_focus;
+ });
+
+ $self->{controls}->{quickFields} = new GCFieldSelector(0, undef, 0, 1, 1);
+ $self->{controls}->{quickFields}->set_focus_on_click(0);
+
+ # Without 2 handlers below, the focus goes out of the toolbar when
+ # pressing Tab or Shift-Tab
+ $self->{controls}->{quickEntry}->signal_connect('key-press-event' => sub {
+ my ($widget, $event) = @_;
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+ if ($key eq 'Tab')
+ {
+ $self->{controls}->{quickFields}->grab_focus;
+ return 1;
+ }
+ # Let key be managed by Gtk2
+ return 0;
+ });
+ $self->{controls}->{quickFields}->signal_connect('key-press-event' => sub {
+ my ($widget, $event) = @_;
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+ my $state = $event->get_state;
+ if (($key =~ /Tab$/) && ($state =~ /shift-mask/))
+ {
+ $self->{controls}->{quickEntry}->grab_focus;
+ return 1;
+ }
+ # Let key be managed by Gtk2
+ return 0;
+ });
+ $quickBox->pack_start($self->{controls}->{quickEntry}, 0, 0, $GCUtils::halfMargin);
+ my $quickFieldsBox = new Gtk2::VBox(0,0);
+ $quickFieldsBox->set_border_width(0);
+ $quickFieldsBox->pack_start($self->{controls}->{quickFields}, 1, 0, 0);
+ $quickBox->pack_start($quickFieldsBox, 0, 0, 0);
+ $self->{parent}->{tooltips}->set_tip($self->{controls}->{quickEntry}, $self->{lang}->{ToolbarQuickSearchTooltip}, '');
+ $self->{parent}->{tooltips}->set_tip($self->{controls}->{quickFields}, $self->{lang}->{ToolbarQuickSearchTooltip}, '');
+ my $quickItem = new Gtk2::ToolItem;
+ $quickItem->add($quickBox);
+ $self->insert($quickItem, -1);
+ }
+ }
+ }
+ my $separator = Gtk2::SeparatorToolItem->new;
+ $separator->set_expand(1);
+ $separator->set_draw(0);
+
+ my $logoPixbuf = Gtk2::Gdk::Pixbuf->new_from_file($self->{parent}->{logosDir}.'/button.png');
+ my ($width, $height) = Gtk2::IconSize->lookup($self->get_icon_size);
+ $logoPixbuf = GCUtils::scaleMaxPixbuf($logoPixbuf, $width, $height);
+
+ my $logo = Gtk2::Image->new_from_pixbuf($logoPixbuf);
+ my $logoButton = new Gtk2::Button;
+ $logoButton->add($logo);
+ my $logoItem = new Gtk2::ToolItem;
+ $logoItem->add($logoButton);
+ $logoButton->set_relief('none');
+ $self->{parent}->{tooltips}->set_tip($logoButton,
+ $self->{lang}->{AboutTitle});
+ $logoButton->signal_connect('clicked' , sub {
+ $self->{parent}->about;
+ });
+
+ $self->insert($separator, -1);
+ $self->insert($logoItem, -1);
+ }
+
+ sub createUserFilters
+ {
+ my ($self, $model) = @_;
+ $self->{blocked} = 1;
+ if ($self->{controls}->{userFiltersOption})
+ {
+ $self->{userFilters} = $model->getUserFilters;
+ my $i = 0;
+ my @filters = map {{value => $i++,
+ displayed => $model->getDisplayedText($_->{name})}}
+ @{$self->{userFilters}};
+ $self->{controls}->{userFiltersOption}->setValues(\@filters);
+ }
+ $self->{blocked} = 0;
+ }
+
+ sub setShowFieldsSelection
+ {
+ my ($self, $value) = @_;
+ return;
+ return if ! $self->{controls}->{groupOption};
+ if ($value)
+ {
+ $self->{controls}->{groupLabel}->show;
+ $self->{groupBox}->show;
+ }
+ else
+ {
+ $self->{controls}->{groupLabel}->hide;
+ $self->{groupBox}->hide;
+ }
+ }
+
+ sub setSaveActive
+ {
+ my ($self, $value) = @_;
+ $self->{controls}->{'gtk-save'}->set_sensitive($value)
+ if $self->{controls}->{'gtk-save'};
+ }
+
+ sub setAddActive
+ {
+ my ($self, $value) = @_;
+ $self->{controls}->{'gtk-add'}->set_sensitive($value)
+ if $self->{controls}->{'gtk-add'};
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+ $self->{blocked} = 1;
+ $self->{model} = $model;
+ $self->{controls}->{groupOption}->setModel($model)
+ if $self->{controls}->{groupOption};
+ $self->setGroupField($model->{preferences}->groupBy, 1);
+
+ if ($self->{controls}->{quickFields})
+ {
+ $self->{controls}->{quickFields}->signal_handler_disconnect(
+ $self->{quickFieldsHandler}
+ ) if $self->{quickFieldsHandler};
+ $self->{controls}->{quickFields}->setModel($model);
+ $self->{controls}->{quickFields}->setValue($model->{preferences}->quickSearchField);
+ $self->{quickFieldsHandler} = $self->{controls}->{quickFields}->signal_connect(
+ 'changed' => sub {
+ my $value = $self->{controls}->{quickFields}->getValue;
+ $self->{model}->{preferences}->quickSearchField($value)
+ if $value;
+ });
+ }
+
+ if ($self->{controls}->{layoutOption})
+ {
+ my @panels = map {{value => $_,
+ displayed => $model->getDisplayedText($model->{panels}->{$_}->{label})}}
+ @{$model->{panelsNames}};
+ $self->{controls}->{layoutOption}->setValues(\@panels);
+ }
+
+ $self->createUserFilters($model);
+
+ # Update tooltip text
+ $self->{parent}->{tooltips}->set_tip($self->{controls}->{'gtk-add'},
+ $self->{lang}->{NewItemTooltip})
+ if $self->{controls}->{'gtk-add'};
+ $self->{parent}->{tooltips}->set_tip($self->{controls}->{'gtk-find'},
+ $self->{lang}->{SearchTooltip})
+ if $self->{controls}->{'gtk-find'};
+ $self->{parent}->{tooltips}->set_tip($self->{controls}->{'gtk-refresh'},
+ $self->{lang}->{ToolbarAllTooltip})
+ if $self->{controls}->{'gtk-refresh'};
+
+ # Update add button text
+ if ($self->{controls}->{'gtk-add'})
+ {
+ my $addText = $self->{lang}->{MenuAddItem};
+ $addText =~ s/\_//g;
+ my $widget = $self->{controls}->{'gtk-add'}->get_children;
+ while ($widget)
+ {
+ if ($widget->isa(Gtk2::Label::))
+ {
+ $widget->set_text($addText);
+ last;
+ }
+ elsif ($widget->isa(Gtk2::Image::))
+ {
+ last;
+ }
+ $widget = $widget->get_children;
+ }
+ }
+
+ # Hide tonight button if needed
+ if ($self->{controls}->{'gtk-execute'})
+ {
+ $self->{controls}->{'gtk-execute'}->show;
+ $self->{controls}->{'gtk-execute'}->hide if !$model->hasRandom;
+ }
+
+ # Hide play button if needed
+ if ($self->{controls}->{'gtk-media-play'})
+ {
+ $self->{controls}->{'gtk-media-play'}->show;
+ # Update button tooltip
+ $self->{parent}->{tooltips}->set_tip($self->{controls}->{'gtk-media-play'},
+ $self->{lang}->{PlayTooltip});
+ $self->{controls}->{'gtk-media-play'}->hide if !$model->hasPlay;
+ }
+
+ $self->{blocked} = 0;
+ }
+
+ sub setGroupField
+ {
+ my ($self, $field, $force) = @_;
+ my $i = 0;
+ return if (defined $self->{currentGroupField}) && ($self->{currentGroupField} eq $field) && !$force;
+ $self->{currentGroupField} = $field;
+ $self->{controls}->{groupOption}->setValue($field)
+ if $self->{controls}->{groupOption};
+ }
+
+ sub setItemsList
+ {
+ my ($self, $view) = @_;
+ return if ! $self->{controls}->{viewOption};
+ $self->{controls}->{viewOption}->setValue($view);
+ }
+
+ sub setLayout
+ {
+ my ($self, $layout) = @_;
+ return if ! $self->{controls}->{layoutOption};
+ $self->{controls}->{layoutOption}->setValue($layout);
+ }
+
+ sub setSize
+ {
+ my ($self, $size) = @_;
+
+ if ($size == 3)
+ {
+ $self->unset_icon_size;
+ }
+ else
+ {
+ $self->set_icon_size($size == 1 ? 'small-toolbar' : 'large-toolbar');
+ }
+ }
+
+ sub removeSearch
+ {
+ my $self = shift;
+ $self->{blocked} = 1;
+ $self->{controls}->{quickEntry}->setValue('')
+ if $self->{controls}->{quickEntry};
+ if ($self->{controls}->{userFiltersOption})
+ {
+ $self->{controls}->{userFiltersOption}->clear
+ if !$self->{controls}->{userFiltersOption}->{changeInProgress};
+ }
+ $self->{blocked} = 0;
+ }
+
+}
+
+
+{
+ package GCToolbarOptionsDialog;
+ use base 'GCDoubleListDialog';
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, 'Toolbar configuration', 1,
+ $parent->{lang}->{ImportExportFieldsUnused}, $parent->{lang}->{ImportExportFieldsUsed});
+
+ bless($self, $class);
+
+ $self->{separatorString} = $self->{parent}->{lang}->{ToolbarSeparator};
+
+ my $defaultButton = new GCButton->newFromStock('gtk-undo', 0, $parent->{lang}->{PanelRestoreDefault});
+ $defaultButton->set_border_width($GCUtils::margin);
+ $defaultButton->signal_connect('clicked' => sub {
+ $self->preFill;
+ });
+ my $clearButton = new GCButton->newFromStock('gtk-clear');
+ $clearButton->set_border_width($GCUtils::margin);
+ $clearButton->signal_connect('clicked' => sub {
+ $self->clearList;
+ });
+
+ $self->getDoubleList->addToPermanent($self->{separatorString});
+ $self->getDoubleList->setDataHandler($self);
+ $self->getDoubleList->addBottomButtons($defaultButton,$clearButton);
+
+ $self->{configFile} = $ENV{GCS_CONFIG_HOME}.'/'.$GCToolBar::CONFIGURATION_FILE;
+ $self->{conversionMap} = {};
+
+ my @separatorXpm = (
+ '16 16 3 1',
+ ' c None', '- c grey', '+ c black',
+ ' +- ', ' +- ', ' +- ', ' +- ',
+ ' +- ', ' +- ', ' +- ', ' +- ',
+ ' +- ', ' +- ', ' +- ', ' +- ',
+ ' +- ', ' +- ', ' +- ', ' +- ');
+ $self->{separatorPixbuf} = Gtk2::Gdk::Pixbuf->new_from_xpm_data(@separatorXpm);
+
+ return $self;
+ }
+
+ sub getInitData
+ {
+ my $self = shift;
+
+ return $self->getDataFromList([
+ 'ToolbarSeparator',
+ 'gtk-add', 'gtk-save', 'gtk-preferences',
+ 'gtk-find', 'gtk-refresh', 'gtk-execute', 'gtk-media-play',
+ 'gtk-new', 'gtk-open', 'gtk-properties', 'gtk-quit',
+ 'gtk-dnd', 'gtk-delete', 'gtk-find-and-replace',
+ 'gtk-help',
+ 'ToolbarGroupBy', 'ToolbarQuickSearch', 'OptionsView', 'OptionsLayout',
+ 'MenuSavedSearches'
+ ], 1);
+ }
+
+ sub getData
+ {
+ my $self = shift;
+ if (! -f $self->{configFile})
+ {
+ return $self->getDefaultData;
+ }
+ open CONFIG, $self->{configFile};
+ my @array;
+ foreach (<CONFIG>)
+ {
+ s/\s+$//;
+ push @array, $_;
+ }
+ close CONFIG;
+ return $self->getDataFromList(\@array);
+ }
+
+ sub getDefaultData
+ {
+ my $self = shift;
+ return $self->getDataFromList(\@GCToolBar::DEFAULT_CONTROLS);
+ }
+
+ sub saveList
+ {
+ my ($self, $list) = @_;
+
+ open CONFIG, '>',$self->{configFile};
+ foreach (@$list)
+ {
+ print CONFIG $self->{conversionMap}->{$_->[1]}, "\n";
+ }
+ close CONFIG;
+ }
+
+ sub preFill
+ {
+ my $self = shift;
+
+ my @data;
+ $self->getDoubleList->setListData($self->getDefaultData);
+ }
+
+ sub getDataFromList
+ {
+ my ($self, $list, $init) = @_;
+ my @data;
+ foreach my $id (@$list)
+ {
+ if ($id =~ /^gtk-/)
+ {
+ my $stockItem = Gtk2::Stock->lookup($id);
+ # Make sure string has model dependant parts translated:
+ (my $label = $self->{parent}->GCLang::getGenericModelString($stockItem->{label})) =~ s/_//g;
+ my $pixbuf = $self->{parent}->render_icon($id, 'menu');
+ push @data, [$pixbuf, $label];
+ $self->{conversionMap}->{$label} = $id if $init;
+ }
+ else
+ {
+ my $pixbuf = undef;
+ if ($id eq 'ToolbarSeparator')
+ {
+ $pixbuf = $self->{separatorPixbuf};
+ }
+ my $label = $self->{parent}->{lang}->{$id};
+ push @data, [$pixbuf, $label];
+ $self->{conversionMap}->{$label} = $id if $init;
+ }
+ }
+ return \@data;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCModel.pm b/lib/gcstar/GCModel.pm
new file mode 100644
index 0000000..2223e3e
--- /dev/null
+++ b/lib/gcstar/GCModel.pm
@@ -0,0 +1,2896 @@
+package GCModel;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCPlugins;
+
+use Storable;
+
+our $modelsSuffix = '.gcm';
+our $autoId = 'gcsautoid';
+our $autoField = 'GCSAuto';
+our $noneField = 'GCSNone';
+our $initDefault = 'DefaultNewItem';
+our $linkNameSeparator = '##';
+
+{
+ package GCModelLoader;
+
+ use GCUtils 'glob';
+ use XML::Simple;
+ $XML::Simple::PREFERRED_PARSER='XML::Parser';
+ #$XML::Simple::PREFERRED_PARSER='XML::SAX::Expat';
+
+ sub load
+ {
+ my ($self, $file) = @_;
+ open XML, $file;
+ binmode(XML, ':utf8');
+ $self->{xmlString} = do {local $/; <XML>};
+ $self->loadFromString;
+ close XML;
+ }
+
+ sub loadFromString
+ {
+ my $self = shift;
+ my $xs = XML::Simple->new;
+ return if ! $self->{xmlString};
+ $self->{collection} = $xs->XMLin($self->{xmlString},
+ ForceArray => ['item', 'values', 'filter', 'panel', 'group', 'field'],
+ KeyAttr => {
+ 'values' => 'id'
+ }
+ );
+ $self->doInitialization;
+ }
+
+ sub doInitialization
+ {
+ my $self = shift;
+ $self->{groups} = $self->{collection}->{groups}->{group};
+ $self->{fields} = $self->{collection}->{fields}->{field};
+ #$self->{filters} = $self->{collection}->{filters}->{filter};
+ $self->initFilters;
+ $self->{options} = $self->{collection}->{options};
+ $self->{commonFields} = $self->{collection}->{options}->{fields};
+ $self->{resultsFields} = $self->{collection}->{options}->{fields}->{results}->{field};
+ $self->{summaryFields} = $self->{collection}->{options}->{fields}->{summary}->{field};
+ $self->{defaultImage} = $ENV{GCS_SHARE_DIR}.'/logos/'.$self->{options}->{defaults}->{image};
+ $self->{userFiltersDir} = $ENV{GCS_DATA_HOME}.'/Filters/'.$self->getName;
+ $self->{random} = $self->{collection}->{random}->{filter};
+
+ my $lang = exists $self->{collection}->{lang} ? $self->{collection}->{lang} : "GCgeneric";
+ my $langName = $self->{parent}->{options}->lang;
+ my %tmpLang;
+
+ # The string should be splitted to avoid considering some scopped variables
+ eval "use GCLang::$langName"."::GCModels::$lang\n";
+ eval "%tmpLang = %GCLang::$langName"."::GCModels::".$lang."::lang";
+ $self->{lang} = \%tmpLang;
+
+ $self->loadPreferences;
+ #$self->checkMaster;
+ $self->addDefaultFields;
+ $self->addPredefinedValues;
+ $self->{searchFields} = 0;
+ $self->checkLending;
+ $self->checkTags;
+ $self->initFields;
+ $self->setDefaults;
+ $self->initPanels;
+ }
+
+ sub getSearchFields
+ {
+ my $self = shift;
+
+ if (!$self->{searchFields})
+ {
+ if (exists $self->{collection}->{options}->{fields}->{search})
+ {
+ $self->{searchFields} = [];
+ push @{$self->{searchFields}}, $_
+ foreach (@{$self->{collection}->{options}->{fields}->{search}->{field}})
+ }
+ else
+ {
+ $self->{searchFields} = [$self->{commonFields}->{title}];
+ }
+ }
+ return $self->{searchFields};
+ }
+
+ sub getSummaryFields
+ {
+ my $self = shift;
+
+ if (!$self->{summaryFields})
+ {
+ $self->{summaryFields} = [];
+ for my $field (@{$self->{resultsFields}})
+ {
+ next if $field eq $self->{commonFields}->{title};
+ push @{$self->{summaryFields}}, $field;
+ }
+ }
+ return $self->{summaryFields};
+ }
+
+ sub isSearchField
+ {
+ my ($self, $field) = @_;
+ foreach (@{$self->getSearchFields})
+ {
+ return 1 if $field eq $_;
+ }
+ return 0;
+ }
+
+ sub hasRandom
+ {
+ my $self = shift;
+ return ($self->{random} && (scalar @{$self->{random}})) ? 1 : 0;
+ }
+
+ sub hasPlay
+ {
+ my $self = shift;
+ return ($self->{commonFields}->{play}) ? 1 : 0;
+ }
+
+ sub saveToFile
+ {
+ my ($self, $file) = @_;
+
+ if (!open DATA, '>'.$file)
+ {
+ print "Could not save collection description in $file\n";
+ return 0;
+ }
+ binmode(DATA, ':utf8');
+ print DATA '<?xml version="1.0" encoding="UTF-8"?>
+';
+ print DATA $self->toString('collection', 1);
+ close DATA;
+ $self->{isInline} = 0;
+ }
+
+ sub setFields
+ {
+ my ($self, $fields, $hasLending, $hasTags) = @_;
+ #Force panel generation
+ delete $self->{collection}->{panels}->{panel};
+ $self->{collection}->{fields}->{field} = $fields;
+ $self->{collection}->{fields}->{lending} = ($hasLending ? 'true' : 'false');
+ $self->{collection}->{fields}->{tags} = ($hasTags ? 'true' : 'false');
+ $self->doInitialization;
+ }
+
+ sub setGroups
+ {
+ my ($self, $groups) = @_;
+
+ $self->{collection}->{groups}->{group} = $groups;
+ }
+
+ sub setOptions
+ {
+ my ($self, $fields, $defaultImage) = @_;
+ $self->{collection}->{options}->{fields} = $fields;
+ $self->{collection}->{options}->{defaults}->{image} = $defaultImage;
+ }
+
+ sub getCommonFields
+ {
+ my $self = shift;
+
+ return $self->{collection}->{options}->{fields};
+ }
+
+ sub getOriginalCollection
+ {
+ my ($self, $withPanel) = @_;
+ #First we clone our collection to do remove everything that have been auto-generated
+ my $collection = Storable::dclone($self->{collection});
+ foreach (@{$collection->{fields}->{field}})
+ {
+ delete $_->{hasHistory};
+ }
+ delete $collection->{panels} if ! $withPanel;
+ if ($self->{hasLending})
+ {
+ my @fields = @{$collection->{fields}->{field}};
+ for (my $i = 0; $i <= $#fields; $i++)
+ {
+ delete $collection->{fields}->{field}->[$i]
+ if $fields[$i]->{group} eq 'lending';
+ }
+ delete $collection->{groups}->{group}->[(scalar @{$collection->{groups}->{group}}) - 1];
+ }
+ if ($self->{hasTags})
+ {
+ my @fields = @{$collection->{fields}->{field}};
+ for (my $i = 0; $i <= $#fields; $i++)
+ {
+ delete $collection->{fields}->{field}->[$i]
+ if $fields[$i]->{group} eq 'tagpanel';
+ }
+ delete $collection->{groups}->{group}->[(scalar @{$collection->{groups}->{group}}) - 1];
+ }
+ if ($self->{defaultModifier})
+ {
+ delete $collection->{fields}->{lending};
+ delete $collection->{fields}->{tags};
+ delete $collection->{options};
+ delete $collection->{random};
+ }
+ return $collection;
+ }
+
+ sub getAddedFields
+ {
+ my $self = shift;
+ return [] if ! $self->{addedModel};
+ return $self->{addedModel}->{collection}->{fields}->{field};
+ }
+
+ sub getAddedGroups
+ {
+ my $self = shift;
+ return {} if ! $self->{addedModel};
+ return $self->{addedModel}->getGroups;
+ }
+
+ sub toString
+ {
+ my ($self, $root, $withPanel) = @_;
+ my $xs = XML::Simple->new;
+ my $collection = $self->getOriginalCollection($withPanel);
+ my $xmlData = $xs->XMLout($collection,
+ RootName => $root,
+ KeyAttr => {'group' => '',
+ 'values' => 'id'
+ });
+ if ($self->{defaultModifier})
+ {
+ $xmlData =~ s|(</?)item|$1userItem|g;
+ }
+ return $xmlData;
+ }
+
+ sub toStringAddedFields
+ {
+ my ($self, $root) = @_;
+ if (($self->{addedModel})
+ && exists $self->{addedModel}->{fieldsNames}
+ && scalar @{$self->{addedModel}->{fieldsNames}})
+ {
+ return $self->{addedModel}->toString($root, 1);
+ }
+ else
+ {
+ return '';
+ }
+ }
+
+ sub loadPreferences
+ {
+ my $self = shift;
+ if (! $self->{isInline})
+ {
+ $self->{configFile} = $ENV{GCS_CONFIG_HOME}.'/GCModels/'.$self->getName.'.conf';
+ $self->{preferences} = new GCOptionLoader($self->{configFile}, 0, $self->{parent}->{options});
+ }
+ $self->{defaultValuesFile} = $ENV{GCS_CONFIG_HOME}.'/GCModels/'.$self->getName.'.default.gcs';
+ }
+
+ sub setDefaults
+ {
+ my $self = shift;
+
+ $self->{fieldsInfo}->{$self->{commonFields}->{title}}->{init} = $GCModel::initDefault
+ if ! $self->{fieldsInfo}->{$self->{commonFields}->{title}}->{init};
+
+ $self->{preferences}->groupBy($self->{options}->{defaults}->{groupby})
+ if ! $self->{preferences}->exists('groupBy');
+
+ $self->{preferences}->quickSearchField($self->{commonFields}->{title})
+ if ! $self->{preferences}->exists('quickSearchField');
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+ return (!$self->{fields} || ((scalar @{$self->{fields}}) == 0));
+ }
+
+ sub isPersonal
+ {
+ my $self = shift;
+ return ($self->{isInline} || $self->{isPersonal});
+ }
+
+ sub isInline
+ {
+ my $self = shift;
+ return $self->{isInline};
+ }
+
+ sub initFields
+ {
+ my $self = shift;
+
+ my @fieldsNames;
+ my %fieldsInfo;
+ my @fieldsHistory;
+ my @fieldsNotNull;
+ my @fieldsNotFormatted;
+ my @fieldsImage;
+ my @fieldsDate;
+ my @managedImages;
+ my $name;
+ foreach (@{$self->{fields}})
+ {
+ $name = $_->{value};
+ push @fieldsNames, $name;
+ $fieldsInfo{$name} = $_;
+ $fieldsInfo{$name}->{displayed} = $self->getDisplayedText($fieldsInfo{$name}->{label});
+ if (($_->{type} =~ /history/)
+ || (
+ ($_->{type} =~ /list/)
+ && ((!exists $_->{history}) || ($_->{history} ne 'false'))
+ ))
+ {
+ push @fieldsHistory, $name;
+ $fieldsInfo{$name}->{hasHistory} = 1;
+ }
+ elsif ($_->{type} eq 'image')
+ {
+ push @fieldsImage, $name;
+ push @managedImages, $name if (exists $_->{imported}) && ($_->{imported} eq 'true');
+ }
+ elsif ($_->{type} eq 'date')
+ {
+ push @fieldsDate, $name;
+ }
+ push @fieldsNotNull, $name
+ if (exists $_->{notnull}) && ($_->{notnull} eq 'true');
+ push @fieldsNotFormatted, $name
+ if ((!exists $_->{type}) || ($_->{type} ne 'formatted'));
+ }
+ $self->{fieldsNames} = \@fieldsNames;
+ $self->{fieldsInfo} = \%fieldsInfo;
+ $self->{fieldsHistory} = \@fieldsHistory;
+ $self->{fieldsNotNull} = \@fieldsNotNull;
+ $self->{fieldsNotFormatted} = \@fieldsNotFormatted;
+ $self->{managedImages} = \@managedImages;
+ $self->{fieldsImage} = \@fieldsImage;
+ $self->{fieldsDate} = \@fieldsDate;
+ }
+
+ sub setFilters
+ {
+ my ($self, $filters) = @_;
+ $self->{filters} = [];
+ $self->{filtersGroup} = [];
+ my %existingGroups = ();
+ my $idxGroup = 0;
+ # The filters have not groups. And we need to do some copy here
+ #foreach (keys %$filters)
+ foreach (@{$self->{fieldsNames}})
+ {
+ next if ! exists $filters->{$_};
+ my $filter = {
+ field => $_,
+ comparison => $filters->{$_}->{comparison},
+ numeric => $filters->{$_}->{numeric},
+ quick => $filters->{$_}->{quick}
+ };
+ $filter->{labelselect} = $filters->{$_}->{labelselect} if $filters->{$_}->{labelselect};
+ push @{$self->{filters}}, $filter;
+ my $group = $self->{fieldsInfo}->{$_}->{group};
+ if (! exists $existingGroups{$group})
+ {
+ $existingGroups{$group} = $idxGroup;
+ $self->{filtersGroup}->[$idxGroup] = {label => $group};
+ $idxGroup++;
+ }
+ push @{$self->{filtersGroup}->[$existingGroups{$group}]->{filter}}, $filter;
+ }
+ $self->{collection}->{filters}->{group} = $self->{filtersGroup};
+ }
+
+ sub initFilters
+ {
+ my $self = shift;
+
+ for my $group (@{$self->{collection}->{filters}->{group}})
+ {
+ foreach (@{$group->{filter}})
+ {
+ push @{$self->{filters}}, $_;
+ }
+ }
+ $self->{filtersGroup} = $self->{collection}->{filters}->{group};
+ }
+
+ sub getUserFilters
+ {
+ my $self = shift;
+ # Deactive user filters for personal collections without a name
+ return [] if ! $self->getName;
+ if (!$self->{userFilters})
+ {
+ my @filters;
+ mkdir $self->{userFiltersDir};
+ foreach my $filterFile(sort {uc($a) cmp uc($b)} glob($self->{userFiltersDir}.'/*'))
+ {
+ my $xs = XML::Simple->new;
+ my $filter = $xs->XMLin($filterFile,
+ ForceArray => ['info', 'filter']);
+ $self->{isUserFilterSaved}->{$filter->{name}} = 1;
+ foreach my $info (@{$filter->{info}})
+ {
+ $info->{filter}->[1] = 0 if ref $info->{filter}->[1] eq 'HASH';
+ $info->{filter}->[2] = undef if ref $info->{filter}->[2] eq 'HASH';
+ }
+ push @filters, $filter;
+ }
+ $self->{userFilters} = \@filters;
+ }
+ return $self->{userFilters};
+ }
+
+ sub filterNameToFile
+ {
+ my ($self, $name) = @_;
+ my $fileName = GCUtils::getSafeFileName($name);
+ return $self->{userFiltersDir}."/$fileName";
+ }
+
+ sub saveUserFilters
+ {
+ my $self = shift;
+ my $xs = XML::Simple->new;
+ foreach my $filter(@{$self->{userFilters}})
+ {
+ next if $self->{isUserFilterSaved}->{$filter->{name}};
+ $xs->XMLout($filter,
+ RootName => 'search',
+ OutputFile => $self->filterNameToFile($filter->{name}));
+ $self->{isUserFilterSaved}->{$filter->{name}} = 1;
+ }
+ }
+
+ sub setUserFilters
+ {
+ my ($self, $filters) = @_;
+ $self->{userFilters} = $filters;
+ # Make sure they will be saved if needed
+ foreach my $filter(@$filters)
+ {
+ $self->{isUserFilterSaved}->{$filter->{name}} = $filter->{saved};
+ # This should not be saved
+ delete $filter->{saved};
+ }
+ }
+
+ sub addUserFilter
+ {
+ my ($self, $filter) = @_;
+ push (@{$self->{userFilters}}, $filter);
+ my @sorted = sort {uc($a->{name}) cmp uc($b->{name})} @{$self->{userFilters}};
+ $self->{userFilters} = \@sorted;
+ $self->{isUserFilterSaved}->{$filter->{name}} = 0;
+ }
+
+ sub deleteUserFilters
+ {
+ my ($self, $names) = @_;
+ foreach my $name(@$names)
+ {
+ unlink $self->filterNameToFile($name);
+ }
+ }
+
+ sub existsUserFilter
+ {
+ my ($self, $name) = @_;
+ return 1 if exists $self->{isUserFilterSaved}->{$name};
+ return 1 if -e $self->filterNameToFile($name);
+ }
+
+ sub addDefaultFields
+ {
+ my $self = shift;
+ return if $self->isEmpty || $self->{defaultModifier};
+ if (! $self->{commonFields}->{id})
+ {
+ $self->{commonFields}->{id} = $GCModel::autoId;
+ push @{$self->{fields}},
+ {
+ value => $self->{commonFields}->{id},
+ type => 'number',
+ label => '',
+ init => '',
+ group => '',
+ imported => 'false'
+ };
+ }
+ }
+
+ sub addPredefinedValues
+ {
+ my $self = shift;
+
+ # Add file size units if needed
+ my @array;
+ my $val = 0;
+ foreach (@{$self->{parent}->{lang}->{PropertiesFileSizeSymbols}})
+ {
+ push @array,
+ {displayed => $_, content => $val++};
+ }
+ $self->{collection}->{options}->{values}->{filesizeunits}->{value} = \@array;
+ }
+
+ sub removeAddedFields
+ {
+ my $self = shift;
+ return if ! $self->{addedModel};
+ delete $self->{addedModel}->{collection}->{panels}->{panel};
+ foreach my $container('fieldsNames', 'fieldsHistory', 'fieldsNotNull',
+ 'fieldsNotFormatted', 'managedImages', 'fieldsImage')
+ {
+ my @filtered = grep(!/gcsfield/, @{$self->{$container}});
+ $self->{$container} = \@filtered;
+ }
+ foreach (keys %{$self->{panels}})
+ {
+ if ($_ eq 'form')
+ {
+ if ($self->{formNotebook})
+ {
+ my @filtered = grep(!$_->{userDefined}, @{$self->{formNotebook}->{item}});
+ $self->{formNotebook}->{item} = \@filtered;
+ }
+ }
+ else
+ {
+ my @filtered = grep(!$_->{userDefined}, @{$self->{panels}->{$_}->{item}});
+ $self->{panels}->{$_}->{item} = \@filtered;
+ }
+ }
+ my $addedModel = $self->{addedModel};
+ delete $self->{addedModel};
+ return $addedModel;
+ }
+
+ sub updateAddedFields
+ {
+ my ($self, $fields, $groups) = @_;
+
+ # First clean what we previously added
+ my $addedModel = $self->removeAddedFields;
+
+ if (!$addedModel)
+ {
+ # We didn't have one previously. We need to create it.
+ $addedModel = GCModelLoader->newEmpty($self->{parent}, {defaultModifier => 1});
+ }
+ $addedModel->setGroups($groups);
+ $addedModel->setFields($fields);
+
+ $self->addFields($addedModel);
+ }
+
+ sub addFields
+ {
+ my ($self, $model) = @_;
+ # Fields are stored in another model
+
+ $self->{addedModel} = $model;
+
+ return if ! scalar @{$model->{fieldsNames}};
+
+ # Groups part
+ my %groups = map { $_->{id} => 1 } @{$self->{groups}};
+ foreach (@{$model->{groups}})
+ {
+ push @{$self->{groups}}, $_
+ if !exists $groups{$_->{id}};
+ }
+
+ # initFields part
+ foreach(@{$model->{fieldsNames}})
+ {
+ push @{$self->{fieldsNames}}, $_;
+ $self->{fieldsInfo}->{$_} = $model->{fieldsInfo}->{$_};
+ }
+ push @{$self->{fieldsHistory}}, @{$model->{fieldsHistory}};
+ push @{$self->{fieldsNotNull}}, @{$model->{fieldsNotNull}};
+ push @{$self->{fieldsNotFormatted}}, @{$model->{fieldsNotFormatted}};
+ push @{$self->{managedImages}}, @{$model->{managedImages}};
+ push @{$self->{fieldsImage}}, @{$model->{fieldsImage}};
+
+ # initPanels part
+ foreach (keys %{$model->{panels}})
+ {
+ # We mark them to be able to remove them later
+ foreach my $container(@{$model->{panels}->{$_}->{item}})
+ {
+ $container->{userDefined} = 1;
+ }
+
+ if ($_ eq 'form')
+ {
+ # Search the main notebook
+ sub getNotebook
+ {
+ my $item = shift;
+ return $item if $item->{type} eq 'notebook';
+ foreach my $child(@{$item->{item}})
+ {
+ my $notebook = getNotebook($child);
+ return $notebook if $notebook;
+ }
+ return undef;
+ }
+ $self->{formNotebook} = getNotebook($self->{panels}->{$_});
+ push @{$self->{formNotebook}->{item}}, @{$model->{panels}->{$_}->{item}};
+ }
+ else
+ {
+ push @{$self->{panels}->{$_}->{item}}, @{$model->{panels}->{$_}->{item}};
+ }
+ }
+ }
+
+ sub checkLending
+ {
+ my $self = shift;
+ $self->{hasLending} = 0;
+ return if ! ($self->{collection}->{fields}->{lending} eq 'true');
+ $self->{hasLending} = 1;
+
+ # Add group
+ push @{$self->{groups}}, {
+ id => 'lending',
+ label => 'PanelLending'
+ };
+
+ # Add lending fields
+ push @{$self->{fields}}, (
+ {
+ value => 'borrower',
+ type => 'options',
+ label => 'PanelBorrower',
+ init => 'none',
+ group => 'lending',
+ imported => 'false'
+ },
+ {
+ value => 'lendDate',
+ type => 'date',
+ label => 'PanelLendDate',
+ init => '',
+ group => 'lending',
+ imported => 'false'
+ },
+ {
+ value => 'borrowings',
+ type => 'triple list',
+ label => 'PanelHistory',
+ label1 => 'PanelBorrower',
+ label2 => 'PanelLendDate',
+ label3 => 'PanelReturnDate',
+ init => '',
+ group => 'lending',
+ imported => 'false'
+ },
+ );
+
+ # Set fields names
+ $self->{commonFields}->{borrower} = {
+ name => 'borrower',
+ date => 'lendDate',
+ history => 'borrowings'
+ };
+ }
+
+ sub checkTags
+ {
+ my $self = shift;
+ $self->{hasTags} = 0;
+ return if ! ($self->{collection}->{fields}->{tags} eq 'true');
+ $self->{hasTags} = 1;
+
+ # Add group
+ push @{$self->{groups}}, {
+ id => 'tagpanel',
+ label => 'PanelTags'
+ };
+ # Add tag fields
+ push @{$self->{fields}}, (
+ {
+ value => 'favourite',
+ type => 'yesno',
+ label => 'PanelFavourite',
+ init => '0',
+ group => 'tagpanel',
+ imported => 'false'
+ },
+ {
+ value => 'tags',
+ type => 'single list',
+ label => 'TagsAssigned',
+ init => '',
+ group => 'tagpanel',
+ imported => 'false'
+ },
+ );
+
+ # Add filter
+ push @{$self->{filters}}, (
+ {
+ field => 'tags',
+ comparison => 'contain',
+ quick => 'true',
+ numeric => 'false'
+ },
+ {
+ field => 'favourite',
+ comparison => 'contain',
+ quick => 'true',
+ numeric => 'false'
+ },
+ );
+
+ }
+
+ sub initPanels
+ {
+ my $self = shift;
+ $self->createDefaultPanel if !$self->{collection}->{panels}->{panel};
+ return if !$self->{collection}->{panels}->{panel};
+ my @panels = @{$self->{collection}->{panels}->{panel}};
+ $self->{panelsNames} = [];
+ $self->{panels} = {};
+ foreach (@panels)
+ {
+ push @{$self->{panelsNames}}, $_->{name};
+ $self->{panels}->{$_->{name}} = $_;
+ }
+ }
+
+ sub createDefaultPanel
+ {
+ my $self = shift;
+ return if (! $self->{commonFields}->{title}) && (!$self->{defaultModifier});
+ my $panel;
+ $panel->{name} = 'form';
+ $panel->{label} = 'PanelForm';
+ $panel->{editable} = 'true';
+ my @items;
+
+ if (!$self->{defaultModifier})
+ {
+ my $header = {type => 'line'};
+ push @{$header->{item}}, {
+ type => 'value',
+ for => $self->{commonFields}->{id},
+ width => '5'
+ }
+ if $self->{commonFields}->{id} && ($self->{commonFields}->{id} ne $GCModel::autoId);
+ push @{$header->{item}}, {
+ type => 'value',
+ for => $self->{commonFields}->{title},
+ expand => 'true'
+ };
+ push @items, $header;
+ }
+
+ my $fields = $self->getDisplayedInfo;
+ my $notebook;
+ my $hasTabs;
+ if ($self->{defaultModifier})
+ {
+ $hasTabs = 1;
+ $notebook = undef;
+ }
+ else
+ {
+ $hasTabs = (scalar @$fields > 1);
+ if ($hasTabs)
+ {
+ $notebook = {type => 'notebook', expand => 'true'};
+ }
+ }
+
+ my $i = 0;
+ my $infoFrame;
+ foreach (@{$fields})
+ {
+ next if (($_->{id} eq 'lending') || ($_->{id} eq 'tagpanel'));
+ my $tab;
+ if ($hasTabs)
+ {
+ $tab = {type => 'tab', value => 'bla', title => $_->{title}, expand => 'true'};
+ }
+ else
+ {
+ $tab = {type => 'box', expand => 'true'};
+ $notebook = $tab;
+ }
+ my $tabRank = 0;
+ my $hasInfoFrame = 0;
+ if ($i == 0 && $self->{commonFields}->{cover})
+ {
+ $tab->{item} = [
+ {type => 'line', item => [{type => 'value',
+ for => $self->{commonFields}->{cover},
+ width => 150,
+ height => 150}]},
+ {type => 'table', cols => '2'}
+ ];
+ $infoFrame = {type => 'frame', cols => '2'};
+ push @{$tab->{item}->[0]->{item}}, $infoFrame;
+ $tabRank = 1;
+ $hasInfoFrame = 1;
+ }
+ else
+ {
+ $tab->{item} = [{type => 'table', cols => '4', expand => 'true'}];
+ }
+ my $row = 0;
+ my $frameRow = 0;
+ foreach my $item (@{$_->{items}})
+ {
+ next if ($item->{id} eq $self->{commonFields}->{id})
+ || ($item->{id} eq $self->{commonFields}->{title})
+ || ($item->{id} eq $self->{commonFields}->{cover})
+ || ($item->{id} eq $self->{commonFields}->{url});
+ my $type = $self->{fieldsInfo}->{$item->{id}}->{type};
+ my $longField = ($type eq 'long text') || ($type eq 'image')
+ || ($type =~ /list$/);
+ my $label = undef;
+ $label = {type => 'label', for => $item->{id},
+ col => '0'} if $type ne 'yesno';
+ my $value = {type => 'value', for => $item->{id},
+ col => ($label ? 1 : 0), expand => 'true',
+ colspan => ($label ? 1 : 2)};
+ my $extra = undef;
+ if ($type eq 'file')
+ {
+ # Add launcher next to file chooser field
+ $extra = {type => 'launcher', for => $item->{id}, col => '2'};
+ }
+ if ($hasInfoFrame && ($frameRow < 5) && ! $longField)
+ {
+ if ($label)
+ {
+ $label->{row} = $frameRow;
+ push @{$infoFrame->{item}}, $label;
+ }
+ $value->{row} = $frameRow;
+ push @{$infoFrame->{item}}, $value;
+ if ($extra)
+ {
+ $extra->{row} = $frameRow;
+ push @{$infoFrame->{item}}, $extra;
+ }
+ $frameRow++;
+ }
+ else
+ {
+ if (($type =~ /list$/) && ($self->{fieldsInfo}->{$item->{id}}->{flat} eq 'true'))
+ {
+ my $label =
+ push @{$tab->{item}->[$tabRank]->{item}},
+ {type => 'expander', title => $self->{fieldsInfo}->{$item->{id}}->{label},
+ collapsed => '%'.$item->{id}.'%',
+ row => $row, col => 0, colspan => 3,
+ item => [
+ {type => 'value', for => $item->{id}}
+ ]
+ };
+ }
+ else
+ {
+ my ($colspan, $expand);
+ if ($longField)
+ {
+ $value->{colspan} = 3;
+ }
+ else
+ {
+ $value->{expand} = 'default';
+ }
+ if ($label)
+ {
+ $label->{row} = $row;
+ push @{$tab->{item}->[$tabRank]->{item}}, $label;
+ }
+ $value->{row} = $row;
+ push @{$tab->{item}->[$tabRank]->{item}}, $value;
+ if ($extra)
+ {
+ $extra->{row} = $row;
+ push @{$tab->{item}->[$tabRank]->{item}}, $extra;
+ }
+ }
+ $row++;
+ }
+ }
+ $tab->{item}->[$tabRank]->{rows} = $row;
+ if ($hasTabs)
+ {
+ if ($self->{defaultModifier})
+ {
+ push @items, $tab;
+ }
+ else
+ {
+ push @{$notebook->{item}}, $tab;
+ }
+ }
+ $i++;
+ }
+ if ($self->{hasLending})
+ {
+ my $tab = {type => 'tab', value => 'lending',
+ title => 'PanelLending',
+ item => [
+ {type => 'table', rows => '3',
+ item => [
+ {type => 'label', for => 'borrower', row => '0', col => '0'},
+ {type => 'value', for => 'borrower', row => '0', col => '1'},
+ {type => 'special', for => 'mailButton', row => '0', col => '2'},
+ {type => 'label', for => 'lendDate', row => '1', col => '0'},
+ {type => 'value', for => 'lendDate', row => '1', col => '1'},
+ {type => 'special', for => 'itemBackButton', row => '1', col => '2'}
+ ]
+ },
+ {type => 'label', for => 'borrowings', align => 'left'},
+ {type => 'line', expand => 'true',
+ item => [
+ {type => 'box', width => '64'},
+ {type => 'value', for => 'borrowings', expand => 'true'},
+ {type => 'box', width => '64'}
+ ]
+ }
+ ]
+ };
+ push @{$notebook->{item}}, $tab
+ }
+
+ if ($self->{hasTags})
+ {
+ my $tab = {type => 'tab', value => 'tagpanel',
+ title => 'PanelTags',
+ item => [
+ {type => 'line',
+ item => [
+ {type => 'value', for => 'favourite'}
+ ]
+ },
+ {type => 'value', for => 'tags', expand => 'true'}
+ ]
+ };
+ push @{$notebook->{item}}, $tab
+ }
+
+ if (!$self->{defaultModifier})
+ {
+ push @items, $notebook;
+ my $footer = {type => 'line',
+ item => [
+ {
+ type => 'special',
+ for => 'deleteButton',
+ expand => 'true'
+ }
+ ]
+ };
+
+ unshift @{$footer->{item}}, {
+ type => 'value',
+ for => $self->{commonFields}->{url},
+ expand => 'true'
+ } if $self->{commonFields}->{url};
+
+ push @items, $footer;
+ }
+
+ $panel->{item} = \@items;
+ $self->{collection}->{panels}->{panel}->[0] = $panel;
+ $self->createDefaultReadOnlyPanel;
+ }
+
+ sub createDefaultReadOnlyPanel
+ {
+ my $self = shift;
+ return if (! $self->{commonFields}->{title}) && (!$self->{defaultModifier});
+ my $panel;
+ $panel->{name} = 'readonly';
+ $panel->{label} = 'PanelReadOnly';
+ $panel->{editable} = 'false';
+ my @items;
+
+ if (!$self->{defaultModifier})
+ {
+ my $header = {
+ type => 'line', item => [
+ {type => 'value', for => $self->{commonFields}->{title},
+ style => 'header', row => 0, col => 0, colspan => 3,
+ expand => 'true'}
+ ]
+ };
+ push @items, $header;
+ }
+
+ my $fields = $self->getDisplayedInfo;
+ my $i = 0;
+ my $infoTable;
+ my $currentTable;
+ foreach (@{$fields})
+ {
+ $infoTable = 0;
+ next if (($_->{id} eq 'lending') || ($_->{id} eq 'tagpanel'));
+ my $container;
+ my $inExpander = 0;
+ if (($i == 0) && (!$self->{defaultModifier}))
+ {
+ if ($self->{commonFields}->{cover})
+ {
+ my $line = {type => 'line',
+ item => [
+ {type => 'box', width => '150', style => 'page',
+ item => [
+ {type => 'value', width => '140', for => $self->{commonFields}->{cover}}
+ ]
+ }
+ ]
+ };
+ my $infoBox = {type => 'box', expand => 'true', item => []};
+ $infoTable = {type => 'table', cols => '2', expand => 'true'};
+ push @{$infoBox->{item}}, $infoTable;
+ push @{$line->{item}}, $infoBox;
+ push @items, $line;
+ }
+ $container = {type => 'table', cols => '2', expand => 'true'};
+ push @items, $container;
+ }
+ else
+ {
+ my $expander = {type => 'expander', title => $_->{title},
+ item => [
+ {type => 'table', cols => 2, expand => 'true', item => []}
+ ]
+ };
+ push @items, $expander;
+ $container = $expander->{item}->[0];
+ $inExpander = 1;
+ }
+ my $row = 0;
+ my $infoRow = 0;
+ foreach my $item (@{$_->{items}})
+ {
+ next if ($item->{id} eq $self->{commonFields}->{title})
+ || ($item->{id} eq $self->{commonFields}->{cover})
+ || ($item->{id} eq $self->{commonFields}->{url});
+ my $type = $self->{fieldsInfo}->{$item->{id}}->{type};
+ my $longField = ($type eq 'long text') || ($type eq 'image')
+ || ($type =~ /list$/o);
+ my $label = undef;
+ $label = {type => 'label', for => $item->{id},
+ col => '0'};
+ my $value = {type => 'value', for => $item->{id},
+ col => 1, expand => 'true', flat => ($item->{flat} || 'false'),
+ colspan => 1};
+ if ($infoTable && ($infoRow < 5) && ! $longField)
+ {
+ $label->{row} = $infoRow;
+ push @{$infoTable->{item}}, $label;
+ $value->{row} = $infoRow;
+ push @{$infoTable->{item}}, $value;
+ $infoRow++;
+ }
+ else
+ {
+ my ($colspan, $expand);
+ $label->{row} = $row;
+ $value->{row} = $row;
+ push @{$container->{item}}, $label;
+ push @{$container->{item}}, $value;
+ $row++;
+ }
+ }
+ $container->{rows} = $row;
+ $i++;
+ }
+ if ($self->{hasLending})
+ {
+ my $lendingExpander = {
+ type => 'expander',
+ title => 'PanelLending',
+ item => [
+ {type => 'table', rows => '4', cols => '2',
+ item => [
+ {type => 'label', for => 'borrower', row => '0', col => '0'},
+ {type => 'value', for => 'borrower', row => '0', col => '1', expand => 'true'},
+ {type => 'label', for => 'lendDate', row => '1', col => '0'},
+ {type => 'value', for => 'lendDate', row => '1', col => '1', expand => 'true'},
+ {type => 'line', row => '2', col => '0', colspan => '2', height => '12', expand => 'true'},
+ {type => 'line', row => '2', col => '0', colspan => '2', expand => 'true',
+ item => [
+ {type => 'box', width => '50', style => 'page'},
+ {type => 'value', for => 'borrowings', expand => 'true'},
+ {type => 'box', width => '50', style => 'page'},
+ ]
+ }
+ ]
+ }
+ ]
+ };
+ push @items, $lendingExpander;
+ }
+ if ($self->{hasTags})
+ {
+ my $tagsExpander = {
+ type => 'expander',
+ title => 'PanelTags',
+ item => [
+ {type => 'value', for => 'tags', expand => 'true'}
+ ]
+ };
+ push @items, $tagsExpander;
+ }
+
+ $panel->{item} = \@items;
+ $self->{collection}->{panels}->{panel}->[1] = $panel;
+ }
+
+ sub getGroups
+ {
+ my $self = shift;
+
+ if (!$self->{groupsHash})
+ {
+ $self->{groupsHash} = {};
+ foreach (@{$self->{groups}})
+ {
+ $self->{groupsHash}->{$_->{id}} = {
+ id => $_->{id},
+ label => $_->{label},
+ displayed => $self->getDisplayedText($_->{label})
+ };
+ }
+ }
+ return $self->{groupsHash};
+ }
+
+ sub getDefaultPanel
+ {
+ my $self = shift;
+ return $self->{panels}->{$self->{panelsNames}->[0]};
+ }
+
+ sub getName
+ {
+ my $self = shift;
+ return $self->{collection}->{name};
+ }
+
+ sub getDescription
+ {
+ my $self = shift;
+ my $description = $self->{collection}->{description} ?
+ $self->{collection}->{description} : $self->getDisplayedText('CollectionDescription');
+ return $description eq 'CollectionDescription' ? $self->getName : $description;
+ }
+
+ sub getDisplayedText
+ {
+ my ($self, $id) = @_;
+
+ return $self->{fieldsInfo}->{lc $id}->{displayed}
+ if $id =~ /^gcsfield/i;
+ return $self->{lang}->{$id} if exists $self->{lang}->{$id};
+ return $self->{parent}->{lang}->{$id} if exists $self->{parent}->{lang}->{$id};
+ return $id;
+ }
+
+ sub getDisplayedLabel
+ {
+ my ($self, $field) = @_;
+
+ return $self->getDisplayedText($self->{fieldsInfo}->{$field}->{label})
+ if exists $self->{fieldsInfo}->{$field};
+ return $self->getGroups->{$field}->{displayed}
+ if exists $self->getGroups->{$field};
+ return $self->getDisplayedText($field);
+ }
+
+ sub getDisplayedValue
+ {
+ my ($self, $values, $value) = @_;
+ foreach (@{$self->{collection}->{options}->{'values'}->{$values}->{value}})
+ {
+ return $self->getDisplayedText($_->{displayed}) if $_->{content} eq $value;
+ }
+ return "";
+ }
+
+ sub getDisplayedItems
+ {
+ my ($self, $number) = @_;
+ $number = 'X' if !defined $number;
+ return 'Items' if !exists $self->{lang}->{Items};
+ my $items = $self->{lang}->{Items};
+ if (ref($items) eq 'HASH')
+ {
+ return $items->{$number} if exists $items->{$number};
+ return $items->{X};
+ }
+ elsif (ref($items) eq 'CODE')
+ {
+ # Example of Items definition:
+ #Items => sub {
+ # my $number = shift;
+ # return 'Movie' if $number < 2;
+ # return 'Movies';
+ #},
+
+ return $items->($number);
+ }
+ else
+ {
+ return $items;
+ }
+ }
+
+ sub getValues
+ {
+ my ($self, $id) = @_;
+ my @result;
+ if ($id eq $self->{commonFields}->{borrower}->{name})
+ {
+ @result = (
+ {value => '', displayed => ''},
+ {value => 'none', displayed => $self->getDisplayedText('PanelNobody')}
+ );
+ my @borrowers = split m/\|/, $self->{parent}->{options}->borrowers;
+ foreach (@borrowers)
+ {
+ push @result, {value => $_, displayed => $_};
+ }
+ push @result, {value => 'unknown', displayed => $self->getDisplayedText('PanelUnknown')};
+ }
+ else
+ {
+ if ($id =~ /,/)
+ {
+ # If it contains a comma, it needs no translation (used by user-defined collections)
+ push @result, {displayed => $_, value => $_}
+ foreach (split /\s*,\s*/, $id);
+ }
+ else
+ {
+ push @result, {displayed => $self->getDisplayedText($_->{displayed}), value => $_->{content}}
+ foreach (@{$self->{collection}->{options}->{'values'}->{$id}->{value}});
+ }
+ }
+ return \@result;
+ }
+
+ sub getFieldsCopy
+ {
+ my $self = shift;
+ my @result;
+ foreach (@{$self->{fieldsNames}})
+ {
+ my $info = $self->{fieldsInfo}->{$_};
+ #next if exists $info->{linkedto};
+ push @result, $_ if $info->{group}
+ && $info->{label};
+ }
+ return \@result;
+ }
+
+ sub getDisplayedInfo
+ {
+ my $self = shift;
+ # It will return a reference to an array. Each item will
+ # be like this :
+ # title => 'title of the corresponding tab'
+ # items => [ collection of items {id => '', label => ''} ]
+ my $result = [];
+ my %groups;
+
+ my $i = 0;
+
+ foreach (@{$self->{fieldsNames}})
+ {
+ my $info = $self->{fieldsInfo}->{$_};
+ next if (! $info->{label}); # || (exists $info->{linkedto});
+ my $group = $info->{group};
+ push @{$groups{$group}}, {
+ id => $_,
+ label => $self->getDisplayedText($info->{label})
+ } if $group;
+
+ $i++;
+ }
+ foreach (@{$self->{groups}})
+ {
+ push @$result, {
+ id => $_->{id},
+ title => $self->getDisplayedText($_->{label}),
+ items => $groups{$_->{id}}
+ };
+ }
+
+ return $result;
+ }
+
+ sub getInitInfo
+ {
+ my $self = shift;
+ my $info = {};
+ foreach my $field (@{$self->{fieldsNames}})
+ {
+ $info->{$field} = $self->getDisplayedText($self->{fieldsInfo}->{$field}->{init});
+ if ($self->{fieldsInfo}->{$field}->{type} eq 'formatted')
+ {
+ $info->{$field} =~ s/\[(.*?)\]//g;
+ $info->{$field} =~ s/%(.*?)%//g;
+ }
+ #foreach (@{$self->{fieldsNames}});
+ }
+ return $info;
+ }
+
+ # Required to use current class as a parameter of backend
+ sub preloadModel
+ {
+ my $self = shift;
+ return;
+ }
+
+ # Required to use current class as a parameter of backend
+ sub setCurrentModel
+ {
+ my $self = shift;
+ return 1;
+ }
+
+ # Required to use current class as a parameter of backend
+ sub transformPicturePath
+ {
+ my ($self, @args) = @_;
+
+ # Force the use of absolute path
+ my $currentOption = $self->{parent}->{options}->useRelativePaths;
+ $self->{parent}->{options}->useRelativePaths(0);
+
+ return $self->{parent}->transformPicturePath(@args);
+
+ $self->{parent}->{options}->useRelativePaths($currentOption);
+ }
+
+ sub getDefaultValuesBackend
+ {
+ my ($self) = @_;
+ $self->{defaultValuesBackend} = new GCBackend::GCBeXmlParser($self)
+ if !$self->{defaultValuesBackend};
+ $self->{defaultValuesBackend}->setParameters(file => $self->{defaultValuesFile},
+ version => $self->{parent}->{version});
+ return $self->{defaultValuesBackend}
+ }
+
+ sub getDefaultValues
+ {
+ my $self = shift;
+ if (! exists $self->{defaultValues})
+ {
+ # First get the default values as defined in the model
+ my $info = $self->getInitInfo;
+
+ # Then try to load user ones
+ if ( -r $self->{defaultValuesFile})
+ {
+ my $backend = $self->getDefaultValuesBackend;
+ my $loaded = $backend->load;
+ # We only consider the first item
+ my $userValues = $loaded->{data}->[0];
+ # We store that for later use
+ $self->{defaultValuesInformation} = $loaded->{information};
+
+ # Remove 'current' value for date, otherwise we'll store the current date
+ # as the default value
+ foreach ($self->{fieldsDate})
+ {
+ delete $userValues->{$_}
+ if $userValues->{$_} eq 'current';
+ }
+
+ # Merge init values with the loaded ones
+ $info = {%{$info}, %{$userValues}};
+ }
+
+ $self->{defaultValues} = $info;
+ }
+ return $self->{defaultValues};
+ }
+
+ sub setDefaultValues
+ {
+ my ($self, $info) = @_;
+
+ $self->{defaultValues} = $info;
+ my $backend = $self->getDefaultValuesBackend;
+
+ my $result = $backend->save([$info],
+ $self->{defaultValuesInformation},
+ undef,
+ 1);
+ if ($result->{error})
+ {
+ return $result->{error};
+ }
+ }
+
+
+ sub getFilterType
+ {
+ my ($self, $filter) = @_;
+
+ if (! $self->{filterTypes})
+ {
+ foreach (@{$self->{filters}})
+ {
+ $self->{filterTypes}->{$_->{field}} = [$_->{comparison}, $_->{numeric}, $_->{preprocess}];
+ }
+ }
+ return $self->{filterTypes}->{$filter};
+ }
+
+ sub getPluginsNames
+ {
+ my $self = shift;
+
+ my $tmp = $GCPlugins::pluginsNameArrays{$self->getName};
+ return [] if !$tmp;
+ return $tmp;
+ }
+
+ sub getAllPlugins
+ {
+ my $self = shift;
+
+ my $tmp = $GCPlugins::pluginsMap{$self->getName};
+ return {} if !$tmp;
+ return $tmp;
+ }
+
+ sub getPlugin
+ {
+ my ($self, $pluginName) = @_;
+
+ return $GCPlugins::pluginsMap{$self->getName}->{$pluginName};
+ }
+
+ sub getExtracter
+ {
+ my $self = shift;
+ #return $self->{extracter} if exists $self->{extracter};
+ return 0 if $self->isPersonal;
+ my $extracter;
+ (my $module = 'GCExtract::GCExtract'.$self->getName) =~ s/(GCExtract)GC(.)/$1\U$2\E/;
+ eval "use $module";
+ my $extracterName = 'GCExtract::'.$self->getName.'Extracter';
+ $extracter = new $extracterName(@_);
+ #$self->{extracter} = ($extracter->{errors} ? 0 : $extracter);
+ #return $self->{extracter};
+ return ($extracter->{errors} ? 0 : $extracter);
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $file, $isPersonal) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {parent => $parent, isPersonal => $isPersonal};
+ bless $self, $class;
+ $self->{isInline} = 0;
+
+ # backend expects the model to be in {model}
+ # so we store there a reference to ourselves
+ $self->{model} = $self;
+
+ $self->load($file);
+ GCPlugins::loadPlugins($self->getName) if !$isPersonal && !$ENV{GCS_PROFILING};
+ return $self;
+ }
+
+ sub newFromInline
+ {
+ my ($proto, $parent, $container) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {parent => $parent};
+ bless $self, $class;
+ $self->{isInline} = 1;
+ $self->{xmlString} = $container->{inlineModel};
+ $self->{defaultModifier} = $container->{defaultModifier};
+ $self->{preferences} = GCOptionLoader->newFromXmlString($container->{inlinePreferences}, 0, $self->{parent}->{options});
+ $self->loadFromString;
+ return $self;
+ }
+
+ sub newEmpty
+ {
+ my ($proto, $parent, $container) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {parent => $parent, isInline => 1, isPersonal => 1};
+ bless $self, $class;
+ $self->{xmlString} = '<collection><options/><groups/><fields lending="false" tags="false"/></collection>';
+ $self->{preferences} = GCOptionLoader->newFromXmlString('',0, $self->{parent}->{options});
+ if ($container)
+ {
+ $self->{defaultModifier} = $container->{defaultModifier};
+ }
+ $self->loadFromString;
+ return $self;
+ }
+
+ sub save
+ {
+ my $self = shift;
+ $self->{preferences}->save
+ if ! $self->{isInline};
+ $self->saveUserFilters;
+ }
+}
+{
+ package GCModelsChanges;
+
+ use File::Basename;
+ use GCUtils 'glob';
+ my %versionwithchanges;
+
+ sub new
+ {
+ my ($proto, $parent,$model) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {
+ parent => $parent,
+ cache => {},
+ lang => $parent->{lang},
+ persoDirectory => $ENV{GCS_DATA_HOME}.'/GCModels/',
+ defaultDirectory => $ENV{GCS_LIB_DIR}.'/GCModels/',
+ modelsSuffix => $GCModel::modelsSuffix,
+ model => $model
+ };
+
+ $self->{modelsDirectories} = [$self->{persoDirectory}, $self->{defaultDirectory}],
+
+ bless $self, $class;
+ $self->loadChangedVersionNumber;
+ return $self;
+ }
+
+ sub applyChanges
+ {
+ my($self,$data,$fileversion,$gcstarversion)=@_;
+ my @fileVersionSplited=split /\./,$fileversion;
+ my @gcstarVersionSplited=split /\./,$gcstarversion;
+ my $modelChanges=$versionwithchanges{$self->{model}};
+ sub compare
+ {
+ my ($arr1,$arr2,$i)=@_;
+ return 0 if ($i>$#$arr1 && $i>$#$arr2);
+ return -(0>$arr2->[$i])if ($i>$#$arr1);
+ return (0>$arr1->[$i]) if ($i>$#$arr2);
+
+ return -1 if $arr1->[$i]<$arr2->[$i];
+ return 1 if $arr1->[$i]>$arr2->[$i];
+ return compare($arr1,$arr2,$i+1);
+ }
+ # Warning : we assume that versions are sorted ascend
+ for my $vers(keys %$modelChanges)
+ {
+ my @versSplited=split /\./,$vers;
+ my $isConcerned=(compare \@fileVersionSplited,\@versSplited)<0;
+ $isConcerned&=(compare \@versSplited,\@gcstarVersionSplited)<=0;
+ foreach my $item(@$data)
+ {
+ $modelChanges->{$vers}($item);
+ }
+
+ }
+ }
+
+ sub loadChangedVersionNumber
+ {
+ my($self)=@_;
+ # TODO load from files
+
+ # Here is, for each model, a hash "versionNumber"=>sub
+ # example : "1.4.4"=>sub {
+ # $_[0]->{title}=lc $_[0]->{title};
+ # };
+ $versionwithchanges{GCfilms}={
+ };
+ # TODO sort version changes asc
+ }
+}
+
+{
+ package GCModelsCache;
+
+ use File::Basename;
+ use GCUtils 'glob';
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ mkdir $ENV{GCS_DATA_HOME}.'/GCModels/';
+ mkdir $ENV{GCS_DATA_HOME}.'/Filters/';
+ my $self = {
+ parent => $parent,
+ cache => {},
+ lang => $parent->{lang},
+ persoDirectory => $ENV{GCS_DATA_HOME}.'/GCModels/',
+ defaultDirectory => $ENV{GCS_LIB_DIR}.'/GCModels/',
+ modelsSuffix => $GCModel::modelsSuffix
+ };
+
+ $self->{modelsDirectories} = [$self->{persoDirectory}, $self->{defaultDirectory}],
+
+ bless $self, $class;
+ return $self;
+ }
+
+ sub getModel
+ {
+ my ($self, $name) = @_;
+
+ my $suffix = $self->{modelsSuffix};
+ (my $cacheId = $name) =~ s/$suffix$//;
+ if (!exists $self->{cache}->{$cacheId})
+ {
+ my $dir;
+ foreach $dir(@{$self->{modelsDirectories}})
+ {
+ my $file = $dir.$name;
+ $file .= $self->{modelsSuffix}
+ if $file !~ /$self->{modelsSuffix}$/;
+ next if ! -e $file;
+ $self->{cache}->{$cacheId} = GCModelLoader->new($self->{parent},
+ $file,
+ ($dir eq $self->{persoDirectory}));
+ }
+ }
+ # Clean it if user added some fields
+ $self->{cache}->{$cacheId}->removeAddedFields
+ if $self->{cache}->{$cacheId};
+ return $self->{cache}->{$cacheId};
+ }
+
+ sub getInfoFromFile
+ {
+ my ($self, $file) = @_;
+ my $result;
+ open DATA, $file;
+
+ while (<DATA>)
+ {
+ if ($_ =~ /<collection description="([^"]*?)".*?name="([^"]*?)"/)
+ {
+ $result = {
+ description => $1,
+ name => $2
+ };
+ last;
+ }
+ }
+
+ close DATA;
+ return $result;
+ }
+
+ sub getAllModels
+ {
+ my $self = shift;
+
+ my @results;
+ my $file;
+ my $dir;
+ foreach $dir(@{$self->{modelsDirectories}})
+ {
+ foreach $file(glob $dir.'*'.$self->{modelsSuffix})
+ {
+ push @results, $self->getModel(basename($file));
+ }
+ }
+ return \@results;
+ }
+
+ sub getPersonalModels
+ {
+ my $self = shift;
+
+ #Results is [ {name => '', description => ''} ]
+ # name could be used with getModel
+
+ my @results;
+
+ foreach (glob $self->{persoDirectory}.'*'.$self->{modelsSuffix})
+ {
+ my $info = $self->getInfoFromFile($_);
+ next if (! $info->{description}) || (! $info->{name});
+ push @results, $info;
+ }
+ return \@results;
+ }
+
+ sub getDefaultModels
+ {
+ my $self = shift;
+
+ #Results is [ {name => '', description => ''} ]
+ # name could be used with getModel
+
+ my @results;
+ $self->{langName} = $self->{parent}->{options}->lang;
+ foreach (glob $self->{defaultDirectory}.'*'.$self->{modelsSuffix})
+ {
+ #my $model = $self->getModel(basename($_));
+ #push @results, {name => $model->getName,
+ # description => $model->getDescription};
+ push @results, $self->extractInfos($_);
+ }
+ @results = sort {$a->{description} cmp $b->{description}} @results;
+ return \@results;
+ }
+
+ sub extractInfos
+ {
+ my ($self, $file) = @_;
+ my $result;
+
+ open FILE, $file;
+ my $lang;
+ while (<FILE>)
+ {
+ $result->{name} = $1
+ if /name="(.*?)"/;
+ if (m|<lang>(.*?)</lang>|)
+ {
+ $lang = $1;
+ last;
+ }
+ }
+ close FILE;
+
+ open LANG, $ENV{GCS_LIB_DIR}.'/GCLang/'.$self->{langName}."/GCModels/$lang.pm";
+ binmode(LANG, ':utf8');
+ while (<LANG>)
+ {
+ if (/CollectionDescription\s*=>\s*'(.*?)',/)
+ {
+ ($result->{description} = $1) =~ s/\\'/'/g;
+ last;
+ }
+
+ }
+ close LANG;
+
+ return $result;
+ }
+}
+
+use Gtk2;
+
+{
+ package GCModelsDialog;
+
+ use GCImport;
+ use base "GCModalDialog";
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->setModelsList;
+
+ $self->SUPER::show();
+ $self->show_all;
+
+ my $result = 0;
+ $self->{model} = undef;
+ $self->{gotKey} = 0;
+ while (1)
+ {
+ my $response = $self->run;
+ if ($response eq 'ok')
+ {
+ $result = 1;
+ my $path = ($self->{modelsList}->get_cursor)[0];
+ my @indices = $path ? $path->get_indices : (0);
+ if ($indices[0] == 0)
+ {
+ $self->{model} = GCModelLoader->newEmpty($self->{parent});
+ }
+ else
+ {
+ if (!exists $indices[1])
+ {
+ if ($self->{gotKey})
+ {
+ # We expand/collapse row if called by a pressed key
+ if ($self->{modelsList}->row_expanded($path))
+ {
+ $self->{modelsList}->collapse_row($path)
+ }
+ else
+ {
+ $self->{modelsList}->expand_row($path, 0)
+ }
+ $self->{gotKey} = 0;
+ }
+ $self->{modelsList}->grab_focus;
+ next;
+ }
+ my $hasPerso = scalar @{$self->{persoList}};
+ if ((($indices[0] == 2) && !$hasPerso)
+ || ($indices[0] == 3))
+ {
+ # Here we are importing
+ $self->{model} = 0;
+ $self->{importer} = $self->{importers}->[$indices[1]];
+ }
+ else
+ {
+ my $name = ((($indices[0] == 1) && ($hasPerso)) ?
+ $self->{persoList}->[$indices[1]]->{name} : $self->{defaultList}->[$indices[1]]->{name});
+ $self->{model} = $self->{factory}->getModel($name);
+ }
+ }
+ }
+ last;
+ }
+ $self->hide;
+ return $result;
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $factory, $init) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, $parent->{lang}->{ModelsSelect});
+
+ bless ($self, $class);
+ $self->{parent} = $parent;
+
+ my $column = Gtk2::TreeViewColumn->new_with_attributes('', Gtk2::CellRendererText->new,
+ 'text' => 0);
+ $self->{modelsModel} = new Gtk2::TreeStore('Glib::String');
+ $self->{modelsList} = Gtk2::TreeView->new_with_model($self->{modelsModel});
+ $self->{modelsList}->append_column($column);
+ $self->{modelsList}->set_headers_visible(0);
+ $self->{modelsList}->signal_connect ('row-activated' => sub {
+ $self->{gotKey} = 1;
+ $self->response('ok');
+ });
+
+ my $scrollPanelList = new Gtk2::ScrolledWindow;
+ $scrollPanelList->set_border_width(5);
+ $scrollPanelList->set_policy('never', 'automatic');
+ $scrollPanelList->set_shadow_type('etched-in');
+ $scrollPanelList->add($self->{modelsList});
+
+ $self->vbox->pack_start($scrollPanelList, 1, 1, 10);
+
+ $self->{factory} = $factory;
+ $self->{initVersion} = $init;
+ $self->set_default_size(300,350);
+
+ return $self;
+ }
+
+ sub isImporting
+ {
+ my $self = shift;
+ return $self->{model} == 0;
+ }
+
+ sub getModel
+ {
+ my $self = shift;
+ return $self->{model};
+ }
+
+ sub getImporter
+ {
+ my $self = shift;
+ return $self->{importer};
+ }
+
+ sub setModelsList
+ {
+ my $self = shift;
+ $self->{modelsModel}->clear;
+
+ my $iter = $self->{modelsModel}->append(undef);
+ $self->{modelsModel}->set($iter, (0 => $self->{parent}->{lang}->{ModelNewType}));
+
+ $self->{persoList} = $self->{factory}->getPersonalModels;
+ if (scalar @{$self->{persoList}})
+ {
+ my $persoIter = $self->{modelsModel}->append(undef);
+ $self->{modelsModel}->set($persoIter, (0 => $self->{parent}->{lang}->{ModelsPersonal}));
+ foreach (@{$self->{persoList}})
+ {
+ $iter = $self->{modelsModel}->append($persoIter);
+ $self->{modelsModel}->set($iter, (0 => $_->{description}));
+ }
+ }
+ my $defaultIter = $self->{modelsModel}->append(undef);
+ $self->{modelsModel}->set($defaultIter, (0 => $self->{parent}->{lang}->{ModelsDefault}));
+ $self->{defaultList} = $self->{factory}->getDefaultModels;
+ foreach (@{$self->{defaultList}})
+ {
+ $iter = $self->{modelsModel}->append($defaultIter);
+ $self->{modelsModel}->set($iter, (0 => $_->{description}));
+ }
+ $self->{modelsList}->expand_row($self->{modelsModel}->get_path($defaultIter), 0);
+ $self->{modelsList}->get_selection->select_iter($self->{modelsModel}->get_iter_first);
+
+ $self->addImport if $self->{initVersion};
+
+ $self->{modelsList}->grab_focus;
+ }
+
+ sub addImport
+ {
+ my $self = shift;
+ my $importIter = $self->{modelsModel}->append(undef);
+ (my $label = $self->{parent}->{lang}->{MenuImport}) =~ s/_//g;
+ $self->{modelsModel}->set($importIter, (0 => $label));
+ $self->{importers} = [];
+ my $iter;
+ foreach my $importer(@GCImport::importersArray)
+ {
+ next if scalar @{$importer->getModels} == 0;
+ push @{$self->{importers}}, $importer;
+ $iter = $self->{modelsModel}->append($importIter);
+ $self->{modelsModel}->set($iter, (0 => $importer->getName));
+ }
+ }
+}
+
+
+{
+ package GCModelsSettingsDialog;
+
+ use base 'GCModalDialog';
+
+ use GCGraphicComponents::GCBaseWidgets;
+
+ sub setPersonalMode
+ {
+ my ($self, $personal) = @_;
+ $self->{personal} = $personal;
+ if ($personal)
+ {
+ $self->set_title($self->{parent}->{lang}->{ModelSettings});
+ }
+ else
+ {
+ $self->set_title($self->{parent}->{lang}->{PanelUser});
+ $self->{notebook}->set_current_page(0);
+ }
+ $self->{notebook}->set_show_tabs($personal);
+ $self->{collectionName}->set_sensitive($personal);
+ }
+
+ sub setDescription
+ {
+ my ($self, $desc) = @_;
+ $self->{collectionName}->setValue($desc);
+ }
+
+ sub setSensitive
+ {
+ my ($self, $value) = @_;
+ $self->{fieldsOptionsTable}->set_sensitive($value);
+ $self->{removeButton}->set_sensitive($value);
+ $self->{toUp}->set_sensitive($value);
+ $self->{toDown}->set_sensitive($value);
+ $self->activateOkButton($value)
+ if $self->{personal};
+ }
+
+ sub initFields
+ {
+ my ($self, $fields, $groups, $commonFields, $withLending, $withTags) = @_;
+
+ # A clone was already made by caller
+ #$self->{fields} = Storable::dclone($fields) if $fields;
+ $self->{fields} = $fields;
+
+ $self->clearForm;
+ $self->{params}->{group}->setValues([]);
+ $self->{currentField} = -1;
+ $self->{fieldsList}->get_model->clear;
+ $self->{maxId} = 0;
+ my $i = -1;
+ if ($fields)
+ {
+ if (scalar @$fields)
+ {
+ $self->setSensitive(1);
+ $self->checkFieldType;
+ }
+ else
+ {
+ $self->setSensitive(0);
+ }
+ $self->{idToLabel} = {};
+ foreach (@{$self->{fields}})
+ {
+ $i++;
+ $_->{label} = $_->{displayed} if $_->{displayed};
+ $_->{group} = $groups->{$_->{group}}->{displayed}
+ if $groups->{$_->{group}}->{displayed};
+ $self->{params}->{group}->addHistory($_->{group});
+ if ($_->{value} eq $GCModel::autoId)
+ {
+ delete $self->{fields}->[$i];
+ next;
+ }
+ push @{$self->{fieldsList}->{data}}, [$_->{label}];
+ $_->{value} =~ /([0-9]+)$/;
+ $self->{maxId} = $1 if $self->{maxId} < $1;
+ $self->{idToLabel}->{$_->{value}} = $_->{label};
+ $_->{init} = $self->convertFormat($_->{init}, 1)
+ if $_->{type} eq 'formatted';
+ }
+ $self->displayField(0) if scalar(@{$self->{fields}});
+ }
+ $self->initCommonFields($commonFields);
+ $self->{hasLending}->setValue($withLending);
+ $self->{hasTags}->setValue($withTags);
+ }
+
+ sub convertFormat
+ {
+ my ($self, $format, $toUser) = @_;
+ my $converted = $format;
+ if ($toUser)
+ {
+ $converted =~ s/%(.*?)%/'%'.$self->idToLabel($1).'%'/ge;
+ }
+ else
+ {
+ $converted =~ s/%(.*?)%/'%'.$self->labelToId($1).'%'/ge;
+ }
+ # If some replacements failed, we clean the string
+ $converted =~ s/%%//g;
+ return $converted;
+ }
+
+ sub idToLabel
+ {
+ my ($self, $id) = @_;
+ for my $field (@{$self->{fields}})
+ {
+ return $field->{label}
+ if $field->{value} eq $id;
+ }
+ return '';
+ }
+
+ sub labelToId
+ {
+ my ($self, $label) = @_;
+ for my $field (@{$self->{fields}})
+ {
+ return $field->{value}
+ if $field->{label} eq $label;
+ }
+ return '';
+ }
+
+ sub initFilters
+ {
+ my ($self, $filters) = @_;
+
+ $self->{filters} = {};
+ foreach (@{$filters})
+ {
+ $self->{filters}->{$_->{field}} = {
+ comparison => $_->{comparison},
+ numeric => $_->{numeric},
+ quick => $_->{quick}
+ };
+ }
+
+ $self->displayFilter(0) if scalar(@{$self->{fields}});
+ $self->checkFilterActivated;
+ }
+
+ sub getFilters
+ {
+ my ($self, $fieldsInfo) = @_;
+
+ my $type;
+ foreach (keys %{$self->{filters}})
+ {
+ my $filter = $self->{filters}->{$_};
+ $type = $fieldsInfo->{$_}->{type};
+ $filter->{labelselect} = $self->{filter}->{comparison}->valueToDisplayed($filter->{comparison})
+ if ($type eq 'number') || ($type eq 'date');
+ }
+
+ return $self->{filters};
+ }
+
+ sub getGroups
+ {
+ my $self = shift;
+ my $groups = [];
+ my %alreadyPushed = ();
+ foreach (@{$self->{fields}})
+ {
+ push @$groups, {id => $_->{group}, label => $_->{group}}
+ if $_->{group}
+ && !$alreadyPushed{$_->{group}};
+ $alreadyPushed{$_->{group}} = 1;
+ }
+ if (! scalar(@$groups))
+ {
+ if ($self->{personal})
+ {
+ push @$groups, {id => $self->{parent}->{lang}->{OptionsMain}, label => 'OptionsMain',
+ displayed => $self->{parent}->{lang}->{OptionsMain}};
+ }
+ else
+ {
+ push @$groups, {id => $self->{parent}->{lang}->{PanelUser},
+ label => 'PanelUser',
+ displayed => $self->{parent}->{lang}->{PanelUser}};
+ }
+ }
+ my $defaultGroup = $groups->[0]->{id};
+ foreach (@{$self->{fields}})
+ {
+ $_->{group} = $defaultGroup if ! $_->{group};
+ }
+ return $groups;
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+
+ my $response = $self->run;
+ $self->saveCurrent;
+ $self->saveCurrentFilter;
+ $self->hide;
+ if ($response eq 'ok')
+ {
+ # Restore formats
+ foreach my $field(@{$self->{fields}})
+ {
+ $field->{init} = $self->convertFormat($field->{init}, 0)
+ if $field->{type} eq 'formatted';
+ }
+ }
+ return ($response eq 'ok');
+ }
+
+ sub getName
+ {
+ # returns (collection description, safe name, full file name)
+ my $self = shift;
+ my $description = $self->{collectionName}->getValue;
+ my $name = GCUtils::getSafeFileName($description);
+ my $file = $ENV{GCS_DATA_HOME}.'/GCModels/'.$name.$GCModel::modelsSuffix;
+ return ($description, $name, $file);
+ }
+
+ sub saveCurrent
+ {
+ my $self = shift;
+ return if $self->{currentField} < 0;
+ foreach (keys %{$self->{params}})
+ {
+ $self->{fields}->[$self->{currentField}]->{$_} = $self->{params}->{$_}->getValue
+ if $self->{params}->{$_}->is_sensitive;
+ }
+ # Some adjustments
+ my $type = $self->{fields}->[$self->{currentField}]->{type};
+ # history text is managed through 2 fields
+ if ($type eq 'short text')
+ {
+ $self->{fields}->[$self->{currentField}]->{type} = 'history text'
+ if $self->{fields}->[$self->{currentField}]->{history};
+ delete $self->{fields}->[$self->{currentField}]->{history};
+ }
+ # By default, the image will be displayed, right click to change it
+ $self->{fields}->[$self->{currentField}]->{default} = 'view'
+ if $type eq 'image';
+ $self->{fields}->[$self->{currentField}]->{history} =
+ $self->{fields}->[$self->{currentField}]->{history} ? 'true' : 'false'
+ if exists $self->{fields}->[$self->{currentField}]->{history};
+ $self->{fields}->[$self->{currentField}]->{flat} =
+ $self->{fields}->[$self->{currentField}]->{flat} ? 'true' : 'false'
+ if exists $self->{fields}->[$self->{currentField}]->{flat};
+ $self->{params}->{group}->addHistory;
+ }
+
+ sub saveCurrentFilter
+ {
+ my $self = shift;
+ return if $self->{currentFilter} < 0;
+ # As we use the same model, the index is the same in the fields array
+ my $field = $self->{fields}->[$self->{currentFilter}]->{value};
+ if ($self->{filter}->{activated}->getValue)
+ {
+ $self->{filters}->{$field} = {
+ comparison => $self->{filter}->{comparison}->getValue,
+ numeric => $self->{filter}->{numeric}->getValueAsText,
+ quick => $self->{filter}->{quick}->getValueAsText
+ };
+ }
+ else
+ {
+ delete $self->{filters}->{$field};
+ }
+ }
+
+ sub changeCurrentLabel
+ {
+ my $self = shift;
+ return if $self->{currentField} < 0;
+ $self->{fieldsList}->{data}->[$self->{currentField}]->[0] = $self->{params}->{label}->getValue;
+ }
+
+ sub displayField
+ {
+ my ($self, $idx) = @_;
+
+ $self->{currentField} = $idx;
+ foreach (keys %{$self->{params}})
+ {
+ my $value = $self->{fields}->[$idx]->{$_};
+ if ($_ eq 'init')
+ {
+ $value = '' if $value eq $GCModel::initDefault;
+ }
+ elsif (($_ eq 'history') || ($_ eq 'flat'))
+ {
+ $value = ($value eq 'true') ? 1 : 0;
+ }
+ $self->{params}->{$_}->setValue($value);
+ }
+ if ($self->{fields}->[$idx]->{type} eq 'history text')
+ {
+ $self->{params}->{type}->setValue('short text');
+ $self->{params}->{history}->setValue(1);
+ }
+ $self->{fieldsList}->select($idx);
+ }
+
+ sub displayFilter
+ {
+ my ($self, $idx) = @_;
+
+ $self->{currentFilter} = $idx;
+ my $field = $self->{fields}->[$idx]->{value};
+ my $hasFilter = (exists $self->{filters}->{$field});
+ my $info = $self->{fields}->[$self->{currentFilter}];
+ if ($hasFilter)
+ {
+ $self->{filter}->{activated}->setValue(1);
+ $self->{filter}->{comparison}->setValue($self->{filters}->{$field}->{comparison});
+ $self->{filter}->{numeric}->setValue($self->{filters}->{$field}->{numeric} eq 'true');
+ $self->{filter}->{quick}->setValue($self->{filters}->{$field}->{quick} eq 'true');
+ }
+ else
+ {
+ $self->{filter}->{activated}->setValue(0);
+ $self->{filter}->{comparison}->setValue(0);
+ $self->{filter}->{numeric}->setValue(0);
+ $self->{filter}->{quick}->setValue(0);
+ }
+ $self->checkFilterSettings;
+ $self->{filtersList}->select($idx);
+ }
+
+ sub clearForm
+ {
+ my $self = shift;
+ foreach (keys %{$self->{params}})
+ {
+ $self->{params}->{$_}->setValue('');
+ }
+
+ }
+
+ sub moveDownUp
+ {
+ my ($self, $dir) = @_;
+ $self->saveCurrent;
+ my $newField = $self->{currentField} + $dir;
+ return if ($newField < 0) || ($newField >= scalar @{$self->{fields}});
+ ($self->{fields}->[$self->{currentField}], $self->{fields}->[$newField])
+ = ($self->{fields}->[$newField], $self->{fields}->[$self->{currentField}]);
+ $self->{fieldsList}->{data}->[$self->{currentField}] = [$self->{fields}->[$self->{currentField}]->{label}];
+ $self->{fieldsList}->{data}->[$newField] = [$self->{fields}->[$newField]->{label}];
+ $self->displayField($newField);
+ }
+
+ sub addField
+ {
+ my $self = shift;
+ my $newLabel = $self->{parent}->{lang}->{ModelNewField};
+ $self->saveCurrent;
+ $self->{maxId}++;
+ push (@{$self->{fields}}, {value => $self->{fieldsPrefix}.$self->{maxId},
+ label => $newLabel});
+ push (@{$self->{fieldsList}->{data}}, [$newLabel]);
+ my $nbFields = scalar(@{$self->{fields}});
+ if ($nbFields)
+ {
+ $self->setSensitive(1);
+ $self->checkFieldType;
+ }
+ $self->displayField($nbFields - 1);
+ $self->{params}->{label}->selectAll;
+ }
+
+ sub removeCurrent
+ {
+ my $self = shift;
+ splice(@{$self->{fieldsList}->{data}}, $self->{currentField}, 1);
+ splice(@{$self->{fields}}, $self->{currentField}, 1);
+ $self->{currentField}-- if $self->{currentField} >= scalar @{$self->{fields}};
+ if ($self->{currentField} < 0)
+ {
+ $self->clearForm;
+ $self->setSensitive(0);
+ }
+ else
+ {
+ $self->displayField($self->{currentField});
+ }
+ }
+
+ sub initCommonFields
+ {
+ my ($self, $init) = @_;
+
+ my @imgValues = ({value => $GCModel::autoField, displayed => $self->{parent}->{lang}->{ModelOptionsFieldsAuto}});
+ my @txtValues = ({value => $GCModel::autoField, displayed => $self->{parent}->{lang}->{ModelOptionsFieldsAuto}});
+ my @fileValues = ({value => $GCModel::autoField, displayed => $self->{parent}->{lang}->{ModelOptionsFieldsAuto}},
+ {value => $GCModel::noneField, displayed => $self->{parent}->{lang}->{ModelOptionsFieldsNone}});
+ if ($self->{fields})
+ {
+ foreach (@{$self->{fields}})
+ {
+ my $value = {value => $_->{value}, displayed => $_->{label}};
+ if ($_->{type} eq 'image')
+ {
+ push @imgValues, $value;
+ }
+ elsif ($_->{type} eq 'file')
+ {
+ push @fileValues, $value;
+ }
+ else
+ {
+ push @txtValues, $value;
+ }
+ }
+ }
+
+ $self->{common}->{title}->setValues(\@txtValues, 0, 1);
+ $self->{common}->{id}->setValues(\@txtValues, 0, 1);
+ $self->{common}->{cover}->setValues(\@imgValues, 0, 1);
+ $self->{common}->{play}->setValues(\@fileValues, 0, 1);
+
+ if ($init)
+ {
+ foreach (keys %{$self->{common}})
+ {
+ my $value = $init->{$_};
+ $value ||= (($_ eq 'play') ? $GCModel::noneField : $GCModel::autoField);
+ $self->{common}->{$_}->setValue($value);
+ }
+ }
+ }
+
+ sub getIdField
+ {
+ my $self = shift;
+ my $value = $self->{common}->{id}->getValue;
+ $value = '' if $value eq $GCModel::autoField;
+ return $value;
+ }
+
+ sub getCoverField
+ {
+ my $self = shift;
+ my $value = $self->{common}->{cover}->getValue;
+ # We look for the 1st picture
+ if ($value eq $GCModel::autoField)
+ {
+ $value = '';
+ foreach (@{$self->{fields}})
+ {
+ ($value = $_->{value}, last) if $_->{type} eq 'image';
+ }
+ }
+ # TODO We should check it is a picture
+ return $value;
+ }
+
+ sub getTitleField
+ {
+ my $self = shift;
+ my $value = $self->{common}->{title}->getValue;
+ if ($value eq $GCModel::autoField)
+ {
+ # TODO We should filter to find the 1st suitable one
+ $value = $self->{fields}->[0]->{value};
+ }
+ return $value;
+ }
+
+ sub getPlayField
+ {
+ my $self = shift;
+ my $value = $self->{common}->{play}->getValue;
+ $value = '' if $value eq $GCModel::noneField;
+ # We look for the 1st file
+ if ($value eq $GCModel::autoField)
+ {
+ $value = '';
+ foreach (@{$self->{fields}})
+ {
+ ($value = $_->{value}, last) if $_->{type} eq 'file';
+ }
+ }
+ # TODO We should check it is a file
+ return $value;
+ }
+
+ sub hasLending
+ {
+ my $self = shift;
+
+ return $self->{hasLending}->getValue;
+ }
+
+ sub hasTags
+ {
+ my $self = shift;
+
+ return $self->{hasTags}->getValue;
+ }
+
+ sub checkFieldType
+ {
+ my $self = shift;
+
+ my $type = $self->{params}->{type}->getValue;
+
+ my $sensitive = 0;
+ $sensitive = 1 if $type eq 'number';
+ $self->{minLabel}->set_sensitive($sensitive);
+ $self->{params}->{min}->set_sensitive($sensitive);
+ $self->{maxLabel}->set_sensitive($sensitive);
+ $self->{params}->{max}->set_sensitive($sensitive);
+ $self->{stepLabel}->set_sensitive($sensitive);
+ $self->{params}->{step}->set_sensitive($sensitive);
+ $self->{displayasLabel}->set_sensitive($sensitive);
+ $self->{params}->{displayas}->set_sensitive($sensitive);
+ $sensitive = 0;
+ $sensitive = 1 if $type eq 'options';
+ $self->{valuesListLabel}->set_sensitive($sensitive);
+ $self->{params}->{values}->set_sensitive($sensitive);
+ $self->{valuesListLegend}->set_sensitive($sensitive);
+ $sensitive = 0;
+ $sensitive = 1 if $type eq 'file';
+ $self->{formatLabel}->set_sensitive($sensitive);
+ $self->{params}->{format}->set_sensitive($sensitive);
+ $sensitive = 0;
+ $sensitive = 1 if ($type eq 'short text') || ($type =~ /list$/);
+ $self->{params}->{history}->set_sensitive($sensitive);
+ $sensitive = 0;
+ $sensitive = 1 if $type =~ /list$/;
+ $self->{params}->{flat}->set_sensitive($sensitive);
+ }
+
+ sub checkFilterActivated
+ {
+ my $self = shift;
+
+ my $activated = $self->{filter}->{activated}->getValue;
+ $self->{comparisonLabel}->set_sensitive($activated);
+ $self->{filter}->{comparison}->set_sensitive($activated);
+ $self->{filter}->{numeric}->set_sensitive($activated);
+ $self->{filter}->{quick}->set_sensitive($activated);
+ $self->checkFilterSettings;
+ }
+
+ sub checkFilterSettings
+ {
+ my $self = shift;
+ # We activate quick filter only for some fields
+ my $activated = 0;
+ my $info = $self->{fields}->[$self->{currentFilter}];
+ my $hasFilter = $self->{filter}->{activated}->getValue;
+ my $type = $info->{type};
+ $activated = 1
+ if $hasFilter && (
+ ($info->{history} eq 'true')
+ || ($type eq 'history text')
+ || ($type eq 'yesno')
+ || ($type eq 'number')
+ || ($type eq 'date')
+ || ($type eq 'options')
+ );
+ $self->{filter}->{quick}->set_sensitive($activated);
+ $self->{filter}->{quick}->setValue(0) if !$activated;
+ $activated = 0;
+ $activated = 1
+ if $hasFilter
+ && ($type ne 'date')
+ && ($type ne 'yesno')
+ && ($type ne 'number');
+ $self->{filter}->{numeric}->set_sensitive($activated);
+ $self->{filter}->{numeric}->setValue(($info->{type} eq 'number')) if !$activated;
+ $activated = 1;
+ $activated = 0 if $type eq 'image';
+ $self->{filter}->{activated}->set_sensitive($activated);
+ $self->{filter}->{comparison}->set_sensitive($activated);
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $list) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{ModelSettings},
+ );
+ bless ($self, $class);
+
+ $self->{parent} = $parent;
+ $self->{tooltips} = Gtk2::Tooltips->new();
+
+ $self->{currentField} = -1;
+ $self->{currentFilter} = -1;
+ $self->{fieldsPrefix} = 'gcsfield';
+
+ my $hboxCollectionName = new Gtk2::HBox(0,0);
+ my $collectionNameLabel = new GCLabel($parent->{lang}->{ModelName});
+ $self->{collectionName} = new GCShortText;
+ $self->{tooltips}->set_tip($self->{collectionName},
+ $self->{parent}->{lang}->{ModelTooltipName});
+ $hboxCollectionName->pack_start($collectionNameLabel, 0, 0, $GCUtils::margin);
+ $hboxCollectionName->pack_start($self->{collectionName}, 1, 1, 0);
+
+ $self->{notebook} = new Gtk2::Notebook;
+ $self->{notebook}->set_tab_pos('left');
+ $self->{notebook}->set_show_border(0);
+
+ my $vboxFields = new Gtk2::VBox(0,0);
+ my $vboxOptions = new Gtk2::VBox(0,0);
+ my $vboxFilters = new Gtk2::VBox(0,0);
+
+ $self->{fieldsList} = new Gtk2::SimpleList(
+ '' => "text"
+ );
+ $self->{fieldsList}->signal_connect (cursor_changed => sub {
+ my ($sl, $path, $column) = @_;
+ my @idx = $sl->get_selected_indices;
+ $self->changeCurrentLabel;
+ $self->saveCurrent;
+ $self->displayField($idx[0]);
+ });
+
+ $self->{fieldsList}->set_headers_visible(0);
+ my $vboxFieldsList = new Gtk2::VBox(0,0);
+ $self->{scrollPanelFields} = new Gtk2::ScrolledWindow;
+ $self->{scrollPanelFields}->set_policy ('automatic', 'automatic');
+ $self->{scrollPanelFields}->set_shadow_type('etched-in');
+ $self->{scrollPanelFields}->add($self->{fieldsList});
+ $vboxFieldsList->pack_start($self->{scrollPanelFields},1,1,0);
+ my $hboxFieldsActions = new Gtk2::HBox(0,0);
+ my $addButton = GCButton->newFromStock('gtk-add', 0);
+ $addButton->signal_connect('clicked' => sub {
+ $self->addField;
+ });
+ $self->{removeButton} = GCButton->newFromStock('gtk-remove', 0);
+ $self->{removeButton}->signal_connect('clicked' => sub {
+ $self->removeCurrent;
+ });
+ $hboxFieldsActions->pack_start($addButton,1,1,$GCUtils::halfMargin);
+ $hboxFieldsActions->pack_start($self->{removeButton},1,1,$GCUtils::halfMargin);
+ $vboxFieldsList->pack_start($hboxFieldsActions,0,0,$GCUtils::halfMargin);
+
+ my $vboxMove = new Gtk2::VBox(0,0);
+ $self->{toUp} =GCButton->newFromStock('gtk-go-up', 0);
+ $self->{toUp}->signal_connect('clicked' => sub {
+ $self->moveDownUp(-1);
+ });
+ $self->{toDown} =GCButton->newFromStock('gtk-go-down', 0);
+ $self->{toDown}->signal_connect('clicked' => sub {
+ $self->moveDownUp(1);
+ });
+ $vboxMove->pack_start($self->{toUp}, 0, 0, $GCUtils::margin);
+ $vboxMove->pack_start($self->{toDown}, 0, 0, $GCUtils::margin);
+
+ $self->{fieldsOptionsTable} = new Gtk2::Table(18, 4);
+ $self->{fieldsOptionsTable}->set_row_spacings($GCUtils::halfMargin);
+ $self->{fieldsOptionsTable}->set_col_spacings($GCUtils::margin);
+ $self->{fieldsOptionsTable}->set_border_width($GCUtils::margin);
+
+ # Information
+ #############
+ my $nameLabel = GCLabel->new($parent->{lang}->{ModelFieldName});
+ $self->{params}->{label} = new GCShortText;
+ $self->{tooltips}->set_tip($self->{params}->{label},
+ $parent->{lang}->{ModelTooltipLabel});
+ $self->{params}->{label}->signal_connect('focus-out-event' => sub {
+ $self->changeCurrentLabel;
+ return 0;
+ });
+ my $typeLabel = GCLabel->new($parent->{lang}->{ModelFieldType});
+ $self->{params}->{type} = new GCMenuList;
+ $self->{params}->{type}->setValues([
+ {value => 'short text', displayed => $parent->{lang}->{ModelFieldTypeShortText}},
+ {value => 'long text', displayed => $parent->{lang}->{ModelFieldTypeLongText}},
+ {value => 'yesno', displayed => $parent->{lang}->{ModelFieldTypeYesNo}},
+ {value => 'number', displayed => $parent->{lang}->{ModelFieldTypeNumber}},
+ {value => 'date', displayed => $parent->{lang}->{ModelFieldTypeDate}},
+ {value => 'options', displayed => $parent->{lang}->{ModelFieldTypeOptions}},
+ {value => 'image', displayed => $parent->{lang}->{ModelFieldTypeImage}},
+ {value => 'single list', displayed => $parent->{lang}->{ModelFieldTypeSingleList}},
+ {value => 'file', displayed => $parent->{lang}->{ModelFieldTypeFile}},
+ {value => 'formatted', displayed => $parent->{lang}->{ModelFieldTypeFormatted}},
+ ]);
+ $self->{params}->{type}->signal_connect('changed' => sub {
+ $self->checkFieldType;
+ });
+ my $groupLabel = GCLabel->new($parent->{lang}->{ModelFieldGroup});
+ $self->{params}->{group} = new GCHistoryText;
+ $self->{tooltips}->set_tip($self->{params}->{group},
+ $parent->{lang}->{ModelTooltipGroup});
+ my $informationLabel = new GCHeaderLabel($parent->{lang}->{ModelFieldInformation});
+ $self->{fieldsOptionsTable}->attach($informationLabel, 0, 4, 0, 1, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($nameLabel, 2, 3, 1, 2, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{label}, 3, 4, 1, 2, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($typeLabel, 2, 3, 2, 3, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{type}, 3, 4, 2, 3, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($groupLabel, 2, 3, 3, 4, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{group}, 3, 4, 3, 4, ['expand', 'fill'], 'fill', 0, 0);
+
+ # Parameters
+ #############
+ $self->{params}->{history} = GCCheckBox->new($parent->{lang}->{ModelFieldHasHistory});
+ $self->{params}->{flat} = GCCheckBox->new($parent->{lang}->{ModelFieldFlat});
+ $self->{tooltips}->set_tip($self->{params}->{history},
+ $parent->{lang}->{ModelTooltipHistory});
+ $self->{formatLabel} = GCLabel->new($parent->{lang}->{ModelFieldFileFormat});
+ $self->{params}->{format} = new GCMenuList;
+ $self->{tooltips}->set_tip($self->{params}->{format},
+ $parent->{lang}->{ModelTooltipFormat});
+ $self->{params}->{format}->setValues([
+ {value => 'file', displayed => $parent->{lang}->{ModelFieldFileFile}},
+ {value => 'video', displayed => $parent->{lang}->{ModelFieldFileVideo}},
+ {value => 'audio', displayed => $parent->{lang}->{ModelFieldFileAudio}},
+ {value => 'image', displayed => $parent->{lang}->{ModelFieldFileImage}},
+ {value => 'program', displayed => $parent->{lang}->{ModelFieldFileProgram}},
+ {value => 'url', displayed => $parent->{lang}->{ModelFieldFileUrl}},
+ {value => 'ebook', displayed => $parent->{lang}->{ModelFieldFileEbook}}
+ ]);
+ my $parametersLabel = new GCHeaderLabel($parent->{lang}->{ModelFieldParameters});
+ $self->{fieldsOptionsTable}->attach($parametersLabel, 0, 4, 5, 6, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{history}, 2, 4, 6, 7, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{flat}, 2, 4, 7, 8, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{formatLabel}, 2, 3, 8, 9, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{format}, 3, 4, 8, 9, ['expand', 'fill'], 'fill', 0, 0);
+
+ # Values
+ #############
+ my $initLabel = GCLabel->new($parent->{lang}->{ModelFieldInit});
+ $self->{params}->{init} = new GCShortText;
+ $self->{minLabel} = GCLabel->new($parent->{lang}->{ModelFieldMin});
+ $self->{params}->{min} = new GCShortText;
+ $self->{maxLabel} = GCLabel->new($parent->{lang}->{ModelFieldMax});
+ $self->{params}->{max} = new GCShortText;
+ $self->{stepLabel} = GCLabel->new($parent->{lang}->{ModelFieldStep});
+ $self->{params}->{step} = new GCCheckedText('0-9.');
+ $self->{valuesListLabel} = GCLabel->new($parent->{lang}->{ModelFieldList});
+ $self->{params}->{values} = new GCShortText;
+ $self->{valuesListLegend} = GCLabel->new($parent->{lang}->{ModelFieldListLegend});
+ $self->{displayasLabel} = GCLabel->new($parent->{lang}->{ModelFieldDisplayAs});
+ $self->{params}->{displayas} = new GCMenuList;
+ $self->{params}->{displayas}->setValues([
+ {value => 'text', displayed => $parent->{lang}->{ModelFieldDisplayAsText}},
+ {value => 'graphical', displayed => $parent->{lang}->{ModelFieldDisplayAsGraphical}}
+ ]);
+ my $valuesLabel = new GCHeaderLabel($parent->{lang}->{ModelFieldValues});
+ $self->{fieldsOptionsTable}->attach($valuesLabel, 0, 4, 10, 11, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($initLabel, 2, 3, 11, 12, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{init}, 3, 4, 11, 12, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{minLabel}, 2, 3, 12, 13, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{min}, 3, 4, 12, 13, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{maxLabel}, 2, 3, 13, 14, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{max}, 3, 4, 13, 14, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{stepLabel}, 2, 3, 14, 15, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{step}, 3, 4, 14, 15, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{displayasLabel}, 2, 3, 15, 16, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{displayas}, 3, 4, 15, 16, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{valuesListLabel}, 2, 3, 16, 17, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{values}, 3, 4, 16, 17, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{valuesListLegend}, 3, 4, 17, 18, ['expand', 'fill'], 'fill', 0, 0);
+
+ $self->{scrollFieldsPane} = new Gtk2::ScrolledWindow;
+ $self->{scrollFieldsPane}->set_policy ('never', 'automatic');
+ $self->{scrollFieldsPane}->set_shadow_type('none');
+ $self->{scrollFieldsPane}->set_border_width($GCUtils::margin);
+ $self->{scrollFieldsPane}->add_with_viewport($self->{fieldsOptionsTable});
+
+ my $hboxFields = new Gtk2::HBox(0,0);
+ $hboxFields->set_border_width($GCUtils::margin);
+ $self->{fieldsPane} = new Gtk2::HPaned;
+ $self->{fieldsPane}->signal_connect('size-allocate' => sub {
+ $self->{scrollPanelFilters}->set_size_request($self->{scrollPanelFields}->allocation->width, -1);
+ });
+ $hboxFields->pack_start($vboxFieldsList, 1, 1, 0);
+ $hboxFields->pack_start($vboxMove, 0, 0, $GCUtils::halfMargin);
+ $self->{fieldsPane}->pack1($hboxFields,1,0);
+ $self->{fieldsPane}->pack2($self->{scrollFieldsPane},1,0);
+ $vboxFields->pack_start($self->{fieldsPane}, 1, 1, 0);
+
+ my $optionsTable = new Gtk2::Table(9, 4);
+ $optionsTable->set_row_spacings($GCUtils::halfMargin);
+ $optionsTable->set_col_spacings($GCUtils::margin);
+ $optionsTable->set_border_width($GCUtils::margin);
+
+ my $titleFieldLabel = GCLabel->new($parent->{lang}->{ModelOptionsFieldsTitle});
+ $self->{common}->{title} = new GCMenuList;
+ my $coverFieldLabel = GCLabel->new($parent->{lang}->{ModelOptionsFieldsCover});
+ $self->{common}->{cover} = new GCMenuList;
+ my $idFieldLabel = GCLabel->new($parent->{lang}->{ModelOptionsFieldsId});
+ $self->{common}->{id} = new GCMenuList;
+ my $playFieldLabel = GCLabel->new($parent->{lang}->{ModelOptionsFieldsPlay});
+ $self->{common}->{play} = new GCMenuList;
+ $self->{hasLending} = new GCCheckBox($parent->{lang}->{ModelCollectionSettingsLending});
+ $self->{tooltips}->set_tip($self->{hasLending},
+ $parent->{lang}->{ModelTooltipLending});
+ $self->{hasTags} = new GCCheckBox($parent->{lang}->{ModelCollectionSettingsTagging});
+ $self->{tooltips}->set_tip($self->{hasTags},
+ $parent->{lang}->{ModelTooltipTagging});
+
+ my $commonFieldsLabel = new GCHeaderLabel($parent->{lang}->{ModelOptionsFields});
+ $optionsTable->attach($commonFieldsLabel, 0, 4, 0, 1, 'fill', 'fill', 0, 0);
+ $optionsTable->attach($titleFieldLabel, 2, 3, 1, 2, 'fill', 'fill', 0, 0);
+ $optionsTable->attach($self->{common}->{title}, 3, 4, 1, 2, ['expand', 'fill'], 'fill', 0, 0);
+ $optionsTable->attach($coverFieldLabel, 2, 3, 2, 3, 'fill', 'fill', 0, 0);
+ $optionsTable->attach($self->{common}->{cover}, 3, 4, 2, 3, ['expand', 'fill'], 'fill', 0, 0);
+ $optionsTable->attach($idFieldLabel, 2, 3, 3, 4, 'fill', 'fill', 0, 0);
+ $optionsTable->attach($self->{common}->{id}, 3, 4, 3, 4, ['expand', 'fill'], 'fill', 0, 0);
+ $optionsTable->attach($playFieldLabel, 2, 3, 4, 5, 'fill', 'fill', 0, 0);
+ $optionsTable->attach($self->{common}->{play}, 3, 4, 4, 5, ['expand', 'fill'], 'fill', 0, 0);
+ my $collectionSettingsLabel = new GCHeaderLabel($parent->{lang}->{ModelCollectionSettings});
+ $optionsTable->attach($collectionSettingsLabel, 0, 4, 6, 7, 'fill', 'fill', 0, 0);
+ $optionsTable->attach($self->{hasLending}, 2, 4, 7, 8, ['expand', 'fill'], 'fill', 0, 0);
+ $optionsTable->attach($self->{hasTags}, 2, 4, 8, 9, ['expand', 'fill'], 'fill', 0, 0);
+
+ $vboxOptions->pack_start($optionsTable, 1, 1, 0);
+
+ $self->{notebook}->signal_connect('switch-page' => sub {
+ my ($widget, $pointer, $number) = @_;
+ $self->saveCurrent;
+ $self->saveCurrentFilter;
+ $self->initCommonFields if $number == 1;
+ });
+
+
+ $self->{filtersList} = new Gtk2::SimpleList('' => "text");
+ $self->{filtersList}->set_model($self->{fieldsList}->get_model);
+ $self->{filtersList}->signal_connect (cursor_changed => sub {
+ my ($sl, $path, $column) = @_;
+ my @idx = $sl->get_selected_indices;
+ $self->saveCurrentFilter;
+ $self->displayFilter($idx[0]);
+ });
+
+ $self->{filtersList}->set_headers_visible(0);
+ $self->{scrollPanelFilters} = new Gtk2::ScrolledWindow;
+ $self->{scrollPanelFilters}->set_policy ('automatic', 'automatic');
+ $self->{scrollPanelFilters}->set_shadow_type('etched-in');
+ $self->{scrollPanelFilters}->add($self->{filtersList});
+
+ $self->{filter}->{activated} = GCCheckBox->new($parent->{lang}->{ModelFilterActivated});
+ $self->{filter}->{activated}->signal_connect('toggled' => sub {
+ $self->checkFilterActivated;
+ });
+ $self->{comparisonLabel} = GCLabel->new($parent->{lang}->{ModelFilterComparison});
+ $self->{filter}->{comparison} = new GCComparisonSelector($parent);
+ $self->{filter}->{numeric} = GCCheckBox->new($parent->{lang}->{ModelFilterNumeric});
+ $self->{tooltips}->set_tip($self->{filter}->{numeric},
+ $parent->{lang}->{ModelTooltipNumeric});
+ $self->{filter}->{quick} = GCCheckBox->new($parent->{lang}->{ModelFilterQuick});
+ $self->{tooltips}->set_tip($self->{filter}->{quick},
+ $parent->{lang}->{ModelTooltipQuick});
+
+ $self->{filtersOptionsTable} = new Gtk2::Table(4, 4);
+ $self->{filtersOptionsTable}->set_row_spacings($GCUtils::halfMargin);
+ $self->{filtersOptionsTable}->set_col_spacings($GCUtils::margin);
+ $self->{filtersOptionsTable}->set_border_width($GCUtils::margin);
+
+ $self->{filtersOptionsTable}->attach($self->{filter}->{activated}, 0, 4, 0, 1, 'fill', 'fill', 0, 0);
+ $self->{filtersOptionsTable}->attach($self->{comparisonLabel}, 2, 3, 1, 2, 'fill', 'fill', 0, 0);
+ $self->{filtersOptionsTable}->attach($self->{filter}->{comparison}, 3, 4, 1, 2, 'fill', 'fill', 0, 0);
+ $self->{filtersOptionsTable}->attach($self->{filter}->{numeric}, 2, 4, 2, 3, 'fill', 'fill', 0, 0);
+ $self->{filtersOptionsTable}->attach($self->{filter}->{quick}, 2, 4, 3, 4, 'fill', 'fill', 0, 0);
+
+ my $hboxFilters = new Gtk2::HBox(0,0);
+ $hboxFilters->set_border_width($GCUtils::margin);
+ $hboxFilters->pack_start($self->{scrollPanelFilters}, 0, 0, 0);
+ $hboxFilters->pack_start($self->{filtersOptionsTable}, 1, 1, $GCUtils::halfMargin);
+ $vboxFilters->pack_start($hboxFilters,1,1,0);
+
+ $self->{notebook}->append_page($vboxFields, $parent->{lang}->{ModelFields});
+ $self->{notebook}->append_page($vboxOptions, $parent->{lang}->{ModelOptions});
+ $self->{notebook}->append_page($vboxFilters, $parent->{lang}->{ModelFilters});
+
+ $self->vbox->pack_start($hboxCollectionName, 0, 0, $GCUtils::margin);
+ $self->vbox->pack_start($self->{notebook}, 1, 1, 0);
+ $self->vbox->show_all;
+
+ # Set dialog size to fit nicely onto screen
+ my $dialogWidth = $self->get_screen->get_width < 800 ? $self->get_screen->get_width - 50 : 750;
+ my $dialogHeight = $self->get_screen->get_height < 650 ? $self->get_screen->get_height - 50 : 650;
+ $self->set_default_size($dialogWidth, $dialogHeight);
+
+ $self->setSensitive(0);
+
+ return $self;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCModels/GCTVepisodes.gcm b/lib/gcstar/GCModels/GCTVepisodes.gcm
new file mode 100644
index 0000000..4f57910
--- /dev/null
+++ b/lib/gcstar/GCModels/GCTVepisodes.gcm
@@ -0,0 +1,390 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision3.xsd"
+name="GCTVepisodes">
+
+ <lang>GCTVepisodes</lang>
+
+ <options>
+
+ <defaults>
+ <image>film_no.png</image>
+ <listImageWidth>173</listImageWidth>
+ <listImageHeight>110</listImageHeight>
+ <groupby>series</groupby>
+ <sortby>season</sortby>
+ </defaults>
+
+ <fields>
+ <id>id</id>
+ <title>title</title>
+ <cover>image</cover>
+ <url>webPage</url>
+ <play>videofile</play>
+ <search>
+ <field>name</field>
+ <field>series</field>
+ </search>
+ <results>
+ <field>series</field>
+ <field>season</field>
+ <field>episode</field>
+ <field>name</field>
+ <field>firstaired</field>
+ </results>
+ </fields>
+
+ <overlay>
+ <image>film.png</image>
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>12</paddingRight>
+ <paddingTop>0</paddingTop>
+ <paddingBottom>0</paddingBottom>
+ </overlay>
+
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+ <values id="ages">
+ <value displayed="">0</value>
+ <value displayed="AgeUnrated">1</value>
+ <value displayed="AgeAll">2</value>
+ <value displayed="AgeParent">5</value>
+ <value displayed="10">10</value>
+ <value displayed="11">11</value>
+ <value displayed="12">12</value>
+ <value displayed="13">13</value>
+ <value displayed="14">14</value>
+ <value displayed="15">15</value>
+ <value displayed="16">16</value>
+ <value displayed="17">17</value>
+ <value displayed="18">18</value>
+ <value displayed="19">19</value>
+ <value displayed="20">20</value>
+ <value displayed="21">21</value>
+ </values>
+ <values id="seen">
+ <value displayed="SeenNo">0</value>
+ <value displayed="SeenYes">1</value>
+ </values>
+ </options>
+
+ <groups>
+ <group id="main" label="Main"/>
+ <group id="info" label="General"/>
+ <group id="details" label="Details"/>
+ </groups>
+
+ <random>
+ <filter field="seen" comparison="eq" numeric="true" value="0" after="1"/>
+ </random>
+
+ <fields lending="true" tags="true">
+ <field value="id"
+ type="number"
+ label="Id"
+ init=""
+ group="main"
+ imported="false"/>
+ <field value="title"
+ group="main"
+ init="%series% - S%season%E%episode%"
+ label="title"
+ type="formatted" />
+ <field value="name"
+ type="short text"
+ label="Name"
+ init="NewItem"
+ group="main"
+ imported="true"/>
+ <field value="series"
+ type="history text"
+ label="Serie"
+ init="NewSeries"
+ group="main"
+ imported="true"/>
+ <field value="season"
+ type="number"
+ label="Season"
+ init="1"
+ min="0"
+ max="99999"
+ group="main"
+ imported="true"/>
+ <field value="episode"
+ type="number"
+ label="Episode"
+ init="1"
+ min="0"
+ max="99999"
+ group="main"
+ imported="true"/>
+ <field value="seen"
+ type="yesno"
+ label="Seen"
+ init="0"
+ notnull="true"
+ group="details"
+ imported="main"/>
+ <field value="firstaired"
+ type="short text"
+ label="FirstAired"
+ init=""
+ group="info"
+ imported="true"
+ sorttype="date"/>
+ <field value="time"
+ type="short text"
+ label="Time"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="country"
+ type="history text"
+ label="Country"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="director"
+ type="short text"
+ label="Director"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="writer"
+ type="short text"
+ label="Writer"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="music"
+ type="short text"
+ label="Music"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="rating"
+ type="number"
+ displayas="graphical"
+ label="PanelRating"
+ init="0"
+ max="10"
+ group="details"
+ imported="true"/>
+ <field value="age"
+ type="options"
+ label="MinimumAge"
+ init=""
+ values="ages"
+ separator="4"
+ group="info"
+ imported="true"/>
+ <field value="image"
+ type="image"
+ label="Image"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="genre"
+ type="single list"
+ label="Genre"
+ init=",,,"
+ group="info"
+ imported="true"/>
+ <field value="actors"
+ type="double list"
+ label="Actors"
+ label1="Actor"
+ label2="Role"
+ init=""
+ group="info"
+ history="false"
+ imported="true"/>
+ <field value="synopsis"
+ type="long text"
+ label="Synopsis"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="audio"
+ type="double list"
+ label="Audio"
+ label1="Audio"
+ label2="Encoding"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="subt"
+ type="single list"
+ label="Subtitles"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="videofile"
+ type="file"
+ format="video"
+ label="Trailer"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="format"
+ type="history text"
+ label="Format"
+ init="DVD"
+ group="details"
+ imported="false"/>
+ <field value="location"
+ type="history text"
+ label="Location"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="added"
+ type="date"
+ label="PanelAdded"
+ init="current"
+ group="details"
+ imported="false"/>
+ <field value="comment"
+ type="long text"
+ label="Comment"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="webPage"
+ type="button"
+ format="url"
+ label="Url"
+ init=""
+ group="main"
+ imported="true"/>
+ </fields>
+
+ <filters>
+ <group label="General">
+ <filter field="title" comparison="contain"/>
+ <filter field="original" comparison="contain"/>
+ <filter field="director" comparison="contain"/>
+ <filter field="actors" comparison="contain"/>
+ <filter field="series" comparison="contain" quick="true"/>
+ <filter field="genre" comparison="contain" quick="true"/>
+ <filter field="country" comparison="contain" quick="true"/>
+ <filter field="age" label="FilterAudienceAge" comparison="le" numeric="true" quick="true"/>
+ <filter field="firstaired" comparison="range" numeric="true" preprocess="extractYear"/>
+ </group>
+ <group label="Details">
+ <filter field="seen" comparison="eq" values="both" labeloff="FilterSeenNo" labelon="FilterSeenYes" quick="true"/>
+ <filter field="rating" comparison="ge" numeric="true" labelselect="FilterRatingSelect" quick="true"/>
+ </group>
+ <group label="PanelLending">
+ <filter field="borrower" comparison="eq" quick="true"/>
+ </group>
+ </filters>
+
+ <panels>
+ <panel name="form" label="PanelForm" editable="true">
+ <item type="line">
+ <item type="value" for="id" width="5" nomargin="true" />
+ <item type="label" for="series" nomargin="true" />
+ <item type="value" for="series" expand="true" nomargin="true" />
+ <item type="label" for="season" nomargin="true" />
+ <item type="value" for="season" width="5" nomargin="true" />
+ <item type="label" for="episode" nomargin="true" />
+ <item type="value" for="episode" width="5" nomargin="true" />
+ </item>
+ <item type="line">
+ <item type="value" for="name" expand="true" nomargin="true" />
+ <item type="special" for="searchButton" nomargin="true" />
+ <item type="special" for="refreshButton" nomargin="true" />
+ </item>
+ <item type="notebook" expand="true">
+ <item type="tab" value="info" title="General">
+ <item type="line">
+ <item type="value" for="image" width="170" height="130"/>
+ <item type="table" rows="4" cols="4">
+ <item type="label" for="firstaired" row="0" col="0"/>
+ <item type="value" for="firstaired" row="0" col="1"/>
+ <item type="label" for="time" row="0" col="2"/>
+ <item type="value" for="time" row="0" col="3"/>
+ <item type="label" for="director" row="1" col="0"/>
+ <item type="value" for="director" row="1" col="1"/>
+ <item type="label" for="writer" row="1" col="2"/>
+ <item type="value" for="writer" row="1" col="3"/>
+ <item type="label" for="country" row="2" col="0"/>
+ <item type="value" for="country" row="2" col="1"/>
+ <item type="label" for="music" row="2" col="2"/>
+ <item type="value" for="music" row="2" col="3"/>
+ <item type="label" for="age" row="3" col="0"/>
+ <item type="value" for="age" row="3" col="1"/>
+ </item>
+ </item>
+ <item type="expander" title="Genre" collapsed="%genre%">
+ <item type="value" for="genre"/>
+ </item>
+ <item type="expander" title="Actors" collapsed="%actors%">
+ <item type="value" for="actors"/>
+ </item>
+ <item type="table" rows="1" cols="2" expand="true">
+ <item type="value" for="synopsis" row="0" col="0" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="details" title="Details">
+ <item type="table" rows="4" cols="4">
+ <item type="value" for="seen" row="0" col="0" colspan="2"/>
+ <item type="label" for="rating" row="0" col="2"/>
+ <item type="value" for="rating" row="0" col="3"/>
+ <item type="label" for="format" row="1" col="0"/>
+ <item type="value" for="format" row="1" col="1"/>
+ <item type="label" for="added" row="1" col="2"/>
+ <item type="value" for="added" row="1" col="3"/>
+ <item type="label" for="location" row="2" col="0"/>
+ <item type="value" for="location" row="2" col="1"/>
+ <item type="label" for="videofile" row="3" col="0"/>
+ <item type="line" row="3" col="1" colspan="3" expand="horizontal">
+ <item type="value" for="videofile" expand="true" nomargin="true"/>
+ <item type="launcher" for="videofile" nomargin="true"/>
+ <item type="extractor" for="videofile" nomargin="true"/>
+ </item>
+ </item>
+ <item type="expander" title="Languages" collapsed="=audio[@Audio@@Separator@%audio%]=^ - ^=subt[@Subtitles@@Separator@%subt%]=">
+ <item type="line" expand="true">
+ <item type="value" for="audio" expand="true"/>
+ <item type="value" for="subt" expand="true"/>
+ </item>
+ </item>
+ <item type="line" expand="true">
+ <item type="label" for="comment"/>
+ <item type="value" for="comment" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="lending" title="PanelLending">
+ <item type="table" rows="3" cols="3">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1"/>
+ <item type="special" for="mailButton" row="0" col="2"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1"/>
+ <item type="special" for="itemBackButton" row="1" col="2"/>
+ </item>
+ <item type="label" for="borrowings" align="left"/>
+ <item type="line" expand="true">
+ <item type="box" width="64"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="64"/>
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line" homogeneous="true">
+ <item type="value" for="webPage" expand="true"/>
+ <item type="special" for="deleteButton" expand="true"/>
+ </item>
+ </panel>
+ </panels>
+</collection>
diff --git a/lib/gcstar/GCModels/GCTVseries.gcm b/lib/gcstar/GCModels/GCTVseries.gcm
new file mode 100644
index 0000000..e9d2272
--- /dev/null
+++ b/lib/gcstar/GCModels/GCTVseries.gcm
@@ -0,0 +1,417 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision3.xsd"
+name="GCTVseries">
+
+ <lang>GCTVseries</lang>
+
+ <options>
+
+ <defaults>
+ <image>no.png</image>
+ <sortby>name</sortby>
+ </defaults>
+
+ <fields>
+ <id>id</id>
+ <title>name</title>
+ <cover>image</cover>
+ <url>webPage</url>
+ <play>videofile</play>
+ <search>
+ <field>series</field>
+ </search>
+ <results>
+ <field>series</field>
+ <field>title</field>
+ <field>season</field>
+ <field>firstaired</field>
+ </results>
+ </fields>
+
+ <overlay>
+ <image>dvd.png</image>
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>16</paddingRight>
+ <paddingTop>16</paddingTop>
+ <paddingBottom>2</paddingBottom>
+ </overlay>
+
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+ <values id="ages">
+ <value displayed="">0</value>
+ <value displayed="AgeUnrated">1</value>
+ <value displayed="AgeAll">2</value>
+ <value displayed="AgeParent">5</value>
+ <value displayed="10">10</value>
+ <value displayed="11">11</value>
+ <value displayed="12">12</value>
+ <value displayed="13">13</value>
+ <value displayed="14">14</value>
+ <value displayed="15">15</value>
+ <value displayed="16">16</value>
+ <value displayed="17">17</value>
+ <value displayed="18">18</value>
+ <value displayed="19">19</value>
+ <value displayed="20">20</value>
+ <value displayed="21">21</value>
+ </values>
+ <values id="seen">
+ <value displayed="SeenNo">0</value>
+ <value displayed="SeenYes">1</value>
+ </values>
+ </options>
+
+ <groups>
+ <group id="main" label="Main"/>
+ <group id="info" label="General"/>
+ <group id="details" label="Details"/>
+ <group id="episodelist" label="Episodes"/>
+ </groups>
+
+ <random>
+ <filter field="seen" comparison="eq" numeric="true" value="0" after="1"/>
+ </random>
+
+ <fields lending="true" tags="true">
+ <field value="id"
+ type="number"
+ label="Id"
+ init=""
+ group="main"
+ imported="false"/>
+ <field value="name"
+ group="main"
+ init="%series% - Season %season%"
+ label="Name"
+ type="formatted" />
+ <field value="series"
+ type="short text"
+ label="Series"
+ init="NewItem"
+ group="main"
+ imported="true"/>
+ <field value="season"
+ type="number"
+ label="Season"
+ init="1"
+ min="0"
+ max="99999"
+ group="main"
+ imported="true"/>
+ <field value="part"
+ type="number"
+ label="Part"
+ init="1"
+ min="0"
+ max="99999"
+ group="main"
+ imported="true"/>
+ <field value="title"
+ type="short text"
+ label="Title"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="specialep"
+ type="yesno"
+ label="Special"
+ init="0"
+ notnull="true"
+ group="main"
+ imported="true"/>
+ <field value="seen"
+ type="yesno"
+ label="Seen"
+ init="0"
+ notnull="true"
+ group="details"
+ imported="main"/>
+ <field value="firstaired"
+ type="short text"
+ label="FirstAired"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="time"
+ type="short text"
+ label="Time"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="country"
+ type="history text"
+ label="Country"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="director"
+ type="short text"
+ label="Director"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="producer"
+ type="short text"
+ label="Producer"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="music"
+ type="short text"
+ label="Music"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="rating"
+ type="number"
+ displayas="graphical"
+ label="PanelRating"
+ init="0"
+ max="10"
+ group="details"
+ imported="true"/>
+ <field value="ratingpress"
+ type="number"
+ displayas="graphical"
+ label="PanelPressRating"
+ init="0"
+ max="10"
+ group="details"
+ imported="true"/>
+ <field value="age"
+ type="options"
+ label="MinimumAge"
+ init=""
+ values="ages"
+ separator="4"
+ group="info"
+ imported="true"/>
+ <field value="image"
+ type="image"
+ label="Image"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="genre"
+ type="single list"
+ label="Genre"
+ init=",,,"
+ group="info"
+ imported="true"/>
+ <field value="actors"
+ type="double list"
+ label="Actors"
+ label1="Actor"
+ label2="Role"
+ init=""
+ group="info"
+ history="false"
+ imported="true"/>
+ <field value="synopsis"
+ type="long text"
+ label="Synopsis"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="episodes"
+ type="double list"
+ label="Episodes"
+ label1="Episode"
+ label2="Name"
+ init=""
+ group="episodelist"
+ history="false"
+ imported="true"/>
+ <field value="audio"
+ type="double list"
+ label="Audio"
+ label1="Audio"
+ label2="Encoding"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="subt"
+ type="single list"
+ label="Subtitles"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="videofile"
+ type="file"
+ format="video"
+ label="Trailer"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="format"
+ type="history text"
+ label="Format"
+ init="DVD"
+ group="details"
+ imported="false"/>
+ <field value="location"
+ type="history text"
+ label="PanelLocation"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="added"
+ type="date"
+ label="PanelAdded"
+ init="current"
+ group="details"
+ imported="false"/>
+ <field value="comment"
+ type="long text"
+ label="Comment"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="webPage"
+ type="button"
+ format="url"
+ label="Url"
+ init=""
+ group="main"
+ imported="true"/>
+ </fields>
+
+ <filters>
+ <group label="General">
+ <filter field="title" comparison="contain"/>
+ <filter field="original" comparison="contain"/>
+ <filter field="director" comparison="contain"/>
+ <filter field="actors" comparison="contain"/>
+ <filter field="series" comparison="contain" quick="true"/>
+ <filter field="genre" comparison="contain" quick="true"/>
+ <filter field="country" comparison="contain" quick="true"/>
+ <filter field="age" label="FilterAudienceAge" comparison="le" numeric="true" quick="true"/>
+ <filter field="firstaired" comparison="range" numeric="true" preprocess="extractYear"/>
+ </group>
+ <group label="Details">
+ <filter field="seen" comparison="eq" values="both" labeloff="FilterSeenNo" labelon="FilterSeenYes" quick="true"/>
+ <filter field="rating" comparison="ge" numeric="true" labelselect="FilterRatingSelect" quick="true"/>
+ </group>
+ <group label="PanelLending">
+ <filter field="borrower" comparison="eq" quick="true"/>
+ </group>
+ </filters>
+
+ <panels>
+ <panel name="form" label="PanelForm" editable="true">
+ <item type="line">
+ <item type="value" for="id" width="5" nomargin="true"/>
+ <item type="value" for="series" expand="true" nomargin="true"/>
+ <item type="label" for="season" width="5" nomargin="true"/>
+ <item type="value" for="season" nomargin="true"/>
+ <item type="label" for="part" width="5" nomargin="true"/>
+ <item type="value" for="part" nomargin="true"/>
+ <item type="special" for="searchButton" nomargin="true"/>
+ <item type="special" for="refreshButton" nomargin="true" />
+ </item>
+ <item type="notebook" expand="true">
+ <item type="tab" value="info" title="General">
+ <item type="line">
+ <item type="value" for="image" width="130" height="170"/>
+ <item type="table" rows="5" cols="4">
+ <item type="label" for="title" row="0" col="0"/>
+ <item type="line" row="0" col="1" colspan="3" expand="horizontal">
+ <item type="value" for="title" expand="true" nomargin="true"/>
+ <item type="value" for="specialep" nomargin="true"/>
+ </item>
+ <item type="label" for="firstaired" row="1" col="0"/>
+ <item type="value" for="firstaired" row="1" col="1"/>
+ <item type="label" for="time" row="1" col="2"/>
+ <item type="value" for="time" row="1" col="3"/>
+ <item type="label" for="director" row="2" col="0"/>
+ <item type="value" for="director" row="2" col="1"/>
+ <item type="label" for="producer" row="2" col="2"/>
+ <item type="value" for="producer" row="2" col="3"/>
+ <item type="label" for="country" row="3" col="0"/>
+ <item type="value" for="country" row="3" col="1"/>
+ <item type="label" for="music" row="3" col="2"/>
+ <item type="value" for="music" row="3" col="3"/>
+ <item type="label" for="age" row="4" col="0"/>
+ <item type="value" for="age" row="4" col="1"/>
+ </item>
+ </item>
+ <item type="expander" title="Genre" collapsed="%genre%">
+ <item type="value" for="genre"/>
+ </item>
+ <item type="expander" title="Actors" collapsed="%actors%">
+ <item type="value" for="actors"/>
+ </item>
+ <item type="table" rows="1" cols="2" expand="true">
+ <item type="value" for="synopsis" row="0" col="0" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="details" title="Details">
+ <item type="table" rows="4" cols="4">
+ <item type="value" for="seen" row="0" col="0" colspan="2"/>
+ <item type="label" for="rating" row="0" col="2"/>
+ <item type="value" for="rating" row="0" col="3"/>
+ <item type="label" for="format" row="1" col="0"/>
+ <item type="value" for="format" row="1" col="1"/>
+ <item type="label" for="ratingpress" row="1" col="2"/>
+ <item type="value" for="ratingpress" row="1" col="3"/>
+ <item type="label" for="location" row="2" col="0"/>
+ <item type="value" for="location" row="2" col="1"/>
+ <item type="label" for="added" row="2" col="2"/>
+ <item type="value" for="added" row="2" col="3"/>
+ <item type="label" for="videofile" row="3" col="0"/>
+ <item type="line" row="3" col="1" colspan="3" expand="horizontal">
+ <item type="value" for="videofile" expand="true" nomargin="true"/>
+ <item type="launcher" for="videofile" nomargin="true"/>
+ <item type="extractor" for="videofile" nomargin="true"/>
+ </item>
+ </item>
+ <item type="expander" title="Languages" collapsed="[@Audio@@Separator@%audio%] - [@Subtitles@@Separator@%subt%]">
+ <item type="line" expand="true">
+ <item type="value" for="audio" expand="true"/>
+ <item type="value" for="subt" expand="true"/>
+ </item>
+ </item>
+ <item type="line" expand="true">
+ <item type="label" for="comment"/>
+ <item type="value" for="comment" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="episodestab" title="Episodes">
+ <item type="box" expand="true">
+ <item type="value" for="episodes" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="lending" title="PanelLending">
+ <item type="table" rows="3" cols="3">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1"/>
+ <item type="special" for="mailButton" row="0" col="2"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1"/>
+ <item type="special" for="itemBackButton" row="1" col="2"/>
+ </item>
+ <item type="label" for="borrowings" align="left"/>
+ <item type="line" expand="true">
+ <item type="box" width="64"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="64"/>
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line" homogeneous="true">
+ <item type="value" for="webPage" expand="true"/>
+ <item type="special" for="deleteButton" expand="true"/>
+ </item>
+ </panel>
+ </panels>
+</collection>
diff --git a/lib/gcstar/GCModels/GCboardgames.gcm b/lib/gcstar/GCModels/GCboardgames.gcm
new file mode 100644
index 0000000..3c2af83
--- /dev/null
+++ b/lib/gcstar/GCModels/GCboardgames.gcm
@@ -0,0 +1,478 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCboardgames">
+ <lang>GCboardgames</lang>
+
+ <options>
+
+ <defaults>
+ <image>bg_no.png</image>
+ </defaults>
+
+ <fields>
+ <id>id</id>
+ <title>name</title>
+ <cover>boxpic</cover>
+ <url>web</url>
+ <search>
+ <field>name</field>
+ </search>
+ <results>
+ <field>name</field>
+ <field>released</field>
+ </results>
+ </fields>
+
+ <overlay>
+ <image>subtle.png</image>
+ <paddingLeft>13</paddingLeft>
+ <paddingRight>13</paddingRight>
+ <paddingTop>13</paddingTop>
+ <paddingBottom>0</paddingBottom>
+ </overlay>
+
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+ <values id="condition">
+ <value displayed="Perfect">4</value>
+ <value displayed="Good">3</value>
+ <value displayed="Average">2</value>
+ <value displayed="Poor">1</value>
+ </values>
+ <values id="completecontents">
+ <value displayed="CompleteNo">0</value>
+ <value displayed="CompleteYes">1</value>
+ </values>
+ </options>
+
+
+ <groups>
+ <group id="info" label="General"/>
+ <group id="details" label="Details"/>
+ <group id="personal" label="Personal"/>
+ </groups>
+
+ <random>
+ <filter />
+ </random>
+
+ <fields lending="true" tags="true">
+ <field value="id"
+ type="number"
+ label="Id"
+ init=""
+ group="info"
+ imported="false"/>
+ <field value="name"
+ type="short text"
+ label="Name"
+ init="NewItem"
+ group="info"
+ imported="true"/>
+ <field value="original"
+ type="short text"
+ label="Original"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="boxpic"
+ type="image"
+ label="Box"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="backpic"
+ type="image"
+ label="ContextImgBack"
+ init=""
+ group="info"
+ linkedto="boxpic"
+ imported="true"/>
+ <field value="designedby"
+ type="history text"
+ label="DesignedBy"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="illustratedby"
+ type="history text"
+ label="IllustratedBy"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="publishedby"
+ type="history text"
+ label="PublishedBy"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="players"
+ type="short text"
+ label="Players"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="playingtime"
+ type="short text"
+ label="PlayingTime"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="suggestedage"
+ type="short text"
+ label="SuggestedAge"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="released"
+ type="date"
+ label="Released"
+ init=""
+ group="info"
+ imported="true"
+ sorttype="date"/>
+ <field value="description"
+ type="long text"
+ label="Description"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="category"
+ type="single list"
+ label="Category"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="mechanics"
+ type="single list"
+ label="Mechanics"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="expandedby"
+ type="single list"
+ label="ExpandedBy"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="expansionfor"
+ type="short text"
+ label="ExpansionFor"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="gamefamily"
+ type="short text"
+ label="GameFamily"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="web"
+ type="button"
+ format="url"
+ label="Url"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="rating"
+ type="number"
+ displayas="graphical"
+ label="PanelRating"
+ init="0"
+ max="10"
+ group="personal"
+ imported="false"/>
+ <field value="timesplayed"
+ type="number"
+ label="TimesPlayed"
+ init=""
+ min="0"
+ max="99999"
+ step="1"
+ group="personal"
+ imported="false"/>
+ <field value="added"
+ type="date"
+ label="PanelAdded"
+ init="current"
+ group="personal"
+ imported="false"/>
+ <field value="copies"
+ type="number"
+ label="Copies"
+ init="1"
+ min="0"
+ max="99999"
+ step="1"
+ group="personal"
+ imported="false"/>
+ <field value="completecontents"
+ type="yesno"
+ label="CompleteContents"
+ init="1"
+ notnull="true"
+ group="personal"
+ imported="false"/>
+ <field value="condition"
+ type="options"
+ label="Condition"
+ values="condition"
+ init="3"
+ group="personal"
+ imported="false"/>
+ <field value="photo1"
+ type="image"
+ label="Photo1"
+ init=""
+ default="view"
+ group="details"
+ imported="true"/>
+ <field value="photo2"
+ type="image"
+ label="Photo2"
+ init=""
+ default="view"
+ group="details"
+ imported="true"/>
+ <field value="photo3"
+ type="image"
+ label="Photo3"
+ init=""
+ default="view"
+ group="details"
+ imported="true"/>
+ <field value="photo4"
+ type="image"
+ label="Photo4"
+ init=""
+ default="view"
+ group="details"
+ imported="true"/>
+ <field value="comments"
+ type="long text"
+ label="Comments"
+ init=""
+ group="personal"
+ imported="false"/>
+ </fields>
+
+
+ <filters>
+ <group label="General">
+ <filter field="name" comparison="contain"/>
+ <filter field="publishedby" comparison="contain" quick="true" numeric="false"/>
+ <filter field="designedby" comparison="contain" quick="true" numeric="false"/>
+ <filter field="category" comparison="contain" quick="true"/>
+ </group>
+ <group label="Details">
+ <filter field="rating" comparison="ge" numeric="true" labelselect="FilterRatingSelect" quick="true"/>
+ </group>
+ </filters>
+ <panels>
+ <panel name="form" label="PanelForm" editable="true">
+ <item type="line">
+ <item type="value" for="name" expand="true" nomargin="true" />
+ <item type="special" for="searchButton" nomargin="true" />
+ <item type="special" for="refreshButton" nomargin="true" />
+ </item>
+ <item type="notebook" expand="true">
+ <item type="tab" value="info" title="General">
+ <item type="line">
+ <item type="label" for="original"/>
+ <item type="value" for="original" expand="true"/>
+ </item>
+ <item type="line">
+ <item type="value" for="boxpic" width="200" height="200"/>
+ <item type="table" title="Information" rows="6" cols="2">
+ <item type="label" for="players" row="0" col="0"/>
+ <item type="value" for="players" row="0" col="1"/>
+ <item type="label" for="playingtime" row="1" col="0"/>
+ <item type="value" for="playingtime" row="1" col="1"/>
+ <item type="label" for="suggestedage" row="2" col="0"/>
+ <item type="value" for="suggestedage" row="2" col="1"/>
+ <item type="label" for="expansionfor" row="3" col="0"/>
+ <item type="value" for="expansionfor" row="3" col="1"/>
+ <item type="label" for="gamefamily" row="4" col="0"/>
+ <item type="value" for="gamefamily" row="4" col="1"/>
+ <item type="label" for="released" row="5" col="0"/>
+ <item type="value" for="released" row="5" col="1"/>
+ </item>
+ </item>
+ <item type="box" expand="true">
+ <item type="label" for="description"/>
+ <item type="value" for="description" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="details" title="Details">
+ <item type="box" expand="true">
+ <item type="table" rows="3" cols="4">
+ <item type="label" for="designedby" row="0" col="0"/>
+ <item type="value" for="designedby" row="0" col="1" expand="default"/>
+ <item type="label" for="publishedby" row="0" col="2"/>
+ <item type="value" for="publishedby" row="0" col="3" expand="default"/>
+ <item type="label" for="illustratedby" row="2" col="0"/>
+ <item type="value" for="illustratedby" row="2" col="1" expand="default"/>
+ </item>
+ <item type="expander" title="Category" collapsed="%category%">
+ <item type="value" for="category"/>
+ </item>
+ <item type="expander" title="Mechanics" collapsed="%mechanics%">
+ <item type="value" for="mechanics"/>
+ </item>
+ <item type="expander" title="ExpandedBy" collapsed="%expandedby%" expanded="true">
+ <item type="value" for="expandedby" />
+ </item>
+ <item type="table" rows="3" cols="2" expand="true">
+ <item type="label" label="Photos" row="0" col="0" colspan="2"/>
+ <item type="value" for="photo1" row="1" col="0" expand="true" height="150"/>
+ <item type="value" for="photo2" row="1" col="1" expand="true" height="150"/>
+ <item type="value" for="photo3" row="2" col="0" expand="true" height="150"/>
+ <item type="value" for="photo4" row="2" col="1" expand="true" height="150"/>
+ </item>
+ </item>
+
+ </item>
+ <item type="tab" value="personal" title="Personal">
+ <item type="table" rows="4" cols="4">
+ <item type="label" for="rating" row="0" col="0"/>
+ <item type="value" for="rating" row="0" col="1"/>
+ <item type="label" for="timesplayed" row="0" col="2"/>
+ <item type="value" for="timesplayed" row="0" col="3"/>
+ <item type="label" for="added" row="1" col="0"/>
+ <item type="value" for="added" row="1" col="1"/>
+ <item type="label" for="copies" row="1" col="2"/>
+ <item type="value" for="copies" row="1" col="3"/>
+ <item type="label" for="condition" row="2" col="0"/>
+ <item type="value" for="condition" row="2" col="1"/>
+ <item type="value" for="completecontents" row="2" col="2" colspan="2"/>
+ </item>
+ <item type="table" rows="2" cols="2" expand="true">
+ <item type="label" for="comments" row="0" col="0" colspan="2"/>
+ <item type="value" for="comments" row="1" col="0" colspan="2" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="lending" title="PanelLending">
+ <item type="table" rows="3" cols="3">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1"/>
+ <item type="special" for="mailButton" row="0" col="2"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1"/>
+ <item type="special" for="itemBackButton" row="1" col="2"/>
+ </item>
+ <item type="label" for="borrowings" align="left"/>
+ <item type="line" expand="true">
+ <item type="box" width="64"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="64"/>
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line" homogeneous="true">
+ <item type="value" for="web" expand="true"/>
+ <item type="special" for="deleteButton" expand="true"/>
+ </item>
+ </panel>
+ <panel name="readonly" label="PanelReadOnly" editable="false">
+ <item type="table" rows="2" cols="2">
+ <item type="value" for="name" style="header" row="0" col="0" colspan="2" expand="true"/>
+ <item type="value" for="original" style="subheader" row="1" col="0" colspan="2" expand="true"/>
+ </item>
+ <item type="line">
+ <item type="box">
+ <item type="value" for="boxpic" width="200" height="200"/>
+ </item>
+ <item type="box" width="6"/>
+ <item type="table" title="Information" rows="6" cols="5" expand="true">\
+ <item type="label" for="players" row="0" col="0"/>
+ <item type="value" for="players" row="0" col="1" expand="true"/>
+ <item type="label" for="playingtime" row="1" col="0"/>
+ <item type="value" for="playingtime" row="1" col="1" expand="true"/>
+ <item type="label" for="suggestedage" row="2" col="0"/>
+ <item type="value" for="suggestedage" row="2" col="1" expand="true"/>
+ <item type="label" for="expansionfor" row="3" col="0"/>
+ <item type="value" for="expansionfor" row="3" col="1" expand="true"/>
+ <item type="label" for="gamefamily" row="4" col="0"/>
+ <item type="value" for="gamefamily" row="4" col="1" expand="true"/>
+ <item type="label" for="released" row="5" col="0"/>
+ <item type="value" for="released" row="5" col="1" expand="true"/>
+ </item>
+ </item>
+ <item type="box" expand="true">
+ <item type="label" for="description"/>
+ <item type="value" for="description" expand="true"/>
+ </item>
+ <item type="expander" title="Details">
+ <item type="table" rows="5" cols="4" expand="true">
+ <item type="label" for="designedby" row="0" col="0"/>
+ <item type="value" for="designedby" row="0" col="1" expand="true"/>
+ <item type="label" for="publishedby" row="0" col="2"/>
+ <item type="value" for="publishedby" row="0" col="3" expand="true"/>
+ <item type="label" for="illustratedby" row="1" col="0"/>
+ <item type="value" for="illustratedby" row="1" col="1" colspan="3"/>
+ <item type="label" for="category" row="2" col="0" />
+ <item type="value" for="category" row="2" col="1" flat="true" expand="true" colspan="3" />
+ <item type="label" for="mechanics" row="3" col="0" />
+ <item type="value" for="mechanics" row="3" col="1" flat="true" expand="true" colspan="3" />
+ <item type="value" for="expandedby" row="4" col="0" colspan="4"/>
+ </item>
+ </item>
+ <item type="expander" title="Personal">
+ <item type="table" rows="3" cols="4" expand="true">
+ <item type="label" for="rating" row="0" col="0"/>
+ <item type="value" for="rating" row="0" col="1" expand="true"/>
+ <item type="label" for="timesplayed" row="0" col="2"/>
+ <item type="value" for="timesplayed" row="0" col="3" expand="true"/>
+ <item type="label" for="added" row="1" col="0"/>
+ <item type="value" for="added" row="1" col="1" expand="true"/>
+ <item type="label" for="copies" row="1" col="2"/>
+ <item type="value" for="copies" row="1" col="3" expand="true"/>
+ <item type="label" for="condition" row="2" col="0"/>
+ <item type="value" for="condition" row="2" col="1" expand="true"/>
+ <item type="value" for="completecontents" row="2" col="2" colspan="2" expand="true" nomargin="true" values="completecontents"/>
+ </item>
+ <item type="table" rows="2" cols="2" expand="true">
+ <item type="label" for="comments" row="0" col="0" colspan="2"/>
+ <item type="value" for="comments" row="1" col="0" colspan="2" expand="true"/>
+ </item>
+ </item>
+ <item type="expander" title="PanelLending">
+ <item type="table" rows="4" cols="2" expand="true">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1" expand="true"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1" expand="true"/>
+ <item type="line" row="2" col="0" colspan="2" height="12" expand="true"/>
+ <item type="line" row="3" col="0" colspan="2" expand="true">
+ <item type="box" width="50" style="page"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="50" style="page"/>
+ </item>
+ </item>
+ </item>
+ <item type="expander" title="PanelTags">
+ <item expand="true" for="tags" type="value" />
+ <item type="value" for="favourite" values="favouriteYesno" collapse="true"/>
+ </item>
+ <item type="expander" title="Photos">
+ <item type="table" rows="3" cols="2" expand="true">
+ <item type="label" label="Photos" row="0" col="0" colspan="2"/>
+ <item type="value" for="photo1" row="1" col="0" expand="true" height="150"/>
+ <item type="value" for="photo2" row="1" col="1" expand="true" height="150"/>
+ <item type="value" for="photo3" row="2" col="0" expand="true" height="150"/>
+ <item type="value" for="photo4" row="2" col="1" expand="true" height="150"/>
+ </item>
+ </item>
+ </panel>
+ </panels>
+
+</collection>
diff --git a/lib/gcstar/GCModels/GCbooks.gcm b/lib/gcstar/GCModels/GCbooks.gcm
new file mode 100644
index 0000000..1494982
--- /dev/null
+++ b/lib/gcstar/GCModels/GCbooks.gcm
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCbooks">
+ <lang>GCbooks</lang>
+
+ <options>
+ <defaults>
+ <image>book_no.png</image>
+ </defaults>
+ <fields>
+ <id>id</id>
+ <title>title</title>
+ <cover>cover</cover>
+ <url>web</url>
+ <play>digitalfile</play>
+ <search>
+ <field>isbn</field>
+ <field>title</field>
+ <field>authors</field>
+ </search>
+ <results>
+ <field>title</field>
+ <field>authors</field>
+ <field>publication</field>
+ <field>format</field>
+ <field>edition</field>
+ <field>serie</field>
+ </results>
+ <summary>
+ <field>authors</field>
+ <field>publication</field>
+ <field>genre</field>
+ <field>format</field>
+ <field>borrower</field>
+ <field>tags</field>
+ </summary>
+ </fields>
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+ <values id="read">
+ <value displayed="ReadNo">0</value>
+ <value displayed="ReadYes">1</value>
+ </values>
+ <overlay>
+ <image>subtle.png</image>
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>11</paddingRight>
+ <paddingTop>12</paddingTop>
+ <paddingBottom>0</paddingBottom>
+ </overlay>
+ </options>
+
+ <groups>
+ <group id="Main" label="General" />
+ <group id="Details" label="Details" />
+ </groups>
+
+ <random>
+ <filter field="read" comparison="eq" numeric="true" value="0" after="1"/>
+ </random>
+
+ <fields lending="true" tags="true">
+ <field value="id" group="Main" init="" label="" type="number" imported="false"/>
+ <field value="isbn" group="Main" init="" label="Isbn" format="0-9X\-" type="checked text" imported="true"/>
+ <field value="title" group="Main" init="NewItem" label="Title" type="short text" imported="true" />
+ <field value="cover" group="Main" init="" label="Cover" type="image" default="view" imported="true" />
+ <field value="backpic" type="image" label="ContextImgBack" init="" group="Main" linkedto="cover" imported="true"/>
+ <field value="authors" group="Main" history="true" init="" label="Authors" type="single list" imported="true" />
+ <field value="publisher" group="Main" init="" label="Publisher" type="history text" imported="true" />
+ <field value="publication" group="Main" init="" label="Publication" type="date" imported="true" />
+ <field value="language" group="Main" init="" label="Language" type="history text" imported="true" />
+ <field value="serie" group="Main" init="" label="Serie" type="history text" imported="true" />
+ <field value="rank" group="Main" init="1" label="Rank" type="number" min="0" max="999" imported="true" />
+ <field value="edition" group="Details" init="" label="Edition" type="short text" imported="true" />
+ <field value="format" group="Details" init="" label="Format" type="history text" imported="true" />
+ <field value="genre" group="Main" history="true" init="" label="Genre" type="single list" imported="true" />
+ <field value="description" group="Main" init="" label="Bookdescription" type="long text" imported="true" />
+ <field value="pages" group="Main" init="" label="Pages" type="number" imported="true" />
+ <field value="web" group="Main" init="" label="Url" type="button" format="url" imported="true" />
+ <field value="read" group="Details" init="0" label="Read" type="yesno" />
+ <field value="added" group="Details" init="current" label="PanelAdded" type="date" />
+ <field value="rating" group="Details" init="0" label="PanelRating" min="0" max="10" type="number" displayas="graphical" />
+ <field value="acquisition" group="Details" init="" label="Acquisition" type="date" />
+ <field value="location" group="Details" init="" label="PanelLocation" type="history text" />
+ <field value="comments" group="Details" init="" label="Comments" type="long text" />
+ <field value="translator" group="Details" init="" label="Translator" type="short text" imported="true" />
+ <field value="artist" group="Details" init="" label="Artist" type="short text" />
+ <field value="digitalfile" group="Details" init="" label="DigitalFile" type="file" format="ebook" />
+ </fields>
+
+ <filters>
+ <group label="Main">
+ <filter comparison="contain" field="isbn" numeric="false" quick="false" />
+ <filter comparison="contain" field="title" numeric="false" quick="false" />
+ <filter comparison="contain" field="authors" numeric="false" quick="true" />
+ <filter comparison="contain" field="publisher" numeric="false" quick="true" />
+ <filter comparison="contain" field="language" numeric="false" quick="true" />
+ <filter comparison="contain" field="genre" numeric="false" quick="true" />
+ <filter comparison="ge" field="rating" labelselect="&gt;=" numeric="true" quick="false" />
+ </group>
+ <group label="Details">
+ <filter comparison="eq" field="read" numeric="false" quick="true" />
+ <filter comparison="ge" field="acquisition" labelselect="&gt;=" numeric="false" quick="false" />
+ </group>
+ </filters>
+
+ <panels>
+ <panel editable="true" label="PanelForm" name="form">
+ <item type="line">
+ <item for="isbn" type="value" width="13" nomargin="true" />
+ <item expand="true" for="title" type="value" nomargin="true" />
+ <item type="special" for="searchButton" nomargin="true" />
+ <item type="special" for="refreshButton" nomargin="true" />
+ </item>
+ <item expand="true" type="notebook">
+ <item expand="true" title="General" type="tab" value="main">
+ <item type="line">
+ <item for="cover" height="170" width="130" type="value"/>
+ <item cols="4" rows="5" type="table" expand="true">
+ <item col="0" for="publication" row="0" type="label" />
+ <item col="1" colspan="3" expand="true" for="publication" row="0" type="value" />
+ <item col="0" for="publisher" row="1" type="label" />
+ <item col="1" colspan="3" expand="true" for="publisher" row="1" type="value" />
+ <item col="0" for="serie" row="2" type="label" />
+ <item col="1" colspan="1" expand="true" for="serie" row="2" type="value" width="5" />
+ <item col="2" for="rank" row="2" type="label" />
+ <item col="3" colspan="1" expand="true" for="rank" row="2" type="value" />
+ <item col="0" for="language" row="3" type="label" />
+ <item col="1" colspan="3" expand="true" for="language" row="3" type="value" />
+ <item col="0" for="pages" row="4" type="label" />
+ <item col="1" colspan="3" expand="true" for="pages" row="4" type="value" />
+ </item>
+ <item type="line" width="0"/>
+ </item>
+ <item type="expander" title="Authors" collapsed="%authors%" row="0" col="0" colspan="4">
+ <item type="value" for="authors"/>
+ </item>
+ <item type="expander" title="Genre" collapsed="%genre%" row="1" col="0" colspan="4">
+ <item type="value" for="genre"/>
+ </item>
+ <item cols="4" rows="3" type="table" expand="true">
+ <item col="0" for="description" row="0" type="label" />
+ <item col="1" colspan="3" expand="true" for="description" row="0" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Details" type="tab" value="bla">
+ <item cols="6" expand="true" rows="8" type="table">
+ <item col="0" row="0" colspan="4" for="read" type="value" />
+ <item col="0" row="1" for="added" type="label" />
+ <item col="1" row="1" colspan="3" for="added" type="value" />
+ <item col="0" row="2" for="translator" type="label" />
+ <item col="1" row="2" for="translator" type="value" />
+ <item col="2" row="2" for="artist" type="label" />
+ <item col="3" row="2" for="artist" type="value" />
+ <item col="0" row="3" for="rating" type="label" />
+ <item col="1" row="3" for="rating" type="value" />
+ <item col="2" row="3" for="location" type="label" />
+ <item col="3" row="3" for="location" width="13" type="value" />
+ <item col="0" row="4" for="edition" type="label" />
+ <item col="1" row="4" for="edition" type="value" />
+ <item col="2" row="4" for="format" type="label" />
+ <item col="3" row="4" for="format" width="13" type="value" />
+ <item col="0" row="5" for="acquisition" type="label" />
+ <item col="1" row="5" for="acquisition" type="value" />
+ <item col="0" row="6" type="label" for="digitalfile" nomargin="true"/>
+ <item col="1" row="6" type="line" colspan="3">
+ <item type="value" for="digitalfile" expand="true" nomargin="true"/>
+ <item type="launcher" for="digitalfile" nomargin="true"/>
+ </item>
+ <item col="0" row="7" for="comments" type="label" />
+ <item col="1" row="7" colspan="3" expand="true" for="comments" type="value" />
+ </item>
+ </item>
+ <item type="tab" value="lending" title="PanelLending">
+ <item type="table" rows="3" cols="3">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1"/>
+ <item type="special" for="mailButton" row="0" col="2"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1"/>
+ <item type="special" for="itemBackButton" row="1" col="2"/>
+ </item>
+ <item type="label" for="borrowings" align="left"/>
+ <item type="line" expand="true">
+ <item type="box" width="64"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="64"/>
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line" homogeneous="true">
+ <item expand="true" for="web" type="value" />
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+
+ <panel name="readonly" label="PanelReadOnly" editable="false">
+ <item type="table" rows="2" cols="3">
+ <item type="value" for="title" style="header" row="0" col="0" colspan="3" expand="true"/>
+ <item type="box" row="1" col="0" width="100" expand="false" style="page"/>
+ <item type="value" for="authors" flat="true" style="subheader" row="1" col="1" expand="true"/>
+ <item type="box" row="1" col="2" width="100" expand="false" style="box">
+ <item type="value" for="isbn" style="box" nomargin="true"/>
+ <item type="value" for="read" style="box" nomargin="true" values="read"/>
+ <item type="formatted" name="fullrating" value="%rating%/10" style="box" nomargin="true"/>
+ </item>
+ </item>
+ <item type="line">
+ <item type="box" width="150" style="page">
+ <item type="value" for="cover" width="140"/>
+ </item>
+ <item type="box" expand="true">
+ <item type="table" rows="6" cols="2" expand="true">
+ <item type="label" for="publication" row="0" col="0"/>
+ <item type="value" for="publication" row="0" col="1" expand="true"/>
+ <item type="label" for="publisher" row="1" col="0"/>
+ <item type="value" for="publisher" row="1" col="1" expand="true"/>
+ <item type="label" for="serie" row="2" col="0"/>
+ <item type="value" for="serie" row="2" col="1" expand="true"/>
+ <item type="label" for="language" row="3" col="0"/>
+ <item type="value" for="language" row="3" col="1" expand="true"/>
+ <item type="label" for="pages" row="4" col="0"/>
+ <item type="value" for="pages" row="4" col="1" expand="true"/>
+ <item type="label" for="genre" row="5" col="0"/>
+ <item type="value" for="genre" flat="true" row="5" col="1" expand="true"/>
+ </item>
+ </item>
+ </item>
+ <item type="value" for="description" height="5em"/>
+ <item type="expander" title="Details">
+ <item cols="2" expand="true" rows="7" type="table">
+ <item col="0" for="edition" row="0" type="label" />
+ <item col="1" for="edition" row="0" type="value" />
+ <item col="0" for="format" row="1" type="label" />
+ <item col="1" for="format" row="1" type="value" />
+ <item col="0" for="location" row="2" type="label" />
+ <item col="1" for="location" row="2" type="value" />
+ <item col="0" for="acquisition" row="3" type="label" />
+ <item col="1" for="acquisition" row="3" type="value" />
+ <item col="0" for="translator" row="4" type="label" />
+ <item col="1" for="translator" row="4" type="value" />
+ <item col="0" for="artist" row="5" type="label" />
+ <item col="1" for="artist" row="5" type="value" />
+ <item col="0" for="comments" row="6" type="label" />
+ <item col="1" expand="true" height="5em" for="comments" row="6" type="value" />
+ </item>
+ </item>
+ <item type="expander" title="PanelLending">
+ <item type="table" rows="4" cols="2" expand="true">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1" expand="true"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1" expand="true"/>
+ <item type="line" row="2" col="0" colspan="2" height="12" expand="true"/>
+ <item type="line" row="3" col="0" colspan="2" expand="true">
+ <item type="box" width="50" style="page"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="50" style="page"/>
+ </item>
+ </item>
+ </item>
+ <item type="expander" title="PanelTags">
+ <item expand="true" for="tags" type="value" />
+ <item type="value" for="favourite" values="favouriteYesno" collapse="true"/>
+ </item>
+ </panel>
+
+</panels>
+</collection>
diff --git a/lib/gcstar/GCModels/GCcoins.gcm b/lib/gcstar/GCModels/GCcoins.gcm
new file mode 100644
index 0000000..9e37272
--- /dev/null
+++ b/lib/gcstar/GCModels/GCcoins.gcm
@@ -0,0 +1,275 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCcoins">
+
+ <lang>GCcoins</lang>
+
+ <options>
+ <defaults>
+ <image>no.png</image>
+ </defaults>
+ <fields>
+ <cover>picture</cover>
+ <id>gcsautoid</id>
+ <play/>
+ <title>name</title>
+ </fields>
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+ <values id="types">
+ <value displayed="Coin">coin</value>
+ <value displayed="Banknote">banknote</value>
+ </values>
+ <values id="grades">
+ <value displayed="Grade1">1</value>
+ <value displayed="Grade2">2</value>
+ <value displayed="Grade3">3</value>
+ <value displayed="Grade4">4</value>
+ <value displayed="Grade6">6</value>
+ <value displayed="Grade8">8</value>
+ <value displayed="Grade10">10</value>
+ <value displayed="Grade12">12</value>
+ <value displayed="Grade15">15</value>
+ <value displayed="Grade20">20</value>
+ <value displayed="Grade25">25</value>
+ <value displayed="Grade30">30</value>
+ <value displayed="Grade35">35</value>
+ <value displayed="Grade40">40</value>
+ <value displayed="Grade45">45</value>
+ <value displayed="Grade50">50</value>
+ <value displayed="Grade53">53</value>
+ <value displayed="Grade55">55</value>
+ <value displayed="Grade58">58</value>
+ <value displayed="Grade60">60</value>
+ <value displayed="Grade61">61</value>
+ <value displayed="Grade62">62</value>
+ <value displayed="Grade63">63</value>
+ <value displayed="Grade64">64</value>
+ <value displayed="Grade65">65</value>
+ <value displayed="Grade66">66</value>
+ <value displayed="Grade67">67</value>
+ <value displayed="Grade68">68</value>
+ <value displayed="Grade69">69</value>
+ <value displayed="Grade70">70</value>
+ </values>
+ </options>
+
+ <groups>
+ <group id="Main" label="Main" />
+ <group id="Description" label="Description" />
+ <group id="Other" label="Other" />
+ <group id="Pictures" label="Pictures" />
+ </groups>
+
+ <filters>
+ <group label="Main">
+ <filter comparison="range" field="year" labelselect="Intervalle" numeric="true" quick="true" />
+ <filter comparison="contain" field="picture" numeric="true" quick="false" />
+ </group>
+ <group label="Description">
+ <filter comparison="contain" field="diameter" labelselect="Contient" numeric="true" quick="false" />
+ </group>
+ </filters>
+
+ <random></random>
+
+ <fields lending="false" tags="true">
+ <field value="gcsautoid" displayed="" group="" imported="false" init="" label="" type="number" />
+ <field value="name" group="Main" init="%currency% %value% (%year%)" label="Name" type="formatted" />
+ <field value="picture" default="view" group="Main" init="" label="Picture" type="image" />
+ <field value="currency" flat="true" group="Main" history="true" init="" label="Currency" type="history text" />
+ <field value="country" group="Main" label="Country" type="history text" init="" />
+ <field value="value" group="Main" init="" label="Value" type="number" />
+ <field value="year" group="Main" init="" label="Year" type="number" />
+ <field value="added" group="Main" init="current" label="PanelAdded" type="date" />
+ <field values="grades" group="Main" init="" label="Condition" type="options" value="condition" />
+ <field value="comments" group="Main" init="" label="Comments" type="long text" />
+ <field value="diameter" group="Description" init="" label="Diameter" type="number" />
+ <field value="metal" flat="true" group="Description" history="true" init="" label="Metal" type="single list" />
+ <field value="edge" group="Description" init="" label="Edge" type="long text" />
+ <field value="head" group="Description" init="" label="Head" type="long text" />
+ <field value="tail" group="Description" init="" label="Tail" type="long text" />
+ <field value="location" group="Description" init="current" label="Location" type="history text" />
+ <field value="history" group="Other" init="" label="History" type="long text" />
+ <field value="website" group="Other" init="" label="Website" type="url" />
+ <field value="estimate" group="Other" init="" label="Estimate" type="number" />
+ <field value="references" group="Other" init="" label="References" type="long text" />
+ <field value="front" default="view" group="Pictures" init="" label="Head" type="image" />
+ <field value="back" default="view" group="Pictures" init="" label="Tail" type="image" />
+ <field value="edge1" default="view" group="Pictures" init="" label="Edge1" type="image" />
+ <field value="edge2" default="view" group="Pictures" init="" label="Edge2" type="image" />
+ <field value="edge3" default="view" group="Pictures" init="" label="Edge3" type="image" />
+ <field value="edge4" default="view" group="Pictures" init="" label="Edge4" type="image" />
+ <field value="type" group="Main" init="" label="Type" type="options" values="types" />
+ </fields>
+
+ <panels>
+ <panel editable="true" label="PanelForm" name="form">
+ <item type="line">
+ <item expand="true" for="name" type="value" />
+ </item>
+ <item expand="true" type="notebook">
+ <item expand="true" title="Main" type="tab" value="bla">
+ <item type="line">
+ <item for="picture" height="150" type="value" width="150" />
+ <item cols="2" rows="5" type="table">
+ <item row="0" col="0" for="currency" type="label" />
+ <item row="0" col="1" for="currency" expand="true" type="value" />
+ <item row="1" col="0" for="value" type="label" />
+ <item row="1" col="1" for="value" expand="true" type="value" />
+ <item row="2" col="0" for="year" type="label" />
+ <item row="2" col="1" for="year" expand="true" type="value" />
+ <item row="3" col="0" for="country" type="label" />
+ <item row="3" col="1" for="country" expand="true" type="value" />
+ <item row="4" col="0" for="type" type="label" />
+ <item row="4" col="1" for="type" expand="true" type="value" />
+ </item>
+ </item>
+ <item type="box" expand="true">
+ <item type="table" rows="2" cols="2">
+ <item row="0" col="0" for="added" type="label" />
+ <item row="0" col="1" expand="default" for="added" type="value" />
+ <item row="1" col="0" for="condition" type="label" />
+ <item row="1" col="1" for="condition" type="value" />
+ </item>
+ <item for="comments" type="label" />
+ <item for="comments" expand="true" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Description" type="tab" value="bla">
+ <item cols="4" expand="true" rows="5" type="table">
+ <item row="0" col="0" for="diameter" type="label" />
+ <item row="0" col="1" expand="default" for="diameter" type="value" />
+ <item row="1" col="0" collapsed="%metal%" colspan="3" title="Metal" type="expander">
+ <item for="metal" type="value" />
+ </item>
+ <item row="2" col="0" for="edge" type="label" />
+ <item row="2" col="1" colspan="3" expand="true" for="edge" type="value" />
+ <item row="3" col="0" for="head" type="label" />
+ <item row="3" col="1" colspan="3" expand="true" for="head" type="value" />
+ <item row="4" col="0" for="tail" type="label" />
+ <item row="4" col="1" colspan="3" expand="true" for="tail" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Other" type="tab" value="bla">
+ <item cols="4" expand="true" rows="5" type="table">
+ <item col="0" row="0" for="location" type="label" />
+ <item col="1" row="0" for="location" type="value" />
+ <item col="0" row="1" for="estimate" type="label" />
+ <item col="1" row="1" expand="default" for="estimate" type="value" />
+ <item col="0" row="2" for="website" type="label" />
+ <item col="1" row="2" expand="default" for="website" type="value" />
+ <item col="0" row="3" for="history" type="label" />
+ <item col="1" row="3" colspan="3" expand="true" for="history" type="value" />
+ <item col="0" row="4" for="references" type="label" />
+ <item col="1" row="4" colspan="3" expand="true" for="references" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Pictures" type="tab" value="bla">
+ <item type="box" expand="true">
+ <item cols="2" rows="5" expand="true" type="table">
+ <item row="0" col="0" expand="true" type="label" label="Front" align="center" />
+ <item row="0" col="1" expand="true" type="label" label="Back" align="center" />
+ <item row="1" col="0" expand="true" for="front" type="value" height="150" />
+ <item row="1" col="1" expand="true" for="back" type="value" height="150" />
+ <item row="2" col="0" expand="true" colspan="2" type="label" label="Edge" align="center" />
+ <item row="3" col="0" expand="true" for="edge1" type="value" height="150" />
+ <item row="3" col="1" expand="true" for="edge2" type="value" height="150" />
+ <item row="4" col="0" expand="true" for="edge3" type="value" height="150" />
+ <item row="4" col="1" expand="true" for="edge4" type="value" height="150" />
+ </item>
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+
+ <panel editable="false" label="PanelReadOnly" name="readonly">
+ <item type="line">
+ <item style="page" type="box" width="150">
+ <item for="picture" type="value" width="140" />
+ </item>
+ <item expand="true" type="box">
+ <item type="table" cols="2" rows="4" expand="true">
+ <item col="0" row="0" for="currency" type="label" />
+ <item col="1" row="0" for="currency" type="value" expand="true" />
+ <item col="0" row="1" for="value" type="label" />
+ <item col="1" row="1" for="value" type="value" expand="true" />
+ <item col="0" row="2" for="year" type="label" />
+ <item col="1" row="2" for="year" type="value" expand="true" />
+ <item col="0" row="3" for="country" type="label" />
+ <item col="1" row="3" for="country" type="value" expand="true" />
+ </item>
+ </item>
+ </item>
+ <item type="box">
+ <item type="table" cols="2" rows="4" expand="true">
+ <item col="0" row="0" for="added" type="label" />
+ <item col="1" row="0" for="added" type="value" />
+ <item col="0" row="1" for="condition" type="label" />
+ <item col="1" row="1" for="condition" type="value" />
+ <item col="0" row="2" for="type" type="label" />
+ <item col="1" row="2" for="type" type="value" />
+ <item col="0" row="3" for="comments" type="label" />
+ <item col="1" row="3" for="comments" type="value" expand="horizontal" height="5em" />
+ </item>
+ <item type="expander" title="Description">
+ <item type="table" cols="2" rows="5" expand="true">
+ <item col="0" row="0" for="diameter" type="label" />
+ <item col="1" row="0" for="diameter" type="value" />
+ <item col="0" row="1" for="metal" type="label" />
+ <item col="1" row="1" for="metal" type="value" flat="true" />
+ <item col="0" row="2" for="edge" type="label" />
+ <item col="1" row="2" for="edge" type="value" expand="true" />
+ <item col="0" row="3" for="head" type="label" />
+ <item col="1" row="3" for="head" type="value" expand="true" />
+ <item col="0" row="4" for="tail" type="label" />
+ <item col="1" row="4" for="tail" type="value" expand="true" />
+ </item>
+ </item>
+ <item type="expander" title="Other">
+ <item type="table" cols="2" rows="5" expand="true">
+ <item col="0" row="0" for="location" type="label" />
+ <item col="1" row="0" for="location" type="value" expand="true" />
+ <item col="0" row="1" for="estimate" type="label" />
+ <item col="1" row="1" for="estimate" type="value" expand="true" />
+ <item col="0" row="2" for="website" type="label" />
+ <item col="1" row="2" for="website" type="value" expand="true" />
+ <item col="0" row="3" for="history" type="label" />
+ <item col="1" row="3" for="history" type="value" expand="true" />
+ <item col="0" row="4" for="references" type="label" />
+ <item col="1" row="4" for="references" type="value" expand="true" />
+ </item>
+ </item>
+ <item type="expander" title="Pictures">
+ <item type="table" cols="2" rows="5" expand="true">
+ <item row="0" col="0" type="label" label="Front" align="center" expand="true" />
+ <item row="0" col="1" type="label" label="Back" align="center" expand="true" />
+ <item row="1" col="0" for="front" type="value" expand="true" />
+ <item row="1" col="1" for="back" type="value" expand="true" />
+ <item row="2" col="0" colspan="2" type="label" label="Edge" align="center" expand="true" />
+ <item row="3" col="0" for="edge1" type="value" expand="true" />
+ <item row="3" col="1" for="edge2" type="value" expand="true" />
+ <item row="4" col="0" for="edge3" type="value" expand="true" />
+ <item row="4" col="1" for="edge4" type="value" expand="true" />
+ </item>
+ </item>
+ </item>
+ <item type="expander" title="PanelTags">
+ <item expand="true" for="tags" type="value" />
+ <item type="value" for="favourite" values="favouriteYesno" collapse="true"/>
+ </item>
+ </panel>
+ </panels>
+</collection>
diff --git a/lib/gcstar/GCModels/GCcomics.gcm b/lib/gcstar/GCModels/GCcomics.gcm
new file mode 100644
index 0000000..528a9f7
--- /dev/null
+++ b/lib/gcstar/GCModels/GCcomics.gcm
@@ -0,0 +1,353 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCcomics">
+ <lang>GCcomics</lang>
+ <options>
+ <defaults>
+ <image>no.png</image>
+ </defaults>
+
+ <fields>
+ <id>id</id>
+ <title>name</title>
+ <cover>image</cover>
+ <url>webPage</url>
+ <search>
+ <field>series</field>
+ <field>writer</field>
+ </search>
+ <results>
+ <field>series</field>
+ <field>volume</field>
+ <field>title</field>
+ <field>type</field>
+ <field>format</field>
+ <field>publishdate</field>
+ </results>
+ </fields>
+
+ <overlay>
+ <image>subtle.png</image>
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>11</paddingRight>
+ <paddingTop>12</paddingTop>
+ <paddingBottom>0</paddingBottom>
+ </overlay>
+
+ <values id="signing">
+ <value displayed="SigningNo">0</value>
+ <value displayed="SigningYes">1</value>
+ </values>
+ <values id="favouriteYesno">
+ <value displayed="PanelFavourite">1</value>
+ <value displayed="">0</value>
+ </values>
+ </options>
+
+
+ <groups>
+ <group id="main" label="Main"/>
+ <group id="info" label="General"/>
+ <group id="details" label="Details"/>
+ </groups>
+
+ <random>
+ <filter />
+ </random>
+
+ <fields lending="true" tags="true">
+ <field value="id"
+ type="number"
+ label="Id"
+ init=""
+ group="main"
+ imported="false"/>
+ <field value="name"
+ group="main"
+ init="%series% #%volume[%03d]% %title%"
+ label="Name"
+ type="formatted" />
+ <field value="series"
+ type="history text"
+ label="Series"
+ init="New Comic"
+ group="main"
+ imported="true"/>
+ <field value="volume"
+ type="number"
+ label="Volume"
+ init="1"
+ min="0"
+ max="9999"
+ group="main"
+ imported="true"/>
+ <field value="title"
+ type="short text"
+ label="Title"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="writer"
+ type="history text"
+ label="Writer"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="illustrator"
+ type="history text"
+ label="Illustrator"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="colourist"
+ type="history text"
+ label="Colourist"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="publisher"
+ type="history text"
+ label="Publisher"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="synopsis"
+ type="long text"
+ label="Synopsis"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="collection"
+ type="history text"
+ label="Collection"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="publishdate"
+ type="date"
+ label="PublishDate"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="printdate"
+ type="date"
+ label="PrintingDate"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="image"
+ type="image"
+ label="Image"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="backpic"
+ type="image"
+ label="ContextImgBack"
+ init=""
+ group="info"
+ linkedto="image"
+ imported="true"/>
+ <field value="webPage"
+ type="button"
+ format="url"
+ label="Url"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="added"
+ type="date"
+ label="PanelAdded"
+ init="current"
+ group="details"
+ imported="false"/>
+ <field value="isbn"
+ type="short text"
+ label="ISBN"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="type"
+ type="history text"
+ label="Type"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="category"
+ type="history text"
+ label="Category"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="format"
+ type="history text"
+ label="Format"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="numberboards"
+ type="number"
+ label="NumberBoards"
+ init="1"
+ min="0"
+ max="9999"
+ group="details"
+ imported="true"/>
+ <field value="signing"
+ type="yesno"
+ label="Signing"
+ init="0"
+ group="details"
+ imported="false"/>
+ <field value="cost"
+ type="number"
+ label="Cost"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="rating"
+ type="number"
+ displayas="graphical"
+ label="Rating"
+ init="0"
+ max="10"
+ group="details"
+ imported="true"/>
+ <field value="comment"
+ type="long text"
+ label="Comment"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="file"
+ type="file"
+ format="simple"
+ label="File"
+ init=""
+ group="details"
+ imported="false"/>
+ </fields>
+
+
+ <filters>
+ <group label="General">
+ <filter field="series" comparison="contain" quick="true"/>
+ <filter field="writer" comparison="contain" quick="true"/>
+ <filter field="illustrator" comparison="contain" quick="true"/>
+ <filter field="colourist" comparison="contain" quick="true"/>
+ <filter field="publisher" comparison="contain" quick="true"/>
+ <filter field="publishdate" comparison="range" numeric="true" preprocess="extractYear"/>
+ <filter field="printdate" comparison="range" numeric="true" preprocess="extractYear"/>
+ </group>
+ <group label="Details">
+ <filter field="rating" comparison="ge" numeric="true" labelselect="FilterRatingSelect" quick="true"/>
+ </group>
+ <group label="PanelLending">
+ <filter field="borrower" comparison="eq" quick="true"/>
+ </group>
+ </filters>
+
+
+ <panels>
+ <panel name="form" label="PanelForm" editable="true">
+ <item type="line">
+ <item type="value" for="id" width="5" nomargin="true" />
+ <item type="label" for="series" nomargin="true" />
+ <item type="value" for="series" expand="true" nomargin="true" />
+ <item type="label" for="volume" nomargin="true" />
+ <item type="value" for="volume" nomargin="true" />
+ <item type="special" for="searchButton" nomargin="true" />
+ <item type="special" for="refreshButton" nomargin="true" />
+
+ </item>
+ <item type="notebook" expand="true">
+ <item type="tab" value="info" title="General">
+ <item type="line">
+ <item type="value" for="image" width="130" height="170"/>
+ <item type="table" rows="5" cols="4" expand="true">
+ <item type="label" for="title" row="0" col="0"/>
+ <item type="value" for="title" row="0" col="1" colspan="3"/>
+ <item type="label" for="writer" row="1" col="0"/>
+ <item type="value" for="writer" row="1" col="1" colspan="3"/>
+ <item type="label" for="illustrator" row="2" col="0"/>
+ <item type="value" for="illustrator" row="2" col="1" colspan="3"/>
+ <item type="label" for="colourist" row="3" col="0"/>
+ <item type="value" for="colourist" row="3" col="1" colspan="3"/>
+ <item type="label" for="publisher" row="4" col="0"/>
+ <item type="value" for="publisher" row="4" col="1" colspan="3"/>
+ </item>
+ </item>
+ <item type="table" rows="1" cols="2" expand="true">
+ <item type="value" for="synopsis" row="0" col="0" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="details" title="Details">
+ <item type="table" rows="7" cols="4">
+ <item type="label" for="collection" row="0" col="0"/>
+ <item type="value" for="collection" row="0" col="1" colspan="3"/>
+ <item type="label" for="type" row="1" col="0"/>
+ <item type="value" for="type" row="1" col="1"/>
+ <item type="label" for="category" row="1" col="2"/>
+ <item type="value" for="category" row="1" col="3"/>
+ <item type="label" for="publishdate" row="2" col="0"/>
+ <item type="value" for="publishdate" row="2" col="1"/>
+ <item type="label" for="printdate" row="2" col="2"/>
+ <item type="value" for="printdate" row="2" col="3"/>
+ <item type="label" for="rating" row="3" col="0"/>
+ <item type="value" for="rating" row="3" col="1"/>
+ <item type="label" for="added" row="4" col="0"/>
+ <item type="value" for="added" row="4" col="1"/>
+ <item type="label" for="cost" row="4" col="2"/>
+ <item type="value" for="cost" row="4" col="3"/>
+ <item type="label" for="isbn" row="5" col="0"/>
+ <item type="value" for="isbn" row="5" col="1"/>
+ <item type="label" for="format" row="5" col="2"/>
+ <item type="value" for="format" row="5" col="3"/>
+ <item type="label" for="numberboards" row="6" col="0"/>
+ <item type="value" for="numberboards" row="6" col="1"/>
+ <item type="value" for="signing" row="6" col="2" colspan="2"/>
+
+ </item>
+ <item type="line">
+ <item type="label" for="file"/>
+ <item type="value" for="file" expand="true"/>
+ <item type="launcher" for="file"/>
+ </item>
+
+ <item type="line" expand="true">
+ <item type="label" for="comment"/>
+ <item type="value" for="comment" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="lending" title="PanelLending">
+ <item type="table" rows="3" cols="3">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1"/>
+ <item type="special" for="mailButton" row="0" col="2"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1"/>
+ <item type="special" for="itemBackButton" row="1" col="2"/>
+ </item>
+ <item type="label" for="borrowings" align="left"/>
+ <item type="line" expand="true">
+ <item type="box" width="64"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="64"/>
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line" homogeneous="true">
+ <item type="value" for="webPage" expand="true"/>
+ <item type="special" for="deleteButton" expand="true"/>
+ </item>
+ </panel>
+ </panels>
+
+</collection>
diff --git a/lib/gcstar/GCModels/GCfilms.gcm b/lib/gcstar/GCModels/GCfilms.gcm
new file mode 100644
index 0000000..a5e34f4
--- /dev/null
+++ b/lib/gcstar/GCModels/GCfilms.gcm
@@ -0,0 +1,604 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCfilms">
+ <lang>GCfilms</lang>
+
+ <options>
+
+ <defaults>
+ <image>no.png</image>
+ <groupby>serie</groupby>
+ </defaults>
+
+ <fields>
+ <id>id</id>
+ <title>title</title>
+ <cover>image</cover>
+ <url>webPage</url>
+ <play>trailer</play>
+ <results>
+ <field>title</field>
+ <field>date</field>
+ <field>director</field>
+ <field>actors</field>
+ <field>original</field>
+ <field>country</field>
+ <field>format</field>
+ </results>
+ <summary>
+ <field>director</field>
+ <field>date</field>
+ <field>genre</field>
+ <field>format</field>
+ <field>borrower</field>
+ <field>tags</field>
+ </summary>
+ </fields>
+
+ <overlay>
+ <image>dvd.png</image>
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>16</paddingRight>
+ <paddingTop>16</paddingTop>
+ <paddingBottom>2</paddingBottom>
+ </overlay>
+
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+ <values id="ages">
+ <value displayed="">0</value>
+ <value displayed="AgeUnrated">1</value>
+ <value displayed="AgeAll">2</value>
+ <value displayed="AgeParent">5</value>
+ <value displayed="10">10</value>
+ <value displayed="11">11</value>
+ <value displayed="12">12</value>
+ <value displayed="13">13</value>
+ <value displayed="14">14</value>
+ <value displayed="15">15</value>
+ <value displayed="16">16</value>
+ <value displayed="17">17</value>
+ <value displayed="18">18</value>
+ <value displayed="19">19</value>
+ <value displayed="20">20</value>
+ <value displayed="21">21</value>
+ </values>
+ <values id="seen">
+ <value displayed="SeenNo">0</value>
+ <value displayed="SeenYes">1</value>
+ </values>
+ </options>
+
+
+ <groups>
+ <group id="main" label="Main"/>
+ <group id="info" label="General"/>
+ <group id="details" label="Details"/>
+ </groups>
+
+ <random>
+ <filter field="seen" comparison="eq" numeric="true" value="0" after="1"/>
+ </random>
+
+ <fields lending="true" tags="true">
+ <field value="id"
+ type="number"
+ label="Id"
+ init=""
+ group="main"
+ imported="false"/>
+ <field value="title"
+ type="short text"
+ label="Title"
+ init="NewItem"
+ group="main"
+ imported="true"/>
+ <field value="date"
+ type="date"
+ label="Date"
+ init=""
+ group="info"
+ imported="true"
+ sorttype="date"/>
+ <field value="time"
+ type="short text"
+ label="Time"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="director"
+ type="short text"
+ label="Director"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="country"
+ type="single list"
+ label="Country"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="genre"
+ type="single list"
+ label="Genre"
+ init=",,,"
+ group="info"
+ imported="true"/>
+ <field value="image"
+ type="image"
+ label="Image"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="backpic"
+ type="image"
+ label="ContextImgBack"
+ init=""
+ group="info"
+ linkedto="image"
+ imported="true"/>
+ <field value="actors"
+ type="double list"
+ label="Actors"
+ label1="Actor"
+ label2="Role"
+ init=""
+ group="info"
+ history="false"
+ imported="true"/>
+ <field value="original"
+ type="short text"
+ label="Original"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="synopsis"
+ type="long text"
+ label="Synopsis"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="webPage"
+ type="button"
+ format="url"
+ label="Url"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="seen"
+ type="yesno"
+ label="Seen"
+ init="0"
+ notnull="true"
+ group="details"
+ imported="false"/>
+ <field value="added"
+ type="date"
+ label="PanelAdded"
+ init="current"
+ group="details"
+ imported="false"/>
+ <field value="region"
+ type="history text"
+ label="Region"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="format"
+ type="history text"
+ label="Format"
+ init="DVD"
+ group="details"
+ imported="false"/>
+ <field value="number"
+ type="number"
+ label="Number"
+ init="1"
+ min="0"
+ max="9999"
+ group="details"
+ imported="false"/>
+ <field value="identifier"
+ type="number"
+ label="Identifier"
+ init="0"
+ min="0"
+ max="999999"
+ group="details"
+ imported="false"/>
+ <field value="place"
+ type="history text"
+ label="PanelLocation"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="rating"
+ type="number"
+ displayas="graphical"
+ label="PanelRating"
+ init="0"
+ min="0"
+ max="10"
+ group="details"
+ imported="true"/>
+ <field value="ratingpress"
+ type="number"
+ displayas="graphical"
+ label="PanelPressRating"
+ init="0"
+ min="0"
+ max="10"
+ group="info"
+ imported="true"/>
+ <field value="comment"
+ type="long text"
+ label="Comment"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="audio"
+ type="double list"
+ label="Audio"
+ label1="Audio"
+ label2="Encoding"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="subt"
+ type="single list"
+ label="Subtitles"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="age"
+ type="options"
+ label="MinimumAge"
+ init=""
+ values="ages"
+ separator="4"
+ group="info"
+ imported="true"/>
+ <field value="video"
+ type="history text"
+ label="Video"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="serie"
+ type="history text"
+ label="Serie"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="rank"
+ type="number"
+ label="Rank"
+ init=""
+ min="0"
+ max="999"
+ group="details"
+ imported="false"/>
+ <field value="trailer"
+ type="file"
+ format="video"
+ label="Trailer"
+ init=""
+ group="details"
+ imported="false"/>
+ </fields>
+
+
+ <filters>
+ <group label="General">
+ <filter field="title" comparison="contain"/>
+ <filter field="original" comparison="contain"/>
+ <filter field="director" comparison="contain"/>
+ <filter field="genre" comparison="contain" quick="true"/>
+ <filter field="actors" comparison="contain"/>
+ <filter field="age" label="FilterAudienceAge" comparison="le" numeric="true" quick="true"/>
+ <filter field="date" comparison="range" numeric="true" preprocess="extractYear"/>
+ </group>
+ <group label="Languages">
+ <filter field="audio" comparison="contain"/>
+ <filter field="subt" comparison="contain"/>
+ </group>
+ <group label="Details">
+ <filter field="seen" comparison="eq" values="both" labeloff="FilterSeenNo" labelon="FilterSeenYes" quick="true"/>
+ <filter field="rating" comparison="ge" numeric="true" labelselect="FilterRatingSelect" quick="true"/>
+ </group>
+ <group label="PanelLending">
+ <filter field="borrower" comparison="eq" quick="true"/>
+ </group>
+ </filters>
+
+
+ <panels>
+ <panel name="form" label="PanelForm" editable="true">
+ <item type="line">
+ <item type="value" for="id" width="5" nomargin="true" />
+ <item type="value" for="title" expand="true" nomargin="true" />
+ <item type="special" for="searchButton" nomargin="true" />
+ <item type="special" for="refreshButton" nomargin="true" />
+ </item>
+ <item type="notebook" expand="true">
+ <item type="tab" value="info" title="General">
+ <item type="line">
+ <item type="label" for="original"/>
+ <item type="value" for="original" expand="true"/>
+ </item>
+ <item type="line">
+ <item type="value" for="image" width="130" height="170"/>
+ <item type="box" width="6"/>
+ <item type="table" rows="4" cols="2">
+ <item type="label" for="date" row="0" col="0"/>
+ <item type="value" for="date" row="0" col="1"/>
+ <item type="label" for="director" row="1" col="0"/>
+ <item type="value" for="director" row="1" col="1"/>
+ <item type="label" for="time" row="2" col="0"/>
+ <item type="value" for="time" row="2" col="1"/>
+ <item type="label" for="age" row="3" col="0"/>
+ <item type="value" for="age" row="3" col="1"/>
+ </item>
+ </item>
+ <item type="expander" title="Country" collapsed="%country%">
+ <item type="value" for="country"/>
+ </item>
+ <item type="expander" title="Genre" collapsed="%genre%">
+ <item type="value" for="genre"/>
+ </item>
+ <item type="expander" title="Actors" collapsed="%actors%">
+ <item type="value" for="actors"/>
+ </item>
+ <item type="table" rows="1" cols="2" expand="true">
+ <item type="value" for="synopsis" row="0" col="0" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="details" title="Details">
+ <item type="table" rows="7" cols="3">
+ <item type="value" for="seen" row="0" col="0" colspan="2"/>
+ <item type="label" for="identifier" row="0" col="2"/>
+ <item type="value" for="identifier" row="0" col="3"/>
+ <item type="label" for="rating" row="1" col="0"/>
+ <item type="value" for="rating" row="1" col="1" colspan="1"/>
+ <item type="label" for="ratingpress" row="1" col="2"/>
+ <item type="value" for="ratingpress" row="1" col="3"/>
+ <item type="label" for="format" row="2" col="0"/>
+ <item type="value" for="format" row="2" col="1" expand="true"/>
+ <item type="label" for="number" row="2" col="2"/>
+ <item type="value" for="number" row="2" col="3" expand="true"/>
+ <item type="label" for="video" row="3" col="0"/>
+ <item type="value" for="video" row="3" col="1"/>
+ <item type="label" for="region" row="3" col="2"/>
+ <item type="value" for="region" row="3" col="3"/>
+ <item type="label" for="serie" row="4" col="0"/>
+ <item type="value" for="serie" row="4" col="1"/>
+ <item type="label" for="rank" row="4" col="2"/>
+ <item type="value" for="rank" row="4" col="3"/>
+ <item type="label" for="added" row="5" col="0"/>
+ <item type="value" for="added" row="5" col="1"/>
+ <item type="label" for="place" row="5" col="2"/>
+ <item type="value" for="place" row="5" col="3"/>
+ <item type="label" for="trailer" row="6" col="0"/>
+ <item type="line" row="6" col="1" colspan="3">
+ <item type="value" for="trailer" expand="true" nomargin="true"/>
+ <item type="launcher" for="trailer" nomargin="true"/>
+ <item type="extractor" for="trailer" nomargin="true"/>
+ </item>
+ </item>
+ <item type="expander" title="Languages" collapsed="=audio[@Audio@@Separator@%audio%]=^ - ^=subt[@Subtitles@@Separator@%subt%]=">
+ <item type="line" expand="true">
+ <item type="value" for="audio" expand="true"/>
+ <item type="value" for="subt" expand="true"/>
+ </item>
+ </item>
+ <item type="line" expand="true">
+ <item type="label" for="comment"/>
+ <item type="value" for="comment" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="lending" title="PanelLending">
+ <item type="table" rows="3" cols="3">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1"/>
+ <item type="special" for="mailButton" row="0" col="2"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1"/>
+ <item type="special" for="itemBackButton" row="1" col="2"/>
+ </item>
+ <item type="label" for="borrowings" align="left"/>
+ <item type="line" expand="true">
+ <item type="box" width="64"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="64"/>
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line" homogeneous="true">
+ <item type="value" for="webPage" expand="true"/>
+ <item type="special" for="deleteButton" expand="true"/>
+ </item>
+ </panel>
+
+ <panel name="compact" label="PanelCompact" editable="true">
+ <item type="line">
+ <item type="value" for="id" width="5"/>
+ <item type="value" for="title" expand="true"/>
+ <item type="special" for="searchButton"/>
+ <item type="special" for="deleteButton"/>
+ </item>
+ <item type="line">
+ <item type="box">
+ <item type="value" for="image" width="130" height="170"/>
+ </item>
+ <item type="box" expand="true">
+ <item type="table" for="title" rows="7" cols="8">
+ <item type="label" for="original" row="0" col="0"/>
+ <item type="value" for="original" row="0" col="1" colspan="4"/>
+ <item type="label" for="date" row="1" col="0"/>
+ <item type="value" for="date" row="1" col="1" width="18" expand="true"/>
+ <item type="label" for="time" row="1" col="3"/>
+ <item type="value" for="time" row="1" col="4" width="8" expand="true"/>
+ <item type="label" for="age" row="1" col="6"/>
+ <item type="value" for="age" row="1" col="7"/>
+ <item type="label" for="director" row="2" col="0"/>
+ <item type="value" for="director" row="2" col="1" width="18"/>
+ <item type="label" for="ratingpress" row="2" col="3"/>
+ <item type="value" for="ratingpress" row="2" col="4"/>
+ <item type="label" for="video" row="2" col="6"/>
+ <item type="value" for="video" row="2" col="7" width="8"/>
+ <item type="label" for="serie" row="3" col="0"/>
+ <item type="value" for="serie" row="3" col="1" width="8"/>
+ <item type="label" for="rank" row="3" col="3"/>
+ <item type="value" for="rank" row="3" col="4"/>
+ <item type="label" for="place" row="3" col="6"/>
+ <item type="value" for="place" row="3" col="7" width="8"/>
+ <item type="label" for="format" row="4" col="0"/>
+ <item type="value" for="format" row="4" col="1" width="8"/>
+ <item type="label" for="number" row="4" col="3"/>
+ <item type="value" for="number" row="4" col="4"/>
+ <item type="label" for="region" row="4" col="6"/>
+ <item type="value" for="region" row="4" col="7" width="8"/>
+ <item type="label" for="identifier" row="5" col="0"/>
+ <item type="value" for="identifier" row="5" col="1"/>
+ <item type="value" for="seen" row="5" col="6" colspan="2"/>
+ <item type="label" for="rating" row="5" col="3"/>
+ <item type="value" for="rating" row="5" col="4"/>
+ <item type="label" for="trailer" row="6" col="0"/>
+ <item type="value" for="trailer" row="6" col="1" colspan="4" expand="true"/>
+ <item type="label" for="added" row="6" col="6"/>
+ <item type="value" for="added" row="6" col="7"/>
+ </item>
+ <item type="expander" title="Country" collapsed="%country%">
+ <item type="value" for="country"/>
+ </item>
+ <item type="expander" title="Genre" collapsed="%genre%">
+ <item type="value" for="genre"/>
+ </item>
+ <item type="expander" title="Languages" collapsed="=audio[@Audio@@Separator@%audio%]=^ - ^=subt[@Subtitles@@Separator@%subt%]=">
+ <item type="line" expand="true">
+ <item type="value" for="audio"/>
+ <item type="value" for="subt"/>
+ </item>
+ </item>
+ <item type="expander" title="Actors" collapsed="%actors%">
+ <item type="value" for="actors"/>
+ </item>
+ </item>
+ </item>
+ <item type="table" rows="2" cols="2" expand="true">
+ <item type="label" for="synopsis" row="0" col="0"/>
+ <item type="value" for="synopsis" row="0" col="1" expand="true"/>
+ <item type="label" for="comment" row="1" col="0"/>
+ <item type="value" for="comment" row="1" col="1" expand="true"/>
+ </item>
+ <item type="line">
+ <item type="frame" value="lending" title="PanelLending" row="4" col="4" expand="true" nomargin="true">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1"/>
+ <item type="special" for="mailButton" row="0" col="2"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1"/>
+ <item type="special" for="itemBackButton" row="1" col="2"/>
+ <item type="label" for="borrowings" row="2" col="0" colspan="1" align="top"/>
+ <item type="value" for="borrowings" row="2" col="1" colspan="2"/>
+ </item>
+ <item type="box">
+ <item type="value" for="webPage" place="end" width="200"/>
+ </item>
+ </item>
+ </panel>
+
+ <panel name="readonly" label="PanelReadOnly" editable="false">
+ <item type="table" rows="2" cols="3">
+ <item type="value" for="title" style="header" row="0" col="0" colspan="3" expand="true"/>
+ <item type="box" row="1" col="0" width="100" expand="false" style="page"/>
+ <item type="value" for="original" style="subheader" row="1" col="1" expand="true"/>
+ <item type="box" row="1" col="2" width="100" expand="false" style="box">
+ <item type="formatted" name="fullrating" value="%rating%/10" style="box" nomargin="true"/>
+ <item type="value" for="seen" style="box" nomargin="true" values="seen"/>
+ </item>
+ </item>
+ <item type="line">
+ <item type="box" width="150" style="page">
+ <item type="value" for="image"/>
+ </item>
+ <item type="box" expand="true">
+ <item type="table" rows="6" cols="2" expand="true">
+ <item type="label" for="date" row="0" col="0"/>
+ <item type="value" for="date" row="0" col="1" expand="true"/>
+ <item type="label" for="director" row="1" col="0"/>
+ <item type="value" for="director" row="1" col="1" expand="true"/>
+ <item type="label" for="time" row="2" col="0"/>
+ <item type="value" for="time" row="2" col="1" expand="true"/>
+ <item type="label" for="country" row="3" col="0"/>
+ <item type="value" for="country" row="3" col="1" expand="true"/>
+ <item type="label" for="age" row="4" col="0"/>
+ <item type="value" for="age" row="4" col="1" expand="true" values="ages"/>
+ <item type="label" for="genre" row="5" col="0"/>
+ <item type="value" for="genre" flat="true" row="5" col="1" expand="true"/>
+ <item type="label" for="ratingpress" row="6" col="0"/>
+ <item type="formatted" name="fullRatingpress" value="%ratingpress%/10" row="6" col="1"/>
+ </item>
+ </item>
+ </item>
+ <item type="box">
+ <item type="table" rows="4" cols="2" expand="true">
+ <item type="label" for="actors" row="1" col="0"/>
+ <item type="value" for="actors" row="1" col="1" expand="true" flat="true" height="100"/>
+ <item type="label" for="synopsis" row="2" col="0"/>
+ <item type="value" for="synopsis" row="2" col="1" height="100" expand="true"/>
+ <item type="label" for="comment" row="3" col="0"/>
+ <item type="value" for="comment" row="3" col="1" height="100" expand="true"/>
+ </item>
+ <item type="expander" title="Details">
+ <item type="table" rows="8" cols="2" expand="true">
+ <item type="label" for="format" row="0" col="0"/>
+ <item type="formatted" name="fullformat" value="%format% (%number%)" row="0" col="1" expand="true"/>
+ <item type="label" for="region" row="1" col="0"/>
+ <item type="value" for="region" row="1" col="1" expand="true"/>
+ <item type="label" for="place" row="2" col="0"/>
+ <item type="value" for="place" row="2" col="1" expand="true"/>
+ <item type="label" for="identifier" row="3" col="0"/>
+ <item type="value" for="identifier" row="3" col="1" expand="true"/>
+ <item type="label" for="serie" row="4" col="0"/>
+ <item type="value" for="serie" row="4" col="1" expand="true"/>
+ <item type="label" for="audio" row="5" col="0"/>
+ <item type="value" for="audio" flat="true" row="5" col="1" expand="true"/>
+ <item type="label" for="subt" row="6" col="0"/>
+ <item type="value" for="subt" flat="true" row="6" col="1" expand="true"/>
+ <item type="label" for="video" row="7" col="0"/>
+ <item type="value" for="video" row="7" col="1" expand="true"/>
+ </item>
+ </item>
+ <item type="expander" title="PanelLending">
+ <item type="table" rows="4" cols="2" expand="true">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1" expand="true"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1" expand="true"/>
+ <item type="line" row="2" col="0" colspan="2" height="12" expand="true"/>
+ <item type="line" row="3" col="0" colspan="2" expand="true">
+ <item type="box" width="50" style="page"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="50" style="page"/>
+ </item>
+ </item>
+ </item>
+ <item type="expander" title="PanelTags">
+ <item expand="true" for="tags" type="value" />
+ <item type="value" for="favourite" values="favouriteYesno" collapse="true"/>
+ </item>
+ </item>
+ </panel>
+ </panels>
+
+</collection>
diff --git a/lib/gcstar/GCModels/GCgames.gcm b/lib/gcstar/GCModels/GCgames.gcm
new file mode 100644
index 0000000..3792063
--- /dev/null
+++ b/lib/gcstar/GCModels/GCgames.gcm
@@ -0,0 +1,492 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCgames">
+ <lang>GCgames</lang>
+
+ <options>
+
+ <defaults>
+ <image>no.png</image>
+ <groupby>platform</groupby>
+ </defaults>
+
+ <fields>
+ <id>id</id>
+ <title>name</title>
+ <cover>boxpic</cover>
+ <url>web</url>
+ <play>executable</play>
+ <search>
+ <field>ean</field>
+ <field>name</field>
+ </search>
+ <results>
+ <field>name</field>
+ <field>platform</field>
+ <field>genre</field>
+ <field>released</field>
+ </results>
+ <summary>
+ <field>platform</field>
+ <field>genre</field>
+ <field>editor</field>
+ <field>completion</field>
+ <field>borrower</field>
+ <field>tags</field>
+ </summary>
+ </fields>
+
+ <overlay>
+ <image>dvd.png</image>
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>16</paddingRight>
+ <paddingTop>16</paddingTop>
+ <paddingBottom>2</paddingBottom>
+ </overlay>
+
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+ <values id="">
+ <value displayed=""></value>
+ </values>
+ </options>
+
+
+ <groups>
+ <group id="info" label="General"/>
+ <group id="details" label="Details"/>
+ <group id="tips" label="Tips"/>
+ </groups>
+
+ <random>
+ <filter field="completion" comparison="lt" numeric="true" value="100"/>
+ </random>
+
+ <fields lending="true" tags="true">
+ <field value="id"
+ type="number"
+ label="Id"
+ init=""
+ group="info"
+ imported="false"/>
+ <field value="ean"
+ type="number"
+ label="Ean"
+ tip="Ean"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="name"
+ type="short text"
+ label="Name"
+ init="NewItem"
+ group="info"
+ imported="true"/>
+ <field value="boxpic"
+ type="image"
+ label="Box"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="backpic"
+ type="image"
+ label="ContextImgBack"
+ init=""
+ group="info"
+ linkedto="boxpic"
+ imported="true"/>
+ <field value="platform"
+ type="history text"
+ label="Platform"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="players"
+ type="short text"
+ label="Players"
+ init="1"
+ min="1"
+ max="10"
+ group="info"
+ imported="true"/>
+ <field value="editor"
+ type="short text"
+ label="Editor"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="developer"
+ type="short text"
+ label="Developer"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="released"
+ type="date"
+ label="Released"
+ init=""
+ group="info"
+ imported="true"
+ sorttype="date"/>
+ <field value="description"
+ type="long text"
+ label="Description"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="web"
+ type="button"
+ format="url"
+ label="Url"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="genre"
+ type="single list"
+ label="Genre"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="rating"
+ type="number"
+ displayas="graphical"
+ label="PanelRating"
+ init="0"
+ max="10"
+ group="details"
+ imported="false"/>
+ <field value="ratingpress"
+ type="number"
+ displayas="graphical"
+ label="PanelPressRating"
+ init="0"
+ min="0"
+ max="10"
+ group="details"
+ imported="true"/>
+ <field value="case"
+ type="yesno"
+ label="Case"
+ init="1"
+ group="details"
+ imported="false"/>
+ <field value="manual"
+ type="yesno"
+ label="Manual"
+ init="1"
+ group="details"
+ imported="false"/>
+ <field value="exclusive"
+ type="yesno"
+ label="Exclusive"
+ init="0"
+ group="details"
+ imported="true"/>
+ <field value="added"
+ type="date"
+ label="PanelAdded"
+ init="current"
+ group="details"
+ imported="false"/>
+ <field value="completion"
+ type="number"
+ label="Completion"
+ init="0"
+ min="0"
+ max="200"
+ step="0.1"
+ group="details"
+ imported="false"/>
+ <field value="resolutions"
+ type="single list"
+ label="Resolutions"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="location"
+ type="history text"
+ label="PanelLocation"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="installationsize"
+ type="number"
+ label="InstallationSize"
+ init="0"
+ group="details"
+ imported="false"/>
+ <field value="installationsizeunit"
+ type="options"
+ label=""
+ init="0"
+ values="filesizeunits"
+ group="details"
+ imported="false"
+ relatedto="installationsize"/>
+ <field value="executable"
+ type="file"
+ format="program"
+ label="Executable"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="screenshot1"
+ type="image"
+ label="Screenshot1"
+ init=""
+ default="view"
+ group="details"
+ imported="true"/>
+ <field value="screenshot2"
+ type="image"
+ label="Screenshot2"
+ init=""
+ default="view"
+ group="details"
+ imported="true"/>
+ <field value="comments"
+ type="long text"
+ label="Comments"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="code"
+ type="double list"
+ history="false"
+ label="Codes"
+ label1="Code"
+ label2="Effect"
+ init=""
+ group="tips"
+ imported="true"/>
+ <field value="unlockable"
+ type="double list"
+ history="false"
+ label="Unlockables"
+ label1="Unlockable"
+ label2="Howto"
+ init=""
+ group="tips"
+ imported="true"/>
+ <field value="secrets"
+ type="long text"
+ label="Secrets"
+ init=""
+ group="tips"
+ imported="true"/>
+ <field value="region"
+ type="history text"
+ label="Region"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="serialnumber"
+ type="short text"
+ label="SerialNumber"
+ init=""
+ group="details"
+ imported="true"/>
+
+ </fields>
+
+
+ <filters>
+ <group label="General">
+ <filter field="name" comparison="contain"/>
+ <filter field="platform" comparison="eq" quick="true"/>
+ <filter field="genre" comparison="contain" quick="true"/>
+ </group>
+ <group label="Details">
+ <filter field="rating" comparison="ge" numeric="true" labelselect="FilterRatingSelect" quick="true"/>
+ <filter field="completion" comparison="range" numeric="true"/>
+ </group>
+ </filters>
+
+
+ <panels>
+ <panel name="form" label="PanelForm" editable="true">
+ <item type="line">
+ <item type="value" for="ean" width="10" tip="" nomargin="true" />
+ <item type="value" for="name" expand="true" nomargin="true" />
+ <item type="special" for="searchButton" nomargin="true" />
+ <item type="special" for="refreshButton" nomargin="true" />
+ </item>
+ <item type="notebook" expand="true">
+ <item type="tab" value="info" title="General">
+ <item type="line">
+ <item type="box">
+ <item type="value" for="boxpic" width="200" height="200"/>
+ </item>
+ <item type="table" title="Information" rows="6" cols="5">
+ <item type="label" for="platform" row="0" col="0"/>
+ <item type="value" for="platform" row="0" col="1"/>
+ <item type="label" for="players" row="1" col="0"/>
+ <item type="value" for="players" row="1" col="1"/>
+ <item type="label" for="editor" row="2" col="0"/>
+ <item type="value" for="editor" row="2" col="1"/>
+ <item type="label" for="developer" row="3" col="0"/>
+ <item type="value" for="developer" row="3" col="1"/>
+ <item type="label" for="released" row="4" col="0"/>
+ <item type="value" for="released" row="4" col="1"/>
+ <item type="expander" title="Genre" collapsed="%genre%" row="5" col="0" colspan="2">
+ <item type="value" for="genre"/>
+ </item>
+ </item>
+ </item>
+ <item type="box" expand="true">
+ <item type="label" for="description"/>
+ <item type="value" for="description" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="details" title="Details">
+ <item type="table" rows="7" cols="5">
+ <item type="line" row="0" col="0" colspan="3">
+ <item type="value" for="case" />
+ <item type="value" for="manual" />
+ <item type="value" for="exclusive" />
+ </item>
+ <item type="label" for="rating" row="1" col="0"/>
+ <item type="value" for="rating" row="1" col="1"/>
+ <item type="label" for="ratingpress" row="1" col="2"/>
+ <item type="value" for="ratingpress" row="1" col="3" colspan="2"/>
+ <item type="label" for="completion" row="2" col="0"/>
+ <item type="value" for="completion" row="2" col="1"/>
+ <item type="label" for="added" row="2" col="2"/>
+ <item type="value" for="added" row="2" col="3" colspan="2"/>
+ <item type="label" for="serialnumber" row="3" col="0"/>
+ <item type="value" for="serialnumber" row="3" col="1"/>
+ <item type="label" for="region" row="3" col="2"/>
+ <item type="value" for="region" row="3" col="3" colspan="2" />
+ <item type="label" for="location" row="4" col="0"/>
+ <item type="value" for="location" row="4" col="1"/>
+ <item type="label" for="installationsize" row="4" col="2"/>
+ <item type="value" for="installationsize" row="4" col="3"/>
+ <item type="value" for="installationsizeunit" row="4" col="4"/>
+ <item type="label" for="executable" row="5" col="0"/>
+ <item type="line" row="5" col="1" colspan="4">
+ <item type="value" for="executable" nomargin="true" expand="true"/>
+ <item type="launcher" for="executable" nomargin="true"/>
+ </item>
+ <item type="expander" title="Resolutions" collapsed="%resolutions%" row="6" col="0" colspan="5">
+ <item type="value" for="resolutions"/>
+ </item>
+ </item>
+ <item type="table" rows="4" cols="2" expand="true">
+ <item type="label" label="Screenshots" row="0" col="0" colspan="2"/>
+ <item type="value" for="screenshot1" row="1" col="0" width="200" height="150"/>
+ <item type="value" for="screenshot2" row="1" col="1" width="200" height="150"/>
+ <item type="label" for="comments" row="2" col="0" colspan="2"/>
+ <item type="value" for="comments" row="3" col="0" colspan="2" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="tips" title="Tips">
+ <item type="expander" title="Codes">
+ <item type="value" for="code" expand="true"/>
+ </item>
+ <item type="expander" title="Unlockables">
+ <item type="value" for="unlockable" expand="true"/>
+ </item>
+ <item type="box" expand="true" nomargin="true">
+ <item type="label" for="secrets"/>
+ <item type="value" for="secrets" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="lending" title="PanelLending">
+ <item type="table" rows="3" cols="3">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1"/>
+ <item type="special" for="mailButton" row="0" col="2"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1"/>
+ <item type="special" for="itemBackButton" row="1" col="2"/>
+ </item>
+ <item type="label" for="borrowings" align="left"/>
+ <item type="line" expand="true">
+ <item type="box" width="64"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="64"/>
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line" homogeneous="true">
+ <item type="value" for="web" expand="true"/>
+ <item type="special" for="deleteButton" expand="true"/>
+ </item>
+ </panel>
+
+ <panel name="readonly" label="PanelReadOnly" editable="false">
+ <item type="table" rows="2" cols="3">
+ <item type="value" for="name" style="header" row="0" col="0" colspan="3" expand="true"/>
+ <item type="box" row="1" col="0" width="150" expand="false" style="page"/>
+ <item type="value" for="platform" style="subheader" row="1" col="1" expand="true"/>
+ <item type="box" row="1" col="2" width="150" expand="false" style="box">
+ <item type="formatted" name="fullrating" value="%rating%/10" style="box" nomargin="true"/>
+ <item type="value" for="editor" style="box" nomargin="true"/>
+ </item>
+ </item>
+ <item type="line">
+ <item type="box" width="150" style="page">
+ <item type="value" for="boxpic" width="140"/>
+ </item>
+ <item type="box" expand="true">
+ <item type="table" rows="6" cols="2" expand="true">
+ <item type="label" for="genre" row="0" col="0"/>
+ <item type="value" for="genre" flat="true" row="0" col="1" expand="true"/>
+ <item type="label" for="developer" row="1" col="0"/>
+ <item type="value" for="developer" row="1" col="1" expand="true"/>
+ <item type="label" for="players" row="2" col="0"/>
+ <item type="value" for="players" row="2" col="1" expand="true"/>
+ <item type="label" for="released" row="3" col="0"/>
+ <item type="value" for="released" row="3" col="1" expand="true"/>
+ <item type="label" for="completion" row="4" col="0"/>
+ <item type="value" for="completion" row="4" col="1" expand="true"/>
+ <item type="label" for="location" row="5" col="0"/>
+ <item type="value" for="location" row="5" col="1" expand="true"/>
+ </item>
+ </item>
+ </item>
+ <item type="value" for="description" height="5em"/>
+ <item type="table" rows="1" cols="2" expand="true">
+ <item type="value" for="screenshot1" row="0" col="0" width="200" height="150" expand="true"/>
+ <item type="value" for="screenshot2" row="0" col="1" width="200" height="150" expand="true"/>
+ </item>
+ <item type="expander" title="Codes">
+ <item type="value" for="code" expand="true"/>
+ </item>
+ <item type="expander" title="Unlockables">
+ <item type="value" for="unlockable" expand="true"/>
+ </item>
+ <item type="expander" title="Secrets">
+ <item type="value" for="secrets" expand="true" height="5em"/>
+ </item>
+ <item type="expander" title="PanelLending">
+ <item type="table" rows="4" cols="2" expand="true">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1" expand="true"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1" expand="true"/>
+ <item type="line" row="2" col="0" colspan="2" height="12" expand="true"/>
+ <item type="line" row="3" col="0" colspan="2" expand="true">
+ <item type="box" width="50" style="page"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="50" style="page"/>
+ </item>
+ </item>
+ </item>
+ <item type="expander" title="PanelTags">
+ <item expand="true" for="tags" type="value" />
+ <item type="value" for="favourite" values="favouriteYesno" collapse="true" />
+ </item>
+ </panel>
+ </panels>
+
+</collection>
diff --git a/lib/gcstar/GCModels/GCminicars.gcm b/lib/gcstar/GCModels/GCminicars.gcm
new file mode 100644
index 0000000..ba43eb0
--- /dev/null
+++ b/lib/gcstar/GCModels/GCminicars.gcm
@@ -0,0 +1,892 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCminicars">
+
+ <lang>GCminicars</lang>
+
+ <options>
+
+ <defaults>
+ <image>no_minicars.png</image>
+ <groupby>scale</groupby>
+ </defaults>
+
+ <fields>
+ <cover>picture</cover>
+ <id>gcsautoid</id>
+ <play>playlist</play>
+ <title>name</title>
+ </fields>
+
+ <overlay>
+ <image>minicars.png</image>
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>12</paddingRight>
+ <paddingTop>0</paddingTop>
+ <paddingBottom>12</paddingBottom>
+ </overlay>
+
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+
+ </options>
+
+ <groups>
+ <group id="Main" label="Main" />
+ <group id="Details" label="Details" />
+ <group id="Catalogs" label="Catalogs" />
+ <group id="Pictures" label="Pictures" />
+ <group id="PanelLending" label="PanelLending" />
+ <group id="Realmodel" label="Realmodel" />
+ </groups>
+
+ <filters>
+
+ <group label="Main">
+ <filter comparison="range" field="year" labelselect="Intervalle" numeric="true" quick="true" />
+ <filter comparison="contain" field="picture" numeric="true" quick="false" />
+ <filter comparison="eq" field="exchange" numeric="false" quick="true" />
+ </group>
+
+ <group label="Details">
+ <filter comparison="ge" field="acquisition" labelselect="&gt;=" numeric="false" quick="false" />
+ </group>
+
+ </filters>
+
+ <random></random>
+
+ <fields lending="true" tags="true">
+
+<!-- Definition des Champs Communs -->
+
+ <field value="playlist" format="audio" group="" init="..\lib\gcstar\GCHelp\GCHelpMinicars.pdf" label="Help" type="file" />
+ <field value="name" group="" init="%scale% %manufacturer% %constructor% %modele% %version% (%year%)" label="Name" type="formatted" />
+
+<!-- Definition des Champs "Main" -->
+
+ <field value="gcsautoid" displayed="" group="" imported="false" init="" label="" type="number" />
+ <field value="rating1" group="Main" label="Rating1" max="10" init="0" type="number" displayas="graphical"/>
+
+ <field value="picture" default="view" group="Main" init="" label="Picture" type="image" />
+ <field value="logo1" default="view" group="Main" init="" label="Logo1" type="image" />
+ <field value="logo2" default="view" group="Main" init="" label="Logo2" type="image" />
+ <field value="scale" flat="true" group="Main" history="true" init="" label="Scale" type="history text" />
+ <field value="type1" flat="true" group="Main" history="true" init="" label="Type1" type="history text" />
+ <field value="manufacturer" flat="true" group="Main" history="true" init="" label="Manufacturer" type="history text" />
+ <field value="version" flat="true" group="Main" history="true" init="" label="Version" type="short text" />
+ <field value="modele" group="Main" label="Modele" history="false" type="history text" init="" />
+ <field value="constructor" flat="true" group="Main" history="true" init="" label="Constructor" type="history text" />
+ <field value="year" group="Main" init="" label="Year" type="number" />
+ <field value="comments1" group="Main" init="" label="Comments1" type="long text" />
+ <field value="exchange" group="Main" init="0" label="Exchange" type="yesno" />
+ <field value="wanted" group="Main" init="0" label="Wanted" type="yesno" />
+ <field value="pub" group="Main" label="Pub" history="false" type="history text" init="" />
+ <field value="transformation" group="Main" init="0" label="Transformation" type="yesno" />
+ <field value="kit" group="Main" init="0" label="Kit" type="yesno" />
+ <field value="reference" group="Main" init="" label="Reference" type="short text" />
+ <field value="color" flat="true" group="Main" history="true" init="" label="Color" type="short text" />
+
+<!-- Definition des Champs "Details" -->
+
+ <field value="material" flat="true" group="Details" history="true" init="" label="Material" type="single list" />
+ <field value="added" group="Details" init="current" label="PanelAdded" type="date" />
+ <field value="rating2" group="Details" init="0" label="Rating2" min="0" max="10" type="number" displayas="graphical" />
+ <field value="rating3" group="Details" init="0" label="Rating3" min="0" max="10" type="number" displayas="graphical" />
+ <field value="acquisition" group="Details" init="" label="Acquisition" type="date" />
+ <field value="comments2" group="Details" init="" label="Comments2" type="long text" />
+ <field value="buyprice" group="Details" init="" label="Buyprice" type="number" />
+ <field value="finishline" group="Details" init="" label="Finishline" type="number" />
+ <field value="carnumber" group="Details" init="" label="Carnumber" type="number" />
+ <field value="courseyear" group="Details" init="" label="Courseyear" type="date" />
+ <field value="courselocation" group="Details" history="true" init="" label="Courselocation" type="history text" />
+ <field value="location" group="Details" init="" label="Location" type="short text" />
+ <field value="box1" flat="true" group="Details" history="true" init="" label="Box1" type="history text" />
+ <field value="box2" flat="true" group="Details" history="true" init="" label="Box2" type="history text" />
+ <field value="condition" flat="true" group="Details" history="true" init="" label="Condition" type="history text" />
+ <field value="pilots" group="Details" init="" label="Pilots" type="short text" />
+ <field value="copilots" group="Details" init="" label="Copilots" type="short text" />
+ <field value="course" flat="true" group="Details" history="true" init="" label="Course" type="history text" />
+ <field value="pub2" group="Details" init="" label="Pub2" type="short text" />
+ <field value="edition" flat="true" group="Details" history="true" init="" label="Edition" type="history text" />
+ <field value="estimate" group="Details" init="" label="Estimate" type="number" />
+ <field value="weight" group="Details" init="" label="Weight" type="short text" />
+ <field value="parts" group="Details" init="" label="Parts" type="number" />
+ <field value="decorations" group="Details" init="" label="Decorations" type="number" />
+ <field value="team" group="Details" history="true" init="" label="Team" type="history text" />
+ <field value="personalref" group="Details" init="" label="Personalref" type="short text" />
+ <field value="madein" flat="true" group="Details" history="true" init="" label="Madein" type="history text" />
+ <field value="interior" group="Details" init="" label="Interior" type="short text" />
+ <field value="serial" group="Details" init="" label="Serial" type="short text" />
+ <field value="serialnumber" group="Details" init="" label="Serialnumber" type="short text" />
+ <field value="lwh" group="Details" history="true" init="" label="Lwh" type="short text" />
+ <field value="designed" group="Details" history="true" init="" label="Designed" type="history text" />
+ <field value="containbox" group="Details" init="" label="Containbox" type="short text" />
+ <field value="framecar" group="Details" init="" label="Framecar" type="short text" />
+ <field value="bodycar" group="Details" init="" label="Bodycar" type="short text" />
+ <field value="registrationnumber1" group="Details" init="" label="Registrationnumber1" type="short text" />
+ <field value="registrationnumber2" group="Details" init="" label="Registrationnumber2" type="short text" />
+ <field value="collectiontype" group="Details" history="true" init="" label="Collectiontype" type="history text" />
+ <field value="wheels" group="Details" init="" label="Wheels" type="short text" />
+ <field value="characters" group="Details" init="" label="Characters" type="short text" />
+ <field value="filmcar" group="Details" init="" label="Filmcar" type="short text" />
+ <field value="filmpart" group="Details" init="" label="Filmpart" type="short text" />
+ <field value="decorationset" group="Details" init="" label="Decorationset" type="short text" />
+ <field value="molding" group="Details" init="" label="Molding" type="short text" />
+ <field value="detailsparts" group="Details" init="" label="Detailsparts" type="short text" />
+ <field value="detailsdecorations" group="Details" init="" label="Detailsdecorations" type="short text" />
+ <field value="colormirror" group="Details" init="%color%" label="Colormirror" type="formatted" />
+ <field value="steeringwheel" group="Details" init="" label="Steeringwheel" type="short text" />
+
+<!-- Definition des Champs "Catalogs" -->
+
+ <field value="websitec" group="Catalogs" init="" label="Websitec" type="url" />
+ <field value="websitem" group="Catalogs" init="" label="Websitem" type="url" />
+ <field value="websiteo" group="Catalogs" init="" label="Websiteo" type="url" />
+ <field value="barcode" group="Catalogs" init="" label="Barcode" type="number" />
+ <field value="catalogyear" group="Catalogs" init="" label="Catalogyear" type="date" />
+ <field value="catalogpage" group="Catalogs" init="" label="Catalogpage" type="short text" />
+ <field value="catalogedition" group="Catalogs" init="" label="Catalogedition" type="short text" />
+ <field value="catalogprice" group="Catalogs" init="" label="Catalogprice" type="number" />
+ <field value="picture2" default="view" group="Catalogs" init="" label="Picture2" type="image" />
+ <field value="catalog1" default="view" group="Catalogs" init="" label="Catalog1" type="image" />
+ <field value="catalog2" default="view" group="Catalogs" init="" label="Catalog2" type="image" />
+ <field value="comments3" group="Catalogs" init="" label="Comments3" type="long text" />
+ <field value="year3" group="Catalogs" init="" label="Year3" type="date" />
+ <field value="referencemirror" group="Catalogs" init="%reference%" label="Referencemirror" type="formatted" />
+
+<!-- Definition des Champs "Pictures" -->
+
+ <field value="top" default="view" group="Pictures" init="" label="Top" type="image" />
+ <field value="back" default="view" group="Pictures" init="" label="Back" type="image" />
+ <field value="edge1" default="view" group="Pictures" init="" label="Edge1" type="image" />
+ <field value="edge2" default="view" group="Pictures" init="" label="Edge2" type="image" />
+ <field value="edge3" default="view" group="Pictures" init="" label="Edge3" type="image" />
+ <field value="edge4" default="view" group="Pictures" init="" label="Edge4" type="image" />
+ <field value="edge5" default="view" group="Pictures" init="" label="Edge5" type="image" />
+ <field value="edge6" default="view" group="Pictures" init="" label="Edge6" type="image" />
+ <field value="edge7" default="view" group="Pictures" init="" label="Edge7" type="image" />
+ <field value="edge8" default="view" group="Pictures" init="" label="Edge8" type="image" />
+ <field value="edge9" default="view" group="Pictures" init="" label="Edge9" type="image" />
+ <field value="otherscomments" group="Pictures" init="" label="OthersComments" type="long text" />
+ <field value="othersdetails" group="Pictures" init="" label="OthersDetails" type="long text" />
+
+<!-- Definition des Champs "PanelLending" -->
+
+ <field value="comments4" group="PanelLending" init="" label="Comments4" type="long text" />
+
+<!-- Definition des Champs "Realmodel" -->
+
+ <field value="front2" default="view" group="Realmodel" init="" label="Head" type="image" />
+ <field value="back2" default="view" group="Realmodel" init="" label="Tail" type="image" />
+ <field value="edge10" default="view" group="Realmodel" init="" label="Edge10" type="image" />
+ <field value="edge20" default="view" group="Realmodel" init="" label="Edge20" type="image" />
+ <field value="edge30" default="view" group="Realmodel" init="" label="Edge30" type="image" />
+ <field value="edge40" default="view" group="Realmodel" init="" label="Edge40" type="image" />
+ <field value="comments5" group="Realmodel" init="" label="Comments5" type="long text" />
+ <field value="difference" group="Realmodel" init="" label="Difference" type="long text" />
+
+ </fields>
+
+<!-- Lecture / Ecriture -->
+
+ <panels>
+ <panel editable="true" label="PanelForm" name="form">
+ <item type="line">
+ <item cols="4" rows="1" type="table" expand="true" >
+ <item col="0" row="1" expand="true" for="name" type="value" />
+ <!--<item col="2" row="1" for="playlist" type="label" />
+ <item col="3" row="1" for="playlist" type="launcher" label="Help1" />-->
+ </item>
+ </item>
+ <item expand="true" type="notebook">
+
+<!-- Onglet "Main" -->
+
+ <item expand="true" title="Main" type="tab" value="bla">
+ <item type="line" align="center" >
+ <item cols="2" rows="1" type="table" expand="true" align="center" >
+ <item row="0" col="0" expand="true" for="exchange" type="value" />
+ <item row="0" col="1" expand="true" for="wanted" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item cols="1" rows="11" type="table" expand="true">
+ <item col="0" for="rating1" row="2" type="label" align="center" />
+ <item col="0" for="rating1" expand="false" row="3" type="value" />
+ <item row="9" col="0" expand="true" type="label" label="Picture1" align="center" />
+ <item row="8" col="0" expand="false" for="picture" height="180" type="value" width="240" />
+ </item>
+ <item cols="2" rows="10" type="table" expand="true">
+ <item row="1" col="0" for="scale" type="label" />
+ <item row="1" col="1" for="scale" expand="true" type="value" />
+ <item row="2" col="0" for="manufacturer" type="label" />
+ <item row="2" col="1" for="manufacturer" expand="true" type="value" />
+ <item row="3" col="0" for="type1" type="label" />
+ <item row="3" col="1" for="type1" expand="true" type="value" />
+ <item row="4" col="0" for="constructor" type="label" />
+ <item row="4" col="1" for="constructor" expand="true" type="value" />
+ <item row="5" col="0" for="modele" type="label" />
+ <item row="5" col="1" for="modele" expand="true" type="value" />
+ <item row="6" col="0" for="version" type="label" />
+ <item row="6" col="1" for="version" expand="true" type="value" />
+ <item row="7" col="0" for="color" type="label" />
+ <item row="7" col="1" for="color" expand="true" type="value" />
+ <item row="8" col="0" for="pub" type="label" />
+ <item row="8" col="1" for="pub" expand="true" type="value" />
+ <item row="9" col="0" for="year" type="label" />
+ <item row="9" col="1" for="year" expand="true" type="value" />
+ <item row="10" col="0" for="reference" type="label" />
+ <item row="10" col="1" for="reference" expand="true" type="value" />
+ </item>
+ <item cols="1" rows="4" type="table" expand="true">
+ <item row="3" expand="true" type="label" label="Constructor" align="center" />
+ <item row="1" expand="true" type="label" label="Manufacturer" align="center" />
+ <item row="0" for="logo1" expand="false" height="120" type="value" width="120" />
+ <item row="2" for="logo2" expand="false" height="120" type="value" width="120" />
+ </item>
+ </item>
+
+ <item type="box" expand="false">
+ <item cols="2" rows="1" type="table" expand="true" align="center" >
+ <item row="0" col="0" expand="true" for="kit" type="value" />
+ <item row="0" col="1" expand="true" for="transformation" type="value" />
+ </item>
+ <item for="comments1" type="label" />
+ <item for="comments1" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "Details" -->
+
+ <item expand="true" title="Details" type="tab" value="bla">
+ <item type="label" label="MiscCharacteristics" align="center" />
+ <item cols="4" expand="true" rows="29" type="table" >
+ <item row="0" col="0" collapsed="%material%" colspan="2" title="Material" type="expander">
+ <item for="material" type="value" />
+ </item>
+ <item col="2" row="0" for="molding" type="label" />
+ <item col="3" row="0" for="molding" type="value" />
+ <item col="0" row="1" for="condition" type="label" />
+ <item col="1" row="1" for="condition" type="value" />
+ <item col="2" row="1" for="added" type="label" />
+ <item col="3" row="1" for="added" type="value" />
+ <item col="0" row="2" for="edition" type="label" />
+ <item col="1" row="2" for="edition" type="value" />
+ <item col="2" row="2" for="collectiontype" type="label" />
+ <item col="3" row="2" for="collectiontype" type="value" />
+
+ <item col="0" row="3" for="serial" type="label" />
+ <item col="1" row="3" for="serial" type="value" />
+ <item col="2" row="3" for="serialnumber" type="label" />
+ <item col="3" row="3" for="serialnumber" type="value" />
+ <item col="0" row="4" for="designed" type="label" />
+ <item col="1" row="4" for="designed" type="value" />
+ <item col="2" row="4" for="madein" type="label" />
+ <item col="3" row="4" for="madein" type="value" />
+
+ <item col="0" row="5" for="box1" type="label" />
+ <item col="1" row="5" for="box1" type="value" />
+ <item col="2" row="5" for="box2" type="label" />
+ <item col="3" row="5" for="box2" type="value" />
+ <item col="0" row="6" for="containbox" type="label" />
+ <item col="1" row="6" for="containbox" type="value" />
+
+ <item col="0" row="7" for="rating2" type="label" />
+ <item col="1" row="7" for="rating2" type="value" align="center"/>
+ <item col="2" row="7" for="rating3" type="label" />
+ <item col="3" row="7" for="rating3" type="value" align="center"/>
+ <item col="0" row="8" for="acquisition" type="label" />
+ <item col="1" row="8" for="acquisition" type="value" />
+ <item col="2" row="8" for="location" type="label" />
+ <item col="3" row="8" for="location" type="value" />
+ <item col="0" row="9" for="buyprice" type="label" />
+ <item col="1" row="9" for="buyprice" type="value" />
+ <item col="2" row="9" for="estimate" type="label" />
+ <item col="3" row="9" for="estimate" type="value" />
+
+ <item col="0" row="10" for="comments2" type="label" />
+ <item col="0" row="11" colspan="4" for="comments2" expand="true" type="value" />
+
+ <item col="1" row="12" type="label" label="Diorama" align="center" />
+ <item col="0" row="13" for="decorationset" type="label" />
+ <item col="1" row="13" for="decorationset" type="value" />
+ <item col="0" row="14" for="characters" type="label" />
+ <item col="1" row="14" for="characters" type="value" />
+
+ <item col="3" row="12" type="label" label="CarFromFilm" align="center" />
+ <item col="2" row="13" for="filmcar" type="label" />
+ <item col="3" row="13" for="filmcar" type="value" />
+ <item col="2" row="14" for="filmpart" type="label" />
+ <item col="3" row="14" for="filmpart" type="value" />
+
+ <item col="1" row="15" type="label" label="VehiculeDetails" align="center" />
+ <item col="0" row="16" for="parts" type="label" />
+ <item col="1" row="16" for="parts" type="value" />
+ <item col="0" row="17" for="detailsparts" type="label" />
+ <item col="1" row="17" for="detailsparts" type="value" />
+ <item col="0" row="18" for="decorations" type="label" />
+ <item col="1" row="18" for="decorations" type="value" />
+ <item col="0" row="19" for="detailsdecorations" type="label" />
+ <item col="1" row="19" for="detailsdecorations" type="value" />
+ <item col="0" row="20" for="lwh" type="label" />
+ <item col="1" row="20" for="lwh" type="value" />
+ <item col="0" row="21" for="weight" type="label" />
+ <item col="1" row="21" for="weight" type="value" />
+ <item col="0" row="22" for="framecar" type="label" />
+ <item col="1" row="22" for="framecar" type="value" />
+ <item col="0" row="23" for="bodycar" type="label" />
+ <item col="1" row="23" for="bodycar" type="value" />
+ <item col="0" row="24" for="colormirror" type="label" />
+ <item col="1" row="24" for="colormirror" type="value" />
+ <item col="0" row="25" for="interior" type="label" />
+ <item col="1" row="25" for="interior" type="value" />
+ <item col="0" row="26" for="wheels" type="label" />
+ <item col="1" row="26" for="wheels" type="value" />
+ <item col="0" row="27" for="registrationnumber1" type="label" />
+ <item col="1" row="27" for="registrationnumber1" type="value" />
+ <item col="2" row="27" for="registrationnumber2" type="label" />
+ <item col="3" row="27" for="registrationnumber2" type="value" />
+ <item col="0" row="28" for="steeringwheel" type="label" />
+ <item col="1" row="28" for="steeringwheel" type="value" />
+
+ <item col="3" row="15" type="label" label="RacingCar" align="center" />
+ <item col="2" row="16" for="course" type="label" />
+ <item col="3" row="16" for="course" type="value" />
+ <item col="2" row="17" for="courselocation" type="label" />
+ <item col="3" row="17" for="courselocation" type="value" />
+ <item col="2" row="18" for="courseyear" type="label" />
+ <item col="3" row="18" for="courseyear" type="value" />
+ <item col="2" row="19" for="team" type="label" />
+ <item col="3" row="19" for="team" type="value" />
+ <item col="2" row="20" for="pilots" type="label" />
+ <item col="3" row="20" for="pilots" type="value" />
+ <item col="2" row="21" for="copilots" type="label" />
+ <item col="3" row="21" for="copilots" type="value" />
+ <item col="2" row="22" for="carnumber" type="label" />
+ <item col="3" row="22" for="carnumber" type="value" />
+ <item col="2" row="23" for="pub2" type="label" />
+ <item col="3" row="23" for="pub2" type="value" />
+ <item col="2" row="24" for="finishline" type="label" />
+ <item col="3" row="24" for="finishline" type="value" />
+
+ </item>
+
+ </item>
+
+<!-- Onglet "Catalogs" -->
+
+ <item expand="true" title="Catalogs" type="tab" value="bla">
+ <item type="line">
+ <item cols="1" rows="9" type="table" expand="true">
+ <item row="8" col="0" expand="true" type="label" label="OfficialPicture" align="center" />
+ <item row="7" col="0" expand="false" for="picture2" height="180" type="value" width="240" />
+ </item>
+ <item cols="2" rows="11" type="table" expand="true">
+ <item col="0" row="0" for="barcode" type="label" />
+ <item col="1" row="0" for="barcode" type="value" />
+ <item col="0" row="1" for="referencemirror" type="label" />
+ <item col="1" row="1" for="referencemirror" type="value" />
+ <item col="0" row="2" for="year3" type="label" />
+ <item col="1" row="2" for="year3" type="value" />
+ <item col="0" row="3" for="catalogyear" type="label" />
+ <item col="1" row="3" for="catalogyear" type="value" />
+ <item col="0" row="4" for="catalogedition" type="label" />
+ <item col="1" row="4" for="catalogedition" type="value" />
+ <item col="0" row="5" for="catalogpage" type="label" />
+ <item col="1" row="5" for="catalogpage" type="value" />
+ <item col="0" row="6" for="catalogprice" type="label" />
+ <item col="1" row="6" for="catalogprice" type="value" />
+ <item col="0" row="7" for="personalref" type="label" />
+ <item col="1" row="7" for="personalref" type="value" />
+ <item col="0" row="8" for="websitem" type="label" />
+ <item col="1" row="8" for="websitem" expand="default" type="value" />
+ <item col="0" row="9" for="websitec" type="label" />
+ <item col="1" row="9" for="websitec" expand="default" type="value" />
+ <item col="0" row="10" for="websiteo" type="label" />
+ <item col="1" row="10" for="websiteo" expand="default" type="value" />
+ </item>
+ <item cols="1" rows="4" type="table" expand="true">
+ <item row="1" expand="true" type="label" label="CatalogCoverPicture" align="center" />
+ <item row="3" expand="true" type="label" label="CatalogPagePicture" align="center" />
+ <item row="0" for="catalog1" expand="false" height="120" type="value" width="120" />
+ <item row="2" for="catalog2" expand="false" height="120" type="value" width="120" />
+ </item>
+ </item>
+
+ <item type="box" expand="false">
+ <item for="comments3" type="label" />
+ <item for="comments3" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "Pictures" -->
+
+ <item expand="true" title="Pictures" type="tab" value="bla" >
+
+ <item align="left" for="othersdetails" type="label" />
+ <item expand="true" type="line">
+ <item for="othersdetails" expand="true" type="value" />
+ </item>
+
+ <item type="line" >
+ <item cols="3" rows="11" type="table" expand="true" >
+ <item row="1" col="0" expand="false" for="edge1" type="value" height="180" width="240" align="center" />
+ <item row="1" col="1" expand="false" for="edge2" type="value" height="180" width="240" align="center" />
+ <item row="1" col="2" expand="false" for="edge3" type="value" height="180" width="240" align="center" />
+ <item row="5" col="0" expand="false" for="edge4" type="value" height="180" width="240" align="center" />
+ <item row="5" col="1" expand="false" for="edge5" type="value" height="180" width="240" align="center" />
+ <item row="5" col="2" expand="false" for="edge6" type="value" height="180" width="240" align="center" />
+ <item row="9" col="0" expand="false" for="edge7" type="value" height="180" width="240" align="center" />
+ <item row="9" col="1" expand="false" for="edge8" type="value" height="180" width="240" align="center" />
+ <item row="9" col="2" expand="false" for="edge9" type="value" height="180" width="240" align="center" />
+
+ <item row="2" col="0" expand="true" type="label" label="AVG" align="center" />
+ <item row="2" col="1" expand="true" type="label" label="AV" align="center" />
+ <item row="2" col="2" expand="true" type="label" label="AVD" align="center" />
+ <item row="6" col="0" expand="true" type="label" label="G" align="center" />
+ <item row="6" col="1" expand="true" type="label" label="BOX" align="center" />
+ <item row="6" col="2" expand="true" type="label" label="D" align="center" />
+ <item row="10" col="0" expand="true" type="label" label="ARG" align="center" />
+ <item row="10" col="1" expand="true" type="label" label="AR" align="center" />
+ <item row="10" col="2" expand="true" type="label" label="ARD" align="center" />
+
+ </item>
+ </item>
+
+ <item type="line" >
+ <item cols="2" rows="2" type="table" expand="true" >
+ <item row="0" col="0" expand="false" for="top" type="value" height="180" width="240" align="center" />
+ <item row="0" col="1" expand="false" for="back" type="value" height="180" width="240" align="center" />
+ <item row="1" col="0" expand="true" type="label" label="Top1" align="center" />
+ <item row="1" col="1" expand="true" type="label" label="Back1" align="center" />
+
+ </item>
+ </item>
+
+ <item align="left" for="otherscomments" type="label" />
+ <item expand="true" type="line">
+ <item for="otherscomments" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "PanelLending" -->
+
+ <item title="PanelLending" type="tab" value="lending">
+ <item type="label" label="LendingExplanation" align="center" />
+ <item rows="3" type="table">
+ <item col="0" for="borrower" row="0" type="label" />
+ <item col="1" for="borrower" row="0" type="value" />
+ <item col="2" for="mailButton" row="0" type="special" />
+ <item col="0" for="lendDate" row="1" type="label" />
+ <item col="1" for="lendDate" row="1" type="value" />
+ <item col="2" for="itemBackButton" row="1" type="special" />
+ </item>
+ <item align="left" for="borrowings" type="label" />
+ <item expand="true" type="line">
+ <item type="box" width="64" />
+ <item expand="true" for="borrowings" type="value" />
+ <item type="box" width="64" />
+ </item>
+ <item align="left" for="comments4" type="label" />
+ <item expand="true" type="line">
+ <item for="comments4" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "Realmodel" -->
+
+ <item expand="true" title="Realmodel" type="tab" value="bla" >
+
+ <item align="left" for="difference" type="label" />
+ <item expand="true" type="line">
+ <item for="difference" expand="true" type="value" />
+ </item>
+
+ <item type="line" >
+ <item cols="2" rows="5" type="table" expand="true" >
+ <item row="0" col="0" expand="true" type="label" label="Front2" align="center" />
+ <item row="0" col="1" expand="true" type="label" label="Back2" align="center" />
+ <item row="1" col="0" expand="false" for="front2" type="value" height="180" width="240" align="center" />
+ <item row="1" col="1" expand="false" for="back2" type="value" height="180" width="240" align="center" />
+ <item row="2" col="0" expand="true" colspan="2" type="label" label="Others" align="center" />
+ <item row="3" col="0" expand="false" for="edge10" type="value" height="180" width="240" align="center" />
+ <item row="3" col="1" expand="false" for="edge20" type="value" height="180" width="240" align="center" />
+ <item row="4" col="0" expand="false" for="edge30" type="value" height="180" width="240" align="center" />
+ <item row="4" col="1" expand="false" for="edge40" type="value" height="180" width="240" align="center" />
+ </item>
+ </item>
+
+ <item align="left" for="comments5" type="label" />
+ <item expand="true" type="line">
+ <item for="comments5" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "PanelTags" -->
+
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+
+
+<!-- "Lecture Seule" -->
+
+
+ <panel editable="false" label="PanelReadOnly" name="readonly">
+
+ <item type="line">
+ <item expand="true" for="name" type="value" />
+ </item>
+ <item expand="true" type="notebook">
+
+<!-- Onglet "Main" -->
+
+ <item expand="true" title="Main" type="tab" value="bla">
+ <item type="line" align="center" >
+ <item cols="2" rows="1" type="table" expand="true" align="center" >
+ <item row="0" col="0" expand="true" for="exchange" type="value" />
+ <item row="0" col="1" expand="true" for="wanted" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item cols="1" rows="11" type="table" expand="true">
+ <item col="0" for="rating1" row="2" type="label" align="center" />
+ <item col="0" for="rating1" expand="false" row="3" type="value" />
+ <item row="9" col="0" expand="true" type="label" label="Picture1" align="center" />
+ <item row="8" col="0" expand="false" for="picture" height="180" type="value" width="240" />
+ </item>
+ <item cols="2" rows="10" type="table" expand="true">
+ <item row="1" col="0" for="scale" type="label" />
+ <item row="1" col="1" for="scale" expand="true" type="value" />
+ <item row="2" col="0" for="manufacturer" type="label" />
+ <item row="2" col="1" for="manufacturer" expand="true" type="value" />
+ <item row="3" col="0" for="type1" type="label" />
+ <item row="3" col="1" for="type1" expand="true" type="value" />
+ <item row="4" col="0" for="constructor" type="label" />
+ <item row="4" col="1" for="constructor" expand="true" type="value" />
+ <item row="5" col="0" for="modele" type="label" />
+ <item row="5" col="1" for="modele" expand="true" type="value" />
+ <item row="6" col="0" for="version" type="label" />
+ <item row="6" col="1" for="version" expand="true" type="value" />
+ <item row="7" col="0" for="color" type="label" />
+ <item row="7" col="1" for="color" expand="true" type="value" />
+ <item row="8" col="0" for="pub" type="label" />
+ <item row="8" col="1" for="pub" expand="true" type="value" />
+ <item row="9" col="0" for="year" type="label" />
+ <item row="9" col="1" for="year" expand="true" type="value" />
+ <item row="10" col="0" for="reference" type="label" />
+ <item row="10" col="1" for="reference" expand="true" type="value" />
+ </item>
+ <item cols="1" rows="4" type="table" expand="true">
+ <item row="3" expand="true" type="label" label="Constructor" align="center" />
+ <item row="1" expand="true" type="label" label="Manufacturer" align="center" />
+ <item row="0" for="logo1" expand="false" height="120" type="value" width="120" />
+ <item row="2" for="logo2" expand="false" height="120" type="value" width="120" />
+ </item>
+ </item>
+
+ <item type="box" expand="false">
+ <item cols="2" rows="1" type="table" expand="true" align="center" >
+ <item row="0" col="0" expand="true" for="kit" type="value" />
+ <item row="0" col="1" expand="true" for="transformation" type="value" />
+ </item>
+ <item for="comments1" type="label" />
+ <item for="comments1" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "Details" -->
+
+ <item expand="true" title="Details" type="tab" value="bla">
+ <item type="label" label="MiscCharacteristics" align="center" />
+ <item cols="4" expand="true" rows="29" type="table" >
+ <item row="0" col="0" collapsed="%material%" colspan="2" title="Material" type="expander">
+ <item for="material" type="value" />
+ </item>
+ <item col="2" row="0" for="molding" type="label" />
+ <item col="3" row="0" for="molding" type="value" />
+ <item col="0" row="1" for="condition" type="label" />
+ <item col="1" row="1" for="condition" type="value" />
+ <item col="2" row="1" for="added" type="label" />
+ <item col="3" row="1" for="added" type="value" />
+ <item col="0" row="2" for="edition" type="label" />
+ <item col="1" row="2" for="edition" type="value" />
+ <item col="2" row="2" for="collectiontype" type="label" />
+ <item col="3" row="2" for="collectiontype" type="value" />
+
+ <item col="0" row="3" for="serial" type="label" />
+ <item col="1" row="3" for="serial" type="value" />
+ <item col="2" row="3" for="serialnumber" type="label" />
+ <item col="3" row="3" for="serialnumber" type="value" />
+ <item col="0" row="4" for="designed" type="label" />
+ <item col="1" row="4" for="designed" type="value" />
+ <item col="2" row="4" for="madein" type="label" />
+ <item col="3" row="4" for="madein" type="value" />
+
+ <item col="0" row="5" for="box1" type="label" />
+ <item col="1" row="5" for="box1" type="value" />
+ <item col="2" row="5" for="box2" type="label" />
+ <item col="3" row="5" for="box2" type="value" />
+ <item col="0" row="6" for="containbox" type="label" />
+ <item col="1" row="6" for="containbox" type="value" />
+
+ <item col="0" row="7" for="rating2" type="label" />
+ <item col="1" row="7" for="rating2" type="value" align="center"/>
+ <item col="2" row="7" for="rating3" type="label" />
+ <item col="3" row="7" for="rating3" type="value" align="center"/>
+ <item col="0" row="8" for="acquisition" type="label" />
+ <item col="1" row="8" for="acquisition" type="value" />
+ <item col="2" row="8" for="location" type="label" />
+ <item col="3" row="8" for="location" type="value" />
+ <item col="0" row="9" for="buyprice" type="label" />
+ <item col="1" row="9" for="buyprice" type="value" />
+ <item col="2" row="9" for="estimate" type="label" />
+ <item col="3" row="9" for="estimate" type="value" />
+
+ <item col="0" row="10" for="comments2" type="label" />
+ <item col="0" row="11" colspan="4" for="comments2" expand="true" type="value" />
+
+ <item col="1" row="12" type="label" label="Diorama" align="center" />
+ <item col="0" row="13" for="decorationset" type="label" />
+ <item col="1" row="13" for="decorationset" type="value" />
+ <item col="0" row="14" for="characters" type="label" />
+ <item col="1" row="14" for="characters" type="value" />
+
+ <item col="3" row="12" type="label" label="CarFromFilm" align="center" />
+ <item col="2" row="13" for="filmcar" type="label" />
+ <item col="3" row="13" for="filmcar" type="value" />
+ <item col="2" row="14" for="filmpart" type="label" />
+ <item col="3" row="14" for="filmpart" type="value" />
+
+ <item col="1" row="15" type="label" label="VehiculeDetails" align="center" />
+ <item col="0" row="16" for="parts" type="label" />
+ <item col="1" row="16" for="parts" type="value" />
+ <item col="0" row="17" for="detailsparts" type="label" />
+ <item col="1" row="17" for="detailsparts" type="value" />
+ <item col="0" row="18" for="decorations" type="label" />
+ <item col="1" row="18" for="decorations" type="value" />
+ <item col="0" row="19" for="detailsdecorations" type="label" />
+ <item col="1" row="19" for="detailsdecorations" type="value" />
+ <item col="0" row="20" for="lwh" type="label" />
+ <item col="1" row="20" for="lwh" type="value" />
+ <item col="0" row="21" for="weight" type="label" />
+ <item col="1" row="21" for="weight" type="value" />
+ <item col="0" row="22" for="framecar" type="label" />
+ <item col="1" row="22" for="framecar" type="value" />
+ <item col="0" row="23" for="bodycar" type="label" />
+ <item col="1" row="23" for="bodycar" type="value" />
+ <item col="0" row="24" for="colormirror" type="label" />
+ <item col="1" row="24" for="colormirror" type="value" />
+ <item col="0" row="25" for="interior" type="label" />
+ <item col="1" row="25" for="interior" type="value" />
+ <item col="0" row="26" for="wheels" type="label" />
+ <item col="1" row="26" for="wheels" type="value" />
+ <item col="0" row="27" for="registrationnumber1" type="label" />
+ <item col="1" row="27" for="registrationnumber1" type="value" />
+ <item col="2" row="27" for="registrationnumber2" type="label" />
+ <item col="3" row="27" for="registrationnumber2" type="value" />
+ <item col="0" row="28" for="steeringwheel" type="label" />
+ <item col="1" row="28" for="steeringwheel" type="value" />
+
+ <item col="3" row="15" type="label" label="RacingCar" align="center" />
+ <item col="2" row="16" for="course" type="label" />
+ <item col="3" row="16" for="course" type="value" />
+ <item col="2" row="17" for="courselocation" type="label" />
+ <item col="3" row="17" for="courselocation" type="value" />
+ <item col="2" row="18" for="courseyear" type="label" />
+ <item col="3" row="18" for="courseyear" type="value" />
+ <item col="2" row="19" for="team" type="label" />
+ <item col="3" row="19" for="team" type="value" />
+ <item col="2" row="20" for="pilots" type="label" />
+ <item col="3" row="20" for="pilots" type="value" />
+ <item col="2" row="21" for="copilots" type="label" />
+ <item col="3" row="21" for="copilots" type="value" />
+ <item col="2" row="22" for="carnumber" type="label" />
+ <item col="3" row="22" for="carnumber" type="value" />
+ <item col="2" row="23" for="pub2" type="label" />
+ <item col="3" row="23" for="pub2" type="value" />
+ <item col="2" row="24" for="finishline" type="label" />
+ <item col="3" row="24" for="finishline" type="value" />
+
+ </item>
+
+ </item>
+
+<!-- Onglet "Catalogs" -->
+
+ <item expand="true" title="Catalogs" type="tab" value="bla">
+ <item type="line">
+ <item cols="1" rows="9" type="table" expand="true">
+ <item row="8" col="0" expand="true" type="label" label="OfficialPicture" align="center" />
+ <item row="7" col="0" expand="false" for="picture2" height="180" type="value" width="240" />
+ </item>
+ <item cols="2" rows="11" type="table" expand="true">
+ <item col="0" row="0" for="barcode" type="label" />
+ <item col="1" row="0" for="barcode" type="value" />
+ <item col="0" row="1" for="referencemirror" type="label" />
+ <item col="1" row="1" for="referencemirror" type="value" />
+ <item col="0" row="2" for="year3" type="label" />
+ <item col="1" row="2" for="year3" type="value" />
+ <item col="0" row="3" for="catalogyear" type="label" />
+ <item col="1" row="3" for="catalogyear" type="value" />
+ <item col="0" row="4" for="catalogedition" type="label" />
+ <item col="1" row="4" for="catalogedition" type="value" />
+ <item col="0" row="5" for="catalogpage" type="label" />
+ <item col="1" row="5" for="catalogpage" type="value" />
+ <item col="0" row="6" for="catalogprice" type="label" />
+ <item col="1" row="6" for="catalogprice" type="value" />
+ <item col="0" row="7" for="personalref" type="label" />
+ <item col="1" row="7" for="personalref" type="value" />
+ <item col="0" row="8" for="websitem" type="label" />
+ <item col="1" row="8" for="websitem" expand="default" type="value" />
+ <item col="0" row="9" for="websitec" type="label" />
+ <item col="1" row="9" for="websitec" expand="default" type="value" />
+ <item col="0" row="10" for="websiteo" type="label" />
+ <item col="1" row="10" for="websiteo" expand="default" type="value" />
+ </item>
+ <item cols="1" rows="4" type="table" expand="true">
+ <item row="1" expand="true" type="label" label="CatalogCoverPicture" align="center" />
+ <item row="3" expand="true" type="label" label="CatalogPagePicture" align="center" />
+ <item row="0" for="catalog1" expand="false" height="120" type="value" width="120" />
+ <item row="2" for="catalog2" expand="false" height="120" type="value" width="120" />
+ </item>
+ </item>
+
+ <item type="box" expand="false">
+ <item for="comments3" type="label" />
+ <item for="comments3" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "Pictures" -->
+
+ <item expand="true" title="Pictures" type="tab" value="bla" >
+
+ <item align="left" for="othersdetails" type="label" />
+ <item expand="true" type="line">
+ <item for="othersdetails" expand="true" type="value" />
+ </item>
+
+ <item type="line" >
+ <item cols="3" rows="11" type="table" expand="true" >
+ <item row="1" col="0" expand="false" for="edge1" type="value" height="180" width="240" align="center" />
+ <item row="1" col="1" expand="false" for="edge2" type="value" height="180" width="240" align="center" />
+ <item row="1" col="2" expand="false" for="edge3" type="value" height="180" width="240" align="center" />
+ <item row="5" col="0" expand="false" for="edge4" type="value" height="180" width="240" align="center" />
+ <item row="5" col="1" expand="false" for="edge5" type="value" height="180" width="240" align="center" />
+ <item row="5" col="2" expand="false" for="edge6" type="value" height="180" width="240" align="center" />
+ <item row="9" col="0" expand="false" for="edge7" type="value" height="180" width="240" align="center" />
+ <item row="9" col="1" expand="false" for="edge8" type="value" height="180" width="240" align="center" />
+ <item row="9" col="2" expand="false" for="edge9" type="value" height="180" width="240" align="center" />
+
+ <item row="2" col="0" expand="true" type="label" label="AVG" align="center" />
+ <item row="2" col="1" expand="true" type="label" label="AV" align="center" />
+ <item row="2" col="2" expand="true" type="label" label="AVD" align="center" />
+ <item row="6" col="0" expand="true" type="label" label="G" align="center" />
+ <item row="6" col="1" expand="true" type="label" label="BOX" align="center" />
+ <item row="6" col="2" expand="true" type="label" label="D" align="center" />
+ <item row="10" col="0" expand="true" type="label" label="ARG" align="center" />
+ <item row="10" col="1" expand="true" type="label" label="AR" align="center" />
+ <item row="10" col="2" expand="true" type="label" label="ARD" align="center" />
+
+ </item>
+ </item>
+
+ <item type="line" >
+ <item cols="2" rows="2" type="table" expand="true" >
+ <item row="0" col="0" expand="false" for="top" type="value" height="180" width="240" align="center" />
+ <item row="0" col="1" expand="false" for="back" type="value" height="180" width="240" align="center" />
+ <item row="1" col="0" expand="true" type="label" label="Top1" align="center" />
+ <item row="1" col="1" expand="true" type="label" label="Back1" align="center" />
+
+ </item>
+ </item>
+
+ <item align="left" for="otherscomments" type="label" />
+ <item expand="true" type="line">
+ <item for="otherscomments" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "PanelLending" -->
+
+ <item title="PanelLending" type="tab" value="lending">
+ <item type="label" label="LendingExplanation" align="center" />
+ <item rows="3" type="table">
+ <item col="0" for="borrower" row="0" type="label" />
+ <item col="1" for="borrower" row="0" type="value" />
+ <item col="2" for="mailButton" row="0" type="special" />
+ <item col="0" for="lendDate" row="1" type="label" />
+ <item col="1" for="lendDate" row="1" type="value" />
+ <item col="2" for="itemBackButton" row="1" type="special" />
+ </item>
+ <item align="left" for="borrowings" type="label" />
+ <item expand="true" type="line">
+ <item type="box" width="64" />
+ <item expand="true" for="borrowings" type="value" />
+ <item type="box" width="64" />
+ </item>
+ <item align="left" for="comments4" type="label" />
+ <item expand="true" type="line">
+ <item for="comments4" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "Realmodel" -->
+
+ <item expand="true" title="Realmodel" type="tab" value="bla" >
+
+ <item align="left" for="difference" type="label" />
+ <item expand="true" type="line">
+ <item for="difference" expand="true" type="value" />
+ </item>
+
+ <item type="line" >
+ <item cols="2" rows="5" type="table" expand="true" >
+ <item row="0" col="0" expand="true" type="label" label="Front2" align="center" />
+ <item row="0" col="1" expand="true" type="label" label="Back2" align="center" />
+ <item row="1" col="0" expand="false" for="front2" type="value" height="180" width="240" align="center" />
+ <item row="1" col="1" expand="false" for="back2" type="value" height="180" width="240" align="center" />
+ <item row="2" col="0" expand="true" colspan="2" type="label" label="Others" align="center" />
+ <item row="3" col="0" expand="false" for="edge10" type="value" height="180" width="240" align="center" />
+ <item row="3" col="1" expand="false" for="edge20" type="value" height="180" width="240" align="center" />
+ <item row="4" col="0" expand="false" for="edge30" type="value" height="180" width="240" align="center" />
+ <item row="4" col="1" expand="false" for="edge40" type="value" height="180" width="240" align="center" />
+ </item>
+ </item>
+
+ <item align="left" for="comments5" type="label" />
+ <item expand="true" type="line">
+ <item for="comments5" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "PanelTags" -->
+
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" collapse="true"/>
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+
+
+ </panels>
+</collection>
diff --git a/lib/gcstar/GCModels/GCmusics.gcm b/lib/gcstar/GCModels/GCmusics.gcm
new file mode 100644
index 0000000..acfaf8c
--- /dev/null
+++ b/lib/gcstar/GCModels/GCmusics.gcm
@@ -0,0 +1,250 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCmusics">
+ <lang>GCmusics</lang>
+
+ <options>
+ <defaults>
+ <image>cd_no.png</image>
+ <listImageWidth>125</listImageWidth>
+ <listImageHeight>120</listImageHeight>
+ </defaults>
+ <fields>
+ <cover>cover</cover>
+ <id>gcsautoid</id>
+ <play>playlist</play>
+ <title>title</title>
+ <url>web</url>
+ <search>
+ <field>unique</field>
+ <field>title</field>
+ <field>artist</field>
+ <field>label</field>
+ </search>
+ <results>
+ <field>title</field>
+ <field>artist</field>
+ <field>release</field>
+ </results>
+ <summary>
+ <field>artist</field>
+ <field>release</field>
+ <field>genre</field>
+ <field>format</field>
+ <field>borrower</field>
+ <field>tags</field>
+ </summary>
+ </fields>
+
+
+ <overlay>
+ <image>cd.png</image>
+ <paddingLeft>44</paddingLeft>
+ <paddingRight>13</paddingRight>
+ <paddingTop>15</paddingTop>
+ <paddingBottom>4</paddingBottom>
+ </overlay>
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+ </options>
+
+ <groups>
+ <group id="main" label="General" />
+ <group id="details" label="Details" />
+ </groups>
+
+
+
+ <random></random>
+
+ <fields lending="true" tags="true">
+ <field value="gcsautoid" group="" imported="false" init="" label="" type="number" />
+ <field value="unique" group="main" init="" label="Unique" type="short text" />
+ <field value="title" group="main" init="NewItem" label="Title" type="short text" imported="true"/>
+ <field value="cover" default="view" group="main" init="" label="Cover" type="image" imported="true"/>
+ <field value="backpic" type="image" label="ContextImgBack" init="" group="main" linkedto="cover" imported="true"/>
+ <field value="artist" group="main" init="" label="Artist" type="short text" imported="true" />
+ <field value="running" group="main" init="0" label="Running" type="short text" imported="true" />
+ <field value="release" group="main" init="" label="Release" type="date" imported="true" />
+ <field value="label" group="main" init="" label="Label" type="history text" imported="true"/>
+ <field value="genre" group="main" history="true" init="" label="Genre" type="single list" imported="true" />
+ <field value="tracks" group="main" history="false" init="" label="Tracks" type="triple list" imported="true" label1="Number" label2="Track" label3="Time"/>
+ <field value="rating" group="details" init="0" label="PanelRating" max="10" type="number" displayas="graphical" />
+ <field value="ratingpress" group="details" init="0" label="PanelPressRating" max="10" type="number" displayas="graphical" imported="true" />
+ <field value="added" group="details" init="current" label="PanelAdded" type="date" />
+ <field value="location" group="details" init="" label="PanelLocation" type="history text" imported="false"/>
+ <field value="origin" group="details" init="" label="Origin" type="history text" imported="true" />
+ <field value="composer" group="details" init="" label="Composer" type="short text" imported="true" />
+ <field value="producer" group="details" init="" label="Producer" type="short text" imported="true" />
+ <field value="format" group="details" init="" label="Format" type="history text" imported="true" />
+ <field value="playlist" format="audio" group="details" init="" label="Playlist" type="file" />
+ <field value="comments" group="details" init="" label="Comments" type="long text" />
+ <field value="web" group="main" init="" label="Url" type="button" format="url" imported="true" />
+ </fields>
+
+ <filters>
+ <group label="Main">
+ <filter comparison="contain" field="unique" numeric="false" quick="false" />
+ <filter comparison="contain" field="title" numeric="false" quick="false" />
+ <filter comparison="contain" field="artist" numeric="false" quick="false" />
+ <filter comparison="contain" field="genre" numeric="false" quick="true" />
+ </group>
+ <group label="Details">
+ <filter comparison="contain" field="label" numeric="false" quick="false" />
+ </group>
+ </filters>
+
+ <panels>
+ <panel editable="true" label="PanelForm" name="form">
+ <item type="line">
+ <item for="unique" type="value" width="13" nomargin="true" />
+ <item expand="true" for="title" type="value" nomargin="true" />
+ <item type="special" for="searchButton" nomargin="true" />
+ <item type="special" for="refreshButton" nomargin="true" />
+ </item>
+ <item expand="true" type="notebook">
+ <item expand="true" title="Main" type="tab" value="bla">
+ <item type="line">
+ <item for="cover" height="150" type="value" width="150" />
+ <item cols="2" rows="4" type="table">
+ <item col="0" row="0" for="artist" type="label" />
+ <item col="1" row="0" for="artist" type="value" />
+ <item col="0" row="1" for="running" type="label" />
+ <item col="1" row="1" for="running" type="value" />
+ <item col="0" row="2" for="release" type="label" />
+ <item col="1" row="2" for="release" type="value" />
+ <item col="0" row="3" for="label" type="label" />
+ <item col="1" row="3" for="label" type="value" />
+ </item>
+ </item>
+ <item collapsed="%genre%" title="Genre" type="expander">
+ <item for="genre" type="value" />
+ </item>
+ <item type="box" expand="true">
+ <item expand="true" for="tracks" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Details" type="tab" value="bla">
+ <item cols="4" rows="6" expand="true" type="table">
+ <item col="0" row="0" type="label" for="rating"/>
+ <item col="1" row="0" type="value" for="rating"/>
+ <item col="2" row="0" type="label" for="ratingpress"/>
+ <item col="3" row="0" type="value" for="ratingpress"/>
+ <item col="0" row="1" type="label" for="location"/>
+ <item col="1" row="1" type="value" for="location"/>
+ <item col="2" row="1" type="label" for="added"/>
+ <item col="3" row="1" type="value" for="added"/>
+ <item col="0" row="2" for="origin" type="label" />
+ <item col="1" row="2" for="origin" type="value" />
+ <item col="2" row="2" for="format" type="label" />
+ <item col="3" row="2" for="format" type="value" />
+ <item col="0" row="3" type="label" for="composer"/>
+ <item col="1" row="3" type="value" for="composer"/>
+ <item col="2" row="3" type="label" for="producer"/>
+ <item col="3" row="3" type="value" for="producer"/>
+ <item col="0" row="4" for="playlist" type="label" />
+ <item type="line" col="1" row="4" colspan="3">
+ <item type="value" for="playlist" expand="true" nomargin="true"/>
+ <item type="launcher" for="playlist" nomargin="true"/>
+ <item type="extractor" for="playlist" nomargin="true"/>
+ </item>
+ <item col="0" row="5" type="label" for="comments"/>
+ <item col="1" row="5" colspan="3" type="value" for="comments" expand="true"/>
+ </item>
+ </item>
+ <item title="PanelLending" type="tab" value="lending">
+ <item rows="3" type="table">
+ <item col="0" for="borrower" row="0" type="label" />
+ <item col="1" for="borrower" row="0" type="value" />
+ <item col="2" for="mailButton" row="0" type="special" />
+ <item col="0" for="lendDate" row="1" type="label" />
+ <item col="1" for="lendDate" row="1" type="value" />
+ <item col="2" for="itemBackButton" row="1" type="special" />
+ </item>
+ <item align="left" for="borrowings" type="label" />
+ <item expand="true" type="line">
+ <item type="box" width="64" />
+ <item expand="true" for="borrowings" type="value" />
+ <item type="box" width="64" />
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line" homogeneous="true">
+ <item expand="true" for="web" type="value" />
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+
+ <panel editable="false" label="PanelReadOnly" name="readonly">
+ <item type="table" rows="2" cols="3">
+ <item type="value" for="title" style="header" row="0" col="0" colspan="3" expand="true"/>
+ <item type="box" row="1" col="0" width="100" expand="false" style="page"/>
+ <item type="value" for="artist" flat="true" style="subheader" row="1" col="1" expand="true"/>
+ <item type="box" row="1" col="2" width="100" expand="false" style="box">
+ <item type="value" for="format" style="box" nomargin="true"/>
+ <item type="formatted" name="fullrating" value="%rating%/10" style="box" nomargin="true"/>
+ </item>
+ </item>
+ <item type="line">
+ <item style="page" type="box">
+ <item for="cover" type="value" width="200" height="200" />
+ </item>
+ <item expand="true" type="box">
+ <item cols="2" rows="5" expand="true" type="table">
+ <item col="0" row="0" for="running" type="label" />
+ <item col="1" row="0" colspan="1" expand="true" for="running" type="value" />
+ <item col="0" row="1" for="release" type="label" />
+ <item col="1" row="1" colspan="1" expand="true" for="release" type="value" />
+ <item col="0" row="2" for="label" type="label" />
+ <item col="1" row="2" colspan="1" expand="true" for="label" type="value" flat="true"/>
+ <item col="0" row="3" for="location" type="label" />
+ <item col="1" row="3" colspan="1" expand="true" for="location" type="value" flat="true"/>
+ <item col="0" row="4" for="origin" type="label" />
+ <item col="1" row="4" colspan="1" expand="true" for="origin" type="value"/>
+ </item>
+ </item>
+ </item>
+ <item type="table" rows="1" cols="2">
+ <item col="0" row="0" type="label" for="genre"/>
+ <item col="1" row="0" type="value" for="genre" flat="true" expand="true"/>
+ <item col="0" row="1" for="composer" type="label" />
+ <item col="1" row="1" colspan="1" expand="true" for="composer" type="value"/>
+ </item>
+ <item type="value" for="comments" height="5em"/>
+ <item type="expander" title="Tracks">
+ <item type="line" expand="true">
+ <item type="box" width="20" style="page"/>
+ <item type="value" for="tracks" expand="true" header="false"/>
+ <item type="box" width="20" style="page"/>
+ </item>
+ </item>
+ <item title="PanelLending" type="expander">
+ <item cols="2" rows="4" type="table">
+ <item col="0" for="borrower" row="0" type="label" />
+ <item col="1" expand="true" for="borrower" row="0" type="value" />
+ <item col="0" for="lendDate" row="1" type="label" />
+ <item col="1" expand="true" for="lendDate" row="1" type="value" />
+ <item col="0" colspan="2" expand="true" height="12" row="2" type="line" />
+ <item col="0" colspan="2" expand="true" row="2" type="line">
+ <item style="page" type="box" width="50" />
+ <item expand="true" for="borrowings" type="value" />
+ <item style="page" type="box" width="50" />
+ </item>
+ </item>
+ </item>
+ <item type="expander" title="PanelTags">
+ <item expand="true" for="tags" type="value" />
+ <item type="value" for="favourite" values="favouriteYesno" collapse="true"/>
+ </item>
+ </panel>
+ </panels>
+</collection>
diff --git a/lib/gcstar/GCModels/GCperiodicals.gcm b/lib/gcstar/GCModels/GCperiodicals.gcm
new file mode 100644
index 0000000..4a6541f
--- /dev/null
+++ b/lib/gcstar/GCModels/GCperiodicals.gcm
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCperiodicals">
+
+ <lang>GCperiodicals</lang>
+
+ <options>
+ <defaults>
+ <image>no.png</image>
+ </defaults>
+ <fields>
+ <cover>gcsfield6</cover>
+ <id>gcsautoid</id>
+ <play></play>
+ <title>gcsfield1</title>
+ <url></url>
+ <search>
+ <field>gcsfield1</field>
+ </search>
+ <results>
+ <field>gcsfield1</field>
+ </results>
+ </fields>
+
+ <overlay>
+ <image>subtle.png</image>
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>11</paddingRight>
+ <paddingTop>12</paddingTop>
+ <paddingBottom>0</paddingBottom>
+ </overlay>
+ </options>
+
+ <fields lending="false" tags="false">
+ <field label="Title" group="main" init="NewItem" type="short text" value="gcsfield1" />
+ <field label="Periodical" group="main" init="" type="history text" value="gcsfield2" />
+ <field label="Number" group="main" init="" type="short text" value="gcsfield3" />
+ <field label="Date" group="main" init="" type="date" value="gcsfield4" />
+ <field label="Subject" flat="true" group="main" history="true" init="" type="single list" value="gcsfield5" />
+ <field default="view" label="Cover" group="main" init="" type="image" value="gcsfield6" />
+ <field label="Articles" history="false" group="main" init="" label1="Article" label2="Page" label3="Résumé" type="triple list" value="gcsfield7" />
+ <field label="" group="" imported="false" init="" type="number" value="gcsautoid" />
+ </fields>
+ <filters>
+ </filters>
+ <groups>
+ <group id="main" label="General" />
+ </groups>
+ <panels>
+ <panel editable="true" label="PanelForm" name="form">
+ <item type="line">
+ <item expand="true" for="gcsfield1" type="value" />
+ </item>
+ <item expand="true" type="box">
+ <item type="line">
+ <item for="gcsfield6" height="150" type="value" width="150" />
+ <item cols="2" type="frame">
+ <item col="0" for="gcsfield2" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" for="gcsfield2" row="0" type="value" />
+ <item col="0" for="gcsfield3" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" for="gcsfield3" row="1" type="value" />
+ <item col="0" for="gcsfield4" row="2" type="label" />
+ <item col="1" colspan="1" expand="true" for="gcsfield4" row="2" type="value" />
+ <item col="0" for="gcsfield7" row="3" type="label" />
+ <item col="1" colspan="1" expand="true" for="gcsfield7" row="3" type="value" />
+ </item>
+ </item>
+ <item col="0" collapsed="%gcsfield5%" colspan="3" row="0" title="Subject" type="expander">
+ <item for="gcsfield5" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+ <panel editable="false" label="PanelReadOnly" name="readonly">
+ <item type="line">
+ <item col="0" colspan="3" expand="true" for="gcsfield1" row="0" style="header" type="value" />
+ </item>
+ <item type="line">
+ <item style="page" type="box" width="150">
+ <item for="gcsfield6" type="value" width="140" />
+ </item>
+ <item expand="true" type="box">
+ <item cols="2" expand="true" type="table">
+ <item col="0" for="gcsfield2" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield2" row="0" type="value" />
+ <item col="0" for="gcsfield3" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield3" row="1" type="value" />
+ <item col="0" for="gcsfield4" row="2" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield4" row="2" type="value" />
+ <item col="0" for="gcsfield7" row="3" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield7" row="3" type="value" />
+ </item>
+ </item>
+ </item>
+ <item cols="2" expand="true" rows="1" type="table">
+ <item col="0" for="gcsfield5" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield5" row="0" type="value" />
+ </item>
+ </panel>
+ </panels>
+ <random></random>
+</collection>
diff --git a/lib/gcstar/GCModels/GCsmartcards.gcm b/lib/gcstar/GCModels/GCsmartcards.gcm
new file mode 100644
index 0000000..8af8c9c
--- /dev/null
+++ b/lib/gcstar/GCModels/GCsmartcards.gcm
@@ -0,0 +1,379 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCsmartcards">
+
+ <lang>GCsmartcards</lang>
+
+ <options>
+
+ <defaults>
+ <image>no_smartcards.png</image>
+ <groupby>country</groupby>
+ </defaults>
+
+ <fields>
+ <cover>cover</cover>
+ <id>gcsautoid</id>
+ <title>name</title>
+ </fields>
+
+ <overlay>
+ <!--<image>smartcards.png</image>-->
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>12</paddingRight>
+ <paddingTop>0</paddingTop>
+ <paddingBottom>12</paddingBottom>
+ </overlay>
+
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+
+ </options>
+
+ <groups>
+ <group id="Main" label="Main" />
+ <group id="PanelLending" label="PanelLending" />
+
+ </groups>
+
+ <filters>
+
+ <group label="Main">
+ <filter comparison="range" field="year1" labelselect="Intervalle" numeric="true" quick="true" />
+ <filter comparison="eq" field="exchange" numeric="false" quick="true" />
+ </group>
+
+ </filters>
+
+ <random></random>
+
+ <fields lending="true" tags="true">
+
+
+# Definition des Champs Communs
+
+ <field value="playlist" format="audio" group="" init="..\lib\gcstar\GCHelp\GCHelpSmartcards.pdf" label="Help" type="file" />
+ <field value="name" group="" init="%type1% (%year1%)" label="Name" type="formatted" />
+
+# Definition des Champs "Main"
+
+ <field value="gcsautoid" displayed="" group="" imported="false" init="" label="" type="number" />
+ <field value="rating1" group="Main" label="Rating1" max="10" init="0" type="number" displayas="graphical"/>
+
+ <field value="cover" default="view" group="Main" init="" label="Cover" type="image" imported="true"/>
+ <field value="backpic" type="image" label="ContextImgBack" init="" group="Main" linkedto="cover" imported="true"/>
+ <field value="chip" default="view" group="Main" init="" label="Chip" type="image" />
+ <field value="boxed" default="view" group="Main" init="" label="Box" type="image" />
+ <field value="chip1" flat="true" group="Main" history="true" init="" label="Chip1" type="history text" />
+
+ <field value="type1" flat="true" group="Main" history="true" init="" label="Type1" type="history text" />
+ <field value="type2" flat="true" group="Main" history="true" init="" label="Type2" type="history text" />
+ <field value="dimension" flat="true" group="Main" history="true" init="" label="Dimension" type="history text" />
+ <field value="location" flat="true" group="Main" history="true" init="" label="Location" type="history text" />
+ <field value="pressed" flat="true" group="Main" history="true" init="" label="Pressed" type="history text" />
+ <field value="title1" flat="true" group="Main" history="true" init="" label="Title1" type="short text" />
+ <field value="edition" flat="true" group="Main" history="true" init="" label="Edition" type="history text" />
+ <field value="serial" flat="true" group="Main" history="true" init="" label="Serial" type="short text" />
+ <field value="theme" flat="true" group="Main" history="true" init="" label="Theme" type="history text" />
+ <field value="serie" flat="true" group="Main" history="true" init="" label="Serie" type="history text" />
+
+ <field value="year1" group="Main" init="" label="Year1" type="date" />
+ <field value="year2" group="Main" init="" label="Year2" type="date" />
+
+ <field value="comments1" group="Main" init="" label="Comments1" type="long text" />
+ <field value="exchange" group="Main" init="0" label="Exchange" type="yesno" />
+ <field value="wanted" group="Main" init="0" label="Wanted" type="yesno" />
+ <field value="condition" group="Main" init="0" label="Condition" type="yesno" />
+
+ <field value="variety" group="Main" init="0" label="Variety" type="yesno" />
+ <field value="charge" group="Main" init="0" label="Charge" type="yesno" />
+
+ <field value="color" flat="true" group="Main" history="true" init="" label="Color" type="short text" />
+
+ <field value="weight" group="Main" init="" label="Weight" type="history text" />
+
+ <field value="country" group="Main" init="" label="Country" type="history text" />
+
+ <field value="unit" group="Main" label="Unit" history="true" type="history text" init="" />
+
+ <field value="added" group="Main" init="current" label="PanelAdded" type="date" />
+ <field value="acquisition" group="Main" init="" label="Acquisition" type="date" />
+
+ <field value="catalog3" group="Main" init="" label="Catalog3" type="short text" />
+
+ <field value="reference1" group="Main" init="" label="Reference1" type="short text" />
+ <field value="reference2" group="Main" init="" label="Reference2" type="short text" />
+ <field value="reference3" group="Main" init="" label="Reference3" type="short text" />
+
+ <field value="quotationnew10" group="Main" init="" label="Quotationnew10" type="short text" />
+ <field value="quotationnew20" group="Main" init="" label="Quotationnew20" type="short text" />
+ <field value="quotationnew30" group="Main" init="" label="Quotationnew30" type="short text" />
+
+ <field value="quotationold10" group="Main" init="" label="Quotationold10" type="short text" />
+ <field value="quotationold20" group="Main" init="" label="Quotationold20" type="short text" />
+ <field value="quotationold30" group="Main" init="" label="Quotationold30" type="short text" />
+
+
+ </fields>
+
+# Lecture / Ecriture
+
+ <panels>
+ <panel editable="true" label="PanelForm" name="form">
+ <item type="line">
+ <item cols="5" rows="1" type="table" expand="true" >
+ <item col="0" row="1" expand="true" for="name" type="value" />
+ <item col="1" row="1" for="added" type="label" />
+ <item col="2" row="1" for="added" type="value" />
+
+ </item>
+ </item>
+ <item expand="true" type="notebook">
+
+# Onglet "Main"
+
+ <item expand="true" title="Main" type="tab" value="bla">
+ <item type="line" align="center" >
+ <item cols="3" rows="1" type="table" expand="true" align="center" >
+ <item row="0" col="0" expand="true" for="exchange" type="value" />
+ <item row="0" col="1" expand="true" for="wanted" type="value" />
+ <item row="0" col="2" expand="true" for="condition" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item cols="1" rows="11" type="table" expand="true">
+ <item col="0" for="rating1" row="2" type="label" align="center" />
+ <item col="0" for="rating1" expand="false" row="3" type="value" />
+ <item row="9" col="0" expand="true" type="label" label="TheSmartCard" align="center" />
+ <item row="8" col="0" expand="false" for="cover" height="160" type="value" width="240" />
+ </item>
+ <item cols="2" rows="11" type="table" expand="true">
+ <item row="1" col="0" for="country" type="label" />
+ <item row="1" col="1" for="country" expand="true" type="value" />
+ <item row="2" col="0" for="type1" type="label" />
+ <item row="2" col="1" for="type1" expand="true" type="value" />
+ <item row="3" col="0" for="unit" type="label" />
+ <item row="3" col="1" for="unit" expand="true" type="value" />
+ <item row="4" col="0" for="title1" type="label" />
+ <item row="4" col="1" for="title1" expand="true" type="value" />
+ <item row="5" col="0" for="serie" type="label" />
+ <item row="5" col="1" for="serie" expand="true" type="value" />
+ <item row="6" col="0" for="theme" type="label" />
+ <item row="6" col="1" for="theme" expand="true" type="value" />
+ <item row="7" col="0" for="edition" type="label" />
+ <item row="7" col="1" for="edition" expand="true" type="value" />
+ <item row="8" col="0" for="serial" type="label" />
+ <item row="8" col="1" for="serial" expand="true" type="value" />
+ <item row="9" col="0" for="year1" type="label" />
+ <item row="9" col="1" for="year1" expand="true" type="value" />
+ <item row="10" col="0" for="year2" type="label" />
+ <item row="10" col="1" for="year2" expand="true" type="value" />
+ </item>
+ <item cols="1" rows="11" type="table" expand="true">
+ <item row="0" for="chip" expand="false" height="100" type="value" width="120" />
+ <item row="1" expand="true" type="label" label="Chip" align="center" />
+ <item row="2" for="boxed" expand="false" height="100" type="value" width="120" />
+ <item row="3" expand="true" type="label" label="Box" align="center" />
+ </item>
+ </item>
+ <item type="line">
+ <item cols="4" rows="4" type="table" expand="true">
+ <item row="0" col="0" for="pressed" type="label" />
+ <item row="0" col="1" for="pressed" expand="true" type="value" />
+ <item row="1" col="0" for="location" type="label" />
+ <item row="1" col="1" for="location" expand="true" type="value" />
+ <item row="0" col="2" for="dimension" type="label" />
+ <item row="0" col="3" for="dimension" expand="true" type="value" />
+ <item row="1" col="2" for="weight" type="label" />
+ <item row="1" col="3" for="weight" expand="true" type="value" />
+ <item row="2" col="0" for="type2" type="label" />
+ <item row="2" col="1" for="type2" expand="true" type="value" />
+ <item row="2" col="2" for="color" type="label" />
+ <item row="2" col="3" for="color" expand="true" type="value" />
+ <item row="3" col="0" for="acquisition" type="label" />
+ <item row="3" col="1" for="acquisition" expand="true" type="value" />
+ </item>
+ </item>
+
+ <item type="box" expand="false">
+ <item cols="2" rows="1" type="table" expand="true" align="center" >
+ <item row="0" col="0" expand="true" for="charge" type="value" />
+ <item row="0" col="1" expand="true" for="variety" type="value" />
+ </item>
+ <item for="comments1" type="label" />
+ <item for="comments1" expand="true" type="value" />
+ </item>
+
+ <item type="line">
+ <item cols="6" rows="4" type="table" expand="true">
+
+ <item row="0" col="0" align="center" label="Catalog0" type="label" />
+ <item row="0" col="1" align="center" label="Reference0" type="label" />
+ <item row="0" col="2" align="center" label="Quotationnew00" type="label" />
+ <item row="0" col="3" align="center" label="Quotationold00" type="label" />
+
+ <item row="1" col="0" align="center" label="Catalog1" type="label" />
+ <item row="1" col="1" for="reference1" type="value" />
+ <item row="1" col="2" for="quotationnew10" type="value" />
+ <item row="1" col="3" for="quotationold10" type="value" />
+
+ <item row="2" col="0" align="center" label="Catalog2" type="label" />
+ <item row="2" col="1" for="reference2" type="value" />
+ <item row="2" col="2" for="quotationnew20" type="value" />
+ <item row="2" col="3" for="quotationold20" type="value" />
+
+ <item row="3" col="0" align="center" for="catalog3" type="value" />
+ <item row="3" col="1" for="reference3" type="value" />
+ <item row="3" col="2" for="quotationnew30" type="value" />
+ <item row="3" col="3" for="quotationold30" type="value" />
+ </item>
+ </item>
+
+ </item>
+
+# Onglet "PanelTags"
+
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+
+
+######################################################## "Lecture Seule" ###################################################################
+
+
+ <panel editable="false" label="PanelReadOnly" name="readonly">
+
+ <item type="line">
+ <item expand="true" for="name" type="value" />
+ </item>
+ <item expand="true" type="notebook">
+
+# Onglet "Main"
+
+<item expand="true" title="Main" type="tab" value="bla">
+ <item type="line" align="center" >
+ <item cols="3" rows="1" type="table" expand="true" align="center" >
+ <item row="0" col="0" expand="true" for="exchange" type="value" />
+ <item row="0" col="1" expand="true" for="wanted" type="value" />
+ <item row="0" col="2" expand="true" for="condition" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item cols="1" rows="11" type="table" expand="true">
+ <item col="0" for="rating1" row="2" type="label" align="center" />
+ <item col="0" for="rating1" expand="false" row="3" type="value" />
+ <item row="9" col="0" expand="true" type="label" label="TheSmartCard" align="center" />
+ <item row="8" col="0" expand="false" for="cover" height="160" type="value" width="240" />
+ </item>
+ <item cols="2" rows="11" type="table" expand="true">
+ <item row="1" col="0" for="country" type="label" />
+ <item row="1" col="1" for="country" expand="true" type="value" />
+ <item row="2" col="0" for="type1" type="label" />
+ <item row="2" col="1" for="type1" expand="true" type="value" />
+ <item row="3" col="0" for="unit" type="label" />
+ <item row="3" col="1" for="unit" expand="true" type="value" />
+ <item row="4" col="0" for="title1" type="label" />
+ <item row="4" col="1" for="title1" expand="true" type="value" />
+ <item row="5" col="0" for="serie" type="label" />
+ <item row="5" col="1" for="serie" expand="true" type="value" />
+ <item row="6" col="0" for="theme" type="label" />
+ <item row="6" col="1" for="theme" expand="true" type="value" />
+ <item row="7" col="0" for="edition" type="label" />
+ <item row="7" col="1" for="edition" expand="true" type="value" />
+ <item row="8" col="0" for="serial" type="label" />
+ <item row="8" col="1" for="serial" expand="true" type="value" />
+ <item row="9" col="0" for="year1" type="label" />
+ <item row="9" col="1" for="year1" expand="true" type="value" />
+ <item row="10" col="0" for="year2" type="label" />
+ <item row="10" col="1" for="year2" expand="true" type="value" />
+ </item>
+ <item cols="1" rows="11" type="table" expand="true">
+ <item row="0" for="chip" expand="false" height="100" type="value" width="120" />
+ <item row="1" expand="true" type="label" label="Chip" align="center" />
+ <item row="2" for="boxed" expand="false" height="100" type="value" width="120" />
+ <item row="3" expand="true" type="label" label="Box" align="center" />
+ </item>
+ </item>
+ <item type="line">
+ <item cols="4" rows="4" type="table" expand="true">
+ <item row="0" col="0" for="pressed" type="label" />
+ <item row="0" col="1" for="pressed" expand="true" type="value" />
+ <item row="1" col="0" for="location" type="label" />
+ <item row="1" col="1" for="location" expand="true" type="value" />
+ <item row="0" col="2" for="dimension" type="label" />
+ <item row="0" col="3" for="dimension" expand="true" type="value" />
+ <item row="1" col="2" for="weight" type="label" />
+ <item row="1" col="3" for="weight" expand="true" type="value" />
+ <item row="2" col="0" for="type2" type="label" />
+ <item row="2" col="1" for="type2" expand="true" type="value" />
+ <item row="2" col="2" for="color" type="label" />
+ <item row="2" col="3" for="color" expand="true" type="value" />
+ <item row="3" col="0" for="acquisition" type="label" />
+ <item row="3" col="1" for="acquisition" expand="true" type="value" />
+ </item>
+ </item>
+
+ <item type="box" expand="false">
+ <item cols="2" rows="1" type="table" expand="true" align="center" >
+ <item row="0" col="0" expand="true" for="charge" type="value" />
+ <item row="0" col="1" expand="true" for="variety" type="value" />
+ </item>
+ <item for="comments1" type="label" />
+ <item for="comments1" expand="true" type="value" />
+ </item>
+
+ <item type="line">
+ <item cols="6" rows="4" type="table" expand="true">
+
+ <item row="0" col="0" align="center" label="Catalog0" type="label" />
+ <item row="0" col="1" align="center" label="Reference0" type="label" />
+ <item row="0" col="2" align="center" label="Quotationnew00" type="label" />
+ <item row="0" col="3" align="center" label="Quotationold00" type="label" />
+
+ <item row="1" col="0" align="center" label="Catalog1" type="label" />
+ <item row="1" col="1" for="reference1" type="value" />
+ <item row="1" col="2" for="quotationnew10" type="value" />
+ <item row="1" col="3" for="quotationold10" type="value" />
+
+ <item row="2" col="0" align="center" label="Catalog2" type="label" />
+ <item row="2" col="1" for="reference2" type="value" />
+ <item row="2" col="2" for="quotationnew20" type="value" />
+ <item row="2" col="3" for="quotationold20" type="value" />
+
+ <item row="3" col="0" align="center" for="catalog3" type="value" />
+ <item row="3" col="1" for="reference3" type="value" />
+ <item row="3" col="2" for="quotationnew30" type="value" />
+ <item row="3" col="3" for="quotationold30" type="value" />
+ </item>
+ </item>
+
+ </item>
+
+# Onglet "PanelTags"
+
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" collapse="true"/>
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+
+
+ </panels>
+</collection>
diff --git a/lib/gcstar/GCModels/GCsoftware.gcm b/lib/gcstar/GCModels/GCsoftware.gcm
new file mode 100644
index 0000000..05b7268
--- /dev/null
+++ b/lib/gcstar/GCModels/GCsoftware.gcm
@@ -0,0 +1,438 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCsoftware">
+ <lang>GCsoftware</lang>
+
+ <options>
+
+ <defaults>
+ <image>no.png</image>
+ <listImageWidth>160</listImageWidth>
+ <listImageHeight>160</listImageHeight>
+ </defaults>
+
+ <fields>
+ <id>id</id>
+ <title>name</title>
+ <cover>boxpic</cover>
+ <url>web</url>
+ <play>executable</play>
+ <search>
+ <field>ean</field>
+ <field>name</field>
+ </search>
+ <results>
+ <field>name</field>
+ <field>platform</field>
+ <field>category</field>
+ <field>released</field>
+ </results>
+ </fields>
+
+ <overlay>
+ <image>dvd.png</image>
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>16</paddingRight>
+ <paddingTop>16</paddingTop>
+ <paddingBottom>2</paddingBottom>
+ </overlay>
+
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+ <values id="licenses">
+ <value displayed=""></value>
+ <value displayed="Commercial">Commercial</value>
+ <value displayed="Shareware">Shareware</value>
+ <value displayed="Freeware">Freeware</value>
+ <value displayed="FreewareNoncommercial">Freeware (non-commercial use)</value>
+ <value displayed="Adware">Adware</value>
+ <value displayed="GNU GPL">GNU GPL</value>
+ <value displayed="MPL">MPL</value>
+ <value displayed="BSD">BSD</value>
+ <value displayed="OtherOpenSource">Other Open Source</value>
+ <value displayed="PublicDomain">Public Domain</value>
+ <value displayed="OtherLicense">Other</value>
+ </values>
+ <values id="">
+ <value displayed=""></value>
+ </values>
+ </options>
+
+
+ <groups>
+ <group id="info" label="General"/>
+ <group id="details" label="Details"/>
+ </groups>
+
+ <random>
+ </random>
+
+ <fields lending="true" tags="true">
+ <field value="id"
+ type="number"
+ label="Id"
+ init=""
+ group="info"
+ imported="false"/>
+ <field value="ean"
+ type="number"
+ label="Ean"
+ tip="Ean"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="name"
+ type="short text"
+ label="Name"
+ init="NewItem"
+ group="info"
+ imported="true"/>
+ <field value="boxpic"
+ type="image"
+ label="Box"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="backpic"
+ type="image"
+ label="ContextImgBack"
+ init=""
+ group="info"
+ linkedto="boxpic"
+ imported="true"/>
+ <field value="platform"
+ type="history text"
+ label="Platform"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="editor"
+ type="history text"
+ label="Editor"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="developer"
+ type="history text"
+ label="Developer"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="released"
+ type="date"
+ label="Released"
+ init=""
+ group="info"
+ imported="true"
+ sorttype="date"/>
+ <field value="license"
+ type="options"
+ label="License"
+ init=""
+ values="licenses"
+ separator="2"
+ group="info"
+ imported="true"/>
+ <field value="homepage"
+ type="file"
+ format="url"
+ label="Homepage"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="description"
+ type="long text"
+ label="Description"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="web"
+ type="button"
+ format="url"
+ label="Url"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="numberOfCopies"
+ type="number"
+ label="NumberOfCopies"
+ init="1"
+ min="0"
+ max="99999"
+ group="info"
+ imported="true"/>
+ <field value="price"
+ type="number"
+ label="Price"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="category"
+ type="single list"
+ label="Category"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="rating"
+ type="number"
+ displayas="graphical"
+ label="PanelRating"
+ init="0"
+ max="10"
+ group="details"
+ imported="false"/>
+ <field value="ratingpress"
+ type="number"
+ displayas="graphical"
+ label="PanelPressRating"
+ init="0"
+ min="0"
+ max="10"
+ group="info"
+ imported="true"/>
+ <field value="case"
+ type="yesno"
+ label="Case"
+ init="1"
+ group="details"
+ imported="false"/>
+ <field value="manual"
+ type="yesno"
+ label="Manual"
+ init="1"
+ group="details"
+ imported="false"/>
+ <field value="added"
+ type="date"
+ label="PanelAdded"
+ init="current"
+ group="details"
+ imported="false"/>
+ <field value="location"
+ type="history text"
+ label="PanelLocation"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="executable"
+ type="file"
+ format="program"
+ label="Executable"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="screenshot1"
+ type="image"
+ label="Screenshot1"
+ init=""
+ default="view"
+ group="details"
+ imported="true"/>
+ <field value="screenshot2"
+ type="image"
+ label="Screenshot2"
+ init=""
+ default="view"
+ group="details"
+ imported="true"/>
+ <field value="comments"
+ type="long text"
+ label="Comments"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="regInfo"
+ type="triple list"
+ label="RegInfo"
+ label1="RegistrationName"
+ label2="RegistrationNumber"
+ label3="RegistrationComments"
+ init=""
+ group="details"
+ history="false"
+ imported="true"/>
+ </fields>
+
+
+ <filters>
+ <group label="General">
+ <filter field="name" comparison="contain"/>
+ <filter field="platform" comparison="eq" quick="true"/>
+ <filter field="category" comparison="contain" quick="true"/>
+ </group>
+ <group label="Details">
+ <filter field="rating" comparison="ge" numeric="true" labelselect="FilterRatingSelect" quick="true"/>
+ </group>
+ </filters>
+
+
+ <panels>
+ <panel name="form" label="PanelForm" editable="true">
+ <item type="line">
+ <item type="value" for="ean" width="10" tip="" nomargin="true" />
+ <item type="value" for="name" expand="true" nomargin="true" />
+ </item>
+ <item type="notebook" expand="true">
+ <item type="tab" value="info" title="General">
+ <item type="line">
+ <item type="box">
+ <item type="value" for="boxpic" width="200" height="200"/>
+ </item>
+ <item type="table" title="Information" rows="9" cols="2">
+ <item type="label" for="platform" row="0" col="0"/>
+ <item type="value" for="platform" row="0" col="1" expand="true"/>
+ <item type="label" for="editor" row="1" col="0"/>
+ <item type="value" for="editor" row="1" col="1" />
+ <item type="label" for="developer" row="2" col="0"/>
+ <item type="value" for="developer" row="2" col="1" />
+ <item type="label" for="license" row="3" col="0"/>
+ <item type="value" for="license" row="3" col="1" expand="true"/>
+ <item type="label" for="released" row="4" col="0"/>
+ <item type="value" for="released" row="4" col="1" expand="true"/>
+ <item type="label" for="numberOfCopies" row="5" col="0"/>
+ <item type="value" for="numberOfCopies" row="5" col="1" />
+ <item type="label" for="price" row="6" col="0"/>
+ <item type="value" for="price" row="6" col="1" />
+ <item type="label" for="homepage" row="7" col="0"/>
+ <item type="line" row="7" col="1">
+ <item type="value" for="homepage" expand="true" nomargin="true"/>
+ <item type="launcher" for="homepage" nomargin="true"/>
+ </item>
+ <item type="expander" title="Category" collapsed="%category%" row="8" col="0" colspan="2">
+ <item type="value" for="category"/>
+ </item>
+ </item>
+ </item>
+ <item type="box" expand="true">
+ <item type="label" for="description"/>
+ <item type="value" for="description" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="details" title="Details">
+ <item type="table" rows="5" cols="4">
+ <item type="line" row="0" col="0" colspan="2">
+ <item type="value" for="case" />
+ <item type="value" for="manual" />
+ </item>
+ <item type="label" for="added" row="1" col="0"/>
+ <item type="value" for="added" row="1" col="1" expand="true" />
+ <item type="label" for="location" row="1" col="2"/>
+ <item type="value" for="location" row="1" col="3" expand="true" />
+ <item type="label" for="rating" row="2" col="0"/>
+ <item type="value" for="rating" row="2" col="1"/>
+ <item type="label" for="ratingpress" row="2" col="2"/>
+ <item type="value" for="ratingpress" row="2" col="3"/>
+ <item type="label" for="executable" row="3" col="0"/>
+ <item type="line" row="3" col="1" colspan="3">
+ <item type="value" for="executable" expand="true"/>
+ <item type="launcher" for="executable" nomargin="true"/>
+ </item>
+
+ </item>
+ <item type="table" rows="4" cols="2" expand="true">
+ <item type="label" label="Screenshots" row="0" col="0" colspan="2"/>
+ <item type="value" for="screenshot1" row="1" col="0" width="200" height="150"/>
+ <item type="value" for="screenshot2" row="1" col="1" width="200" height="150"/>
+ <item type="label" for="comments" row="2" col="0" colspan="2"/>
+ <item type="value" for="comments" row="3" col="0" colspan="2" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="registration" title="RegistrationInfo">
+ <item type="box" nomargin="true">
+ <item type="label" for="regInfo"/>
+ <item type="value" for="regInfo" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="lending" title="PanelLending">
+ <item type="table" rows="3" cols="3">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1"/>
+ <item type="special" for="mailButton" row="0" col="2"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1"/>
+ <item type="special" for="itemBackButton" row="1" col="2"/>
+ </item>
+ <item type="label" for="borrowings" align="left"/>
+ <item type="line" expand="true">
+ <item type="box" width="64"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="64"/>
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line" homogeneous="true">
+ <item type="value" for="web" expand="true"/>
+ <item type="special" for="deleteButton" expand="true"/>
+ </item>
+ </panel>
+
+ <panel name="readonly" label="PanelReadOnly" editable="false">
+ <item type="table" rows="2" cols="3">
+ <item type="value" for="name" style="header" row="0" col="0" colspan="3" expand="true"/>
+ <item type="box" row="1" col="0" width="150" expand="false" style="page"/>
+ <item type="value" for="platform" style="subheader" row="1" col="1" expand="true"/>
+ <item type="box" row="1" col="2" width="150" expand="false" style="box">
+ <item type="formatted" name="fullrating" value="%rating%/10" style="box" nomargin="true"/>
+ <item type="value" for="editor" style="box" nomargin="true"/>
+ <item type="value" for="homepage" style="box" nomargin="true"/>
+ </item>
+ </item>
+ <item type="line">
+ <item type="box" width="150" style="page">
+ <item type="value" for="boxpic" width="140"/>
+ </item>
+ <item type="box" expand="true">
+ <item type="table" rows="7" cols="2" expand="true">
+ <item type="label" for="category" row="0" col="0"/>
+ <item type="value" for="category" flat="true" row="0" col="1" expand="true"/>
+ <item type="label" for="developer" row="1" col="0"/>
+ <item type="value" for="developer" row="1" col="1" expand="true"/>
+ <item type="label" for="released" row="2" col="0"/>
+ <item type="value" for="released" row="2" col="1" expand="true"/>
+ <item type="label" for="license" row="3" col="0"/>
+ <item type="value" for="license" row="3" col="1" expand="true"/>
+ <item type="label" for="numberOfCopies" row="4" col="0"/>
+ <item type="value" for="numberOfCopies" row="4" col="1" expand="true"/>
+ <item type="label" for="price" row="5" col="0"/>
+ <item type="value" for="price" row="5" col="1" expand="true"/>
+ <item type="label" for="location" row="6" col="0"/>
+ <item type="value" for="location" row="6" col="1" expand="true"/>
+ </item>
+ </item>
+ </item>
+ <item type="value" for="description" height="6em"/>
+ <item type="expander" title="PanelLending">
+ <item type="table" rows="4" cols="2" expand="true">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1" expand="true"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1" expand="true"/>
+ <item type="line" row="2" col="0" colspan="2" height="12" expand="true"/>
+ <item type="line" row="3" col="0" colspan="2" expand="true">
+ <item type="box" width="50" style="page"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="50" style="page"/>
+ </item>
+ </item>
+ </item>
+ <item type="expander" title="PanelTags">
+ <item expand="true" for="tags" type="value" />
+ <item type="value" for="favourite" values="favouriteYesno" collapse="true"/>
+ </item>
+ <item type="table" rows="1" cols="2" expand="true">
+ <item type="value" for="screenshot1" row="0" col="0" width="200" height="150" expand="true"/>
+ <item type="value" for="screenshot2" row="0" col="1" width="200" height="150" expand="true"/>
+ </item>
+ </panel>
+ </panels>
+
+</collection>
diff --git a/lib/gcstar/GCModels/GCstamps.gcm b/lib/gcstar/GCModels/GCstamps.gcm
new file mode 100644
index 0000000..5c5c4fe
--- /dev/null
+++ b/lib/gcstar/GCModels/GCstamps.gcm
@@ -0,0 +1,702 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd" name="GCstamps">
+
+ <lang>GCstamps</lang>
+
+ <options>
+ <defaults>
+ <image>no_stamp.png</image>
+ <groupby>year</groupby>
+ </defaults>
+ <fields cover="gcsfield38" id="gcsautoid" play="" title="gcsfield1">
+ <results></results>
+ </fields>
+ <overlay>
+ <image>canevas-timbre.png</image>
+ <paddingLeft>56</paddingLeft>
+ <paddingRight>77</paddingRight>
+ <paddingTop>55</paddingTop>
+ <paddingBottom>76</paddingBottom>
+ </overlay>
+ <values id="gcsfield12" />
+ <values id="types">
+ <value displayed="">0</value>
+ <value displayed="AirMail">1</value>
+ <value displayed="MilitaryStamp">2</value>
+ <value displayed="Official">3</value>
+ <value displayed="PostageDue">4</value>
+ <value displayed="Regular">5</value>
+ <value displayed="Revenue">6</value>
+ <value displayed="SpecialDelivery">7</value>
+ <value displayed="StrikeStamp">8</value>
+ <value displayed="TelegraphStamp">9</value>
+ <value displayed="WarStamp">10</value>
+ <value displayed="WarTaxStamp">11</value>
+ </values>
+ <values id="formats">
+ <value displayed="">0</value>
+ <value displayed="Booklet">1</value>
+ <value displayed="BookletPane">2</value>
+ <value displayed="Card">3</value>
+ <value displayed="Coil">4</value>
+ <value displayed="Envelop">5</value>
+ <value displayed="FirstDayCover">6</value>
+ <value displayed="Sheet">7</value>
+ <value displayed="Single">8</value>
+ </values>
+ <values id="printingvariety">
+ <value displayed="">0</value>
+ <value displayed="Heliogravure">1</value>
+ <value displayed="Lithography">2</value>
+ <value displayed="Offset">3</value>
+ <value displayed="Photogravure">4</value>
+ <value displayed="RecessPrinting">5</value>
+ <value displayed="Typography">6</value>
+ </values>
+ <values id="gums">
+ <value displayed="">0</value>
+ <value displayed="OriginalGum">1</value>
+ <value displayed="Ungummed">2</value>
+ <value displayed="Regummed">3</value>
+ </values>
+ <values id="papers">
+ <value displayed="">0</value>
+ <value displayed="Chalky">1</value>
+ <value displayed="ChinaPaper">2</value>
+ <value displayed="Coarsed">3</value>
+ <value displayed="Glossy">4</value>
+ <value displayed="Granite">5</value>
+ <value displayed="Laid">6</value>
+ <value displayed="Manila">7</value>
+ <value displayed="Native">8</value>
+ <value displayed="Pelure">9</value>
+ <value displayed="Quadrille">10</value>
+ <value displayed="Ribbed">11</value>
+ <value displayed="Rice">12</value>
+ <value displayed="Silk">13</value>
+ <value displayed="Smoothed">14</value>
+ <value displayed="Thick">15</value>
+ <value displayed="Thin">16</value>
+ <value displayed="Wove">17</value>
+ </values>
+ <values id="perforations">
+ <value displayed="">0</value>
+ <value displayed="CoarsedPerforation">1</value>
+ <value displayed="CombPerforation">2</value>
+ <value displayed="CompoundPerforation">3</value>
+ <value displayed="DamagedPerforation">4</value>
+ <value displayed="DoublePerforation">5</value>
+ <value displayed="HarrowPerforation">6</value>
+ <value displayed="LinePerforation">7</value>
+ <value displayed="NoPerforation">8</value>
+ </values>
+ <values id="cancellations">
+ <value displayed="">0</value>
+ <value displayed="CancellationToOrder">1</value>
+ <value displayed="FancyCancellation">2</value>
+ <value displayed="FirstDayCancellation">3</value>
+ <value displayed="NumeralCancellation">4</value>
+ <value displayed="PenMarked">5</value>
+ <value displayed="RailroadCancellation">6</value>
+ <value displayed="SpecialCancellation">7</value>
+ </values>
+ <values id="grades">
+ <value displayed="">0</value>
+ <value displayed="Superb">1</value>
+ <value displayed="ExtraFine">2</value>
+ <value displayed="VeryFine">3</value>
+ <value displayed="FineVeryFine">4</value>
+ <value displayed="Fine">5</value>
+ <value displayed="Average">6</value>
+ <value displayed="Poor">7</value>
+ </values>
+ <values id="status">
+ <value displayed="">0</value>
+ <value displayed="Owned">1</value>
+ <value displayed="Ordered">2</value>
+ <value displayed="Sold">3</value>
+ <value displayed="ToSell">4</value>
+ <value displayed="Wanted">5</value>
+ </values>
+ <values id="cancellation_condition">
+ <value displayed="">0</value>
+ <value displayed="LightCancellation">1</value>
+ <value displayed="HeavyCancellation">2</value>
+ <value displayed="ModerateCancellation">3</value>
+ </values>
+ <values id="perforation_condition">
+ <value displayed="">0</value>
+ <value displayed="Perfect">1</value>
+ <value displayed="VeryNice">2</value>
+ <value displayed="Nice">3</value>
+ <value displayed="Average">4</value>
+ <value displayed="Incomplete">5</value>
+ </values>
+ <values id="gum_condition">
+ <value displayed="">0</value>
+ <value displayed="MintNeverHinged">1</value>
+ <value displayed="MintLightHinged">2</value>
+ <value displayed="HingedRemnant">3</value>
+ <value displayed="HeavilyHinged">4</value>
+ <value displayed="LargePartOriginalGum">5</value>
+ <value displayed="SmallPartOriginalGum">6</value>
+ <value displayed="NoGum">7</value>
+ </values>
+ </options>
+
+
+ <fields lending="false" tags="false">
+ <field displayed="Name"
+ group="General"
+ init="NewItem"
+ label="Name"
+ type="short text"
+ value="gcsfield1" />
+ <field displayed="Country"
+ group="General"
+ init=""
+ label="Country"
+ type="history text"
+ value="gcsfield2" />
+ <field displayas="text"
+ displayed="Year"
+ group="General"
+ init=""
+ label="Year"
+ max=""
+ min=""
+ step=""
+ type="number"
+ value="gcsfield42" />
+ <field displayed="Catalog"
+ group="General"
+ init=""
+ label="Catalog"
+ type="options"
+ value="gcsfield4"
+ values="Anfils, Austria Netto Katalog, Brusden-White, Catalogue of USSR postage stamps, CEI, Cérès, Compréhensive Colour Catalogue of Australian Stamps, Dallay, Domfil, Facit catalog, Fischer catalog, ISC catalog, Isfalia, Lipsia, Ma, Michel catalog, Minkus, Norgeskatalogen, Philex, Pofis catalogue, Pulko, Sakura, Sassone, Scott catalogue, Stanley Gibbons, Unificato, Yang, Yvert et Tellier, Zumstein" />
+ <field displayed="Number"
+ group="General"
+ init=""
+ label="Number"
+ type="short text"
+ value="gcsfield5" />
+ <field displayed="Topic"
+ group="General"
+ init=""
+ label="Topic"
+ type="short text"
+ value="gcsfield15" />
+ <field displayed="Serie"
+ group="General"
+ init=""
+ label="Serie"
+ type="short text"
+ value="gcsfield17" />
+ <field displayed="Designer"
+ group="General" init=""
+ label="Designer"
+ type="short text"
+ value="gcsfield20" />
+ <field displayed="Engraver"
+ group="General"
+ init=""
+ label="Engraver"
+ type="short text"
+ value="gcsfield21" />
+ <field displayed="Type"
+ group="General" init=""
+ label="Type"
+ type="options"
+ value="gcsfield6"
+ values="types" />
+ <field displayed="Format"
+ group="General"
+ init=""
+ label="Format"
+ type="options"
+ value="gcsfield7"
+ values="formats" />
+
+ <field displayed="Description"
+ group="General"
+ init=""
+ label="Description"
+ type="long text"
+ value="gcsfield8" />
+ <field displayed="Color"
+ group="Detail"
+ init=""
+ label="Color"
+ type="short text"
+ value="gcsfield11" />
+ <field displayed="Gum"
+ group="Detail"
+ init=""
+ label="Gum"
+ type="options"
+ value="gcsfield10"
+ values="gums" />
+ <field displayed="Paper"
+ group="Detail"
+ init=""
+ label="Paper"
+ type="options"
+ value="gcsfield12"
+ values="papers" />
+ <field displayed="Perforation"
+ group="Detail"
+ init=""
+ label="Perforation"
+ type="options"
+ value="gcsfield28"
+ values="perforations" />
+ <field displayed="PerforationSize"
+ group="Detail"
+ init=""
+ label="PerforationSize"
+ type="history text"
+ value="gcsfield29" />
+ <field displayed="CancellationType"
+ group="Detail"
+ init=""
+ label="CancellationType"
+ type="options"
+ value="gcsfield43"
+ values="cancellations" />
+ <field displayed="Issue"
+ group="Detail"
+ init=""
+ label="Issue"
+ type="short text"
+ value="gcsfield80" />
+
+ <field displayed="IssueDate"
+ group="Detail"
+ init=""
+ label="IssueDate"
+ type="date"
+ value="gcsfield81" />
+
+ <field displayed="PrintingVariety"
+ group="Detail"
+ init=""
+ label="PrintingVariety"
+ type="options"
+ value="gcsfield83"
+ values="printingvariety" />
+ <field displayed="EndOfIssue"
+ group="Detail"
+ init=""
+ label="EndOfIssue"
+ type="date"
+ value="gcsfield82" />
+ <field displayed="Comments"
+ group="Detail"
+ init=""
+ label="Comments"
+ type="long text"
+ value="gcsfield41" />
+ <field displayed="Grade"
+ group="Condition"
+ init=""
+ label="Grade"
+ type="options"
+ value="gcsfield23"
+ values="grades" />
+ <field displayed="Status"
+ group="Value"
+ init=""
+ label="Status"
+ type="options"
+ value="gcsfield16"
+ values="status" />
+ <field displayed="Adjusted"
+ group="Condition"
+ init=""
+ label="Adjusted"
+ type="yesno"
+ value="gcsfield22" />
+ <field displayed="Cancellation"
+ group="Condition"
+ init=""
+ label="Cancellation"
+ type="yesno"
+ value="gcsfield13" />
+ <field displayed="CancellationCondition"
+ group="Condition"
+ init=""
+ label="CancellationCondition"
+ type="options"
+ value="gcsfield27"
+ values="cancellation_condition" />
+ <field displayed="GumCondition"
+ group="Condition"
+ init=""
+ label="GumCondition"
+ type="options"
+ value="gcsfield25"
+ values="gum_condition" />
+ <field displayed="PerforationCondition"
+ group="Condition"
+ init=""
+ label="PerforationCondition"
+ type="options"
+ value="gcsfield14"
+ values="perforation_condition" />
+ <field displayed="ConditionNotes"
+ group="Condition"
+ init=""
+ label="ConditionNotes"
+ type="long text"
+ value="gcsfield49" />
+ <field displayed="Error"
+ group="Condition"
+ init=""
+ label="Error"
+ type="yesno"
+ value="gcsfield44" />
+ <field displayed="Error notes"
+ group="Condition"
+ init=""
+ label="ErrorNotes"
+ type="long text"
+ value="gcsfield45" />
+ <field displayed="FaceValue"
+ group="Value"
+ init="0 euros"
+ label="FaceValue"
+ type="short text"
+ value="gcsfield35" />
+ <field displayed="MintValue"
+ group="Value"
+ init="0 euros"
+ label="MintValue"
+ type="short text"
+ value="gcsfield36" />
+ <field displayed="UsedValue"
+ group="Value"
+ init="0 euros"
+ label="UsedValue"
+ type="short text"
+ value="gcsfield46" />
+ <field displayed="PurchasedDate"
+ group="Value"
+ init=""
+ label="PurchasedDate"
+ type="date"
+ value="gcsfield33" />
+ <field displayas="text"
+ displayed="Quantity"
+ group="Value"
+ init=""
+ label="Quantity"
+ max=""
+ min=""
+ step=""
+ type="number"
+ value="gcsfield34" />
+ <field displayed="History"
+ group="Notes"
+ init=""
+ label="History"
+ type="long text"
+ value="gcsfield31" />
+ <field displayed="Comments"
+ group="Notes"
+ init=""
+ label="Comments"
+ type="long text"
+ value="gcsfield32" />
+ <field default="view"
+ displayed="Picture1"
+ group="Views"
+ init=""
+ label="Picture1"
+ type="image"
+ value="gcsfield38" />
+ <field default="view"
+ displayed="Picture2"
+ group="Views"
+ init=""
+ label="Picture2"
+ type="image"
+ value="gcsfield39" />
+ <field default="view"
+ displayed="Picture3"
+ group="Views"
+ init=""
+ label="Picture3"
+ type="image"
+ value="gcsfield47" />
+ <field default="view"
+ displayed=""
+ group="General"
+ init=""
+ label=""
+ type="image"
+ value="gcsfield48" />
+ <field displayed=""
+ group=""
+ imported="false"
+ init=""
+ label=""
+ type="number"
+ value="gcsautoid" />
+ </fields>
+ <filters>
+ <group label="General">
+ <filter comparison="contain" field="gcsfield1" numeric="false" quick="false" />
+ <filter comparison="contain" field="gcsfield2" numeric="false" quick="false" />
+ <filter comparison="eq" field="gcsfield42" labelselect="=" numeric="true" quick="false" />
+ <filter comparison="contain" field="gcsfield15" numeric="false" quick="false" />
+ <filter comparison="contain" field="gcsfield20" numeric="false" quick="false" />
+ <filter comparison="contain" field="gcsfield21" numeric="false" quick="false" />
+ <filter comparison="contain" field="gcsfield6" numeric="false" quick="false" />
+ <filter comparison="contain" field="gcsfield7" numeric="false" quick="false" />
+ <filter comparison="contain" field="gcsfiled83" numeric="false" quick="false" />
+ </group>
+ <group label="Condition">
+ <filter comparison="contain" field="gcsfield13" numeric="false" quick="false" />
+ </group>
+ </filters>
+ <groups>
+ <group id="General" label="General" />
+ <group id="Detail" label="Detail" />
+ <group id="Condition" label="Condition" />
+ <group id="Value" label="Value" />
+ <group id="Notes" label="Notes" />
+ <group id="Views" label="Views" />
+ </groups>
+
+ <panels>
+ <panel editable="true" label="PanelForm" name="form">
+ <item type="line">
+ <item expand="true" for="gcsfield1" type="value" />
+ </item>
+ <item expand="true" type="notebook">
+ <item expand="true" title="General" type="tab" value="bla">
+ <item type="line">
+ <item for="gcsfield38" height="150" type="value" width="150" />
+ <item cols="2" type="frame">
+ <item col="0" for="gcsfield2" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" for="gcsfield2" row="0" type="value" />
+ <item col="0" for="gcsfield42" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" for="gcsfield42" row="1" type="value" />
+ <item col="0" for="gcsfield4" row="2" type="label" />
+ <item col="1" colspan="1" expand="true" for="gcsfield4" row="2" type="value" />
+ <item col="0" for="gcsfield5" row="3" type="label" />
+ <item col="1" colspan="1" expand="true" for="gcsfield5" row="3" type="value" />
+ </item>
+ </item>
+ <item cols="2" rows="6" type="table">
+ <item col="0" for="gcsfield15" row="0" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield15" row="0" type="value" />
+ <item col="2" for="gcsfield17" row="0" type="label" />
+ <item col="3" colspan="1" expand="default" for="gcsfield17" row="0" type="value" />
+ <item col="0" for="gcsfield20" row="1" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield20" row="1" type="value" />
+ <item col="0" for="gcsfield21" row="2" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield21" row="2" type="value" />
+ <item col="0" for="gcsfield6" row="3" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield6" row="3" type="value" />
+ <item col="0" for="gcsfield7" row="4" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield7" row="4" type="value" />
+ <item col="0" for="gcsfield8" row="5" type="label" />
+ <item col="1" colspan="3" expand="true" for="gcsfield8" row="5" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Detail" type="tab" value="bla">
+ <item cols="4" expand="true" rows="7" type="table">
+ <item col="0" for="gcsfield11" row="0" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield11" row="0" type="value" />
+ <item col="2" for="gcsfield83" row="0" type="label" />
+ <item col="3" colspan="1" expand="default" for="gcsfield83" row="0" type="value" />
+ <item col="0" for="gcsfield10" row="1" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield10" row="1" type="value" />
+ <item col="2" for="gcsfield81" row="1" type="label" />
+ <item col="3" colspan="1" expand="default" for="gcsfield81" row="1" type="value" />
+ <item col="0" for="gcsfield12" row="2" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield12" row="2" type="value" />
+ <item col="2" for="gcsfield82" row="2" type="label" />
+ <item col="3" colspan="1" expand="default" for="gcsfield82" row="2" type="value" />
+ <item col="0" for="gcsfield28" row="3" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield28" row="3" type="value" />
+ <item col="2" for="gcsfield80" row="3" type="label" />
+ <item col="3" colspan="1" expand="default" for="gcsfield80" row="3" type="value" />
+ <item col="0" for="gcsfield29" row="4" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield29" row="4" type="value" />
+ <item col="0" for="gcsfield43" row="5" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield43" row="5" type="value" />
+ <item col="0" for="gcsfield41" row="6" type="label" />
+ <item col="1" colspan="3" expand="true" for="gcsfield41" row="6" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Condition" type="tab" value="bla">
+ <item cols="4" expand="true" rows="9" type="table">
+ <item col="0" for="gcsfield23" row="0" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield23" row="0" type="value" />
+ <item col="0" colspan="2" expand="default" for="gcsfield22" row="1" type="value" />
+ <item col="0" colspan="2" expand="default" for="gcsfield13" row="2" type="value" />
+ <item col="0" for="gcsfield27" row="3" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield27" row="3" type="value" />
+ <item col="0" for="gcsfield25" row="4" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield25" row="4" type="value" />
+ <item col="0" for="gcsfield14" row="5" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield14" row="5" type="value" />
+ <item col="0" for="gcsfield49" row="6" type="label" />
+ <item col="1" colspan="3" expand="true" for="gcsfield49" row="6" type="value" />
+ <item col="0" colspan="2" expand="default" for="gcsfield44" row="7" type="value" />
+ <item col="0" for="gcsfield45" row="8" type="label" />
+ <item col="1" colspan="3" expand="true" for="gcsfield45" row="8" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Value" type="tab" value="bla">
+ <item cols="4" expand="true" rows="6" type="table">
+ <item col="0" for="gcsfield16" row="0" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield16" row="0" type="value" />
+ <item col="0" for="gcsfield35" row="1" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield35" row="1" type="value" />
+ <item col="0" for="gcsfield36" row="2" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield36" row="2" type="value" />
+ <item col="0" for="gcsfield46" row="3" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield46" row="3" type="value" />
+ <item col="0" for="gcsfield33" row="4" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield33" row="4" type="value" />
+ <item col="0" for="gcsfield34" row="5" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield34" row="5" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Notes" type="tab" value="bla">
+ <item cols="4" expand="true" rows="2" type="table">
+ <item col="0" for="gcsfield31" row="0" type="label" />
+ <item col="1" colspan="3" expand="true" for="gcsfield31" row="0" type="value" />
+ <item col="0" for="gcsfield32" row="1" type="label" />
+ <item col="1" colspan="3" expand="true" for="gcsfield32" row="1" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Views" type="tab" value="bla">
+ <item cols="4" expand="true" rows="2" type="table">
+ <item col="0" for="gcsfield39" row="0" type="label" />
+ <item col="1" colspan="3" expand="true" for="gcsfield39" row="0" type="value" />
+ <item col="0" for="gcsfield47" row="1" type="label" />
+ <item col="1" colspan="3" expand="true" for="gcsfield47" row="1" type="value" />
+ </item>
+ </item>
+ </item>
+ <item type="line">
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+ <panel editable="false" label="PanelReadOnly" name="readonly">
+ <item type="line">
+ <item col="0" colspan="3" expand="true" for="gcsfield1" row="0" style="header" type="value" />
+ </item>
+ <item type="line">
+ <item style="page" type="box" width="150">
+ <item for="gcsfield38" type="value" width="140" />
+ </item>
+ <item expand="true" type="box">
+ <item cols="2" expand="true" type="table">
+ <item col="0" for="gcsfield2" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield2" row="0" type="value" />
+ <item col="0" for="gcsfield42" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield42" row="1" type="value" />
+ <item col="0" for="gcsfield4" row="2" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield4" row="2" type="value" />
+ <item col="0" for="gcsfield5" row="3" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield5" row="3" type="value" />
+ </item>
+ </item>
+ </item>
+ <item cols="2" expand="true" rows="6" type="table">
+ <item col="0" for="gcsfield15" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield15" row="0" type="value" />
+ <item col="0" for="gcsfield20" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield20" row="1" type="value" />
+ <item col="0" for="gcsfield21" row="2" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield21" row="2" type="value" />
+ <item col="0" for="gcsfield6" row="3" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield6" row="3" type="value" />
+ <item col="0" for="gcsfield7" row="4" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield7" row="4" type="value" />
+ <item col="0" for="gcsfield8" row="5" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield8" row="5" type="value" />
+ </item>
+ <item title="Detail" type="expander">
+ <item cols="2" expand="true" rows="7" type="table">
+ <item col="0" for="gcsfield11" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield11" row="0" type="value" />
+ <item col="0" for="gcsfield10" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield10" row="1" type="value" />
+ <item col="0" for="gcsfield12" row="2" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield12" row="2" type="value" />
+ <item col="0" for="gcsfield28" row="3" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield28" row="3" type="value" />
+ <item col="0" for="gcsfield29" row="4" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield29" row="4" type="value" />
+ <item col="0" for="gcsfield43" row="5" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield43" row="5" type="value" />
+ <item col="0" for="gcsfield41" row="6" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield41" row="6" type="value" />
+ </item>
+ </item>
+ <item title="Condition" type="expander">
+ <item cols="2" expand="true" rows="9" type="table">
+ <item col="0" for="gcsfield23" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield23" row="0" type="value" />
+ <item col="0" for="gcsfield22" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield22" row="1" type="value" />
+ <item col="0" for="gcsfield13" row="2" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield13" row="2" type="value" />
+ <item col="0" for="gcsfield27" row="3" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield27" row="3" type="value" />
+ <item col="0" for="gcsfield25" row="4" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield25" row="4" type="value" />
+ <item col="0" for="gcsfield14" row="5" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield14" row="5" type="value" />
+ <item col="0" for="gcsfield49" row="6" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield49" row="6" type="value" />
+ <item col="0" for="gcsfield44" row="7" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield44" row="7" type="value" />
+ <item col="0" for="gcsfield45" row="8" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield45" row="8" type="value" />
+ </item>
+ </item>
+ <item title="Value" type="expander">
+ <item cols="2" expand="true" rows="6" type="table">
+ <item col="0" for="gcsfield16" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield16" row="0" type="value" />
+ <item col="0" for="gcsfield35" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield35" row="1" type="value" />
+ <item col="0" for="gcsfield36" row="2" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield36" row="2" type="value" />
+ <item col="0" for="gcsfield46" row="3" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield46" row="3" type="value" />
+ <item col="0" for="gcsfield33" row="4" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield33" row="4" type="value" />
+ <item col="0" for="gcsfield34" row="5" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield34" row="5" type="value" />
+ </item>
+ </item>
+ <item title="Notes" type="expander">
+ <item cols="2" expand="true" rows="2" type="table">
+ <item col="0" for="gcsfield31" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield31" row="0" type="value" />
+ <item col="0" for="gcsfield32" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield32" row="1" type="value" />
+ </item>
+ </item>
+ <item title="Views" type="expander">
+ <item cols="2" expand="true" rows="2" type="table">
+ <item col="0" for="gcsfield39" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield39" row="0" type="value" />
+ <item col="0" for="gcsfield47" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield47" row="1" type="value" />
+ </item>
+ </item>
+ </panel>
+ </panels>
+ <random></random>
+</collection>
diff --git a/lib/gcstar/GCModels/GCwines.gcm b/lib/gcstar/GCModels/GCwines.gcm
new file mode 100644
index 0000000..30f433f
--- /dev/null
+++ b/lib/gcstar/GCModels/GCwines.gcm
@@ -0,0 +1,356 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2007 Yves Martin -->
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCwines">
+ <lang>GCwines</lang>
+
+ <options>
+ <defaults>
+ <image>no.png</image>
+ </defaults>
+
+ <fields>
+ <id>id</id>
+ <title>name</title>
+ <cover>bottlelabel</cover>
+ <url>website</url>
+ <results></results>
+ <summary>
+ <field>vineyard</field>
+ <field>vintage</field>
+ <field>type</field>
+ <field>tags</field>
+ </summary>
+ </fields>
+
+ <values id="tasted">
+ <value displayed="TastedNo">0</value>
+ <value displayed="TastedYes">1</value>
+ </values>
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+
+ </options>
+
+ <groups>
+ <group id="Main" label="General" />
+ <group id="Details" label="Details" />
+ <group id="Tasting" label="Tasting" />
+ </groups>
+
+ <random>
+ <filter field="quantity" comparison="gt" numeric="true" value="0"/>
+ </random>
+
+ <fields lending="false" tags="true">
+ <field value="id"
+ type="number"
+ imported="false"
+ init=""
+ group=""
+ label=""/>
+ <field value="name"
+ type="formatted"
+ init="%designation% %vineyard% %vintage%"
+ group="Main"
+ label="Name"/>
+ <field value="designation"
+ type="history text"
+ init="NewItem"
+ group="Main"
+ label="Designation"/>
+ <field value="vineyard"
+ type="history text"
+ init=""
+ group="Main"
+ label="Vineyard"/>
+ <field value="vintage"
+ type="number"
+ init=""
+ group="Main"
+ label="Vintage"/>
+ <field value="type"
+ type="history text"
+ init=""
+ group="Main"
+ label="Type"/>
+ <field value="grapes"
+ type="single list"
+ history="true"
+ group="Main"
+ label="Grapes"/>
+ <field value="soil"
+ type="history text"
+ group="Main"
+ label="Soil"/>
+ <field value="producer"
+ type="history text"
+ group="Main"
+ label="Producer"/>
+ <field value="country"
+ type="history text"
+ group="Main"
+ label="Country"/>
+ <field value="volume"
+ type="number"
+ init="750"
+ group="Main"
+ label="Volume"/>
+ <field value="alcohol"
+ type="number"
+ group="Main"
+ label="Alcohol"/>
+ <field value="medal"
+ type="short text"
+ group="Main"
+ label="Distinction"/>
+
+ <field value="location"
+ type="history text"
+ init=""
+ group="Details"
+ label="Location"/>
+ <field value="shelfindex"
+ type="short text"
+ displayed="Position"
+ group="Details"
+ label="ShelfIndex"/>
+ <field value="quantity"
+ type="number"
+ init="0"
+ group="Details"
+ label="Quantity"/>
+ <field value="purchasedate"
+ type="date"
+ group="Details"
+ label="PurchaseDate"/>
+ <field value="purchaseprice"
+ type="number"
+ group="Details"
+ label="PurchasePrice"/>
+ <field value="gift"
+ type="short text"
+ group="Details"
+ label="Gift"/>
+ <field value="bottlelabel"
+ group="Details"
+ label="BottleLabel"
+ type="image"
+ default="view"/>
+ <field value="website"
+ group="Details"
+ label="Website"
+ type="url" />
+ <field value="tasted"
+ type="yesno"
+ group="Tasting"
+ label="Tasted"/>
+ <field value="rating"
+ group="Tasting"
+ label="PanelRating"
+ max="10"
+ init="0"
+ type="number"
+ displayas="graphical"/>
+ <field value="comments"
+ type="long text"
+ group="Tasting"
+ label="Comments"/>
+ <field value="serving"
+ type="long text"
+ group="Tasting"
+ label="Serving"/>
+ <field value="tasting"
+ type="long text"
+ group="Tasting"
+ label="TastingField"/>
+ </fields>
+
+ <filters>
+ <group label="Main">
+ <filter field="vintage" comparison="range" labelselect="FilterRange" numeric="true" quick="true" />
+ <filter field="type" comparison="contain" numeric="false" quick="true" />
+ <filter field="grapes" comparison="contain" numeric="false" quick="true" />
+ </group>
+ <group label="Details">
+ <filter field="purchasedate" comparison="ge" labelselect="&gt;=" numeric="false" quick="false" />
+ <filter field="quantity" comparison="ge" labelselect="&gt;=" numeric="true" quick="true" />
+ <filter field="gift" comparison="contain" numeric="true" quick="false" />
+ <filter field="bottlelabel" comparison="contain" numeric="true" quick="false" />
+ <filter field="website" comparison="contain" numeric="true" quick="false" />
+ </group>
+ <group label="Tasting">
+ <filter field="comments" comparison="contain" numeric="true" quick="false" />
+ <filter field="tasted" comparison="eq" values="both" labeloff="FilterTastedNo" labelon="FilterTastedYes" quick="true" />
+ <filter field="rating" comparison="ge" labelselect="FilterRatingSelect" numeric="true" quick="true" />
+ </group>
+ </filters>
+
+ <panels>
+ <panel editable="true" label="PanelForm" name="form">
+ <item type="line">
+ <item expand="true" for="name" type="value" />
+ </item>
+ <item expand="true" type="notebook">
+ <item expand="true" title="General" type="tab" value="main">
+ <item type="table" cols="4" expand="true" rows="9">
+ <item col="0" row="0" for="designation" type="label" />
+ <item col="1" row="0" colspan="3" for="designation" type="value" />
+ <item col="0" for="vineyard" row="1" type="label" />
+ <item col="1" for="vineyard" row="1" type="value" colspan="3" />
+ <item col="0" row="2" for="vintage" type="label"/>
+ <item col="1" row="2" for="vintage" type="value" width="4"/>
+ <item col="2" for="type" row="2" type="label" />
+ <item col="3" for="type" row="2" type="value" />
+ <item col="0" for="volume" row="3" type="label" />
+ <item col="1" for="volume" row="3" type="value" />
+ <item col="2" for="alcohol" row="3" type="label" />
+ <item col="3" for="alcohol" row="3" type="value" />
+ <item expand="true" type="expander" title="Grapes" collapsed="%grapes%" row="4" col="0" colspan="4">
+ <item type="value" for="grapes"/>
+ </item>
+ <item col="0" for="soil" row="5" type="label" />
+ <item col="1" for="soil" row="5" type="value" colspan="3" />
+ <item col="0" for="country" row="6" type="label" />
+ <item col="1" for="country" row="6" type="value" colspan="3" />
+ <item col="0" for="producer" row="7" type="label" />
+ <item col="1" for="producer" row="7" type="value" colspan="3" />
+ <item col="0" for="medal" row="8" type="label" />
+ <item col="1" for="medal" row="8" type="value" colspan="3" />
+ </item>
+ </item>
+ <item expand="true" title="Details" type="tab" value="details">
+ <item type="box">
+ <item type="table" cols="4" expand="true" rows="4">
+ <item col="0" for="location" row="0" type="label" />
+ <item col="1" for="location" row="0" type="value" />
+ <item col="2" for="shelfindex" row="0" type="label" />
+ <item col="3" for="shelfindex" row="0" type="value" />
+ <item col="0" for="quantity" row="1" type="label" />
+ <item col="1" for="quantity" row="1" type="value" />
+ <item col="0" for="purchasedate" row="2" type="label" />
+ <item col="1" for="purchasedate" row="2" type="value" />
+ <item col="2" for="purchaseprice" row="2" type="label" />
+ <item col="3" for="purchaseprice" row="2" type="value" />
+ <item col="0" for="gift" row="3" type="label" />
+ <item col="1" for="gift" row="3" type="value" />
+ </item>
+ <item type="box">
+ <item for="bottlelabel" type="label" expand="horizontal" align="center" />
+ <item for="bottlelabel" height="200" type="value" expand="horizontal" align="center" />
+ </item>
+ <item type="line" expand="true">
+ <item for="website" type="label" />
+ <item for="website" type="value" />
+ </item>
+ </item>
+ </item>
+ <item type="tab" expand="true" title="Tasting" value="tasting">
+ <item type="table" cols="3" expand="true" rows="4">
+ <item col="0" for="tasted" row="0" type="value" />
+ <item col="1" for="rating" row="0" type="label" />
+ <item col="2" for="rating" row="0" type="value" />
+ <item col="0" for="comments" row="1" type="label" />
+ <item col="1" colspan="2" expand="true" for="comments" row="1" type="value" />
+ <item col="0" for="serving" row="2" type="label" />
+ <item col="1" colspan="2" expand="true" for="serving" row="2" type="value" />
+ <item col="0" for="tasting" row="3" type="label" />
+ <item col="1" colspan="2" expand="true" for="tasting" row="3" type="value" />
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+
+ <panel editable="false" label="PanelReadOnly" name="readonly">
+ <item type="line">
+ <item expand="true" for="name" type="value" style="header" />
+ </item>
+ <item type="table" cols="4" expand="true" rows="9" >
+ <item col="0" row="0" for="designation" type="label" />
+ <item col="1" row="0" colspan="3" for="designation" type="value" />
+ <item col="0" for="vineyard" row="1" type="label" />
+ <item col="1" for="vineyard" row="1" type="value" colspan="3" />
+ <item col="0" row="2" for="vintage" type="label"/>
+ <item col="1" row="2" for="vintage" type="value"/>
+ <item col="2" for="type" row="2" type="label" />
+ <item col="3" for="type" row="2" type="value" />
+ <item col="0" for="volume" row="3" type="label" />
+ <item col="1" for="volume" row="3" type="value" />
+ <item col="2" for="alcohol" row="3" type="label" />
+ <item col="3" for="alcohol" row="3" type="value" />
+ <item col="0" for="grapes" type="value" expand="true" row="4" colspan="4" />
+ <item col="0" for="soil" row="5" type="label" />
+ <item col="1" for="soil" row="5" type="value" colspan="3" />
+ <item col="0" for="country" row="6" type="label" />
+ <item col="1" for="country" row="6" type="value" colspan="3" />
+ <item col="0" for="producer" row="7" type="label" />
+ <item col="1" for="producer" row="7" type="value" colspan="3" />
+ <item col="0" for="medal" row="8" type="label" />
+ <item col="1" for="medal" row="8" type="value" colspan="3" />
+ </item>
+ <item expand="true" title="Details" type="expander" value="quantity">
+ <item type="box">
+ <item type="expander" title="Storage" expand="true" collapsed="%location% - %shelfindex% (%quantity%)">
+ <item type="table" cols="4" expand="true" rows="2">
+ <item col="0" for="location" row="0" type="label" />
+ <item col="1" for="location" row="0" type="value" />
+ <item col="2" for="shelfindex" row="0" type="label" />
+ <item col="3" for="shelfindex" row="0" type="value" />
+ <item col="0" for="quantity" row="1" type="label" />
+ <item col="1" for="quantity" row="1" type="value" />
+ </item>
+ </item>
+ <item type="expander" title="Acquisition" expand="true" collapsed="%purchasedate% (%purchaseprice%)">
+ <item type="table" cols="4" expand="true" rows="1">
+ <item col="0" for="purchasedate" row="0" type="label" />
+ <item col="1" for="purchasedate" row="0" type="value" />
+ <item col="2" for="purchaseprice" row="0" type="label" />
+ <item col="3" for="purchaseprice" row="0" type="value" />
+ </item>
+ </item>
+ <item type="line" expand="true">
+ <item for="gift" type="label" />
+ <item for="gift" type="value" />
+ </item>
+ <item type="box">
+ <item for="bottlelabel" type="label" expand="horizontal" align="center" />
+ <item for="bottlelabel" height="200" type="value" expand="horizontal" align="center" />
+ </item>
+ <item type="line" expand="true">
+ <item for="website" type="label" />
+ <item for="website" type="value" />
+ </item>
+ </item>
+ </item>
+ <item expand="true" title="Tasting" type="expander" value="tasting">
+ <item type="table" cols="3" expand="true" rows="4">
+ <item col="0" for="tasted" row="0" type="value" />
+ <item col="1" for="rating" row="0" type="label" />
+ <item col="2" for="rating" row="0" type="value" />
+ <item col="0" for="comments" row="1" type="label" />
+ <item col="1" colspan="2" expand="true" for="comments" row="1" type="value" />
+ <item col="0" for="serving" row="2" type="label" />
+ <item col="1" colspan="2" expand="true" for="serving" row="2" type="value" />
+ <item col="0" for="tasting" row="3" type="label" />
+ <item col="1" colspan="2" expand="true" for="tasting" row="3" type="value" />
+ </item>
+ </item>
+ <item type="expander" title="PanelTags">
+ <item expand="true" for="tags" type="value" />
+ <item type="value" for="favourite" values="favouriteYesno" collapse="true"/>
+ </item>
+ </panel>
+ </panels>
+</collection>
diff --git a/lib/gcstar/GCOptions.pm b/lib/gcstar/GCOptions.pm
new file mode 100644
index 0000000..053b635
--- /dev/null
+++ b/lib/gcstar/GCOptions.pm
@@ -0,0 +1,1670 @@
+package GCOptions;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use Gtk2;
+
+our $DEFAULT_IMG_DIR='./.%FILE_BASE%_pictures/';
+
+{
+ package GCOptionLoader;
+
+ my $DEFAULT_LANG='EN';
+ #my $DEFAULT_IMG_DIR=$ENV{GCS_DATA_HOME}.'/images/';
+
+ use XML::Simple;
+ use IO::File;
+ use POSIX (':errno_h');
+ use GCLang;
+
+ sub new
+ {
+ # fallbackOptions has been added in 1.7.0. Previous versions stored some collection
+ # specific settings at global level. This has been moved to collection level, but to
+ # let users keep their previous settings, it will try to find it at global level if not found
+ # at collection level.
+
+ my ($proto, $file, $main, $fallbackOptions) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {created => 0, fallbackOptions => $fallbackOptions};
+
+ #GCLang::loadLangs;
+
+ bless ($self, $class);
+ $self->load($file, $main) if $file;
+ return $self;
+ }
+
+ sub newFromXmlString
+ {
+ my ($proto, $string) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {created => 0};
+ bless ($self, $class);
+ if ($string)
+ {
+ my $xs = XML::Simple->new;
+ $self->{options} = $xs->XMLin($string,
+ SuppressEmpty => 1);
+ }
+ return $self;
+ }
+
+ sub toXmlString
+ {
+ my $self = shift;
+
+ my $result = '<collectionInlinePreferences>
+';
+ while (my ($key,$value) = each(%{$self->{options}}))
+ {
+ $result .= " <$key>".GCUtils::encodeEntities($value)."</$key>\n";
+ }
+ $result .= '</collectionInlinePreferences>';
+ return $result;
+ }
+
+ sub error
+ {
+ my ($self, $type, $errmsg) = @_;
+ if ($self->{parent})
+ {
+ $self->{parent}->optionsError($type, $errmsg);
+ }
+ else
+ {
+ print "Error performing $type for ".$self->{file}.": $errmsg\n";
+ }
+ }
+
+ sub setParent
+ {
+ my ($self, $parent) = @_;
+ $self->{parent} = $parent;
+ }
+
+
+ sub load
+ {
+ my ( $self, $file, $main ) = @_;
+
+ my %defaults;
+ if ( $main )
+ {
+ my $lang = $ENV{LANG};
+ if ($lang)
+ {
+ $lang =~ s/(..)_?.*/\U$1\E/;
+ }
+ else
+ {
+ $lang = $DEFAULT_LANG;
+ }; # if
+
+ %defaults = (
+ images => $GCOptions::DEFAULT_IMG_DIR,
+ autosave => 1,
+ noautoload => 0,
+ programs => "system",
+ browser => "firefox",
+ player => "mplayer",
+ audio => "xmms",
+ imageEditor => "gimp",
+ file => "",
+ split => 300,
+ width => 920,
+ height => 640,
+ confirm => 1,
+ lang => $lang,
+ status => 1,
+ splash => 1,
+ tearoffMenus => 0,
+ toolbar => 3,
+ toolbarPosition => 0,
+ transform => 1,
+ articles => "le,la,les,l,un,une,des,a,the,der,die,das,ein,eine,el,los,una",
+ askImport => 0,
+ searchStop => 1,
+ alwaysOriginal => 0,
+ proxy => "",
+ cookieJar => "",
+ borrowers => "",
+ emails => "",
+ view => 0,
+ columns => 3,
+ resizeImgList => 1,
+ animateImgList => 1,
+ listBgPicture => 1,
+ useOverlays => 1,
+ mailer => "Sendmail",
+ from => "",
+ subject => "GCstar email",
+ smtp => "",
+ template => "Hello %1,<br/><br/>You have borrowed my %2 since %3. I\'d like to get it back shortly.",
+ history => "none|none|none|none|none",
+ historysize => "5",
+ useRelativePaths => 1,
+ useTitleForPics => 1,
+ expandersMode => 'cut',
+ dateFormat => '%d/%m/%Y',
+ spellCheck => 1,
+ cdDevice => '/dev/cd',
+ useStars => 1,
+ bigPics => 0,
+ listPaneSplit => 10000, # Big value to make sure it's hidden by default
+ displayMenuBar => 1
+ );
+ }; # if
+
+ $self->{file} = $file;
+ $self->{options} = \%defaults; # Use default values for now.
+ my $handle = IO::File->new($file, "<:utf8");
+ if (defined( $handle))
+ {
+ # File opened succesfully, read it.
+ my $options = \%defaults;
+ while (my $line = $handle->getline())
+ {
+ # Remove last character if white space
+ # This includes carriage return and fix an issue when using DOS-encoded file on Unix system
+ $line =~ s/\s$//;
+ if ($line =~ m{^(.*?)=(.*)$})
+ {
+ $options->{$1} = $2;
+ }
+ else
+ {
+ # TODO: Report an error in config file.
+ } # if
+ } # while
+ # Close file, check errors.
+ my $rc = $handle->close();
+ if ($rc)
+ {
+ # File was read successfully, update options.
+ $self->{options} = $options;
+ }
+ else
+ {
+ # File was not read, do not change default values and report error.
+ $self->error( 'read', $! );
+ } #if
+ }
+ else
+ {
+ # File is not opened. Check the reason.
+ if ($! == ENOENT)
+ {
+ # File does not exist -- not a problem, just continue with defaults.
+ $self->{options} = \%defaults;
+ }
+ else
+ {
+ # It is a real error, report it.
+ # ???: Why report goes to stdout?
+ # TODO: Open a error window.
+ $self->error('read', $!);
+ } # if
+ } # if
+
+ if (!GCLang::loadLangs($self->lang) && $main)
+ {
+ $self->lang($DEFAULT_LANG);
+ GCLang::loadLangs($self->lang);
+ }
+ }
+
+ sub getFullLang
+ {
+ my $self = shift;
+ (my $lang = $self->lang) =~ s/(.*)/\L$1\E_$1/;
+ $lang =~ s/_EN/_US/; # Fix for english
+ $lang =~ s/_CS/_CZ/; # Fix for Czech
+ $lang =~ s/_cn_ZH//; # Fix for Simplified Chinese
+ $lang =~ s/_ZH/_TW/; # Fix for Traditional Chinese
+ $lang .= '.UTF-8';
+ $lang = 'sr@Latn' if $lang =~ /^sr/; # Fix for serbian
+ return $lang;
+ }
+
+ sub save
+ {
+ my $self = shift;
+ return if !$self->{file};
+ my $handle = IO::File->new($self->{file}, ">:utf8");
+ if (defined($handle))
+ {
+ while ( my ( $key, $value ) = each( %{ $self->{options} } ) )
+ {
+ if ($key)
+ {
+ $handle->print( "$key=$value\n" );
+ } # if
+ } # while
+ $handle->close() or $self->error('save', $!);
+ }
+ else
+ {
+ $self->error( 'save', $! );
+ }; # if
+ }
+
+ sub exists
+ {
+ my ($self, $name) = @_;
+
+ return exists $self->{options}->{$name};
+ }
+
+ sub AUTOLOAD
+ {
+ my $self = shift;
+ my $name = our $AUTOLOAD;
+ return if $name =~ /::DESTROY$/;
+ my @comp = split('::', $name);
+ $name = $comp[-1];
+ if (@_)
+ {
+ $self->{options}->{$name} = shift;
+ }
+ else
+ {
+ if (!exists $self->{options}->{$name} && $self->{fallbackOptions})
+ {
+ $self->{options}->{$name} = $self->{fallbackOptions}->$name;
+ }
+ return $self->{options}->{$name};
+ }
+ }
+
+ sub checkPreviousGCfilms
+ {
+ my ($self, $parent) = @_;
+
+ $self->{modelsFactory} = $parent->{modelsFactory};
+ my $gcfilmsconf = $ENV{XDG_CONFIG_HOME}.'/gcfilms/gcfilms.conf';
+
+ if ( -e $gcfilmsconf)
+ {
+ my $dialog = Gtk2::MessageDialog->new($parent,
+ [qw/modal destroy-with-parent/],
+ 'question',
+ 'ok-cancel',
+ $parent->{lang}->{GCfilmsImportQuestion});
+
+ my $withOptionsCb = new Gtk2::CheckButton($parent->{lang}->{GCfilmsImportOptions});
+ my $withDataCb = new Gtk2::CheckButton($parent->{lang}->{GCfilmsImportData});
+ $dialog->vbox->pack_start($withOptionsCb, 0, 0, 0);
+ $dialog->vbox->pack_start($withDataCb, 0, 0, 0);
+ $dialog->vbox->show_all;
+ #$parent->{splash}->hide if $parent->{splash};
+ my $response = $dialog->run;
+ my $withOptions = $withOptionsCb->get_active;
+ my $withData = $withDataCb->get_active;
+ $dialog->destroy;
+ return if $response ne 'ok';
+ my $gcfilmsOptions = GCOptionLoader->new($gcfilmsconf, 0);
+ $self->importGCfilmsOptions($gcfilmsOptions) if $withOptions;
+ $self->importGCfilmsData($gcfilmsOptions) if $withData;
+ }
+ }
+
+ sub importGCfilmsOptions
+ {
+ my ($self, $options) = @_;
+
+ my @commonOptions = (
+ 'listImgSize',
+ 'historysize',
+ 'browser',
+ 'listBgColor',
+ 'listFgColor',
+ 'searchStop',
+ 'groupItems',
+ 'view',
+ 'split',
+ 'autosave',
+ 'articles',
+ 'lang',
+ 'template',
+ 'askImport',
+ 'subject',
+ 'toolbar',
+ 'listImgSkin',
+ 'columns',
+ 'proxy',
+ 'width',
+ 'mailer',
+ 'smtp',
+ 'status',
+ 'borrowers',
+ 'confirm',
+ 'itemWindowHeight',
+ 'from',
+ 'useRelativePaths',
+ 'toolbarPosition',
+ 'transform',
+ 'itemWindowWidth',
+ 'player',
+ 'height',
+ 'listBgPicture',
+ 'emails',
+ 'splash'
+ );
+
+ my @specificOptions = (
+ 'sortOrder',
+ 'details',
+ 'sortField',
+ 'plugin',
+ 'multisite',
+ );
+
+ foreach (@commonOptions)
+ {
+ (my $gcfilmsOption = $_) =~ s/item/movie/;
+ my $value = $options->$gcfilmsOption;
+ $value =~ s|<br>|<br/>|gm;
+ $self->$_($value);
+ }
+ my $newOptions = $self->{modelsFactory}->getModel('GCfilms')->{preferences};
+ foreach (@specificOptions)
+ {
+ $newOptions->$_($options->$_);
+ }
+
+ # Special processing for order -> layout
+ my $layout = 'form';
+ my $order = $options->order;
+ $layout = 'compact' if ($order == 1) || ($order == 2);
+ $layout = 'readonly' if ($order == 3) || ($order == 4);
+ $newOptions->layout($layout);
+
+ $newOptions->save;
+ }
+
+ sub importGCfilmsData
+ {
+ my ($self, $options) = @_;
+ $self->{parent}->importWithDetect($options->file, 1);
+ $self->{options}->{file} = $ENV{GCS_DATA_HOME}.'/films.gcs';
+ $self->{parent}->{items}->save($self->{parent});
+ #$self->{parent}->setFileName($self->{options}->{file});
+ $self->{parent}->refreshTitle;
+ }
+}
+
+{
+ package GCOptionsDialog;
+
+ use Glib::Object::Subclass
+ Gtk2::Dialog::
+ ;
+
+ @GCOptionsDialog::ISA = ('GCModalDialog');
+
+ use GCPlugins;
+
+ use GCLang;
+ use GCStyle;
+ use GCMail;
+
+ sub on_destroy
+ {
+ my ($widget, $self) = @_;
+ return 1;
+ }
+
+ sub initValues
+ {
+ my $self = shift;
+
+ $self->{viewChanged} = 0;
+ $self->{viewOptionsChanged} = 0;
+ $self->{expert}->set_active($self->{options}->expert);
+
+ if ($self->{options}->programs eq 'system')
+ {
+ $self->{systemPrograms}->set_active(1);
+ }
+ else
+ {
+ $self->{userPrograms}->set_active(1);
+ }
+ $self->{defineProgramsButton}->lock($self->{systemPrograms}->get_active);
+ $self->{browser} = $self->{options}->browser;
+ $self->{player} = $self->{options}->player;
+ $self->{audio} = $self->{options}->audio;
+ $self->{imageEditor} = $self->{options}->imageEditor;
+
+ $self->{cdDevice}->setValue($self->{options}->cdDevice);
+ $self->{images}->setValue($self->{options}->images);
+ $self->{confirm}->set_active($self->{options}->confirm);
+ $self->{autosave}->set_active($self->{options}->autosave);
+ $self->{autoload}->set_active(! $self->{options}->noautoload);
+ $self->{splash}->set_active($self->{options}->splash);
+ $self->{tearoffMenus}->set_active($self->{options}->tearoffMenus);
+ $self->{options}->spellCheck(1) if ! $self->{options}->exists('spellCheck');
+ $self->{spellCheck}->set_active($self->{options}->spellCheck)
+ if $self->{spellCheck};
+ $self->{useRelativePaths}->set_active($self->{options}->useRelativePaths);
+ $self->{useStars}->set_active($self->{options}->useStars);
+ $self->{proxycb}->set_active($self->{options}->proxy);
+ $self->{proxyurl}->set_text($self->{options}->proxy);
+ $self->{cookieJarcb}->set_active($self->{options}->cookieJar);
+ $self->{cookieJarPath}->setValue($self->{options}->cookieJar);
+ $self->{transform}->set_active($self->{options}->transform);
+ $self->{articles}->set_text($self->{options}->articles);
+
+ if ($self->{options}->useTitleForPics)
+ {
+ $self->{picturesNameTitle}->set_active(1);
+ }
+ else
+ {
+ $self->{picturesNameAuto}->set_active(1);
+ }
+
+ $self->{options}->columns(3) if ! $self->{options}->exists('columns');
+ $self->{columns} = $self->{options}->columns;
+
+ $self->{options}->resizeImgList(0) if ! $self->{options}->exists('resizeImgList');
+ $self->{resizeImgList} = $self->{options}->resizeImgList;
+
+ $self->{options}->animateImgList(1) if ! $self->{options}->exists('animateImgList');
+ $self->{animateImgList} = $self->{options}->animateImgList;
+
+ $self->{options}->toolbar(3) if ! $self->{options}->exists('toolbar');
+ $self->{toolbarOption}->setValue($self->{options}->toolbar);
+
+ $self->{options}->toolbarPosition(0) if ! $self->{options}->exists('toolbarPosition');
+ $self->{toolbarPositionOption}->setValue($self->{options}->toolbarPosition);
+
+ $self->{options}->expandersMode('cut') if ! $self->{options}->exists('expandersMode');
+ $self->{expandersMode}->setValue($self->{options}->expandersMode);
+
+ $self->{dateFormat}->setValue($self->{options}->dateFormat)
+ if $self->{dateFormat};
+
+ $self->{options}->view(0) if ! $self->{options}->exists('view');
+ $self->{viewOption}->setValue($self->{options}->view);
+
+ $self->{model}->{preferences}->plugin('ask')
+ if ! $self->{model}->{preferences}->exists('plugin');
+ $self->{pluginOption}->setValue($self->{model}->{preferences}->plugin);
+
+ $self->{askImport}->set_active($self->{options}->askImport);
+ $self->{searchStop}->set_active($self->{options}->searchStop);
+ $self->{bigPics}->set_active($self->{options}->bigPics);
+
+ $self->{langOption}->setValue($self->{options}->lang);
+ $self->{styleOption}->setValue($self->{options}->style);
+
+ $self->{layoutOption}->setValue($self->{model}->{preferences}->layout);
+ $self->{panelStyleOption}->setValue($self->{options}->panelStyle);
+
+ $self->{options}->mailer('Sendmail') if ! $self->{options}->exists('mailer');
+ $self->{mailerOption}->setValue($self->{options}->mailer);
+
+ $self->{from}->set_text($self->{options}->from);
+
+ # Picture size for image mode
+ $self->{options}->listImgSize(2) if ! $self->{options}->exists('listImgSize');
+ $self->{listImgSize} = $self->{options}->listImgSize;
+ $self->{options}->listImgSkin($GCStyle::defaultList) if ! $self->{options}->exists('listImgSkin');
+ $self->{listImgSkin} = $self->{options}->listImgSkin;
+ $self->{options}->listBgColor('65535,65535,65535') if ! $self->{options}->exists('listBgColor');
+ $self->{options}->listFgColor('0,0,0') if ! $self->{options}->exists('listFgColor');
+ $self->{mlbg} = $self->{options}->listBgColor;
+ $self->{mlfg} = $self->{options}->listFgColor;
+ $self->{useOverlays} = $self->{options}->useOverlays;
+ $self->{listBgPicture} = $self->{options}->listBgPicture;
+
+ $self->{proxyurl}->set_editable(0) if ! $self->{proxycb}->get_active;
+ $self->{proxyurl}->set_editable(1) if $self->{proxycb}->get_active;
+ $self->{cookieJarPath}->lock(1) if ! $self->{cookieJarcb}->get_active;
+ $self->{cookieJarPath}->lock(0) if $self->{cookieJarcb}->get_active;
+
+ $self->{historysize}->set_value($self->{options}->historysize);
+
+ # Picture size for detailed mode
+ $self->{options}->detailImgSize($self->{options}->listImgSize)
+ if ! $self->{options}->exists('detailImgSize');
+
+ $self->{model}->{preferences}->details($self->{model}->{commonFields}->{title})
+ if ! $self->{model}->{preferences}->exists('details');
+ $self->{details} = $self->{model}->{preferences}->details;
+
+ $self->{detailImgSize} = $self->{options}->detailImgSize;
+ $self->{groupBy} = $self->{model}->{preferences}->groupBy;
+ $self->{secondarySort} = $self->{model}->{preferences}->secondarySort;
+ $self->{groupedFirst} = $self->{model}->{preferences}->groupedFirst;
+ $self->{addCount} = $self->{model}->{preferences}->addCount;
+ }
+
+ sub saveValues
+ {
+ my $self = shift;
+
+ $self->{options}->expert(($self->{expert}->get_active) ? 1 : 0);
+
+ $self->{options}->programs(($self->{systemPrograms}->get_active) ? 'system' : 'user');
+ $self->{options}->browser($self->{browser});
+ $self->{options}->player($self->{player});
+ $self->{options}->audio($self->{audio});
+ $self->{options}->imageEditor($self->{imageEditor});
+
+ $self->{options}->cdDevice($self->{cdDevice}->getValue);
+ $self->{options}->images($self->{images}->getValue);
+ $self->{options}->confirm(($self->{confirm}->get_active) ? 1 : 0);
+ $self->{options}->autosave(($self->{autosave}->get_active) ? 1 : 0);
+ $self->{options}->noautoload(($self->{autoload}->get_active) ? 0 : 1);
+ $self->{options}->splash(($self->{splash}->get_active) ? 1 : 0);
+ $self->{options}->tearoffMenus(($self->{tearoffMenus}->get_active) ? 1 : 0);
+ $self->{options}->spellCheck(($self->{spellCheck}->get_active) ? 1 : 0)
+ if $self->{spellCheck};
+ $self->{options}->useStars(($self->{useStars}->get_active) ? 1 : 0);
+ $self->{options}->useRelativePaths(($self->{useRelativePaths}->get_active) ? 1 : 0);
+ $self->{options}->useTitleForPics(($self->{picturesNameTitle}->get_active) ? 1 : 0);
+ $self->{options}->transform(($self->{transform}->get_active) ? 1 : 0);
+ $self->{options}->articles($self->{articles}->get_text);
+
+ if ($self->{proxycb}->get_active)
+ {
+ $self->{options}->proxy($self->{proxyurl}->get_text);
+ }
+ else
+ {
+ $self->{options}->proxy('');
+ }
+
+ if ($self->{cookieJarcb}->get_active)
+ {
+ $self->{options}->cookieJar($self->{cookieJarPath}->getValue);
+ }
+ else
+ {
+ $self->{options}->cookieJar('');
+ }
+
+ $self->{options}->lang($self->{langOption}->getValue);
+ $self->{options}->style($self->{styleOption}->getValue);
+ $self->{model}->{preferences}->layout($self->{layoutOption}->getValue);
+ $self->{options}->panelStyle($self->{panelStyleOption}->getValue);
+ $self->{options}->toolbar($self->{toolbarOption}->getValue);
+ $self->{options}->toolbarPosition($self->{toolbarPositionOption}->getValue);
+ $self->{options}->expandersMode($self->{expandersMode}->getValue);
+ $self->{options}->dateFormat($self->{dateFormat}->getValue)
+ if $self->{dateFormat};
+ my $currentView = $self->{options}->view;
+ $self->{options}->view($self->{viewOption}->getValue);
+
+ if (($currentView != $self->{options}->view)
+ || ($self->{viewOptionsChanged}))
+ {
+ $self->{parent}->setItemsList(0, 1);
+ $self->{viewChanged} = 1;
+ }
+
+ $self->{model}->{preferences}->plugin($self->{pluginOption}->getValue);
+
+ $self->{options}->askImport(($self->{askImport}->get_active) ? 1 : 0);
+ $self->{options}->searchStop(($self->{searchStop}->get_active) ? 1 : 0);
+ $self->{options}->bigPics(($self->{bigPics}->get_active) ? 1 : 0);
+ #$self->{options}->alwaysOriginal(($self->{alwaysOriginal}->get_active) ? 1 : 0);
+
+ $self->{options}->mailer($self->{mailerOption}->getValue);
+ $self->{options}->smtp($self->{smtp}->get_text);
+ $self->{options}->from($self->{from}->get_text);
+
+ $self->{parent}->checkImagesDirectory(1);
+ $self->{options}->historysize($self->{historysize}->get_value);
+ $self->{parent}->{menubar}->{menuHistoryItem}->remove_submenu();
+ $self->{parent}->{menubar}->{menuHistory} = Gtk2::Menu->new();
+ $self->{parent}->{menubar}->addHistoryMenu();
+
+ #$self->{model}->{preferences}->details($self->{details});
+
+ $self->{options}->save;
+ }
+
+ sub checkValues
+ {
+ my $self = shift;
+
+ return $self->{parent}->{lang}->{OptionsPicturesWorkingDirError}
+ if $self->{images}->getValue =~ /.%WORKING_DIR%/;
+ return undef;
+ }
+
+ sub activateInternetOptions
+ {
+ my ($self, $value) = @_;
+
+ $self->{dataGroupLabel}->set_sensitive($value);
+ $self->{pluginLabel}->set_sensitive($value);
+ $self->{pluginOption}->set_sensitive($value);
+ $self->{pluginList}->set_sensitive($value);
+ $self->{askImport}->set_sensitive($value);
+ $self->{searchStop}->set_sensitive($value);
+ $self->{bigPics}->set_sensitive($value);
+ }
+
+ sub show_all
+ {
+ my $self = shift;
+ $self->SUPER::show_all;
+ $self->{hboxImages}->hide;
+ $self->{hboxDetails}->hide;
+ $self->{hboxSMTP}->hide if $self->{mailerOption}->getValue ne 'SMTP';
+ if ($self->{expert}->get_active)
+ {
+ $self->{hboxImages}->show_all if ($self->{options}->view == 1);
+ $self->{hboxDetails}->show_all if ($self->{options}->view == 2);
+ }
+ else
+ {
+ # Toolbar and status bar
+ $self->{labelToolbar}->hide_all;
+ $self->{toolbarOption}->hide_all;
+ $self->{labelToolbarPosition}->hide_all;
+ $self->{toolbarPositionOption}->hide_all;
+ $self->{labelExpandersMode}->hide_all;
+ $self->{expandersMode}->hide_all;
+ if ($self->{dateFormat})
+ {
+ $self->{labelDateFormat}->hide_all;
+ $self->{dateFormat}->hide_all;
+ }
+ $self->{useStars}->hide_all;
+ # CD Device
+ $self->{cdDeviceLabel}->hide_all;
+ $self->{cdDevice}->hide_all;
+ # Pictures
+ $self->{picturesNameFormat}->hide_all;
+ $self->{picturesNameAuto}->hide_all;
+ $self->{picturesNameTitle}->hide_all;
+ $self->{useRelativePaths}->hide_all;
+ # Internet searches
+ $self->{searchStop}->hide_all;
+ # Internet access
+ $self->{proxycb}->hide_all;
+ $self->{proxyurl}->hide_all;
+ $self->{cookieJarcb}->hide_all;
+ $self->{cookieJarPath}->hide_all;
+ $self->{mailerLabel}->hide_all;
+ $self->{mailerOption}->hide_all;
+ $self->{hboxSMTP}->hide_all;
+ $self->{hboxMua}->hide_all;
+ # Features
+ $self->{tearoffMenus}->hide_all;
+ $self->{autoload}->hide_all;
+ $self->{OptionsRestoreAccelerators}->hide_all;
+ # History
+ $self->{fileHistoryLabel}->hide_all;
+ $self->{labelHistorysize}->hide_all;
+ $self->{historysize}->hide_all;
+ $self->{buttonClearHistory}->hide_all;
+ }
+ $self->{allShown} = 1;
+ $self->{layoutOption}->signal_emit('changed');
+ }
+
+ sub show
+ {
+ my $self = shift;
+ my $tabToShow= shift;
+
+ $self->initValues;
+ $self->show_all if !$self->{allShown};
+ $self->{optionstabs}->set_current_page ($tabToShow) if $tabToShow;
+ $self->activateInternetOptions(! $self->{model}->isPersonal);
+
+ $self->{hboxSMTP}->hide if $self->{options}->mailer ne 'SMTP';
+ $self->{pluginList}->hide
+ if (($self->{model}->{preferences}->plugin ne 'multi')
+ && ($self->{model}->{preferences}->plugin ne 'multiperfield')
+ && ($self->{model}->{preferences}->plugin ne 'multiask'));
+
+ while (1)
+ {
+ my $code = $self->run;
+ last if $code ne 'ok';
+ my $errorMessage = $self->checkValues;
+ if (!$errorMessage)
+ {
+ $self->saveValues;
+ last;
+ }
+ else
+ {
+ my $dialog = Gtk2::MessageDialog->new_with_markup($self->{parent},
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $errorMessage);
+ $dialog->run;
+ $dialog->destroy;
+ next;
+ }
+ }
+ $self->hide;
+ }
+
+ sub changeDetails
+ {
+ my $self = shift;
+ my $parent = $self->{parent};
+ my @tmpOptionsArray = split m/\|/, $self->{details};
+
+ my $fieldsDialog = new GCDetailedOptionsDialog($self,
+ \@tmpOptionsArray);
+
+
+ $fieldsDialog->show;
+ $fieldsDialog->destroy;
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+
+ $self->{model} = $model;
+ my @plugins = map {{value => $_,
+ displayed => $_}}
+ @{$model->getPluginsNames};
+ unshift @plugins, (
+ {value => 'ask', displayed => $self->{parent}->{lang}->{OptionsAskPlugins}},
+ {value => 'multiask', displayed => $self->{parent}->{lang}->{OptionsPluginsMultiAsk}},
+ {value => 'multi', displayed => $self->{parent}->{lang}->{OptionsPluginsMulti}},
+ {value => 'multiperfield', displayed => $self->{parent}->{lang}->{OptionsPluginsMultiPerField}},
+ );
+ $self->{pluginOption}->setValues(\@plugins);
+
+ my @panels = map {{value => $_,
+ displayed => $model->getDisplayedText($model->{panels}->{$_}->{label})}}
+ @{$model->{panelsNames}};
+ $self->{layoutOption}->setValues(\@panels);
+ }
+
+ sub initMailerOption
+ {
+ my $self = shift;
+ use locale;
+ my @mailers = ({value => 'Sendmail', displayed => 'Sendmail'},
+ {value => 'SMTP', displayed => 'SMTP'});
+ my $mailPrograms = GCMail::getMailers;
+ foreach (sort keys %{$mailPrograms})
+ {
+ push @mailers, {value => $_, displayed => $_};
+ }
+ $self->{mailerOption}->setValues(\@mailers, 2);
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $options) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{OptionsTitle},
+ );
+ bless ($self, $class);
+
+ $self->{allShown} = 0;
+ $self->set_has_separator(0);
+
+ $options = $parent->{options} if !$options;
+ $self->{options} = $options;
+
+ $self->{parent} = $parent;
+
+ $self->{lang} = $parent->{lang};
+ $self->{tooltips} = $parent->{tooltips};
+
+ ################
+ # Main options
+ ################
+ my $tableMain = new Gtk2::Table(3,2,0);
+ $tableMain->set_row_spacings($GCUtils::halfMargin);
+ $tableMain->set_col_spacings($GCUtils::margin);
+ $tableMain->set_border_width($GCUtils::margin);
+
+ my $labelLang = new GCLabel($parent->{lang}->{OptionsLang});
+ $self->{langOption} = new GCMenuList;
+ my @langValues;
+ push @langValues, {value => $_, displayed => $GCLang::langs{$_}->{LangName}}
+ foreach (keys %GCLang::langs);
+ @langValues = sort {$a->{displayed} cmp $b->{displayed}} @langValues;
+ $self->{langOption}->setValues(\@langValues);
+
+ $tableMain->attach($labelLang, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ $tableMain->attach($self->{langOption}, 1, 2, 1, 2, 'fill', 'fill', 0, 0);
+
+ my $labelStyle = new GCLabel($parent->{lang}->{OptionsStyle});
+ $self->{styleOption} = new GCMenuList;
+ my @styleValues;
+ push @styleValues, {value => $_, displayed => $_} foreach (sort keys %GCStyle::styles);
+ $self->{styleOption}->setValues(\@styleValues);
+ $tableMain->attach($labelStyle, 0, 1, 2, 3, 'fill', 'fill', 0, 0);
+ $tableMain->attach($self->{styleOption}, 1, 2, 2, 3, 'fill', 'fill', 0, 0);
+
+ $self->{tearoffMenus} = new Gtk2::CheckButton($parent->{lang}->{OptionsTearoffMenus});
+ $self->{tearoffMenus}->set_active($options->tearoffMenus);
+ $self->{tearoffMenus}->set_active(1) if (! $options->exists('tearoffMenus'));
+ $tableMain->attach($self->{tearoffMenus}, 0, 2, 3, 4, 'fill', 'fill', 0, 0);
+
+ my $labelWarning = new Gtk2::Label;
+ $labelWarning->set_markup('<b>'.$parent->{lang}->{OptionsWarning}.'</b>');
+ $labelWarning->set_use_underline(1);
+ $labelWarning->set_line_wrap(1);
+ $labelWarning->set_justify('center');
+
+ my $vboxMain = new Gtk2::VBox(0,0);
+ $vboxMain->set_border_width(20);
+ $vboxMain->pack_start($tableMain,1,1,0);
+ #$vboxMain->pack_start(Gtk2::HSeparator->new,1,1,10);
+ $vboxMain->pack_start($labelWarning,1,1,0);
+
+ ##################
+ # Display options
+ ##################
+ my $tableDisplay = new Gtk2::Table(10, 6, 0);
+ $tableDisplay->set_row_spacings($GCUtils::halfMargin);
+ $tableDisplay->set_col_spacings($GCUtils::margin);
+ $tableDisplay->set_border_width($GCUtils::margin);
+
+ my $labelDisplayInformationGroup = new GCHeaderLabel($parent->{lang}->{OptionsDisplayInformationGroup});
+ $tableDisplay->attach($labelDisplayInformationGroup, 0, 6, 0, 1, 'fill', 'fill', 0, 0);
+
+ my $labelView = new GCLabel($parent->{lang}->{OptionsView});
+ my %views = %{$parent->{lang}->{OptionsViews}};
+ $self->{viewOption} = new GCMenuList;
+ my @viewsOptions = map {{value => $_, displayed => $views{$_}}}
+ (sort keys %views);
+ $self->{viewOption}->setValues(\@viewsOptions);
+
+
+
+ $tableDisplay->attach($labelView, 2, 3, 1, 2, 'fill', 'fill', 0, 0);
+ $tableDisplay->attach($self->{viewOption}, 3, 4, 1, 2, 'fill', 'fill', 0, 0);
+
+ $self->{hboxImages} = new Gtk2::HBox(0,0);
+ $self->{imagesButton} = new Gtk2::Button($parent->{lang}->{ImagesOptionsButton});
+ $self->{imagesButton}->signal_connect('clicked', sub {
+ $self->{imagesOptionsDialog} = new GCImagesOptionsDialog($self)
+ if ! $self->{imagesOptionsDialog};
+ $self->{imagesOptionsDialog}->show;
+ });
+ $self->{hboxImages}->pack_start($self->{imagesButton}, 0, 0, 0);
+
+ $self->{hboxDetails} = new Gtk2::HBox(0,0);
+ $self->{buttonDetails} = new Gtk2::Button($parent->{lang}->{ImagesOptionsButton});
+ $self->{buttonDetails}->signal_connect('clicked' => sub {
+ $self->changeDetails;
+ });
+ $self->{hboxDetails}->pack_start($self->{buttonDetails}, 0, 0, 0);
+
+ $self->{viewOption}->signal_connect('changed' => sub {
+ my $i = $self->{viewOption}->getValue;
+ $self->{hboxImages}->hide;
+ $self->{hboxDetails}->hide;
+ if ($self->{expert}->get_active)
+ {
+ $self->{hboxImages}->show_all if ($i == 1);
+ $self->{hboxDetails}->show_all if ($i == 2);
+ }
+ });
+ $tableDisplay->attach($self->{hboxImages}, 4, 6, 1, 2, 'fill', 'fill', 0, 0);
+ $tableDisplay->attach($self->{hboxDetails}, 4, 6, 1, 2, 'fill', 'fill', 0, 0);
+
+ my $labelLayout = new GCLabel($parent->{lang}->{OptionsLayout});
+ $self->{layoutOption} = new GCMenuList;
+ $self->{layoutOption}->signal_connect('changed' => sub {
+ my $panelName = $self->{layoutOption}->getValue;
+ my $readonly = ($self->{model}->{panels}->{$panelName}->{editable} eq 'false');
+ if ($readonly)
+ {
+ $self->{labelPanelStyle}->show;
+ $self->{panelStyleOption}->show;
+ }
+ else
+ {
+ $self->{labelPanelStyle}->hide;
+ $self->{panelStyleOption}->hide;
+ }
+ });
+ $tableDisplay->attach($labelLayout, 2, 3, 2, 3, 'fill', 'fill', 0, 0);
+ $tableDisplay->attach($self->{layoutOption}, 3, 4, 2, 3, 'fill', 'fill', 0, 0);
+
+ $self->{labelPanelStyle} = new GCLabel($parent->{lang}->{OptionsStyle});
+ $self->{panelStyleOption} = new GCMenuList;
+ my @panelStyles = map {{value => $_, displayed => $_}}
+ (sort @GCStyle::readOnlyStyles);
+ $self->{panelStyleOption}->setValues(\@panelStyles);
+
+ $tableDisplay->attach($self->{labelPanelStyle}, 4, 5, 2, 3, 'fill', 'fill', 0, 0);
+ $tableDisplay->attach($self->{panelStyleOption}, 5, 6, 2, 3, ['fill', 'expand'], 'fill', 0, 0);
+
+ $self->{labelToolbar} = new GCLabel($parent->{lang}->{OptionsToolbar});
+ $self->{toolbarOption} = new GCMenuList;
+ my %toolbars = %{$parent->{lang}->{OptionsToolbars}};
+ my @toolbarValues = map {{value => $_, displayed => $toolbars{$_}}}
+ (sort keys %toolbars);
+ $self->{toolbarOption}->setValues(\@toolbarValues);
+
+ $tableDisplay->attach($self->{labelToolbar}, 2, 3, 3, 4, 'fill', 'fill', 0, 0);
+ $tableDisplay->attach($self->{toolbarOption}, 3, 4, 3, 4, 'fill', 'fill', 0, 0);
+
+ $self->{labelToolbarPosition} = new GCLabel($parent->{lang}->{OptionsToolbarPosition});
+ $self->{toolbarPositionOption} = new GCMenuList;
+ my %toolbarPositions = %{$parent->{lang}->{OptionsToolbarPositions}};
+ my @positionValues = map {{value => $_, displayed => $toolbarPositions{$_}}}
+ (sort keys %toolbarPositions);
+ $self->{toolbarPositionOption}->setValues(\@positionValues);
+
+ $tableDisplay->attach($self->{labelToolbarPosition}, 4, 5, 3, 4, 'fill', 'fill', 0, 0);
+ $tableDisplay->attach($self->{toolbarPositionOption}, 5, 6, 3, 4, ['fill', 'expand'], 'fill', 0, 0);
+
+ $self->{labelExpandersMode} = new GCLabel($parent->{lang}->{OptionsExpandersMode});
+ $self->{expandersMode} = new GCMenuList;
+ my %expandersModes = %{$parent->{lang}->{OptionsExpandersModes}};
+ my @ExpandersModeValues = map {{value => $_, displayed => $expandersModes{$_}}}
+ (sort keys %expandersModes);
+ $self->{expandersMode}->setValues(\@ExpandersModeValues);
+
+ $tableDisplay->attach($self->{labelExpandersMode}, 2, 3, 4, 5, 'fill', 'fill', 0, 0);
+ $tableDisplay->attach($self->{expandersMode}, 3, 4, 4, 5, 'fill', 'fill', 0, 0);
+
+ $self->{useStars} = new Gtk2::CheckButton($parent->{lang}->{OptionsUseStars});
+ $tableDisplay->attach($self->{useStars}, 4, 6, 4, 5, ['expand', 'fill'], 'fill', 0, 0);
+
+ if ($GCUtils::hasTimeConversion)
+ {
+ $self->{labelDateFormat} = new GCLabel($parent->{lang}->{OptionsDateFormat});
+ $self->{dateFormat} = new GCShortText;
+ $self->{dateFormat}->set_width_chars(10);
+ $self->{tooltips}->set_tip($self->{dateFormat},
+ $parent->{lang}->{OptionsDateFormatTooltip});
+ $tableDisplay->attach($self->{labelDateFormat}, 2, 3, 5, 6, 'fill', 'fill', 0, 0);
+ $tableDisplay->attach($self->{dateFormat}, 3, 6, 5, 6, 'fill', 'fill', 0, 0);
+ }
+
+ my $labelDisplayArticlesGroup = new GCHeaderLabel($parent->{lang}->{OptionsDisplayArticlesGroup});
+ $tableDisplay->attach($labelDisplayArticlesGroup, 0, 6, 7, 8, 'fill', 'fill', 0, 0);
+
+ $self->{transform} = new Gtk2::CheckButton($parent->{lang}->{OptionsTransform});
+ $tableDisplay->attach($self->{transform}, 2, 6, 8, 9, 'fill', 'fill', 0, 0);
+ my $labelArticles = new GCLabel($parent->{lang}->{OptionsArticles});
+ $tableDisplay->attach($labelArticles, 2, 4, 9, 10, 'fill', 'fill', 0, 0);
+ $self->{articles} = new Gtk2::Entry;
+ $self->{articles}->set_width_chars(10);
+ $tableDisplay->attach($self->{articles}, 4, 6, 9, 10, ['expand', 'fill'], 'fill', 0, 0);
+ $options->articles('le,la,les,l,un,une,des,a,the') if (! $options->exists('articles'));
+
+ my $vboxDisplay = new Gtk2::VBox(0,0);
+ $vboxDisplay->set_border_width(0);
+ $vboxDisplay->pack_start($tableDisplay, 0, 0, 0);
+
+ #################
+ # Paths options
+ #################
+ my $vboxPath = new Gtk2::VBox(0,0);
+
+ my $tablePath = new Gtk2::Table(14, 4, 0);
+ my $pathRow = -1;
+ $tablePath->set_row_spacings($GCUtils::halfMargin);
+ $tablePath->set_col_spacings($GCUtils::margin);
+ $tablePath->set_border_width($GCUtils::margin);
+
+ my $labelProgramsGroup = new GCHeaderLabel($parent->{lang}->{OptionsPathProgramsGroup});
+ $pathRow++;
+ $tablePath->attach($labelProgramsGroup, 0, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 0, 0);
+
+ $self->{systemPrograms} = new Gtk2::RadioButton(undef, $parent->{lang}->{OptionsProgramsSystem});
+ $pathRow++;
+ $tablePath->attach($self->{systemPrograms}, 2, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 0, 0);
+ $self->{programTypeGroup} = $self->{systemPrograms}->get_group;
+ $self->{userPrograms} = new Gtk2::RadioButton($self->{programTypeGroup}, $parent->{lang}->{OptionsProgramsUser});
+ $self->{defineProgramsButton} = new GCButton($parent->{lang}->{OptionsProgramsSet});
+ $self->{defineProgramsButton}->signal_connect('clicked' => sub {
+ $self->{programsDialog} = new GCProgramsOptionsDialog($self)
+ if ! $self->{programsDialog};
+ $self->{programsDialog}->show;
+ });
+ my $hboxDefinePrograms = new Gtk2::HBox(0,0);
+ $hboxDefinePrograms->pack_start($self->{userPrograms}, 0, 0, 0);
+ $hboxDefinePrograms->pack_start($self->{defineProgramsButton}, 0, 0, 2*$GCUtils::margin);
+ $pathRow++;
+ $tablePath->attach($hboxDefinePrograms, 2, 4, $pathRow, $pathRow + 1, 'fill', [], 0, 0);
+ $self->{userPrograms}->signal_connect('toggled' => sub {
+ $self->{defineProgramsButton}->lock(! $self->{userPrograms}->get_active);
+ });
+
+ $self->{cdDeviceLabel} = new GCLabel($parent->{lang}->{OptionsCdDevice});
+ $self->{cdDevice} = new GCFile($self,
+ $self->{parent}->{lang}->{FileChooserOpenDirectory},
+ 'select-folder');
+ $pathRow++;
+ $tablePath->attach($self->{cdDeviceLabel}, 2, 3, $pathRow, $pathRow + 1, 'fill', 'fill', 0, 0);
+ $tablePath->attach($self->{cdDevice}, 3, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 0, 0);
+
+ $self->{labelImagesGroup} = new GCHeaderLabel($parent->{lang}->{OptionsPathImagesGroup});
+ $pathRow += 2;
+ $tablePath->attach($self->{labelImagesGroup}, 0, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 0, 0);
+ $self->{labelImages} = new GCLabel($parent->{lang}->{OptionsImages});
+ $pathRow++;
+ $tablePath->attach($self->{labelImages}, 2, 3, $pathRow, $pathRow + 1, 'fill', 'fill', 0, 0);
+ $self->{images} = new GCFile($self,
+ $self->{parent}->{lang}->{FileChooserOpenDirectory},
+ 'select-folder',
+ 0,
+ $GCOptions::DEFAULT_IMG_DIR);
+ $self->{images}->setWidth(40);
+ $tablePath->attach($self->{images}, 3, 4, $pathRow, $pathRow + 1, ['expand', 'fill'], 'fill', 0, 0);
+
+ $self->{labelPicturesWorkingDir} = new GCLabel($parent->{lang}->{OptionsPicturesWorkingDir});
+ $pathRow++;
+ $tablePath->attach($self->{labelPicturesWorkingDir}, 2, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 2*$GCUtils::margin, 0);
+ $self->{labelPicturesFileBase} = new GCLabel($parent->{lang}->{OptionsPicturesFileBase});
+ $pathRow++;
+ $tablePath->attach($self->{labelPicturesFileBase}, 2, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 2*$GCUtils::margin, 0);
+
+ $self->{picturesNameFormat} = new GCLabel($parent->{lang}->{OptionsPicturesFormat});
+ $pathRow += 2;
+ $tablePath->attach($self->{picturesNameFormat}, 2, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 0, 0);
+ $self->{picturesNameAuto} = new Gtk2::RadioButton(undef, $parent->{lang}->{OptionsPicturesFormatInternal});
+ $pathRow++;
+ $tablePath->attach($self->{picturesNameAuto}, 2, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 2*$GCUtils::margin, 0);
+ $self->{picturesNameGroup} = $self->{picturesNameAuto}->get_group;
+ $self->{picturesNameTitle} = new Gtk2::RadioButton($self->{picturesNameGroup}, $parent->{lang}->{OptionsPicturesFormatTitle});
+ $pathRow++;
+ $tablePath->attach($self->{picturesNameTitle}, 2, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 2*$GCUtils::margin, 0);
+
+ $self->{useRelativePaths} = new Gtk2::CheckButton($parent->{lang}->{OptionsUseRelativePaths});
+ $self->{useRelativePaths}->set_active($options->useRelativePaths);
+ $self->{useRelativePaths}->set_active(0) if (! $options->exists('useRelativePaths'));
+ $pathRow++;
+ $tablePath->attach($self->{useRelativePaths}, 2, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 0, 0);
+
+ $vboxPath->pack_start($tablePath, 0, 0, 0);
+
+ ###################
+ # Internet options
+ ###################
+ my $tableInternet = new Gtk2::Table(12, 5, 0);
+ $tableInternet->set_row_spacings($GCUtils::halfMargin);
+ $tableInternet->set_col_spacings($GCUtils::margin);
+ $tableInternet->set_border_width($GCUtils::margin);
+
+ $self->{dataGroupLabel} = new GCHeaderLabel($parent->{lang}->{OptionsInternetDataGroup});
+ $tableInternet->attach($self->{dataGroupLabel}, 0, 5, 0, 1, 'fill', 'fill', 0, 0);
+
+ $self->{pluginLabel} = new GCLabel($parent->{lang}->{OptionsPlugins});
+ $self->{pluginOption} = new GCMenuList;
+ $self->{pluginList} = new Gtk2::Button($parent->{lang}->{OptionsPluginsList});
+ $self->{pluginList}->signal_connect('clicked' => sub {
+ $parent->getDialog('MultiSite')->show if (($self->{pluginOption}->getValue eq 'multi')
+ || ($self->{pluginOption}->getValue eq 'multiask'));
+ $parent->getDialog('MultiSitePerField')->show if (($self->{pluginOption}->getValue eq 'multiperfield'));
+ });
+ $self->{pluginOption}->signal_connect('changed' => sub {
+ if (($self->{pluginOption}->getValue eq 'multi')
+ || ($self->{pluginOption}->getValue eq 'multiask')
+ || ($self->{pluginOption}->getValue eq 'multiperfield'))
+ {
+ $self->{pluginList}->show;
+ }
+ else
+ {
+ $self->{pluginList}->hide;
+ }
+ });
+ $self->{askImport} = new Gtk2::CheckButton($parent->{lang}->{OptionsAskImport});
+ $tableInternet->attach($self->{pluginLabel}, 2, 3, 1, 2, 'fill', 'fill', 0, 0);
+ $tableInternet->attach($self->{pluginOption}, 3, 4, 1, 2, 'fill', 'fill', 0, 0);
+ $tableInternet->attach($self->{pluginList}, 4, 5, 1, 2, 'fill', 'fill', 20, 0);
+ $tableInternet->attach($self->{askImport}, 2, 5, 2, 3, 'fill', 'fill', 0, 0);
+ $self->{bigPics} = new Gtk2::CheckButton($parent->{lang}->{OptionsBigPics});
+ $tableInternet->attach($self->{bigPics}, 2, 5, 3, 4, 'fill', 'fill', 0, 0);
+ $self->{searchStop} = new Gtk2::CheckButton($parent->{lang}->{OptionsSearchStop});
+ $tableInternet->attach($self->{searchStop}, 2, 5, 4, 5, 'fill', 'fill', 0, 0) if ($^O !~ /win32/i);
+
+ my $settingsGroupLabel = new GCHeaderLabel($parent->{lang}->{OptionsInternetSettingsGroup});
+ $tableInternet->attach($settingsGroupLabel, 0, 5, 6, 7, 'fill', 'fill', 0, 0);
+
+ $self->{proxycb} = new Gtk2::CheckButton($parent->{lang}->{OptionsProxy});
+ $self->{proxycb}->set_active($options->proxy);
+ $self->{proxyurl} = new Gtk2::Entry;
+ $self->{proxyurl}->set_text($options->proxy);
+ $self->{proxycb}->signal_connect('clicked' => sub {
+ if ($self->{proxycb}->get_active)
+ {
+ $self->{proxyurl}->set_editable(1);
+ }
+ else
+ {
+ $self->{proxyurl}->set_editable(0);
+ }
+ });
+ $tableInternet->attach($self->{proxycb}, 2, 3, 7, 8, 'fill', 'fill', 0, 0);
+ $tableInternet->attach($self->{proxyurl}, 3, 4, 7, 8, 'fill', 'shrink', 0, 0);
+
+ $self->{cookieJarcb} = new Gtk2::CheckButton($parent->{lang}->{OptionsCookieJar});
+ $self->{cookieJarcb}->set_active($options->cookieJar);
+ $self->{cookieJarcb}->signal_connect('clicked' => sub {
+ if ($self->{cookieJarcb}->get_active)
+ {
+ $self->{cookieJarPath}->lock(0);
+ }
+ else
+ {
+ $self->{cookieJarPath}->lock(1);
+ }
+ });
+ $tableInternet->attach($self->{cookieJarcb}, 2, 3, 8, 9, 'fill', 'fill', 0, 0);
+ $self->{cookieJarPath} = new GCFile($self,
+ $self->{parent}->{lang}->{OptionsCookieJar},
+ 'open',
+ 0 );
+ $tableInternet->attach($self->{cookieJarPath}, 3, 4, 8, 9, 'fill', 'fill', 0, 0);
+
+ my $labelFrom = new GCLabel($self->{parent}->{lang}->{OptionsFrom});
+ $self->{from} = new Gtk2::Entry;
+ $tableInternet->attach($labelFrom, 2, 3, 9, 10, 'fill', 'fill', 0, 0);
+ $tableInternet->attach($self->{from}, 3, 4, 9, 10, 'fill', 'fill', 0, 0);
+
+ $self->{mailerLabel} = new GCLabel($parent->{lang}->{OptionsMailer});
+ $self->{mailerOption} = new GCMenuList;
+ $self->initMailerOption;
+ $tableInternet->attach($self->{mailerLabel}, 2, 3, 10, 11, 'fill', 'fill', 0, 0);
+ $tableInternet->attach($self->{mailerOption}, 3, 4, 10, 11, 'fill', 'fill', 0, 0);
+
+ $self->{hboxSMTP} = new Gtk2::HBox(0,0);
+ my $SMTPLabel = new GCLabel($parent->{lang}->{OptionsSMTP});
+ $self->{smtp} = new Gtk2::Entry;
+ $self->{smtp}->set_text($options->smtp);
+ $self->{smtp}->set_width_chars(20);
+ $self->{hboxSMTP}->pack_start($SMTPLabel,0,0,0);
+ $self->{hboxSMTP}->pack_start($self->{smtp},0,0,5);
+ $tableInternet->attach($self->{hboxSMTP}, 4, 5, 10, 11, 'fill', 'fill', 0, 0);
+
+ $self->{mailerOption}->signal_connect('changed' => sub {
+ if ('SMTP' eq $self->{mailerOption}->getValue)
+ {
+ $self->{hboxSMTP}->show;
+ }
+ else
+ {
+ $self->{hboxSMTP}->hide;
+ }
+ });
+
+ my $mailersButton = new GCButton($parent->{lang}->{OptionsConfigureMailers});
+ $self->{hboxMua} = new Gtk2::HBox(0,0);
+ $self->{hboxMua}->pack_start($mailersButton,0,0,0);
+ $tableInternet->attach($self->{hboxMua}, 2, 4, 11, 12, 'fill', 'fill', 0, 0);
+ $mailersButton->signal_connect('clicked' => sub {
+ my $dialog = $self->{parent}->getDialog('MailPrograms');
+ $self->initMailerOption if $dialog->show;
+ });
+
+ my $vboxInternet = new Gtk2::VBox(0,0);
+ $vboxInternet->set_border_width(0);
+ $vboxInternet->pack_start($tableInternet,0,0,0);
+
+ ###################
+ # Features options
+ ###################
+ my $vboxConvenience = new Gtk2::VBox(0,0);
+ my $tableFeature = new Gtk2::Table(11, 5, 0);
+ $tableFeature->set_row_spacings($GCUtils::halfMargin);
+ $tableFeature->set_col_spacings($GCUtils::margin);
+ $tableFeature->set_border_width($GCUtils::margin);
+
+ $self->{confirm} = new Gtk2::CheckButton($parent->{lang}->{OptionsRemoveConfirm});
+ $self->{confirm}->set_active($options->confirm);
+ $self->{autosave} = new Gtk2::CheckButton($parent->{lang}->{OptionsAutoSave});
+ $self->{autosave}->set_active($options->autosave);
+ $self->{autoload} = new Gtk2::CheckButton($parent->{lang}->{OptionsAutoLoad});
+ $self->{autoload}->set_active(! $options->noautoload);
+ $self->{splash} = new Gtk2::CheckButton($parent->{lang}->{OptionsSplash});
+ $self->{splash}->set_active($options->splash);
+ $self->{splash}->set_active(1) if (! $options->exists('splash'));
+ $self->{spellCheck} = 0;
+ my $restoreAccelOffset = 0;
+ if ($GCBaseWidgets::hasSpellChecker)
+ {
+ $self->{spellCheck} = new Gtk2::CheckButton($parent->{lang}->{OptionsSpellCheck});
+ $self->{spellCheck}->set_active($options->spellCheck);
+ $restoreAccelOffset = 1;
+ }
+ $self->{OptionsRestoreAccelerators} = new Gtk2::Button($parent->{lang}->{OptionsRestoreAccelerators});
+ $self->{OptionsRestoreAccelerators}->signal_connect('clicked' => sub {
+ $self->{parent}->{menubar}->restoreDefaultAccels;
+ });
+
+
+ my $conveniencesLabel = new GCHeaderLabel($parent->{lang}->{OptionsFeaturesConveniencesGroup});
+ $tableFeature->attach($conveniencesLabel, 0, 4, 0, 1, 'fill', 'fill', 0, 0);
+ $tableFeature->attach($self->{splash}, 2, 4, 1, 2, 'fill', 'fill', 0, 0);
+ $tableFeature->attach($self->{confirm}, 2, 4, 2, 3, 'fill', 'fill', 0, 0);
+ $tableFeature->attach($self->{autosave}, 2, 4, 3, 4, 'fill', 'fill', 0, 0);
+ $tableFeature->attach($self->{autoload}, 2, 4, 4, 5, 'fill', 'fill', 0, 0);
+ $tableFeature->attach($self->{spellCheck}, 2, 4, 5, 6, 'fill', 'fill', 0, 0)
+ if $self->{spellCheck};
+ $tableFeature->attach($self->{OptionsRestoreAccelerators}, 2, 3,
+ 5 + $restoreAccelOffset, 6 + $restoreAccelOffset,
+ 'fill', 'fill', 0, 0);
+
+ my $fileHistoryLabelText = $parent->{lang}->{MenuHistory};
+ $fileHistoryLabelText =~ s/_//g;
+ $self->{fileHistoryLabel} = new GCHeaderLabel($fileHistoryLabelText);
+ $tableFeature->attach($self->{fileHistoryLabel}, 0, 4, 9, 10, 'fill', 'fill', 0, 0);
+
+ $self->{labelHistorysize} = new GCLabel($parent->{lang}->{OptionsHistory});
+ my $adjHistory = Gtk2::Adjustment->new(0, 1, 20, 1, 1, 0) ;
+ $self->{historysize} = Gtk2::SpinButton->new($adjHistory, 0, 0);
+ $self->{buttonClearHistory} = new Gtk2::Button($parent->{lang}->{OptionsClearHistory});
+ $self->{buttonClearHistory}->signal_connect('clicked' => sub {
+ $self->{options}->history('');
+ });
+ $tableFeature->attach($self->{labelHistorysize}, 2, 3, 10, 11, 'fill', 'fill', 0, 0);
+ $tableFeature->attach($self->{historysize}, 3, 4, 10, 11, 'fill', 'fill', 0, 0);
+ $tableFeature->attach($self->{buttonClearHistory}, 2, 3, 11, 12, 'fill', 'fill', 0, 0);
+
+ $vboxConvenience->pack_start($tableFeature,0,0,0);
+
+ ###################
+ # Tab Gesture Stuff
+ ###################
+
+ my $tabs = Gtk2::Notebook->new();
+ $tabs->set_name('GCOptionsTabs');
+ $tabs->set_tab_pos('left');
+ $tabs->set_show_border(0);
+
+ my ($mainButton, $displayButton, $pathButton, $internetButton, $conveniencesButton);
+
+ $mainButton = GCImageBox->new_from_stock('gtk-home',
+ $parent->{lang}->{OptionsMain});
+ $displayButton = GCImageBox->new_from_stock('gtk-select-color',
+ $parent->{lang}->{OptionsDisplay});
+ $pathButton = GCImageBox->new_from_stock('gtk-directory',
+ $parent->{lang}->{OptionsPaths});
+ $internetButton = GCImageBox->new_from_stock('gtk-network',
+ $parent->{lang}->{OptionsInternet});
+ $conveniencesButton = GCImageBox->new_from_stock('gtk-properties',
+ $parent->{lang}->{OptionsConveniences});
+
+ $tabs->append_page_menu($vboxMain, $mainButton, Gtk2::Label->new($parent->{lang}->{OptionsMain}));
+ $tabs->append_page_menu($vboxDisplay, $displayButton, Gtk2::Label->new($parent->{lang}->{OptionsDisplay}));
+ $tabs->append_page_menu($vboxPath, $pathButton, Gtk2::Label->new($parent->{lang}->{OptionsPaths}));
+ $tabs->append_page_menu($vboxInternet, $internetButton, Gtk2::Label->new($parent->{lang}->{OptionsInternet}));
+ $tabs->append_page_menu($vboxConvenience, $conveniencesButton, Gtk2::Label->new($parent->{lang}->{OptionsConveniences}));
+
+ $tabs->set_tab_label_packing ($vboxMain, 1, 0, 'start');
+ $tabs->set_tab_label_packing ($vboxDisplay, 1, 0, 'start');
+ $tabs->set_tab_label_packing ($vboxPath, 1, 0, 'start');
+ $tabs->set_tab_label_packing ($vboxInternet, 1, 0, 'start');
+ $tabs->set_tab_label_packing ($vboxConvenience, 1, 0, 'start');
+
+ $self->vbox->pack_start($tabs, 1, 1, 0);
+ $self->{optionstabs}=$tabs;
+ $self->{expert} = new Gtk2::CheckButton($parent->{lang}->{OptionsExpertMode});
+ $self->{expert}->signal_connect('toggled' => sub {
+ $self->show_all;
+ });
+ $self->{expert}->set_border_width($GCUtils::margin);
+ $self->vbox->pack_start($self->{expert}, 0, 1, 0);
+
+ $self->{lang} = $parent->{lang};
+
+ return $self;
+ }
+
+}
+
+{
+ # Class used to let user select images options
+ package GCImagesOptionsDialog;
+ use base "GCModalDialog";
+ use GCItemsLists::GCListOptions;
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->{panel}->initValues;
+
+ $self->show_all;
+ my $code = $self->run;
+ if ($code eq 'ok')
+ {
+ $self->{panel}->saveValues;
+ $self->{parent}->{viewOptionsChanged} = 1;
+ }
+ $self->hide;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{ImagesOptionsTitle},
+ );
+
+ $self->{panel} = new GCImagesOptionsPanel($parent->{model}->{preferences}, $parent->{parent});
+ $self->{parent} = $parent;
+
+ $self->vbox->pack_start($self->{panel},1,1,0);
+
+ bless ($self, $class);
+ return $self;
+ }
+}
+
+{
+ # Class used to let user select detailed options
+ package GCDetailedOptionsDialog;
+ use base "GCModalDialog";
+ use GCItemsLists::GCListOptions;
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->{panel}->initValues;
+
+ $self->show_all;
+ my $code = $self->run;
+ if ($code eq 'ok')
+ {
+ $self->{panel}->saveValues;
+ $self->{parent}->{viewOptionsChanged} = 1;
+ }
+ $self->hide;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{DetailedOptionsTitle},
+ );
+
+ $self->{panel} = new GCDetailedOptionsPanel($parent->{model}->{preferences}, $parent->{parent});
+ $self->{parent} = $parent;
+
+ $self->vbox->pack_start($self->{panel},1,1,0);
+
+ bless ($self, $class);
+ return $self;
+ }
+}
+
+
+{
+ # Class used to let user select program to run
+ package GCProgramsOptionsDialog;
+ use base "GCModalDialog";
+
+ sub initValues
+ {
+ my $self = shift;
+
+ foreach (@{$self->{programs}})
+ {
+ $self->{paths}->{$_}->setValue($self->{parent}->{$_});
+ }
+ }
+
+ sub saveValues
+ {
+ my $self = shift;
+
+ foreach (@{$self->{programs}})
+ {
+ $self->{parent}->{$_} = $self->{paths}->{$_}->getValue;
+ }
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->initValues;
+
+ $self->show_all;
+ my $code = $self->run;
+ if ($code eq 'ok')
+ {
+ $self->saveValues;
+ }
+ $self->hide;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{OptionsProgramsSet},
+ );
+
+ $self->{programs} = ['browser', 'player', 'audio', 'imageEditor'];
+
+ my $tablePath = new Gtk2::Table(scalar @{$self->{programs}} + 1, 4);
+ $tablePath->set_row_spacings($GCUtils::halfMargin);
+ $tablePath->set_col_spacings($GCUtils::margin);
+ $tablePath->set_border_width($GCUtils::margin);
+
+ $self->{labelPrograms} = new GCHeaderLabel($parent->{lang}->{OptionsPrograms});
+ $tablePath->attach($self->{labelPrograms}, 0, 4, 0, 1, 'fill', 'fill', 0, $GCUtils::halfMargin);
+
+ my $line = 1;
+ foreach my $program(@{$self->{programs}})
+ {
+ my $label = new GCLabel($parent->{lang}->{'Options'.ucfirst($program)});
+ $tablePath->attach($label, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $self->{paths}->{$program} = new GCFile($parent, $parent->{lang}->{OptionsProgramTitle});
+ $self->{paths}->{$program}->setWidth(40);
+ $tablePath->attach($self->{paths}->{$program}, 3, 4, $line, $line + 1, ['expand', 'fill'], 'fill', 0, 0);
+ $line++;
+ }
+
+ $tablePath->show_all;
+
+ $self->vbox->pack_start($tablePath,1,1,0);
+
+ bless ($self, $class);
+ return $self;
+ }
+}
+
+{
+ # Class used to let user select information to be displayed
+ package GCDisplayOptionsDialog;
+ use base "Gtk2::Dialog";
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->initValues;
+
+ $self->show_all;
+ my $code = $self->run;
+ if ($code eq 'ok')
+ {
+ $self->saveValues;
+ }
+ $self->hide;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new($parent->{lang}->{DisplayOptionsTitle},
+ $parent,
+ [qw/modal destroy-with-parent/],
+ @GCDialogs::okCancelButtons
+ );
+
+ bless($self, $class);
+
+ $self->{show} = {};
+ $self->{options} = $parent->{model}->{preferences};
+ $self->{parent} = $parent;
+
+ $self->{lang} = $parent->{lang};
+ $self->set_default_size(-1,480);
+ return $self;
+ }
+
+ sub createContent
+ {
+ my ($self, $model) = @_;
+
+ $self->{options} = $model->{preferences};
+ if ($self->{tabs})
+ {
+ $self->vbox->remove($self->{hboxActions});
+ $self->{hboxActions}->destroy;
+ $self->vbox->remove($self->{tabs});
+ $self->{tabs}->destroy;
+ }
+
+ $self->{fieldsInfo} = $model->getDisplayedInfo;
+ $self->{fields} = $model->getFieldsCopy;
+
+ #Add special items
+ if (! $model->isPersonal)
+ {
+ unshift @{$self->{fields}}, 'searchButton';
+ unshift @{$self->{fieldsInfo}->[0]->{items}},
+ {id => 'searchButton',
+ label => $model->getDisplayedText('PanelSearchButton')};
+ }
+ $self->createComponents;
+ $self->initValues;
+ }
+
+ sub initValues
+ {
+ my $self = shift;
+ $self->{show} = {};
+
+ foreach (@{$self->{fields}})
+ {
+ my $isShown = 1;
+ $isShown = 0 if ($self->{options}->hidden =~ m/\|$_\|/);
+ $self->{show}->{$_} = $isShown;
+ # Only set active if field exists. Works around problems caused trying
+ # to open corrupted collections
+ $self->{$_}->set_active($isShown)
+ if exists $self->{$_};
+ }
+ }
+
+ sub saveValues
+ {
+ my $self = shift;
+ $self->{show} = {};
+
+ my $hidden = '|';
+ foreach (@{$self->{fields}})
+ {
+ my $isShown = 0;
+ $isShown = 1 if $self->{$_}->get_active;
+ $self->{show}->{$_} = $isShown;
+ $hidden .= $_.'|' if !$isShown;
+ }
+ $self->{options}->hidden($hidden);
+ $self->{options}->save;
+ }
+
+ sub selectAll
+ {
+ my $self = shift;
+
+ foreach (@{$self->{fields}})
+ {
+ $self->{$_}->set_active(1);
+ }
+ }
+
+ sub initBox
+ {
+ my ($self, $box, $values) = @_;
+ $box->set_border_width(2);
+ foreach (@$values)
+ {
+ $self->{$_->{id}} = new Gtk2::CheckButton($_->{label});
+ $box->pack_start($self->{$_->{id}}, 0,0,5);
+ }
+ }
+
+ sub createComponents
+ {
+ my $self = shift;
+
+ $self->{tabs} = Gtk2::Notebook->new();
+ $self->{tabs}->set_border_width(12);
+ foreach (@{$self->{fieldsInfo}})
+ {
+ my $frame = new Gtk2::Frame();
+ $frame->set_shadow_type('none');
+ $frame->set_border_width($GCUtils::margin);
+ $frame->set_label_align(1.0, 0.0);
+ my $vbox = new Gtk2::VBox(0,0);
+ $self->initBox($vbox, $_->{items});
+ my $scroll = new Gtk2::ScrolledWindow;
+ $scroll->set_policy ('automatic', 'automatic');
+ $frame->add($scroll);
+ $scroll->add_with_viewport($vbox);
+ $scroll->set_shadow_type('none');
+ $scroll->child->set_shadow_type('none');
+ $self->{tabs}->append_page($frame, $_->{title});
+ }
+
+ $self->{hboxActions} = new Gtk2::HBox(0,0);
+ my $allButton = new Gtk2::Button($self->{lang}->{DisplayOptionsAll});
+ $allButton->signal_connect( clicked => sub {
+ $self->selectAll;
+ });
+ $self->{hboxActions}->pack_end($allButton,1,0,20);
+
+ $self->vbox->pack_start($self->{tabs}, 1, 1, 2);
+ $self->vbox->pack_start($self->{hboxActions}, 0, 0, 10);
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPanel.pm b/lib/gcstar/GCPanel.pm
new file mode 100644
index 0000000..756ee65
--- /dev/null
+++ b/lib/gcstar/GCPanel.pm
@@ -0,0 +1,1540 @@
+package GCPanel;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+use utf8;
+use Gtk2;
+use GCBorrowings;
+use GCGraphicComponents::GCBaseWidgets;
+
+use strict;
+
+{
+ package GCItemPanel;
+ @GCItemPanel::ISA = ('Gtk2::Frame');
+
+ sub new
+ {
+ my ($proto, $parent, $options, $layout) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+
+ $self->{disableBorrowerChange} = 0;
+ $self->{autoUpdate} = 1;
+ $self->{previouslyHidden} = 0;
+
+ $self->{expanders} = [];
+ $self->{dateFields} = [];
+ $self->{longTextFields} = [];
+ $self->{formatted} = [];
+ #Stores for each fields the widgets which depends on it
+ # (used for formatted and launcher)
+ $self->{dependencies} = {};
+
+ $self->{parent} = $parent;
+ $self->{lang} = $parent->{lang};
+ $self->{options} = $options;
+ $self->{layout} = $layout;
+ $self->set_shadow_type('none');
+
+ #$self->{defaultImage} = $parent->getDefaultImage;
+ $self->{tooltips} = $parent->{tooltips};
+
+ $self->{infoBox} = new Gtk2::VBox(1,0);
+ $self->{viewAllBox} = new Gtk2::EventBox;
+ $self->{viewAllVBox} = new Gtk2::VBox(0,0);
+ $self->{viewAll} = new Gtk2::HBox(0,0);
+ $self->{viewAllButton} = new Gtk2::Button->new_from_stock('gtk-refresh');
+ $self->{viewAll}->pack_start($self->{viewAllButton},1,0,50);
+ $self->{viewAllVBox}->pack_start($self->{viewAll},0,0,0);
+ $self->{viewAllBox}->add($self->{viewAllVBox});
+ $self->{viewAllButton}->signal_connect('clicked' => sub {
+ $self->{parent}->viewAllItems;
+ });
+
+ $self->{margin} = $GCUtils::margin;
+ $self->{halfMargin} = $GCUtils::halfMargin;
+ $self->{quarterMargin} = $GCUtils::quarterMargin;
+
+ return $self;
+ }
+
+ sub loadStyles
+ {
+ my ($self, $style) = @_;
+ }
+
+
+ sub setExpandersMode
+ {
+ my ($self, $mode) = @_;
+ $_->setMode($mode)
+ foreach (@{$self->{expanders}});
+ }
+
+ sub setDateFormat
+ {
+ my ($self, $format) = @_;
+ foreach (@{$self->{dateFields}})
+ {
+ $_->setFormat($format);
+ $_->resetChanged;
+ }
+ }
+
+ sub setSpellChecking
+ {
+ my ($self, $activate, $lang) = @_;
+ foreach (@{$self->{longTextFields}})
+ {
+ $_->setSpellChecking($activate, $lang);
+ }
+ }
+
+ sub createContent
+ {
+ my ($self, $model) = @_;
+ return if $self->{model}
+ && ($self->{model}->getName eq $model->getName);
+
+ if ($self->{model})
+ {
+ my @children = $self->{mainBox}->get_children;
+ $self->{mainBox}->remove($_) foreach (@children);
+ foreach (@{$self->{toDestroy}})
+ {
+ $_->destroy if $_;
+ }
+ }
+
+ $self->{model} = $model;
+ $self->{fieldsInfo} = $self->{model}->{fieldsInfo};
+ $self->{toDestroy} = [];
+ foreach (@{$model->{fieldsNames}})
+ {
+ $self->{$_} = $self->createItem($self->{model}->{fieldsInfo}->{$_});
+ push @{$self->{toDestroy}}, $self->{$_};
+ $self->{$_.'Label'} = $self->createLabel($self->{model}->{fieldsInfo}->{$_}, $self->{withSeparator});
+ push @{$self->{toDestroy}}, $self->{$_.'Label'};
+ }
+ $self->createSpecial;
+
+ $self->{displayedValues} = {};
+ $self->createLayout($self->{layout}, $self->{layoutBox});
+
+ $self->show_all;
+ }
+
+ sub initShow
+ {
+ my ($self, $show, $hasToShow) = @_;
+
+ $self->{show} = $show;
+
+ if ($hasToShow)
+ {
+ $self->show_all;
+ $self->{infoBox}->hide;
+ return 1;
+ }
+ else
+ {
+ $self->hide(0);
+ $self->{previouslyHidden} = 1;
+ return 0;
+ }
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->{mainBox}->show;
+ $self->{infoBox}->hide;
+ $self->setShowOption($self->{show}, 1) if $self->{previouslyHidden};
+ $self->{previouslyHidden} = 0;
+ }
+
+ sub setShowOption
+ {
+ my ($self, $show, $hasToShow) = @_;
+ return if ! $self->initShow($show, $hasToShow);
+ my %parentsToHide;
+ foreach (keys %{$show})
+ {
+ $self->{$_.'Label'}->hide if (! $show->{$_}) && ($self->{$_.'Label'});
+ my $widget = $self->{$_};
+ if ($widget)
+ {
+ if ($show->{$_})
+ {
+ # Useful for GCLinkedComponent
+ $widget->show if !$widget->isa('Gtk2::Widget');
+ #$parentsToHide{$widget->{realParent}} = 0;
+ my $parent = $widget->{realParent};
+ while ($parent)
+ {
+ $parentsToHide{$parent} = 0;
+ $parent = $parent->{realParent};
+ }
+ foreach my $dependency(@{$self->{dependencies}->{$_}})
+ {
+ $parentsToHide{$dependency->{realParent}} = 0;
+ }
+ }
+ else
+ {
+ $widget->hide;
+ $parentsToHide{$widget->{realParent}} = $widget->{realParent} if ! exists $parentsToHide{$widget->{realParent}};
+ foreach my $dependency(@{$self->{dependencies}->{$_}})
+ {
+ $dependency->hide;
+ }
+ }
+ }
+ }
+
+ foreach (keys %parentsToHide)
+ {
+ if ($parentsToHide{$_})
+ {
+ $parentsToHide{$_}->hide;
+ $parentsToHide{$_}->{realParent}->hide
+ if ($parentsToHide{$_}->{realParent})
+ && ($parentsToHide{$_}->{realParent}->isa('GCExpander'));
+ }
+ }
+
+ $self->setShowOptionForSpecials($show, $hasToShow);
+ }
+
+ sub setShowOptionForSpecials
+ {
+ my ($self, $show, $hasToShow) = @_;
+ }
+
+ sub hide
+ {
+ my ($self, $filtering) = @_;
+ $self->{infoBox}->show_all;
+ if ($filtering)
+ {
+ $self->{warning}->set_markup('<b>'.$self->{lang}->{AllItemsFiltered}.'</b>');
+ }
+ else
+ {
+ $self->{warning}->set_markup($self->{lang}->{Warning}) if !$filtering;
+ $self->{viewAllBox}->hide;
+ }
+ $self->{mainBox}->hide;
+ }
+
+ sub showMe
+ {
+ my $self = shift;
+ my $parent = $self->parent;
+ while ($parent)
+ {
+ last if ($parent->isa('Gtk2::Window'));
+ $parent = $parent->parent;
+ }
+ $parent->present if $parent;
+ }
+
+ sub isReadOnly
+ {
+ return 1;
+ }
+
+ sub getAsHash
+ {
+ my $self = shift;
+ my $hash = {};
+ $hash->{$_} = $self->$_ foreach(@{$self->{parent}->{model}->{fieldsNames}});
+ return $hash;
+ }
+
+ sub getValue
+ {
+ my ($self, $field) = @_;
+
+ return $self->$field;
+ }
+
+ sub disableBorrowerChange
+ {
+ my $self = shift;
+ $self->{disableBorrowerChange} = 1;
+ }
+
+ sub disableAutoUpdate
+ {
+ my $self = shift;
+ $self->{autoUpdate} = 0;
+ }
+
+ sub dataChanged
+ {
+ my ($self, $info, $withoutPanel) = @_;
+
+ if (!$withoutPanel)
+ {
+ foreach (@{$self->{expanders}})
+ {
+ $self->setExpanderLabel($_, 1);
+ }
+ }
+ foreach (@{$self->{formatted}})
+ {
+ $self->setFormattedLabel($_, 1, $info, $withoutPanel);
+ }
+ }
+
+ sub createLabel
+ {
+ my ($self, $info, $withSeparator) = @_;
+
+ my $label = $self->{model}->getDisplayedText($info->{label});
+ $label .= $self->{parent}->{lang}->{Separator} if $withSeparator;
+ my $widget = new Gtk2::Label($label);
+ $widget->set_alignment(0, 0.5);
+ return $widget;
+ }
+
+ sub createExpander
+ {
+ my ($self, $label) = @_;
+
+ return new GCExpander($label);
+ }
+
+ sub formatLabel
+ {
+ my ($self, $format, $info) = @_;
+
+ my $label = $format;
+
+ # Remove from format conditional part using this format:
+ # =field.....=
+ $label =~ s/\=(\w*)([^\=]*)\=/($self->{show}->{$1}) ? $2 : ''/eg;
+
+ # Allow formatting using %fields[format]%
+ if ($info)
+ {
+ $label =~ s/%(.*?)(\[(.*?)\])*%/$3 ? sprintf($3,$info->{$1}) : $info->{$1}/eg;
+ }
+ else
+ {
+ $label =~ s/%(.*?)(\[(.*?)\])*%/$3 ? sprintf($3,$self->{$1}->getValue(1)) : $self->{$1}->getValue(1)/eg;
+ }
+ if ($label =~ /^=(.*)$/)
+ {
+ $label = eval $1;
+ }
+
+ $label =~ s/@(.*?)@/$self->{model}->getDisplayedText($1)/eg;
+
+ # Strings between ^ cannot be on the end or on the beginning.
+ # Typically used for separators
+ $label =~ s/^\^([^\^]*)\^//;
+ $label =~ s/\^([^\^]*)\^$//;
+ $label =~ s/\^//g;
+
+ return $label;
+ }
+
+ sub setExpanderLabel
+ {
+ my ($self, $expander, $init) = @_;
+
+ if ($expander->{collapsedTemplate}
+ && ($expander->get_expanded xor $init))
+ {
+ my $label = $self->formatLabel($expander->{collapsedTemplate});
+ $expander->setValue($expander->{originalLabel}.($label ? $self->{parent}->{lang}->{Separator} : ""),
+ $self->formatLabel($expander->{collapsedTemplate}));
+ }
+ else
+ {
+ $expander->setValue($expander->{originalLabel});
+ }
+ }
+
+ sub setAsFormatted
+ {
+ my ($self, $widget, $name, $format) = @_;
+ $widget->{format} = $format;
+ $widget->{name} = $name;
+ push @{$self->{formatted}}, $widget;
+ while ($format =~ /%(.*?)%/g)
+ {
+ push @{$self->{dependencies}->{$1}}, $widget;
+ }
+ }
+
+ sub setFormattedLabel
+ {
+ my ($self, $label, $init, $info, $withoutPanel) = @_;
+
+ my $name = $label->{name};
+ if ($withoutPanel)
+ {
+ $info->{$name} = $self->formatLabel($label->{format}, $info);
+ }
+ else
+ {
+ $self->$name($self->formatLabel($label->{format}));
+ # We store here the value so it could be used by caller if needed
+ # The user is GCData::updateSelectedItemInfoFromPanel
+ $info->{$name} = $self->$name if defined $info;
+ }
+ }
+
+ sub prepareDate
+ {
+ my ($self, $value) = @_;
+
+ return GCUtils::timeToStr($value, $self->{parent}->{options}->dateFormat)
+ }
+
+ sub addToContainer
+ {
+ my ($self, $container, $widget, $info) = @_;
+ $info->{expand} = 'default' if !exists $info->{expand};
+ if ($container->isa('Gtk2::Notebook'))
+ {
+ $container->append_page($widget,
+ $self->{model}->getDisplayedText($info->{title}));
+ }
+ elsif ($container->isa('Gtk2::Table'))
+ {
+ my $left = $info->{col};
+ my $right = $left + ($info->{colspan} ? $info->{colspan} : 1);
+ my $top = $info->{row};
+ my $bottom = $top + ($info->{rowspan} ? $info->{rowspan} : 1);
+ my $fill = [];
+ push @$fill, 'fill' if $info->{expand} ne 'false';
+ push @$fill, 'expand' if $info->{expand} eq 'true';
+ if ($info->{expand} eq 'shrink')
+ {
+ $fill = ['expand', 'fill'];
+ my $hbox = new Gtk2::HBox(0,0);
+ $hbox->pack_start($widget,0,0,0);
+ $widget = $hbox;
+ }
+ if ($info->{expand} eq 'horizontal')
+ {
+ $container->attach($widget,
+ $left, $right, $top, $bottom,
+ ['expand', 'fill'], [],
+ 0, 0);
+ }
+ else
+ {
+ $container->attach($widget,
+ $left, $right, $top, $bottom,
+ $fill, $fill,
+ 0, 0);
+ }
+ }
+ else
+ {
+ my $expand = ($info->{expand} eq 'true') ? 1 : 0;
+ if ($container->isa('Gtk2::VBox'))
+ {
+ my $margin = $self->{halfMargin};
+ $margin = 0 if (exists $info->{nomargin}) && ($info->{nomargin} eq 'true');
+ if ((exists $info->{place}) && ($info->{place} eq 'end'))
+ {
+ $container->pack_end($widget, $expand, $expand, $margin);
+ }
+ else
+ {
+ $container->pack_start($widget, $expand, $expand, $margin);
+ }
+ }
+ else
+ {
+ my $margin = $self->{halfMargin};
+ $margin = 0 if (exists $info->{nomargin}) && ($info->{nomargin} eq 'true');
+ if (($container->get_children) && (!$container->get_homogeneous) && ($margin > 0))
+ {
+ my $marginBox = new Gtk2::HBox(0,0);
+ $container->pack_start($marginBox, 0, 0, $margin);
+ }
+ $container->pack_start($widget, $expand, $expand, 0)
+ if ref($widget) ne 'HASH';
+ }
+ }
+ }
+
+ sub setWidgetStyle
+ {
+ my ($self, $widget, $name, $style) = @_;
+ }
+
+ sub getWidget
+ {
+ my ($self, $field, $info) = @_;
+ return $self->{$field};
+ }
+
+ sub createLayout
+ {
+ my ($self, $xml, $container, $parent, $noTab) = @_;
+ #
+ foreach (@{$xml->{item}})
+ {
+ my $widget;
+ my $box;
+ my $isContainer = 0;
+
+ # TODO We should return an error here
+ $_->{type} = 'default' if ! exists $_->{type};
+
+ if ($_->{type} eq 'formatted')
+ {
+ my $info = {};
+ $info->{type} = 'short text';
+ $info->{value} = $_->{name};
+ $widget = $self->createItem($info);
+ $self->{$_->{name}} = $widget;
+ $self->setAsFormatted($widget, $_->{name}, $_->{value});
+ $_->{for} = $widget->{name};
+ }
+ elsif ($_->{type} eq 'value')
+ {
+ $widget = $self->getWidget($_->{for}, $_);
+ if ($widget)
+ {
+ $widget->setWidth($_->{width}) if $_->{width};
+ $widget->setHeight($_->{height}) if $_->{height};
+ $widget->expand if (exists $_->{expand}) && ($_->{expand} eq 'true');
+ if ($_->{values} || $self->{model}->{fieldsInfo}->{$_->{for}}->{values})
+ {
+ $self->{displayedValues}->{$_->{for}} =
+ $_->{values}
+ || $self->{model}->{fieldsInfo}->{$_->{for}}->{values};
+ }
+ # If the item is related to another, it has to be hidden with it
+ if (exists $self->{model}->{fieldsInfo}->{$_->{for}}->{relatedto})
+ {
+ my $relatedTo = $self->{model}->{fieldsInfo}->{$_->{for}}->{relatedto};
+ push @{$self->{dependencies}->{$relatedTo}}, $widget;
+ }
+ }
+ }
+ elsif ($_->{type} eq 'label')
+ {
+ if ($_->{for})
+ {
+ $widget = $self->{$_->{for}.'Label'};
+ }
+ else
+ {
+ $widget = $self->createLabel($_, $self->{withSeparator});
+ }
+ if ((exists $_->{align}) && ($_->{align} eq 'center'))
+ {
+ $widget->set_alignment(0.5, 0.5);
+ if ($self->{withSeparator})
+ {
+ my $label = $widget->get_label;
+ my $sep = $self->{parent}->{lang}->{Separator};
+ $label =~ s/$sep$//;
+ $widget->set_label($label);
+ }
+ }
+ $widget->set_alignment(0, 0) if (exists $_->{align}) && ($_->{align} eq 'top');
+ }
+ elsif ($_->{type} eq 'special')
+ {
+ $widget = $self->{$_->{for}};
+ $widget->{param} = $_->{param};
+ }
+ elsif ($_->{type} eq 'launcher')
+ {
+ my $valueWidget = $self->{$_->{for}};
+ my $format = $self->{model}->{fieldsInfo}->{$_->{for}}->{format};
+
+ # If the launcher is for a video or music file, label the button 'play'
+ if (($format eq 'video') || ($format eq 'audio'))
+ {
+ $widget = Gtk2::Button->new_from_stock('gtk-media-play');
+ }
+ elsif ($format eq 'program')
+ {
+ # For program launchers, label the button 'launch'
+ $widget = Gtk2::Button->new($self->{parent}->{lang}->{PanelLaunch});
+ }
+ else
+ {
+ # Label the button 'open'
+ $widget = Gtk2::Button->new_from_stock('gtk-open');
+ }
+
+ $widget->signal_connect('clicked' => sub {
+ $self->{parent}->launch($valueWidget->getValue, $format);
+ });
+ push @{$self->{dependencies}->{$_->{for}}}, $widget;
+ }
+ elsif ($_->{type} eq 'extractor')
+ {
+ $widget = Gtk2::Button->new($self->{parent}->{lang}->{ExtractButton});
+ my $valueWidget = $self->{$_->{for}};
+ $widget->signal_connect('clicked' => sub {
+ $self->{parent}->extractInfo($valueWidget->getValue, $self);
+ });
+ push @{$self->{dependencies}->{$_->{for}}}, $widget;
+ }
+ elsif ($_->{type} eq 'line')
+ {
+ my $homogeneous = (exists $_->{homogeneous} && ($_->{homogeneous} eq 'true'))
+ ? 1 : 0;
+ $widget = new Gtk2::HBox($homogeneous, $self->{margin});
+ #$widget->set_border_width($self->{halfMargin});
+ $widget->set_size_request(-1, $_->{height}) if $_->{height};
+ $box = $widget;
+ $isContainer = 1;
+ }
+ elsif ($_->{type} eq 'box')
+ {
+ $widget = new Gtk2::VBox(0,0);
+ #$widget->set_border_width($self->{halfMargin});
+ $box = $widget;
+ if ($_->{width})
+ {
+# $widget = new Gtk2::EventBox;
+# $widget->add($box);
+ $widget->set_size_request($_->{width}, -1);
+ }
+ $isContainer = 1;
+ }
+ elsif ($_->{type} eq 'notebook')
+ {
+ if ($noTab)
+ {
+ $widget = new Gtk2::VBox(0,0);
+ }
+ else
+ {
+ $widget = new Gtk2::Notebook;
+ }
+ #$widget->set_border_width($self->{margin});
+ $box = $widget;
+ $isContainer = 1;
+ }
+ elsif ($_->{type} eq 'tab')
+ {
+ $widget = new Gtk2::VBox(0,0);
+ if ($noTab)
+ {
+ my $label = new Gtk2::Label;
+ $label->set_markup('<b>'.$self->{model}->getDisplayedText($_->{title}).'</b>');
+ $label->set_alignment(0,0);
+ $widget->pack_start($label, 0, 0, 0);
+ $widget->set_border_width(0);
+ $box = new Gtk2::VBox(0,0);
+ $box->set_border_width($self->{margin});
+ $widget->pack_start($box, 1, 1, 0);
+ }
+ else
+ {
+ $widget->set_border_width($self->{margin});
+ $box = $widget;
+ }
+ $isContainer = 1;
+ }
+ elsif ($_->{type} eq 'table')
+ {
+ $widget = new Gtk2::Table($_->{rows},$_->{cols});
+ #$widget->set_border_width($self->{margin});
+ $widget->set_col_spacings($self->{colSpacing});
+ $widget->set_row_spacings($self->{rowSpacing});
+ $box = $widget;
+ $isContainer = 1;
+ }
+ elsif ($_->{type} eq 'frame')
+ {
+ $widget = new GCGroup($self->{model}->getDisplayedText($_->{title}));
+ $widget->set_border_width(0);
+ $widget->setPadding(0);
+ $box = new Gtk2::Table($_->{rows},$_->{cols});
+ $box->set_border_width($self->{halfMargin});
+ $box->set_col_spacings($self->{margin});
+ $box->set_row_spacings($self->{halfMargin});
+ $widget->addWidget($box);
+ $isContainer = 1;
+ }
+ elsif ($_->{type} eq 'expander')
+ {
+ #$widget = new GCExpander($self->{model}->getDisplayedText($_->{title}));
+ $widget = $self->createExpander($self->{model}->getDisplayedText($_->{title}));
+ $widget->setMode($self->{parent}->{options}->expandersMode);
+ $widget->{originalLabel} = $self->{model}->getDisplayedText($_->{title});
+ $widget->{collapsedTemplate} = $_->{collapsed};
+ $self->setExpanderLabel($widget, 1);
+ $widget->signal_connect('activate' => sub {
+ $self->setExpanderLabel($widget, 0);
+ });
+ $widget->set_expanded(1) if (defined $_->{expanded}) && ($_->{expanded} eq 'true');
+ push @{$self->{expanders}}, $widget;
+ $box = new Gtk2::VBox(0,0);
+ $box->set_border_width($self->{halfMargin});
+ $widget->add($box);
+ $isContainer = 1;
+ $_->{style} = 'expander' if !exists $_->{style};
+ }
+
+ if (exists $_->{border})
+ {
+ $widget->set_border_width($_->{border});
+ }
+
+ if (exists $_->{collapse})
+ {
+ $widget->{collapse} = $_->{collapse};
+ }
+
+ if ($isContainer)
+ {
+ $self->createLayout($_, $box, $widget, $noTab);
+ }
+ push @{$self->{toDestroy}}, $widget;
+ $widget->{realParent} = $parent if $parent;
+ $self->setWidgetStyle($widget, $_->{for}, $_->{style}) if $_->{style};
+ $self->addToContainer($container, $widget, $_) if $widget;
+ }
+ }
+}
+
+{
+ package GCReadOnlyPanel;
+
+ use Glib::Object::Subclass
+ Gtk2::Frame::
+ ;
+
+ @GCReadOnlyPanel::ISA = ('GCItemPanel');
+
+ use File::Basename;
+
+ sub new
+ {
+ my ($proto, $parent, $options, $layout) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, $options, $layout);
+
+ bless ($self, $class);
+
+ $self->{withSeparator} = 0;
+ $self->{colSpacing} = $self->{quarterMargin};
+ $self->{rowSpacing} = $self->{quarterMargin};
+ $self->loadStyles($options->panelStyle);
+
+ $self->{inBox} = new Gtk2::VBox(0, 0);
+ $self->{inBox}->set_border_width($self->{margin});
+
+ $self->set_name('GCItemFrame');
+
+ $self->{inBox} = new Gtk2::VBox(0, 0);
+ my $hboxMargins = new Gtk2::HBox(0,0);
+ $hboxMargins->pack_start($self->{inBox}, 1, 1, 50);
+ $self->{mainBox} = new Gtk2::EventBox;
+ $self->{mainBox}->modify_bg('normal', $self->{styles}->{page}->{bgColor});
+ $self->{mainBox}->add($hboxMargins);
+
+ my $realMain = new Gtk2::VBox(0,0);
+
+# GCUtils::setWidgetPixmap($self->{mainBox},$ENV{GCS_SHARE_DIR}.'/logos/splash.png');
+
+# $self->{backgroundPixbuf} = Gtk2::Gdk::Pixbuf->new_from_file($ENV{GCS_SHARE_DIR}.'/logos/splash.png');
+# $self->{mainBox}->signal_connect('expose-event' => sub {
+# $self->paintBg;
+# });
+
+ $realMain->pack_start($self->{mainBox},1,1,0);
+
+ $self->{layoutBox} = $self->{inBox};
+
+ $self->add($realMain);
+ $self->show_all;
+
+
+ $self->{warning} = new Gtk2::Label;
+
+ $self->{infoBox}->pack_start($self->{warning},1,1,0);
+ $self->{infoBox}->pack_start($self->{viewAllBox},1,1,0);
+ $realMain->pack_start($self->{infoBox},1,1,0);
+
+ return $self;
+ }
+
+ sub loadStyles
+ {
+ my ($self, $style) = @_;
+
+ $self->{styles} = {};
+ my $styleFile = $ENV{GCS_SHARE_DIR}.'/panels/'.$style;
+
+ open STYLE, $styleFile;
+ while (<STYLE>)
+ {
+ chomp;
+ next if !$_;
+ m/^(.*?)\s*=\s*(.*)$/;
+ my $item = $1;
+ (my $value = $2) =~ s/^"(.*?)"$/$1/;
+ $item =~ /(.*?)(Bg|Color|Style|Justify|Arrow|Prelight)/;
+ my $comp = $1;
+ my $style = lc $2;
+ $self->{styles}->{$comp}->{$style} = $value;
+ }
+ close STYLE;
+ foreach (keys %{$self->{styles}})
+ {
+ $self->{styles}->{$_}->{bgColor} = Gtk2::Gdk::Color->parse($self->{styles}->{$_}->{bg});
+ $self->{styles}->{$_}->{style} = $self->{styles}->{$_}->{style}
+ . " foreground='".$self->{styles}->{$_}->{color}."'";
+ }
+ #$self->{styles}->{invisible}->{}
+ }
+
+ sub deactivate
+ {
+ my $self = shift;
+ }
+
+ sub getValues
+ {
+ my ($self, $field) = @_;
+ if ($field eq $self->{model}->{commonFields}->{borrower}->{name})
+ {
+ my $borrowers = $self->{model}->getValues($self->{model}->{commonFields}->{borrower}->{name});
+ shift @{$borrowers} if !$borrowers->[0]->{displayed};
+ return $borrowers;
+ }
+ else
+ {
+ return $self->{$field}->getValues;
+ }
+ }
+
+
+ sub selectTitle
+ {
+ my $self = shift;
+ $self->myRealize;
+ }
+
+# sub paintBg
+# {
+# my $self = shift;
+# my $window = $self->{mainBox}->window;
+# $self->{mainBox}->set_app_paintable(1);
+# if (! $self->{gcMain})
+# {
+# $self->{gcMain} = Gtk2::Gdk::GC->new($window);
+# }
+# $window->draw_pixbuf($self->{gcMain}, $self->{backgroundPixbuf}, 0, 0, 0, 0, -1, -1, "none", 5, 5);
+# }
+
+ sub setBorrowers
+ {
+ my ($self) = @_;
+ }
+
+ sub createSpecial
+ {
+ my $self = shift;
+ }
+
+ sub createLabel
+ {
+ my ($self, $info) = @_;
+
+ my $label = $self->{model}->getDisplayedText($info->{label});
+ my $widget = new GCColorLabel($self->{styles}->{label}->{bgColor});
+ $widget->set_selectable(0);
+ $widget->set_padding(5,5);
+ $widget->set_justify('fill');
+ $widget->set_markup("<span ".$self->{styles}->{label}->{style}.">".$label.'</span>');
+ return $widget;
+ }
+
+ sub createExpander
+ {
+ my ($self, $label) = @_;
+
+ return new GCColorExpander($label,
+ $self->{styles}->{expander}->{bgColor},
+ $self->{styles}->{expander}->{style});
+ }
+
+ sub setWidgetStyle
+ {
+ my ($self, $widget, $name, $style) = @_;
+ $self->{style}->{$name} = $style;
+ if ($self->{styles}->{$style}->{bgColor})
+ {
+ $widget->modify_bg('normal', $self->{styles}->{$style}->{bgColor});
+ }
+
+ if ($widget->isa('GCColorLabel') || $widget->isa('GCColorText'))
+ {
+ my $justify = $self->{styles}->{$style}->{justify};
+ $widget->set_justify($justify) if $justify;
+ }
+
+ if ($widget->isa('GCColorExpander'))
+ {
+ my $arrowColor = Gtk2::Gdk::Color->parse($self->{styles}->{expander}->{arrow});
+ my $prelightColor;
+ if (exists $self->{styles}->{expander}->{prelight})
+ {
+ $prelightColor = Gtk2::Gdk::Color->parse($self->{styles}->{expander}->{prelight});
+ }
+ else
+ {
+ $prelightColor = $self->{styles}->{expander}->{bgColor};
+ }
+
+ $widget->modify_bg('prelight', $prelightColor);
+ $widget->get_label_widget->modify_bg('prelight', $prelightColor);
+ $widget->modify_fg('normal', $arrowColor);
+ $widget->modify_fg('prelight', $arrowColor);
+ }
+ }
+
+ sub createItem
+ {
+ my ($self, $info) = @_;
+
+ my $widget;
+
+ if ($info->{type} eq 'long text')
+ {
+ $widget = new GCColorText($self->{styles}->{field}->{bgColor}, 0);
+ $self->{style}->{$info->{value}} = 'field';
+ }
+ elsif ($info->{type} eq 'image')
+ {
+ $widget = new GCItemImage($self->{parent}->{options},
+ $self->{parent});
+ }
+ elsif ($info->{type} eq 'button')
+ {
+ $widget = new GCButton($self->{model}->getDisplayedText($info->{label}));
+ }
+ elsif($info->{type} =~ /list$/o)
+ {
+ my $number = GCUtils::listNameToNumber($info->{type});
+ my @labels;
+ for my $i (1..$number)
+ {
+ push @labels, $self->{model}->getDisplayedText($info->{'label'.$i});
+ }
+ $widget = new GCColorTable($number, \@labels,
+ $self->{styles}->{label},
+ $self->{styles}->{field},
+ $self->{model}->getDisplayedText($info->{label}));
+ }
+ elsif ($info->{type} eq 'url')
+ {
+ $widget = new GCColorLink($self->{styles}->{field}->{bgColor}, $self->{parent});
+ $self->{style}->{$info->{value}} = 'field';
+ $widget->set_selectable(0);
+ }
+ else
+ {
+ # See GCColorLabel constructor for the meaning of listType;
+ $widget = new GCColorLabel($self->{styles}->{field}->{bgColor});
+ if ($info->{value} eq $self->{model}->{commonFields}->{borrower}->{name})
+ {
+ $self->{prepare}->{$info->{value}}->{func} = 'prepareBorrower';
+ }
+ elsif ($info->{type} eq 'date')
+ {
+ $self->{prepare}->{$info->{value}}->{func} = 'prepareDate';
+ }
+ $self->{style}->{$info->{value}} = 'field';
+ $widget->set_selectable(0);
+ $widget->set_padding(5,5);
+ $widget->set_justify('fill');
+ $self->setAsFormatted($widget, $info->{value}, $info->{init})
+ if ($info->{type} eq 'formatted');
+ }
+ $widget->{name} = $info->{value};
+ return $widget;
+ }
+
+ sub getWidget
+ {
+ my ($self, $field, $info) = @_;
+
+ my $widget = $self->{$field};
+ if ($info->{height} && $widget->isa('GCColorLabel'))
+ {
+ my $style = $info->{style};
+ $style = 'field' if !$style;
+ $widget->destroy;
+ $widget = new GCColorText($self->{styles}->{$style}->{bgColor}, 0);
+ $widget->{name} = $self->{$field}->{name};
+ $self->{$field} = $widget;
+ }
+ elsif ($widget->isa('GCColorTable') && ($info->{flat} eq 'true'))
+ {
+ my $columns = $widget->{number};
+ $widget->destroy;
+ $self->{prepare}->{$field}->{func} = 'prepareMultipleList';
+ $self->{prepare}->{$field}->{extra} = $columns;
+ if ($info->{height})
+ {
+ $widget = new GCColorText($self->{styles}->{field}->{bgColor}, 0, $columns);
+ }
+ else
+ {
+ $widget = new GCColorLabel($self->{styles}->{field}->{bgColor}, $columns);
+ $widget->set_selectable(0);
+ $widget->set_padding(5,5);
+ $widget->set_justify('fill');
+ }
+ $self->{style}->{$field} = 'field';
+ $self->{$field} = $widget;
+ }
+
+ return $widget;
+ }
+
+ sub prepareMultipleList
+ {
+ my ($self, $value, $extra) = @_;
+ return GCPreProcess::multipleList($value, $extra);
+ }
+
+ sub prepareBorrower
+ {
+ my ($self, $value) = @_;
+
+ $value = $self->{lang}->{PanelNobody} if $value eq 'none';
+ $value = $self->{lang}->{PanelUnknown} if $value eq 'unknown';
+ return $value;
+ }
+
+ sub AUTOLOAD
+ {
+ return if our $AUTOLOAD =~ /::DESTROY$/;
+ (my $name = $AUTOLOAD) =~ s/.*?::(.*)/$1/;
+ return if !$name;
+ no strict 'refs';
+
+ *{$AUTOLOAD} = sub {
+ my $self = shift;
+ return 0 if !$self->{$name};
+ return $self->{$name.'Value'}
+ if !(scalar @_);
+ my $text = shift;
+ $self->{$name.'Value'} = $text;
+ if (my $func = $self->{prepare}->{$name}->{func})
+ {
+ $text = $self->$func($text, $self->{prepare}->{$name}->{extra});
+ }
+ $text = ' ' if ! defined $text;
+ $text = $self->{model}->getDisplayedValue($self->{displayedValues}->{$name}, $text)
+ if ($self->{displayedValues}->{$name});
+ if ($self->{$name})
+ {
+ # Hide collapsible fields if the field is empty
+ if (($text !~ m/\S+/) && ($self->{$name}->{collapse}))
+ {
+ $self->{$name}->hide;
+ }
+ else
+ {
+ # Otherwise, make sure the field is shown
+ $self->{$name}->show;
+ }
+
+ if ($self->{$name}->acceptMarkup)
+ {
+ $self->{$name}->setMarkup("<span ".
+ $self->{styles}->{$self->{style}->{$name}}->{style}.
+ ">".$self->{$name}->cleanMarkup($text, 1).'</span>');
+ }
+ else
+ {
+ $self->{$name}->setValue($text);
+ }
+ #$self->{$name}->resetChanged;
+ }
+ };
+ goto &{$AUTOLOAD};
+ }
+}
+
+
+{
+ package GCFormPanel;
+
+ use Glib::Object::Subclass
+ Gtk2::Frame::
+ ;
+ @GCFormPanel::ISA = ('GCItemPanel');
+
+ sub createSpecial
+ {
+ my $self = shift;
+
+ $self->{mailButton} = new GCButton($self->{parent}->{lang}->{MailTitle});
+ $self->{mailButton}->signal_connect('clicked' => sub {
+ $self->sendBorrowerEmail;
+ });
+ push @{$self->{toDestroy}}, $self->{mailButton};
+
+ $self->{itemBackButton} = new GCButton($self->{parent}->{lang}->{PanelReturned});
+ $self->{itemBackButton}->signal_connect('clicked' => sub {
+ $self->itemBack;
+ });
+ push @{$self->{toDestroy}}, $self->{mailButton};
+
+ $self->{searchButton} = GCButton->newFromStock('gtk-jump-to');
+ $self->{searchButton}->signal_connect('clicked' => sub {
+ $self->searchItem;
+ });
+ my @subMenuSearch;
+ $subMenuSearch[0]=Gtk2::ImageMenuItem->new_with_mnemonic($self->{parent}->{lang}->{PanelSearchContextChooseOne});
+ $subMenuSearch[0]->signal_connect("activate" , sub {$self->searchItem('ask')});
+
+ $subMenuSearch[1]=Gtk2::ImageMenuItem->new_with_mnemonic($self->{parent}->{lang}->{PanelSearchContextMultiSite});
+ $subMenuSearch[1]->signal_connect("activate" ,sub {$self->searchItem('multi')});
+
+ $subMenuSearch[2]=Gtk2::ImageMenuItem->new_with_mnemonic($self->{parent}->{lang}->{PanelSearchContextMultiSitePerField});
+ $subMenuSearch[2]->signal_connect("activate" ,sub {$self->searchItem('multiperfield')});
+
+ $subMenuSearch[3]=Gtk2::ImageMenuItem->new_with_mnemonic($self->{parent}->{lang}->{PanelSearchContextOptions});
+ $subMenuSearch[3]->signal_connect("activate" ,sub {$self->{parent}->options(0,3)});
+
+ $self->{searchButton}->setContextMenu(\@subMenuSearch);
+ $self->{searchButton}->enableContextMenu;
+ $self->{tooltips}->set_tip($self->{searchButton}, $self->{parent}->{lang}->{PanelSearchTip}, '');
+ push @{$self->{toDestroy}}, $self->{searchButton};
+
+ $self->{deleteButton} = GCButton->newFromStock('gtk-delete');
+ $self->{deleteButton}->signal_connect("clicked" => \&deleteItem, $self);
+ $self->{tooltips}->set_tip($self->{deleteButton}, $self->{parent}->{lang}->{PanelRemoveTip}, '');
+ push @{$self->{toDestroy}}, $self->{deleteButton};
+
+ $self->{refreshButton} = new GCButton($self->{parent}->{lang}->{PanelRefresh});
+ $self->{refreshButton}->signal_connect("clicked" => sub {
+ $self->searchItem('refresh');
+ });
+ $self->{tooltips}->set_tip($self->{refreshButton}, $self->{parent}->{lang}->{PanelRefreshTip}, '');
+ push @{$self->{toDestroy}}, $self->{refreshButton};
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $options, $layout) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, $options, $layout);
+
+ bless ($self, $class);
+
+ $self->{withSeparator} = 1;
+ $self->{locked} = 0;
+ $self->{colSpacing} = $self->{margin};
+ $self->{rowSpacing} = $self->{halfMargin};
+
+ $self->{mainBox} = new Gtk2::VBox(0, 0);
+ $self->{mainBox}->set_border_width($self->{margin});
+
+ $self->set_name('GCItemFrame');
+
+ my $realMain = new Gtk2::VBox(0,0);
+
+ $realMain->pack_start($self->{mainBox},1,1,0);
+ $self->{layoutBox} = $self->{mainBox};
+
+ $self->add($realMain);
+ $self->show_all;
+
+ $self->{warning} = new Gtk2::Label;
+
+ $self->{infoBox}->pack_start($self->{warning},1,1,0);
+ $self->{infoBox}->pack_start($self->{viewAllBox},1,1,0);
+ $realMain->pack_start($self->{infoBox},1,1,0);
+
+ return $self;
+ }
+
+ sub isReadOnly
+ {
+ return 0;
+ }
+
+ sub searchItem
+ {
+ my ($self, $pluginType) = @_;
+
+ #$self->{parent}->searchItemForPanel($self->{$self->{model}->{commonFields}->{title}}->getValue, $self);
+ if ($pluginType eq 'refresh')
+ {
+ $self->{parent}->refreshItemForPanel($self, $self->{$self->{model}->{commonFields}->{url}}->getValue);
+ }
+ else
+ {
+ $self->{parent}->searchItemForPanel($self, $pluginType);
+ $self->showMe;
+ }
+ }
+
+ sub checkBorrowerButtons
+ {
+ my $self = shift;
+ my $borrowerField = $self->{model}->{commonFields}->{borrower}->{name};
+ return if ! $self->{$borrowerField};
+ my $locked = (($self->{$borrowerField}->getValue eq 'none')
+ || ($self->{$borrowerField}->getValue eq 'unknown'));
+ $self->{mailButton}->lock($locked)
+ if $self->{mailButton};
+ $locked = ($self->{locked} || ($self->{$borrowerField}->getValue eq 'none'));
+ $self->{itemBackButton}->lock($locked)
+ if $self->{itemBackButton};
+ }
+
+ sub itemBack
+ {
+ my $self = shift;
+
+ my $isBack = 0;
+ my $dialog = new GCDateSelectionDialog($self->{parent}, $self->{lang}->{PanelReturned});
+ if ($dialog->show)
+ {
+ my $borrowerField = $self->{model}->{commonFields}->{borrower}->{name};
+ my $lendDateField = $self->{model}->{commonFields}->{borrower}->{date};
+ my $borrowingsField = $self->{model}->{commonFields}->{borrower}->{history};
+ my $coverField = $self->{model}->{commonFields}->{cover};
+ my @data = ($self->{$borrowerField}->getDisplayedValue,
+ $self->{$lendDateField}->getValue,
+ $dialog->date);
+ foreach (@data[1..2])
+ {
+ $_ = $self->prepareDate($_);
+ }
+ $self->{$borrowingsField}->addValues(@data);
+ my $previous = $self->getAsHash;
+ $self->{$borrowerField}->setValue('none');
+ $self->{$lendDateField}->clear;
+ my $new = $self->getAsHash;
+ $self->{parent}->{itemsView}->changeCurrent($previous, $new, $self->{parent}->{items}->getCurrent, 1)
+ if $self->$coverField;
+ $isBack = 1;
+ }
+ $self->showMe;
+ return $isBack;
+ }
+
+ sub lock
+ {
+ my ($self, $value) = @_;
+ $self->changeState($self, $value);
+ }
+
+ sub deactivate
+ {
+ my $self = shift;
+ $self->changeState($self,1);
+ }
+
+ sub changeState
+ {
+ my ($caller, $self, $locked) = @_;
+ $locked = 1 if $self->{parent}->{items}->getLock;
+ return if $self->{locked} == $locked;
+ $self->{locked} = $locked;
+ my $info;
+ foreach (@{$self->{parent}->{model}->{fieldsNames}})
+ {
+ $info = $self->{model}->{fieldsInfo}->{$_};
+ next if $info->{type} eq 'button';
+ $self->{$_}->lock($locked) if ($self->{$_});
+ }
+
+ $self->{searchButton}->lock($locked);
+ $self->checkBorrowerButtons;
+ $self->{deleteButton}->lock($locked);
+ $self->{refreshButton}->lock($locked);
+ }
+
+ sub setShowOptionForSpecials
+ {
+ my ($self, $show, $hasToShow) = @_;
+
+ if (! $show->{$self->{model}->{commonFields}->{borrower}->{name}})
+ {
+ $self->{mailButton}->hide;
+ $self->{itemBackButton}->hide;
+ }
+ }
+
+ sub setBorrowers
+ {
+ my $self = shift;
+
+ return if ! $self->{borrowerControl};
+
+ my $borrowers = $self->{model}->getValues($self->{model}->{commonFields}->{borrower}->{name});
+ shift @{$borrowers} if !$borrowers->[0]->{displayed};
+ $self->{borrowerControl}->setValues($borrowers);
+
+ return;
+ }
+
+ sub sendBorrowerEmail
+ {
+ use GCDialogs;
+
+ my $self = shift;
+
+ my %info;
+ $info{title} = $self->{$self->{model}->{commonFields}->{title}}->getValue;
+ $info{borrower} = $self->{$self->{model}->{commonFields}->{borrower}->{name}}->getValue;
+ $info{lendDate} = $self->prepareDate(
+ $self->{$self->{model}->{commonFields}->{borrower}->{date}}->getValue
+ );
+ $self->{parent}->sendBorrowerEmail(\%info);
+ }
+
+ sub selectTitle
+ {
+ my $self = shift;
+ my $titleField = $self->{model}->{commonFields}->{title};
+ #$self->{$titleField}->select_region(0, length($self->{$titleField}->getValue));
+ $self->{$titleField}->selectAll;
+ }
+
+ sub deleteItem
+ {
+ my ($widget, $self) = @_;
+
+ $self->{parent}->deleteCurrentItem;
+ }
+
+ sub createItem
+ {
+ my ($self, $info) = @_;
+
+ my $widget;
+
+ if (exists $info->{linkedto})
+ {
+ $widget = new GCLinkedComponent($self->{$info->{linkedto}});
+ }
+ elsif ($info->{type} eq 'short text')
+ {
+ $widget = new GCShortText;
+ $widget->signal_connect('activate', sub {
+ $self->searchItem;
+ }) if $self->{model}->isSearchField($info->{value});
+ }
+ elsif ($info->{type} eq 'long text')
+ {
+ $widget = new GCLongText;
+ $widget->setSpellChecking($self->{parent}->{options}->spellCheck);
+ push @{$self->{longTextFields}}, $widget;
+ }
+ elsif ($info->{type} eq 'history text')
+ {
+ $widget = new GCHistoryText;
+ }
+ elsif ($info->{type} eq 'options')
+ {
+ $info->{values} = $info->{value} if !$info->{values};
+ if ($info->{value} eq $self->{model}->{commonFields}->{borrower}->{name})
+ {
+ $widget = new GCMenuList;
+ #When borrower not found, we use the last choice: unknown
+ $widget->setLastForDefault;
+ $self->{borrowerControl} = $widget;
+ $widget->signal_connect('changed' => sub {
+ $self->checkBorrowerButtons;
+ });
+ $self->setBorrowers;
+ }
+ else
+ {
+ $widget = new GCMenuList($self->{model}->getValues($info->{values}), $info->{separator});
+ }
+ }
+ elsif ($info->{type} =~ /list$/o)
+ {
+ my $number;
+ my $readonly = 0;
+ my $withHistory = 1;
+ my @types;
+ my @labels;
+ $withHistory = 0
+ if (exists $info->{history}) && ($info->{history} eq 'false');
+ $readonly = 1
+ if $info->{value} eq $self->{model}->{commonFields}->{borrower}->{history};
+ $number = GCUtils::listNameToNumber($info->{type});
+ @types=split / / ,$info->{subtypes} if $info->{subtypes};
+ my $typesRef = \@types;
+ undef $typesRef if scalar(@types)!=$number;
+ if ($number == 1)
+ {
+ @labels = ($self->{model}->getDisplayedText($info->{label}));
+ }
+ else
+ {
+ for my $i (1..$number)
+ {
+ push @labels, $self->{model}->getDisplayedText($info->{'label'.$i});
+ }
+ }
+ $widget = new GCMultipleList($self, $number, \@labels, $withHistory, $readonly,0,$typesRef);
+ }
+ elsif ($info->{type} eq 'checked text')
+ {
+ $widget = new GCCheckedText($info->{format});
+ $widget->signal_connect('activate', sub {
+ $self->searchItem;
+ }) if $self->{model}->isSearchField($info->{value});
+ }
+ elsif ($info->{type} eq 'number')
+ {
+ if (($info->{displayas} eq 'graphical')
+ && ($self->{parent}->{options}->useStars))
+ {
+ $widget = new GCNumeric($info->{init}, 0, $info->{max}, 0, 'graphical');
+ }
+ else
+ {
+ if ((exists $info->{min}) && ($info->{min} ne ''))
+ {
+ $widget = new GCNumeric($info->{init},
+ $info->{min},
+ $info->{max},
+ $info->{step},
+ 'text');
+ }
+ else
+ {
+ $widget = new GCCheckedText('0-9.');
+ $widget->setReadOnly
+ if ($info->{value} eq $self->{model}->{commonFields}->{id});
+ }
+ $widget->signal_connect('activate', sub {
+ $self->searchItem;
+ }) if $self->{model}->isSearchField($info->{value});
+ }
+ }
+ elsif ($info->{type} eq 'image')
+ {
+ my $img = new GCItemImage($self->{parent}->{options},
+ $self->{parent});
+ my $isCover = 0;
+ $isCover = 1 if $info->{value} eq $self->{model}->{commonFields}->{cover};
+ #$img->setImmediate if $isCover;
+ $widget = new GCImageButton($self, $img, $isCover, $info->{default});
+ }
+ elsif ($info->{type} eq 'button')
+ {
+ if ($info->{format} eq 'url')
+ {
+ $widget = new GCUrlButton($self->{model}->getDisplayedText($info->{label}),
+ $self->{parent});
+ $info->{tip} = $self->{lang}->{PanelWebTip}
+ if $info->{value} eq $self->{model}->{commonFields}->{url};
+ }
+ else
+ {
+ $widget = new GCButton($self->{model}->getDisplayedText($info->{label}));
+ }
+ }
+ elsif ($info->{type} eq 'url')
+ {
+ $widget = new GCUrl($self->{parent});
+ }
+ elsif ($info->{type} eq 'yesno')
+ {
+ $widget = new GCCheckBox($self->{model}->getDisplayedText($info->{label}));
+ }
+ elsif ($info->{type} eq 'file')
+ {
+ $widget = new GCFile($self, undef, undef, undef, undef, 1, $info->{format});
+ }
+ elsif ($info->{type} eq 'date')
+ {
+ $widget = new GCDate($self, $self->{lang}, 0,
+ $self->{parent}->{options}->dateFormat);
+ push @{$self->{dateFields}}, $widget;
+ }
+ elsif ($info->{type} eq 'formatted')
+ {
+ $widget = new GCShortText;
+ $widget->setReadOnly;
+ $self->setAsFormatted($widget, $info->{value}, $info->{init});
+ }
+ else
+ {
+ print "Invalid type : ",$info->{type}," for ",$info->{value},"\n";
+ $widget = 0;
+ }
+
+ $widget->{name} = $info->{value} if $widget;
+ $self->{tooltips}->set_tip($widget, $self->{model}->getDisplayedText($info->{tip}), '')
+ if $info->{tip};
+ $widget->activateStateTracking;
+ return $widget;
+ }
+
+ sub getValues
+ {
+ my ($self, $field) = @_;
+ return $self->{$field}->getValues
+ if exists $self->{$field};
+ return [];
+ }
+
+ sub AUTOLOAD
+ {
+ return if our $AUTOLOAD =~ /::DESTROY$/;
+ (my $name = $AUTOLOAD) =~ s/.*?::(.*)/$1/;
+ return if !$name;
+ my $self = $_[0];
+ no strict 'refs';
+ {
+ *{$AUTOLOAD} = sub {
+ my $self = shift;
+ return 0 if !$self->{$name};
+ return $self->{$name}->getValue
+ if !(scalar @_);
+ $self->{$name}->setValue(shift);
+ };
+ }
+ goto &{$AUTOLOAD};
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins.pm b/lib/gcstar/GCPlugins.pm
new file mode 100644
index 0000000..d7acbd5
--- /dev/null
+++ b/lib/gcstar/GCPlugins.pm
@@ -0,0 +1,1783 @@
+{
+ package GCPlugins;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use File::Basename;
+use GCUtils 'glob';
+use GCDialogs;
+
+use base 'Exporter';
+our @EXPORT = qw(%pluginsMap %pluginsNameArrays);
+
+our %pluginsMap;
+our %pluginsNameArrays;
+
+sub loadPlugins
+{
+ my $model = shift;
+ return if $pluginsNameArrays{$model};
+ my $dir = $ENV{GCS_LIB_DIR}.'/GCPlugins/'.$model;
+ foreach (glob "$dir/*.pm")
+ {
+ my $plugin = basename($_, '.pm')."\n";
+ next if $plugin =~ /Common/;
+ (my $class = $plugin) =~ s/^GC/GCPlugin/;
+ my $obj;
+ eval "use GCPlugins::".$model."::$plugin; \$obj = new GCPlugins::".$model."::$class;";
+ die "Fatal error with plugin $plugin : $@" if $@;
+ $pluginsMap{$model}->{$obj->getName} = $obj;
+ }
+ my @names = sort keys %{$pluginsMap{$model}};
+ $pluginsNameArrays{$model} = \@names;
+
+}
+
+sub loadAllPlugins
+{
+ foreach my $dir(glob $ENV{GCS_LIB_DIR}.'/GCPlugins/*')
+ {
+ next if $dir =~ /PluginsBase/;
+ my $model = basename($dir);
+ next if ($model !~ /^GC/) || ($model eq 'GCstar');
+ loadPlugins($model);
+ }
+}
+
+ {
+ package GCPluginJob;
+
+ use Storable qw(store_fd fd_retrieve);
+ use IO::Handle;
+ use GCPlugins::GCPluginsBase;
+
+ sub new
+ {
+ my ($proto, $command, $data) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = {command => $command, data => $data};
+ $command->autoflush(1);
+ $data->autoflush(1);
+ #GCPlugins::loadPlugins if ! $ENV{GCS_PROFILING};
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub run
+ {
+ my $self = shift;
+ my $command = $self->{command};
+ my $info;
+ while (1)
+ {
+ local $Storable::forgive_me = 1;
+ $info = fd_retrieve($command);
+ eval {$self->beginSearch($info)};
+ }
+ }
+
+ sub quit
+ {
+ my $self = shift;
+ close $self->{command};
+ close $self->{data};
+ wait;
+ exit;
+ }
+
+ sub beginSearch
+ {
+ my ($self, $info) = @_;
+ my $pid;
+ GCPlugins::loadPlugins($info->{model}) if $info->{model};
+ if ($pid = fork)
+ {
+ my $command = $self->{command};
+ $command->autoflush(1);
+ my $cmd = readline($command);
+ chomp $cmd;
+ kill 9,$pid if ($cmd eq 'STOP');
+ $self->quit if $cmd eq 'EXIT';
+ wait;
+ }
+ else
+ {
+ #$info could be a simple hash or the plugin itself depending on the phase
+ if ($info->{type} eq 'load')
+ {
+ # Here we create the plugin
+ my $plugin = $pluginsMap{$info->{model}}->{$info->{name}};
+ $plugin->setProxy($info->{proxy});
+ $plugin->setCookieJar($info->{cookieJar});
+ $plugin->{type} = $info->{type};
+ $plugin->{urlField} = $info->{urlField};
+ $plugin->{bigPics} = $info->{bigPics};
+
+ $self->{currentPlugin} = $plugin;
+
+ $plugin->{title} = $info->{query};
+ $plugin->{searchField} = $info->{field};
+ $plugin->{pass} = $info->{pass};
+ $plugin->{nextUrl} = $info->{nextUrl};
+
+ $plugin->load;
+
+ # Remove the user agent part of the data, otherwise the Storable lib complains
+ # about not being able to store the sub's stored in it.
+ undef($plugin->{ua});
+
+ local $Storable::forgive_me = 1;
+ store_fd $plugin, $self->{data};
+ }
+ elsif ($info->{type} ne 'exit')
+ {
+ # Here we re-use it
+ my $plugin = $info;
+ store_fd $plugin->getItemInfo, $self->{data};
+ }
+ exit;
+ }
+ }
+ }
+
+ use Gtk2;
+
+ {
+ package GCPluginsDialog;
+
+ use base 'GCModalDialog';
+
+ sub show
+ {
+ my $self = shift;
+ $self->{useThisSite}->set_active(0);
+ $self->SUPER::show();
+ $self->show_all;
+ $self->{fieldsList}->hide if $self->{hideFieldsList};
+ my $path = $self->{pluginsList}->get_selection->get_selected_rows;
+ $self->{pluginsList}->scroll_to_cell($path) if $path;
+
+ my $response = $self->run;
+ $self->{plugin} = undef;
+ if ($response eq 'ok')
+ {
+ my $pluginName = '';
+ my $idx = ($self->{pluginsList}->get_selected_indices)[0];
+ $pluginName = $self->{pluginsList}->{data}->[$idx]->[0];
+
+ $self->{plugin} = $self->{model}->getPlugin($pluginName);
+
+ if ($self->{useThisSite}->get_active)
+ {
+ $self->{parent}->{model}->{preferences}->plugin($pluginName);
+ $self->{parent}->checkPlugin;
+ }
+ }
+ $self->hide;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{PluginsTitle},
+ 'gtk-jump-to'
+ );
+
+ bless ($self, $class);
+
+ $self->{parent} = $parent;
+
+ $self->{titleGroup} = new GCGroup($parent->{lang}->{PluginsQuery});
+ my $queryHbox = new Gtk2::HBox(0,0);
+ $self->{query} = new GCShortText;
+ $self->{query}->signal_connect(activate => sub {
+ $self->response('ok');
+ });
+
+ $self->{fieldsList} = new GCMenuList;
+ $queryHbox->pack_start($self->{query}, 1, 1, 0);
+ $queryHbox->pack_start($self->{fieldsList}, 0, 0, $GCUtils::halfMargin);
+ $self->{titleGroup}->addWidget($queryHbox);
+ $self->vbox->pack_start($self->{titleGroup}, 0, 0, 0);
+
+
+ my $pluginGroup = undef;
+ my $pluginsFrame = new GCGroup($parent->{lang}->{PluginsFrame});
+
+ $self->{pluginsList} = new Gtk2::SimpleList($parent->{lang}->{PluginsName} => "text",
+ $parent->{lang}->{PluginsLang} => "text",
+ $parent->{lang}->{PluginsSearchFields} => "text",
+ $parent->{lang}->{PluginsAuthor} => "text",
+ $parent->{lang}->{PluginsPreferred} => "pixbuf",);
+ $self->{pluginsList}->set_border_width(5);
+ $self->{pluginsList}->set_rules_hint(1);
+ $self->{pluginsList}->get_column(0)->set_min_width(150);
+ for my $i (0..2)
+ {
+ $self->{pluginsList}->get_column($i)->set_resizable(1);
+ }
+ $self->{pluginsList}->signal_connect(row_activated => sub {
+ $self->response('ok');
+ });
+
+ # Setup tooltips for list control
+ $self->{pluginsList}->set_has_tooltip(1);
+ $self->{pluginsList}->signal_connect (query_tooltip => sub {
+ my ($widget, $x, $y, $keyboard_mode, $tooltip) = @_;
+
+ # Place the tooltip in the right position
+ my $path = $self->{pluginsList}->get_path_at_pos ($x, $y);
+ return 0 unless $path;
+ $self->{pluginsList}->set_tooltip_row($tooltip, $path);
+
+ # If row is for a preferred plugin, set the tooltip
+ my $index = ($path->get_indices)[0];
+ if (${ $self->{pluginsList}->{data} }[$index][4] == $self->{starPixbuf})
+ {
+ $tooltip->set_text($parent->{lang}->{PluginsPreferredTooltip});
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ });
+
+ # Pixbufs for preferred and standard plugins
+ $self->{starPixbuf} = Gtk2::Gdk::Pixbuf->new_from_file($ENV{GCS_SHARE_DIR}.'/icons/star.png');
+ $self->{blankPixbuf} = Gtk2::Gdk::Pixbuf->new ('rgb', 1, 8, 1, 1);
+ $self->{blankPixbuf}->fill(0x00000000);
+
+ $self->{currentPluginList} = undef;
+
+ #$self->setModel;
+
+ my $scrollPanelList = new Gtk2::ScrolledWindow;
+ $scrollPanelList->set_border_width(5);
+ $scrollPanelList->set_policy ('never', 'automatic');
+ $scrollPanelList->set_shadow_type('etched-in');
+ $scrollPanelList->add($self->{pluginsList});
+
+ $self->{useThisSite} = Gtk2::CheckButton->new($parent->{lang}->{PluginsUseSite});
+
+ my $pluginBox = new Gtk2::VBox(0,0);
+ $pluginBox->pack_start($scrollPanelList, 1, 1, 0);
+ $pluginBox->pack_start(Gtk2::VBox->new, 0, 0, $GCUtils::halfMargin);
+ $pluginBox->pack_start($self->{useThisSite}, 0, 0, 0);
+
+ $pluginsFrame->addWidget($pluginBox);
+ $self->vbox->pack_start($pluginsFrame, 1, 1, 0);
+
+ $self->set_default_size(1,550);
+
+ return $self;
+ }
+
+ sub query
+ {
+ my $self = shift;
+ if (@_)
+ {
+ my ($query, $field, $queries) = @_;
+ $self->{fieldsList}->setValue($field);
+ $self->{query}->setValue($query);
+ $self->{queries} = $queries;
+ $self->{fieldsList}->signal_connect('changed' => sub {
+ # Only change the search query if it's not empty, otherwise keep existing value
+ if ($self->{queries}->{$self->{fieldsList}->getValue})
+ {
+ $self->{query}->setValue(
+ $self->{queries}->{$self->{fieldsList}->getValue}
+ );
+ }
+ });
+ #$self->{fieldsList}->setDefaultValues(shift);
+ #$self->{searchField} = shift;
+ }
+ return ($self->{query}->getValue, $self->{fieldsList}->getValue);
+ }
+
+ sub plugin
+ {
+ my $self = shift;
+
+ return $self->{plugin};
+ }
+
+ sub setModel
+ {
+ my ($self, $model, $list) = @_;
+ $model ||= $self->{parent}->{model};
+ my @plugins_array = sort split (",", $list) if $list;
+
+ my @fields = @{$model->getSearchFields};
+ if ($#fields < 1)
+ {
+ $self->{hideFieldsList} = 1;
+ }
+ else
+ {
+ $self->{hideFieldsList} = 0;
+ my @values;
+ foreach (@fields)
+ {
+ push @values, {value => $_,
+ displayed => $model->getDisplayedText($model->{fieldsInfo}->{$_}->{label})};
+ }
+ $self->{fieldsList}->setValues(\@values);
+ }
+
+# if ($model)
+# {
+# my $titleField = $model->{commonFields}->{title};
+# my $titleInfo = $self->{parent}->{model}->{fieldsInfo}->{$titleField};
+# my $titleText = $model->getDisplayedText($titleInfo->{label});
+# $self->{titleGroup}->setLabel($titleText);
+# }
+
+ return if $list && ($self->{currentPluginList} eq $list);
+ $self->{currentPluginList} = $list;
+
+ my $pluginGroup = undef;
+ my $i = 0;
+ my @newData;
+
+ $self->{model} = $model;
+
+ if ($model)
+ {
+ foreach (sort keys %{$model->getAllPlugins})
+ {
+ my $plugin = $model->getPlugin($_);
+ if ((!$list) || ($plugin->getName eq $plugins_array[$i]))
+ {
+ # Add plugin to list
+ # Plugin should be marked as a default if it's both preferred, and for the user's language,
+ # or if isPreferred is 2 (not language dependant)
+ push @newData, [$plugin->getName, "\n".$plugin->getLang."\n",
+ $plugin->getSearchFields($model), $plugin->getAuthor,
+ ((($plugin->isPreferred == 1)
+ && ($self->{parent}->{options}->lang eq $plugin->getLang))
+ || ($plugin->isPreferred == 2))
+ ? $self->{starPixbuf} : $self->{blankPixbuf}];
+
+ $i++;
+ }
+ }
+ }
+
+ # Sort list with preferred plugins first
+ @{$self->{pluginsList}->{data}} = sort {
+ if (($a->[4] == $self->{starPixbuf}) && ($b->[4] == $self->{starPixbuf}))
+ { return lc($a->[0]) cmp lc($b->[0]); }
+ elsif ($a->[4] == $self->{starPixbuf}) { return -1; }
+ elsif ($b->[4] == $self->{starPixbuf}) { return 1; }
+ else { return lc($a->[0]) cmp lc($b->[0]); }
+ } @newData;
+
+ $self->{pluginsList}->select(0);
+ }
+ }
+
+ {
+ package GCAllPluginsDialog;
+
+ use base 'GCModalDialog';
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+ ($self->action_area->get_children)[1]->hide_all;
+ my $response = $self->run;
+ $self->hide;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{PluginsFrame},
+ 'gtk-close'
+ );
+
+ bless ($self, $class);
+
+ $self->{parent} = $parent;
+ $self->{factory} = $parent->{modelsFactory};
+
+ my @columnsNames = ('Name', 'Lang', 'SearchFields', 'Author', 'Preferred');
+ $self->{pluginsModel} = new Gtk2::TreeStore(map {'Glib::String'} @columnsNames);
+ $self->{pluginsList} = Gtk2::TreeView->new_with_model($self->{pluginsModel});
+
+ my @columns;
+ my $i = 0;
+ for my $col(@columnsNames)
+ {
+ my $column = Gtk2::TreeViewColumn->new_with_attributes($parent->{lang}->{'Plugins'.$col},
+ Gtk2::CellRendererText->new,
+ 'text' => $i);
+ $column->set_resizable(1);
+ $self->{pluginsList}->append_column($column);
+ $i++;
+ }
+
+ $self->{pluginsList}->set_border_width(5);
+ $self->{pluginsList}->set_rules_hint(1);
+
+ my $scrollPanelList = new Gtk2::ScrolledWindow;
+ $scrollPanelList->set_border_width(5);
+ $scrollPanelList->set_policy ('never', 'automatic');
+ $scrollPanelList->set_shadow_type('etched-in');
+ $scrollPanelList->add($self->{pluginsList});
+
+ $self->{useThisSite} = Gtk2::CheckButton->new($parent->{lang}->{PluginsUseSite});
+
+ my $pluginBox = new Gtk2::VBox(0,0);
+ $pluginBox->pack_start($scrollPanelList, 1, 1, 0);
+
+ for my $modelInfo (@{$self->{factory}->getDefaultModels})
+ {
+ my $modelIter = $self->{pluginsModel}->append(undef);
+ $self->{pluginsModel}->set($modelIter,
+ (0 => $modelInfo->{description})
+ );
+
+ my $model = $self->{factory}->getModel($modelInfo->{name});
+ for my $pluginName (sort keys %{$model->getAllPlugins})
+ {
+ my $plugin = $model->getPlugin($pluginName);
+ my $pluginIter = $self->{pluginsModel}->append($modelIter);
+ my %data;
+ $i = 0;
+ my $method;
+ ($method = 'get'.$_, $data{$i++} = $plugin->$method($model))
+ foreach (@columnsNames);
+ $self->{pluginsModel}->set($pluginIter, %data);
+# (
+# 0 => $plugin->getName,
+# 1 => $plugin->getLang,
+# 2 => $plugin->getSearchFieldsAsString($model),
+# 4 => $plugin->getAuthor
+# )
+# );
+ }
+ }
+
+ $self->vbox->pack_start($pluginBox, 1, 1, 0);
+
+ $self->set_default_size(1,550);
+
+ return $self;
+ }
+
+ sub setModel
+ {
+ my ($self, $model, $list) = @_;
+ $model ||= $self->{parent}->{model};
+ my @plugins_array = sort split (",", $list) if $list;
+
+ my @fields = @{$model->getSearchFields};
+ if ($#fields < 1)
+ {
+ $self->{hideFieldsList} = 1;
+ }
+ else
+ {
+ $self->{hideFieldsList} = 0;
+ my @values;
+ foreach (@fields)
+ {
+ push @values, {value => $_,
+ displayed => $model->getDisplayedText($model->{fieldsInfo}->{$_}->{label})};
+ }
+ $self->{fieldsList}->setValues(\@values);
+ }
+
+ return if $list && ($self->{currentPluginList} eq $list);
+ $self->{currentPluginList} = $list;
+
+ my $pluginGroup = undef;
+ my $i = 0;
+ my @newData;
+
+ $self->{model} = $model;
+
+ if ($model)
+ {
+ foreach (sort keys %{$model->getAllPlugins})
+ {
+ my $plugin = $model->getPlugin($_);
+ if ((!$list) || ($plugin->getName eq $plugins_array[$i]))
+ {
+ push @newData, [$plugin->getName, "\n".$plugin->getLang."\n", $plugin->getAuthor,
+ $plugin->isPreferred ? $self->{starPixbuf} : $self->{blankPixbuf}];
+ $i++;
+ }
+ }
+ }
+
+ # Sort list with preferred plugins first
+ @{$self->{pluginsList}->{data}} = sort {
+ if (($a->[4] == $self->{starPixbuf}) && ($b->[4] == $self->{starPixbuf}))
+ { return lc($a->[0]) cmp lc($b->[0]); }
+ elsif ($a->[4] == $self->{starPixbuf}) { return -1; }
+ elsif ($b->[4] == $self->{starPixbuf}) { return 1; }
+ else { return lc($a->[0]) cmp lc($b->[0]); }
+ } @newData;
+
+ $self->{pluginsList}->select(0);
+ }
+ }
+
+ {
+ #Class that is used to let user select
+ #plugins he wants to use in a multi-site search.
+ package GCMultiSiteDialog;
+
+ use base 'GCDoubleListDialog';
+
+ sub getInitData
+ {
+ my $self = shift;
+
+ return $self->{model}->getPluginsNames;
+ }
+
+ sub getData
+ {
+ my $self = shift;
+
+ my @array = split m/,/, $self->{model}->{preferences}->multisite;
+ return \@array;
+ }
+
+ sub saveList
+ {
+ my ($self, $list) = @_;
+
+ my $value = join ',', @$list;
+ $self->{model}->{preferences}->multisite($value);
+ }
+
+ sub getPlugin
+ {
+ my ($self, $idx) = @_;
+ $self->init;
+ return $self->{usedArray}->[$idx];
+ }
+
+ sub getPluginsNumber
+ {
+ my $self = shift;
+ $self->init;
+ return scalar @{$self->{usedArray}};
+ }
+
+ sub preFill
+ {
+ my $self = shift;
+
+ my @data;
+ my $langName = $self->{options}->lang;
+ foreach (@{$self->{model}->getPluginsNames})
+ {
+ push @data, $_ if $self->{model}->getPlugin($_)->getLang eq $langName;
+ }
+ $self->getDoubleList->setListData(\@data);
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+
+ $self->{model} = $model;
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $model) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(
+ $parent,
+ $parent->{lang}->{MultiSiteTitle},
+ 0,
+ $parent->{lang}->{MultiSiteUnused},
+ $parent->{lang}->{MultiSiteUsed}
+ );
+ bless ($self, $class);
+
+ $self->setModel($model);
+
+ if (! $self->{model}->{preferences}->exists('multisite'))
+ {
+ $self->preFill;
+ $self->saveList(\@{$self->{usedArray}});
+ $self->{initialized} = 1;
+ }
+
+ my $langButton = new Gtk2::Button($parent->{lang}->{MultiSiteLang});
+ $langButton->set_border_width($GCUtils::margin);
+ $langButton->signal_connect('clicked' => sub {
+ $self->preFill;
+ });
+ my $clearButton = new Gtk2::Button($parent->{lang}->{MultiSiteClear});
+ $clearButton->set_border_width($GCUtils::margin);
+ $clearButton->signal_connect('clicked' => sub {
+ $self->clearList;
+ });
+
+ $self->getDoubleList->setDataHandler($self);
+ $self->getDoubleList->addBottomButtons($langButton,$clearButton);
+
+ return $self;
+ }
+ }
+
+ {
+ #Class that is used to let user select
+ #plugin order he wants to use for each imported fields
+ package GCMultiSitePerFieldDialog;
+ use base 'GCModalDialog';
+
+ our $removeValue = 'GCListRemove';
+ my $startColMenus=1;
+
+ my $pluginListOrderPerField;
+ my $fieldsToFetch;
+ my $remainingSourcesOrderPerField;
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show();
+ $self->show_all;
+
+ my $response = $self->run;
+ $self->hide;
+ $self->cleanListOrder;
+ $self->savePrefOrderListFromForm if ($response eq 'ok');
+ $self->loadPrefOrderListInForm if ($response ne 'ok');
+ return ($response eq 'ok');
+ }
+
+ sub getSourcesListMenu
+ {
+ my ($self,$withRemoveItem) = @_;
+ return new GCMenuList($self->{sourcesList}) if !$withRemoveItem;
+ return new GCMenuList($self->{sourcesListWithRemoveItem}) if $withRemoveItem;
+ }
+
+ sub createRowForField
+ {
+ my ($self, $field, $row, $mandatory) = @_;
+ my $fieldsInfo = $self->{parent}->{model}->{fieldsInfo};
+ $self->{fields}->{$field}->{row}=$row;
+ $self->{fields}->{$field}->{'Cb'} = new GCCheckBox($self->{parent}->{model}->getDisplayedText($fieldsInfo->{$field}->{label}));
+ if ($mandatory)
+ {
+ $self->{fields}->{$field}->{'Cb'}->lock(1);
+ $self->{fields}->{$field}->{'Cb'}->setValue(1);
+ $self->{fields}->{$field}->{'Cb'}->{mandatory} = 1;
+ }
+ $self->{table}->attach($self->{fields}->{$field}->{'Cb'}, 0, 1, $row, $row + 1, 'fill', ['fill', 'expand'], 0, 0);
+
+ my $curNbSite=0;
+ $self->{fields}->{$field}->{'SiteListMenus'}=[];
+ $self->{fields}->{$field}->{'SiteListAddLast'}=new Gtk2::Button("+");
+ $self->{fields}->{$field}->{'SiteListAddLast'}->signal_connect('clicked' => sub {
+ $self->addSiteListToField($field,-1);
+ });
+ $self->{fields}->{$field}->{'SiteListAddLast'}->set_no_show_all(1);
+
+ $self->{fields}->{$field}->{'SiteListAddFirst'}=new Gtk2::Button("+");
+ $self->{fields}->{$field}->{'SiteListAddFirst'}->signal_connect('clicked' => sub {
+ $self->addSiteListToField($field,0);
+ });
+ $self->{table}->attach($self->{fields}->{$field}->{'SiteListAddFirst'}, $startColMenus, 1+$startColMenus, $row, $row + 1, 'fill', 'fill', 0, 0);
+
+ my $Align = new Gtk2::Alignment(0.0, 0.5, 0.0, 0.0);
+ my $Hbox = new Gtk2::HBox();
+ $self->{fields}->{$field}->{'Hbox'}=$Hbox;
+ $Hbox->pack_start($self->{fields}->{$field}->{'SiteListAddLast'},1,0,0);
+ $Align->add($Hbox);
+ $self->{table}->attach($Align, 1+$startColMenus, 2+$startColMenus, $row, $row + 1, ['expand','fill'], 'fill', 0, 0);
+ }
+
+ sub addSiteListToField
+ {
+ my ($self, $field, $position,$value) = @_;
+ my $curListMenus=$self->{fields}->{$field}->{'SiteListMenus'};
+ my $curNbSite=scalar @{$curListMenus};
+ $curNbSite++;
+ $position=$curNbSite-1 if $position==-1;
+ my $Hbox = $self->{fields}->{$field}-> {'Hbox'};
+ my $newSiteList = $self->getSourcesListMenu(1);
+ $value=$self->{bottomline}->{siteAddToAll}->getValue(1) if !$value;
+ $newSiteList->setValue($value);
+ $newSiteList->{orderInList}=$position;
+ $newSiteList->signal_connect('changed' => sub {
+ if ($newSiteList->getValue eq $removeValue)
+ {
+ $self->removeSiteListFromField($field, $newSiteList->{orderInList})
+ }
+ });
+ #insert the new siteList
+ splice @{$curListMenus}, $position, 0, $newSiteList;
+ $Hbox->pack_start($newSiteList,0,0,0);
+ $Hbox->reorder_child($newSiteList,$position);
+ $newSiteList->show;
+ #move other siteList on this row to the right
+ for (my $idx=$position;$idx<$curNbSite;$idx++)
+ {
+ $curListMenus->[$idx]->{orderInList}=$idx;
+ }
+ if($curNbSite==1)
+ {
+ $self->{fields}->{$field}->{'SiteListAddLast'}->set_no_show_all(0);
+ $self->{fields}->{$field}->{'SiteListAddLast'}->show;
+ }
+ }
+
+ sub removeSiteListFromField
+ {
+ my ($self, $field, $position) = @_;
+ my $curListMenus=$self->{fields}->{$field}->{'SiteListMenus'};
+ my $curNbSite=scalar @{$curListMenus};
+ $position=$curNbSite-1 if $position==-1;
+ my $oldSiteList=splice @{$curListMenus}, $position, 1;
+ my $Hbox = $self->{fields}->{$field}-> {'Hbox'};
+ $Hbox->remove($oldSiteList);
+ $curNbSite--;
+ #move other siteList on this row to the left
+ for (my $idx=$position;$idx<$curNbSite;$idx++)
+ {
+ $curListMenus->[$idx]->{orderInList}=$idx;
+ }
+ if($curNbSite==0)
+ {
+ $self->{fields}->{$field}->{'SiteListAddLast'}->set_no_show_all(1);
+ $self->{fields}->{$field}->{'SiteListAddLast'}->hide;
+ }
+ }
+
+ sub removeAllSourceListFromField
+ {
+ my ($self, $field) = @_;
+ my $curNbSite=scalar @{$self->{fields}->{$field}->{'SiteListMenus'}};
+ for (my $i=0;$i<$curNbSite;$i++)
+ {
+ $self->removeSiteListFromField($field,-1);
+ }
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $model,$usePlugins,$otherSources) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{OptionsPluginsMultiPerFieldWindowTitle}
+ );
+
+ bless ($self, $class);
+ $model=$parent->{model} if !$model;
+ $self->{parent} = $parent;
+
+ $self->set_modal(1);
+ $self->set_position('center');
+ $self->set_default_size(1,500);
+ my $layoutHbox = new Gtk2::HBox(0,0);
+ $self->{layoutVBox} = new Gtk2::VBox(0,0);
+ $self->vbox->pack_start($layoutHbox, 1,1,0);
+ $layoutHbox->pack_start($self->{layoutVBox},0,0,$GCUtils::margin);
+
+ $self->{table} = new Gtk2::Table(1, 3, 0);
+ $self->{table}->set_row_spacings($GCUtils::halfMargin);
+ $self->{table}->set_col_spacings($GCUtils::margin);
+ $self->{table}->set_border_width($GCUtils::margin);
+
+ $self->{scrollPanelList} = new Gtk2::ScrolledWindow;
+ $self->{scrollPanelList}->set_policy ('never', 'automatic');
+ $self->{scrollPanelList}->set_shadow_type('none');
+ $self->{scrollPanelList}->add_with_viewport($self->{table});
+
+ $self->{descriptionLabel}=new GCLabel($parent->{lang}->{OptionsPluginsMultiPerFieldDesc});
+ $self->{layoutVBox}->pack_start($self->{descriptionLabel},0,0,$GCUtils::margin);
+
+ $self->{layoutVBox}->pack_start($self->{scrollPanelList},1,1,$GCUtils::margin);
+
+ $self->setModel($model);
+
+ $self->setSourceList($usePlugins,$otherSources);
+ $self->initForm;
+ if (! $self->{model}->{preferences}->exists('multisiteperfield'))
+ {
+ $self->savePrefOrderListFromForm;
+ }
+ else
+ {
+ $self->loadPrefOrderListInForm;
+ }
+ return $self;
+ }
+
+ sub setSourceList
+ {
+ my ($self,$usePlugins,$otherSourcesList) = @_;
+ $#{$self->{sourcesList}}=-1;
+ $#{$self->{sourcesListWithRemoveItem}}=-1;
+ if ($usePlugins)
+ {
+ foreach (@{$self->{model}->getPluginsNames})
+ {
+ push @{$self->{sourcesList}},{value=>$_,
+ displayed=>$_};
+ }
+ }
+ if ($otherSourcesList && scalar (@$otherSourcesList))
+ {
+ foreach (@{$otherSourcesList})
+ {
+ push @{$self->{sourcesList}},Storable::dclone($_);
+ }
+ }
+ $self->{sourcesListWithRemoveItem}=Storable::dclone($self->{sourcesList});
+ unshift @{$self->{sourcesListWithRemoveItem}}, {value=>$removeValue,displayed=>$self->{parent}->{lang}->{OptionsPluginsMultiPerFieldRemove}};
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+
+
+ my $parent = $self->{parent};
+ return if $self->{model} == $model;
+ $self->{model} = $model;
+ }
+
+ sub initForm
+ {
+ my ($self) = @_;
+
+ my $parent = $self->{parent};
+ my $fieldsInfo = $self->{model}->{fieldsInfo};
+ $self->{urlField} = $self->{parent}->{model}->{commonFields}->{url};
+
+ foreach ($self->{table}->get_children)
+ {
+ $self->{table}->remove($_);
+ $_->destroy;
+ }
+
+ my $row = 0;
+ my $field;
+ foreach $field(@{$self->{model}->{fieldsNames}})
+ {
+ next if $fieldsInfo->{$field}->{imported} ne 'true';
+ next if ($field eq $self->{urlField});
+ $self->createRowForField($field, $row);
+ $row++;
+ }
+
+ $row++;
+ if($self->{bottomline})
+ {
+ foreach($self->{bottomline}->get_children)
+ {
+ $self->{bottomline}->remove($_);
+ $_->destroy;
+ }
+ $self->{bottomline}->destroy;
+ undef $self->{bottomline};
+ }
+ $self->{bottomline}=new Gtk2::HBox;
+
+ $self->{bottomline}->{selectAll}=new Gtk2::Button($parent->{lang}->{ImportSelectAll});
+ $self->{bottomline}->{selectAll}->signal_connect('clicked' => sub {
+ while ( my ($field, $row) = each(%{$self->{fields}}) ) {
+ $row->{'Cb'}->setValue(1);
+ }
+ });
+ $self->{bottomline}->pack_start($self->{bottomline}->{selectAll},0,0,0);
+
+ $self->{bottomline}->{selectNone}=new Gtk2::Button($parent->{lang}->{ImportSelectNone});
+ $self->{bottomline}->{selectNone}->signal_connect('clicked' => sub {
+ while ( my ($field, $row) = each(%{$self->{fields}}) ) {
+ $row->{'Cb'}->setValue(0);
+ }
+ });
+ $self->{bottomline}->pack_start($self->{bottomline}->{selectNone},0,0,0);
+
+ $self->{bottomline}->{clear}=new Gtk2::Button($parent->{lang}->{OptionsPluginsMultiPerFieldClearSelected});
+ $self->{bottomline}->{clear}->signal_connect('clicked' => sub {
+ while ( my ($field, $row) = each(%{$self->{fields}}) ) {
+ $self->removeAllSourceListFromField($field) if $row->{'Cb'}->getValue;
+ }
+ });
+ $self->{bottomline}->pack_start($self->{bottomline}->{clear},0,0,0);
+
+ $self->{bottomline}->{positionAddToAll} = new GCMenuList([{value=>'First',displayed=>$parent->{lang}->{OptionsPluginsMultiPerFieldFirst}},
+ {value=>'Last',displayed=>$parent->{lang}->{OptionsPluginsMultiPerFieldLast}}]);
+ $self->{bottomline}->pack_end($self->{bottomline}->{positionAddToAll},0,0,0);
+
+ $self->{bottomline}->{siteAddToAll} = $self->getSourcesListMenu;
+ $self->{bottomline}->pack_end($self->{bottomline}->{siteAddToAll},0,0,0);
+
+ $self->{bottomline}->{addToAll} = GCButton->newFromStock('gtk-add', 0);
+ $self->{bottomline}->{addToAll}->signal_connect('clicked' => sub {
+ my $positionAdd=$self->{bottomline}->{positionAddToAll}->getValue(0) eq 'First' ? 0:-1;
+ foreach $field(keys %{$self->{fields}})
+ {
+ $self->addSiteListToField($field,$positionAdd,$self->{bottomline}->{siteAddToAll}->getValue(0));
+ }
+ });
+ $self->{bottomline}->pack_end($self->{bottomline}->{addToAll},0,0,0);
+
+ $self->{layoutVBox}->pack_start($self->{bottomline},0,0,$GCUtils::margin);
+ }
+
+
+ sub loadPrefOrderListInForm
+ {
+ my $self = shift;
+ # load from preference string
+ undef $pluginListOrderPerField;
+ undef $fieldsToFetch;
+ my $valueStr = $self->{model}->{preferences}->multisiteperfield;
+ my @arrValues= split ';', $valueStr;
+ foreach (@arrValues)
+ {
+ my @line=split ',',$_;
+ my $field=shift @line;
+ $fieldsToFetch->{$field}=shift @line;
+ $pluginListOrderPerField->{$field}=\@line if scalar(@line);
+ }
+ # add values in form
+ while ( my ($field, $row) = each(%{$self->{fields}}) ) {
+ $self->removeAllSourceListFromField($field);
+ $self->addSiteListToField($field,-1,$_) foreach (@{$pluginListOrderPerField->{$field}});
+ $self->{fields}->{$field}->{Cb}->setValue($fieldsToFetch->{$field});
+ }
+ $self->cleanListOrder;
+ }
+
+ sub savePrefOrderListFromForm
+ {
+ my $self = shift;
+ undef $pluginListOrderPerField;
+ undef $fieldsToFetch;
+ # load from form
+ $self->cleanListOrder;
+ while ( my ($field, $row) = each(%{$self->{fields}}) ) {
+ $fieldsToFetch->{$field}= $row->{'Cb'}->getValue;
+ push @{$pluginListOrderPerField->{$field}},$_->getValue foreach (@{$row->{'SiteListMenus'}});
+ }
+ # save to preference string
+ my $valueStrArr = [];
+ while ( my ($field, $row) = each(%{$self->{fields}}) ) {
+ my $value=$field.','.$fieldsToFetch->{$field};
+ $value=$value.','.join ',',@{$pluginListOrderPerField->{$field}} if $pluginListOrderPerField->{$field};
+ push @$valueStrArr,$value;
+ }
+ $self->{model}->{preferences}->multisiteperfield(join ';',@$valueStrArr);
+ }
+
+ sub cleanListOrder
+ {
+ my $self = shift;
+ # remove double sitename for each fields, keep the first one
+ for my $field (keys %{$self->{fields}} ) {
+ my $sites={};
+ my $row=$self->{fields}->{$field}->{SiteListMenus};
+ for (my $i = 0; $i <= $#$row; ++$i)
+ {
+ if ($sites->{$row->[$i]->getValue})
+ {
+ $self->removeSiteListFromField($field,$i);
+ $i--;
+ }
+ else
+ {
+ $sites->{$row->[$i]->getValue}=1;
+ }
+ }
+ undef $sites;
+ }
+ }
+
+ sub resetCurrentFetchingStatus
+ {
+ undef $remainingSourcesOrderPerField;
+ foreach (keys %$fieldsToFetch)
+ {
+ $remainingSourcesOrderPerField->{$_}=Storable::dclone($pluginListOrderPerField->{$_}) if $fieldsToFetch->{$_} ;
+
+ }
+ }
+
+ sub getNextSourceNeeded
+ {
+ my $self = shift;
+ foreach my $field(keys %$remainingSourcesOrderPerField)
+ {
+ if (scalar(@{$remainingSourcesOrderPerField->{$field}})>0)
+ {
+ return $remainingSourcesOrderPerField->{$field}->[0];
+ }
+ }
+ return undef;
+ }
+
+ sub getPlugin
+ {
+ my ($self,$pluginName) = @_;
+ return $self->{model}->getPlugin($pluginName);
+ }
+
+ sub getNonEmptyFields
+ {
+ my ($self,$info)=@_;
+ my $nonEmptyFields=[];
+ foreach my $field(keys %$info)
+ {
+ push @$nonEmptyFields,$field if $self->isFieldNonEmpty($info->{$field});
+ }
+ return $nonEmptyFields;
+ }
+
+ sub isFieldNonEmpty
+ {
+ my ($self,$var)=@_;
+ return 0 if !defined $var;
+ my $reftype=ref $var;
+ if (!$reftype)
+ {
+ return $var ne '';
+ }
+ elsif ($reftype eq 'SCALAR')
+ {
+ return $$var ne '' && $var!=undef;
+ }
+ elsif ($reftype eq 'ARRAY')
+ {
+ return scalar($var)>0;
+ }
+ elsif ($reftype eq 'HASH')
+ {
+ return scalar(keys(%{$var}))>0;
+ }
+ }
+
+ sub doneWithSourceName
+ {
+ my ($self,$pluginName,$info) = @_;
+ foreach my $field(keys %$remainingSourcesOrderPerField)
+ {
+ foreach my $pluginIdx (0..$#{$remainingSourcesOrderPerField->{$field}})
+ {
+ if ($remainingSourcesOrderPerField->{$field}->[$pluginIdx] eq $pluginName)
+ {
+ if ($self->isFieldNonEmpty($info->{$field}))
+ {
+ # if we have the field, so we wont need other info
+ $#{$remainingSourcesOrderPerField->{$field}}=$pluginIdx-1;
+ last;
+ }
+ else
+ {
+ # else we will still need the next one
+ splice @{$remainingSourcesOrderPerField->{$field}},$pluginIdx,1;
+ last;
+ }
+ }
+ }
+ }
+ }
+
+ sub joinInfo
+ {
+ my ($self,$infoPerPlugin) = @_;
+ my $info={};
+ my $fetchedSources=Storable::dclone($pluginListOrderPerField);
+ my %urls;
+ my $urlField=$self->{parent}->{model}->{commonFields}->{url};
+ foreach my $field(keys %$pluginListOrderPerField)
+ {
+ shift @{$fetchedSources->{$field}} while (scalar(@{$fetchedSources->{$field}}) && !$self->isFieldNonEmpty($infoPerPlugin->{$fetchedSources->{$field}->[0]}->{$field}));
+ if (scalar(@{$fetchedSources->{$field}})>0)
+ {
+ $info->{$field}=$infoPerPlugin->{$fetchedSources->{$field}->[0]}->{$field} ;
+ $urls{$fetchedSources->{$field}->[0]}=$infoPerPlugin->{$fetchedSources->{$field}->[0]}->{$urlField};
+ }
+ }
+ $info->{$urlField}=join ';',values %urls;
+ return $info;
+ }
+ }
+}
+
+{
+ package GCResultsDialog;
+ use base 'GCModalDialog';
+
+ sub show
+ {
+ my $self = shift;
+ for my $i (0..$self->{nbCols} - 1)
+ {
+ $self->{results}->get_column($i)->set_sort_indicator(0);
+ }
+ $self->{order} = 1;
+ $self->{sort} = '';
+
+ $self->{validated} = 0;
+ $self->SUPER::show();
+ $self->show_all;
+ $self->{nextButton}->hide if !$self->{withNext};
+ $self->{multipleSelectionLabel}->hide if ! $self->{multipleSelection};
+ my $ended = 0;
+ my $code;
+ while (!$ended)
+ {
+ $code = $self->run;
+ if ($code eq 'ok')
+ {
+ $self->{validated} = 1;
+ $self->{itemsIndexes} = [];
+ my @idxs = $self->{results}->get_selected_indices;
+ foreach my $idx(@idxs)
+ {
+ push @{$self->{itemsIndexes}}, $self->{items}->[$idx]->{'#'};
+ }
+ }
+ elsif ($code eq 'yes')
+ {
+ my @idx = $self->{results}->get_selected_indices;
+ my $itemIndex = $self->{items}->[$idx[0]]->{'#'};
+ $self->{parent}->downloadItemInfoFromPlugin($self->{plugin}, $itemIndex, 1);
+ }
+ $ended = 1 if ($code eq 'ok') || ($code eq 'cancel') || ($code eq 'delete-event') || ($code eq 'no');
+ }
+ $self->hideTooltip;
+ $self->hide;
+ return ($code eq 'no');
+ }
+
+ sub getItemsIndexes
+ {
+ my $self = shift;
+ return $self->{itemsIndexes};
+ }
+
+ sub setMultipleSelection
+ {
+ my ($self, $activate) = @_;
+ return if !$self->{results};
+ $self->{results}->get_selection->set_mode ($activate ? 'multiple' : 'single');
+ $self->{multipleSelection} = $activate;
+ }
+
+ sub setWithNext
+ {
+ my ($self, $value) = @_;
+
+ $self->{withNext} = $value;
+ }
+
+ sub setSearchPlugin
+ {
+ my ($self, $plugin) = @_;
+
+ $self->{plugin} = $plugin;
+ $self->set_title($self->{parent}->{lang}->{ResultsTitle}.' ('.$plugin->getName.')');
+
+ for my $i (0..$self->{nbCols} - 2)
+ {
+ # If plugin is a multi-pass plugin, then update the column headers for this pass
+ $plugin->getReturnedFields() if $plugin->getNumberPasses > 1;
+
+ $self->{results}->get_column($i)->set_visible($plugin->hasField($self->{fields}->[$i]));
+ }
+
+ if ($plugin->getExtra)
+ {
+ $self->{results}->get_column($self->{nbCols} - 1)->set_visible(1);
+ $self->{results}->get_column($self->{nbCols} - 1)->set_title($plugin->getExtra);
+ $self->{withExtra} = 1;
+ }
+ else
+ {
+ $self->{results}->get_column($self->{nbCols} - 1)->set_visible(0);
+ $self->{withExtra} = 0;
+ }
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{ResultsTitle},
+ undef, 0,
+ 'gtk-zoom-in' => 'yes'
+ );
+ bless ($self, $class);
+
+ $self->{results} = 0;
+ $self->{withExtra} = 0;
+ $self->{withNext} = 0;
+ $self->{multipleSelection} = 0;
+ $self->{nextButton} = Gtk2::Button->new_from_stock('gtk-go-forward');
+ $parent->{tooltips}->set_tip($self->{nextButton},
+ $parent->{lang}->{ResultsNextTip});
+ $self->add_action_widget($self->{nextButton}, 'no');
+
+ $self->{parent} = $parent;
+
+ $self->set_modal(1);
+ $self->set_position('center');
+
+ $self->{scrollPanelList} = new Gtk2::ScrolledWindow;
+ $self->{scrollPanelList}->set_policy ('never', 'automatic');
+ $self->{scrollPanelList}->set_shadow_type('etched-in');
+
+ $self->vbox->pack_start($self->{scrollPanelList}, 1, 1, 0);
+ $self->vbox->pack_start(Gtk2::HSeparator->new, 0, 0, 0);
+ my $fillBox = new Gtk2::HBox(0,0);
+ $self->{multipleSelectionLabel} = GCLabel->new('<i>'.$parent->{lang}->{ResultsInfo}.'</i>');
+ $self->{multipleSelectionLabel}->set_line_wrap(1);
+ $self->{multipleSelectionLabel}->set_justify('center');
+ $self->{multipleSelectionLabel}->set_padding($GCUtils::margin, 0);
+ $fillBox->pack_start(Gtk2::HBox->new(0,0),1,1,0);
+ $fillBox->pack_start($self->{multipleSelectionLabel}, 0, 0, $GCUtils::margin);
+ $fillBox->pack_start(Gtk2::HBox->new(0,0),1,1,0);
+ $self->vbox->pack_start($fillBox, 0 , 0, $GCUtils::margin);
+
+ # To create a tooltip as it is not implemented directly in Gtk2
+ $self->{tooltipLabel} = Gtk2::Label->new;
+ $self->{tooltipLabel}->set_line_wrap(1);
+ $self->{tooltipLabel}->set_padding($GCUtils::margin, $GCUtils::margin);
+ $self->{tooltip} = Gtk2::Window->new('popup');
+ $self->{tooltip}->set_decorated(0);
+ $self->{tooltip}->set_sensitive(1);
+ $self->{tooltip}->modify_fg('normal', Gtk2::Gdk::Color->parse('#000000'));
+ $self->{tooltip}->modify_bg('normal', Gtk2::Gdk::Color->parse('#ffffbf'));
+ $self->{tooltip}->set_position('mouse');
+ $self->{tooltip}->add($self->{tooltipLabel});
+ $self->{tooltip}->signal_connect('button_press_event' => sub {
+ $self->hideTooltip;
+ if ($self->{results})
+ {
+ shift;
+ $self->{results}->signal_emit('button_press_event', @_);
+ }
+ });
+ $self->{tooltip}->signal_connect('motion-notify-event' => sub {
+ my ($widget, $event) = @_;
+ my ($x, $y) = ($event->x_root, $event->y_root);
+ my ($xoffset, $yoffset) = $widget->window->get_root_origin;
+ my $allocation = $widget->allocation();
+ my $x1 = $xoffset + 2 * $allocation->x;
+ my $y1 = $yoffset + 2 * $allocation->y;
+ my $x2 = $x1 + $allocation->width;
+ my $y2 = $y1 + $allocation->height;
+ my $isInWidget = ($x > $x1 && $x < $x2 && $y > $y1 && $y < $y2);
+
+ return if $isInWidget;
+ if ($self->{results})
+ {
+ shift;
+ $self->{results}->signal_emit('motion-notify-event', @_);
+ }
+ });
+ $self->{tooltipDisplayed} = 0;
+
+ return $self;
+ }
+
+ sub setModel
+ {
+ my ($self, $model, $fieldsInfo) = @_;
+
+ if ($self->{results})
+ {
+ $self->{scrollPanelList}->remove($self->{results});
+ $self->{results}->destroy;
+ }
+
+
+ $self->{fields} = [];
+ my @cols;
+
+ foreach my $field(@{$model->{resultsFields}})
+ {
+ push @cols, ($fieldsInfo->{$field}->{displayed} => 'text');
+ push @{$self->{fields}}, $field;
+ }
+
+ # Extra column
+ push @cols, ('' => 'text');
+ push @{$self->{fields}}, 'extra';
+
+ $self->{nbCols} = scalar @{$self->{fields}};
+
+ $self->{results} = Gtk2::SimpleList->new(@cols);
+
+ $self->{results}->set_rules_hint(1);
+ $self->{results}->set_headers_clickable(1);
+
+ $self->{order} = 1;
+ $self->{sort} = '';
+
+ for my $i (0..$self->{nbCols} - 1)
+ {
+ $self->{results}->get_column($i)->set_sort_indicator(0);
+ $self->{results}->get_column($i)->set_resizable(1);
+ $self->{results}->get_column($i)->signal_connect('clicked' => sub {
+ $self->sort($self->{fields}->[$i]);
+ });
+ $self->{results}->get_column($i)->{column_number} = $i;
+ }
+
+ $self->{scrollPanelList}->add($self->{results});
+
+ $self->{results}->signal_connect(row_activated => sub {
+ my ($sl, $path, $column) = @_;
+ $self->response('ok');
+ });
+ $self->{results}->signal_connect('motion-notify-event' => sub {
+ my ($widget, $event) = @_;
+ $self->displayTooltip($event);
+ });
+ $self->{results}->signal_connect('leave-notify-event' => sub {
+ my ($widget, $event) = @_;
+ # It corresponds to a leave of the whole widget not from a single cell
+ $self->hideTooltip if $event->detail eq 'ancestor';
+ });
+
+ $self->{multipleSelectionLabel}->set_markup('<i>'.$self->{parent}->{lang}->{ResultsInfo}.'</i>');
+
+ }
+
+ sub sort
+ {
+ my ($self, $type) = @_;
+
+ my $col = 0;
+
+ for my $i (0..$self->{nbCols} - 1)
+ {
+ $self->{results}->get_column($i)->set_sort_indicator(0);
+ $col = $i if $self->{fields}->[$i] eq $type;
+ }
+
+ my @items = @{$self->{items}};
+
+ if ($self->{sort} eq $type)
+ {
+ $self->{order} = 1 - $self->{order}
+ }
+ else
+ {
+ $self->{order} = 1;
+ }
+
+ @items = sort {$a->{$type} cmp $b->{$type}} @items;
+
+ @items = reverse @items if ! $self->{order};
+
+ $self->{results}->get_column($col)->set_sort_indicator(1);
+ $self->{results}->get_column($col)->set_sort_order($self->{order} ? 'ascending' : 'descending');
+
+ $self->setList('',@items);
+
+ $self->{sort} = $type;
+ }
+
+ sub setList
+ {
+ my ($self, $title, @items) = @_;
+
+ $self->set_title($self->get_title . ' - '.$title) if $title;
+
+ $self->{items} = \@items;
+
+ @{$self->{results}->{data}} = ();
+ $self->{tooltipsStrings} = {};
+
+ my $idx = 0;
+ my $col = 0;
+ foreach my $item (@items)
+ {
+ my $infos = [];
+ $col = 0;
+ foreach my $field(@{$self->{fields}})
+ {
+ my $value = '';
+ $value = $item->{$field} if exists $item->{$field};
+ (my $shortField = $value) =~ s/(.{40}).*/$1.../;
+ push @$infos, $shortField."\n";
+ # We store a tooltip is the text has been truncated
+ $self->{tooltipsStrings}->{$idx}->{$col} = $value
+ if $value ne $shortField;
+ $col++;
+ }
+ $item->{'#'} = $idx if ! exists $item->{'#'};
+ push @{$self->{results}->{data}}, $infos;
+ #push @{$self->{tooltipsStrings}}, $item->{$self->{fields}->[0]};
+ $idx++;
+ }
+ $self->{results}->select(0);
+ $self->{results}->columns_autosize;
+ $self->set_default_size(-1,400);
+ }
+
+
+ sub displayTooltip
+ {
+ my ($self, $event) = @_;
+ my ($path, $column, $cell_x, $cell_y) = $self->{results}->get_path_at_pos ($event->x, $event->y);
+ if ($path)
+ {
+ my $model = $self->{results}->get_model;
+ my $col = $column->{column_number};
+ my $row = $path->to_string();
+
+ # If a new cell is selected, then hide the tooltip
+ # It'll be re-shown as required by the code down under
+ if ($self->{selectedRow} ne $row or $self->{selectedCol} != $col)
+ {
+ $self->hideTooltip;
+ $self->{selectedRow} = $row;
+ $self->{selectedCol} = $col;
+ }
+ else
+ {
+ return;
+ }
+ if ($row ne '')
+ {
+ # Pick that popup string from our hash
+ #my $str = $popup_hash->{$row}->{$i};
+ my $str = $self->{tooltipsStrings}->{$row}->{$col};
+ if ($str)
+ {
+ $self->{tooltipLabel}->set_label($str);
+ if (!$self->{tooltipDisplayed})
+ {
+ $self->{tooltip}->show_all;
+ Gtk2->grab_add($self->{tooltip});
+ Gtk2::Gdk->pointer_grab(
+ $self->{tooltip}->window, 1,
+ [qw/button-press-mask button-release-mask pointer-motion-mask/],
+ undef, undef, 0);
+ Gtk2::Gdk->keyboard_grab ($self->{tooltip}->window, 0, 0);
+ $self->{tooltip}->grab_focus;
+ my ($thisx, $thisy) = $self->{tooltip}->window->get_origin;
+ # The window to be a bit away from the mouse pointer.
+ $self->{tooltip}->move($thisx, $thisy-20);
+ $self->{tooltipDisplayed} = 1;
+ }
+ }
+ }
+ return 0;
+ }
+ }
+
+ sub hideTooltip
+ {
+ my $self = shift;
+ if ($self->{tooltipDisplayed})
+ {
+ Gtk2->grab_remove($self->{tooltip});
+ $self->{tooltip}->hide;
+ $self->{tooltipDisplayed} = 0;
+ }
+ }
+
+}
+
+{
+ package GCImportFieldsDialog;
+ use base 'GCModalDialog';
+
+ sub setReadOnly
+ {
+ my ($self, $value) = @_;
+ $self->{readOnly} = $value;
+ my @children = $self->{table}->get_children;
+ foreach (@children)
+ {
+ $_->set_sensitive(!$value) if ($_->get_name eq 'GtkCheckButton')
+ && (!$_->{mandatory});
+ }
+ $self->set_title($value ? $self->{parent}->{lang}->{ResultsPreview}
+ : $self->{parent}->{lang}->{ImportWindowTitle});
+ }
+
+ sub info
+ {
+ my $self = shift;
+
+ my $fieldsInfo = $self->{parent}->{model}->{fieldsInfo};
+
+ if (@_)
+ {
+ my $info = shift;
+
+ $self->{info} = $info;
+
+ my @children = $self->{table}->get_children;
+ foreach (@children)
+ {
+ $_->set_text('') if $_->get_name eq 'GtkEntry';
+ }
+
+ my $fieldsInfo = $self->{parent}->{model}->{fieldsInfo};
+ foreach (keys %{$info})
+ {
+ my $tmp = $info->{$_};
+ if ($fieldsInfo->{$_}->{type} =~ /list/)
+ {
+ $tmp = GCPreProcess::multipleList($tmp, $fieldsInfo->{$_}->{type});
+ }
+ if ($fieldsInfo->{$_}->{values})
+ {
+ $tmp = $self->{parent}->{model}->getDisplayedValue($fieldsInfo->{$_}->{values},
+ $tmp);
+ }
+ if ($_ ne $self->{urlField})
+ {
+ $tmp =~ s/\n/ /g;
+ $tmp =~ s/(.{50}).*/$1.../m;
+ }
+ $self->{$_}->set_text($tmp)
+ if $self->{$_};
+ }
+ }
+ else
+ {
+ my $ignore = $self->{parent}->{ignoreString};
+
+ foreach my $field(@{$self->{parent}->{model}->{fieldsNames}})
+ {
+ next if $fieldsInfo->{$field}->{imported} ne 'true';
+ next if ($fieldsInfo->{$field}->{type} eq 'url');
+ if (! $self->{$field.'Cb'}->get_active)
+ {
+ unlink $self->{info}->{$field}
+ if ($fieldsInfo->{$field}->{type} eq 'image')
+ && ($self->{info}->{$field} !~ m|^http://|);
+ $self->{info}->{$field} = $ignore;
+ }
+ }
+
+ return $self->{info};
+ }
+ }
+
+ sub showImage
+ {
+ use File::Temp qw/ :POSIX /;
+
+ my ($self, $field) = @_;
+
+ my $location = $self->{info}->{$field};
+ if ($location =~ m|^http://|)
+ {
+ my ($name,$path,$suffix) = File::Basename::fileparse($location, "\.gif", "\.jpg", "\.jpeg", "\.png");
+ $self->window->set_cursor(Gtk2::Gdk::Cursor->new('watch'));
+ GCUtils::updateUI;
+ (my $tmpFile = tmpnam) .= $suffix;
+ GCUtils::downloadFile($location, $tmpFile, $self->{parent});
+ $self->window->set_cursor(Gtk2::Gdk::Cursor->new('left_ptr'));
+ $self->{parent}->launch($tmpFile, 'image', 0, $self);
+ $self->{info}->{$field} = $tmpFile;
+ }
+ else
+ {
+ $self->{parent}->launch($location, 'image', 0, $self);
+ }
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show();
+ $self->show_all;
+ if ($self->{readOnly})
+ {
+ $self->{selectAll}->hide;
+ $self->{selectNone}->hide;
+ ($self->action_area->get_children)[1]->hide;
+ }
+
+ foreach (keys %{$self->{imagesButton}})
+ {
+ $self->{$_}->hide if $self->{info}->{$_};
+ $self->{imagesButton}->{$_}->hide if ! $self->{info}->{$_};
+ }
+ my $response = $self->run;
+ $self->hide;
+ return ($response eq 'ok');
+ }
+
+ sub createItem
+ {
+ my ($self, $field, $row, $mandatory) = @_;
+ my $fieldsInfo = $self->{parent}->{model}->{fieldsInfo};
+ $self->{$field.'Cb'} = new Gtk2::CheckButton($self->{parent}->{model}->getDisplayedText($fieldsInfo->{$field}->{label}));
+ if ($mandatory)
+ {
+ $self->{$field.'Cb'}->set_sensitive(0);
+ $self->{$field.'Cb'}->set_active(1);
+ $self->{$field.'Cb'}->{mandatory} = 1;
+ }
+ $self->{$field} = new Gtk2::Entry;
+ $self->{$field}->set_editable(0);
+ $self->{table}->attach($self->{$field.'Cb'}, 0, 1, $row, $row + 1, 'fill', ['fill', 'expand'], 0, 0);
+ $self->{table}->attach($self->{$field}, 1, 2, $row, $row + 1, ['fill', 'expand'], 'fill', 0, 0);
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{ImportWindowTitle}
+ );
+
+ bless ($self, $class);
+
+ $self->{parent} = $parent;
+
+ $self->set_modal(1);
+ $self->set_position('center');
+ $self->set_default_size(1,500);
+
+ $self->{table} = new Gtk2::Table(1, 2, 0);
+ $self->{table}->set_row_spacings($GCUtils::halfMargin);
+ $self->{table}->set_col_spacings($GCUtils::margin);
+ $self->{table}->set_border_width($GCUtils::margin);
+
+ $self->{scrollPanelList} = new Gtk2::ScrolledWindow;
+ $self->{scrollPanelList}->set_policy ('never', 'automatic');
+ $self->{scrollPanelList}->set_shadow_type('none');
+ $self->{scrollPanelList}->add_with_viewport($self->{table});
+
+ $self->vbox->pack_start($self->{scrollPanelList},1,1,$GCUtils::margin);
+
+ $self->setModel($parent->{model});
+
+ return $self;
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+
+ my $parent = $self->{parent};
+
+ $self->{model} = $model;
+ my $fieldsInfo = $model->{fieldsInfo};
+ $self->{urlField} = $self->{parent}->{model}->{commonFields}->{url};
+
+ foreach ($self->{table}->get_children)
+ {
+ $self->{table}->remove($_);
+ $_->destroy;
+ }
+
+ my $row = 0;
+
+ my @picFields;
+ my $field;
+ foreach $field(@{$model->{fieldsNames}})
+ {
+ next if $fieldsInfo->{$field}->{imported} ne 'true';
+ next if ($field eq $self->{urlField});
+ if ($fieldsInfo->{$field}->{type} eq 'image')
+ {
+ push @picFields, $field;
+ next;
+ }
+ $self->createItem($field, $row);
+ $row++;
+ }
+
+ foreach $field(@picFields)
+ {
+ $self->createItem($field, $row);
+ $self->{imagesButton}->{$field} = new Gtk2::Button($parent->{lang}->{ImportViewPicture});
+ $self->{imagesButton}->{$field}->signal_connect('clicked' => sub {
+ $self->showImage($field);
+ });
+ $self->{table}->attach($self->{imagesButton}->{$field}, 1, 2, $row, $row + 1, 'fill', 'fill', 0, 0);
+ $row++;
+ }
+
+ if ($self->{urlField})
+ {
+ $self->createItem($self->{urlField}, $row, 1);
+ $row++;
+ }
+
+ $row++;
+
+ $self->{selectAll} = new Gtk2::Button($parent->{lang}->{ImportSelectAll});
+ $self->{selectAll}->signal_connect('clicked' => sub {
+ my @children = $self->{table}->get_children;
+ foreach (@children)
+ {
+ $_->set_active(1) if $_->get_name eq 'GtkCheckButton';
+ }
+ });
+ $self->{table}->attach($self->{selectAll}, 0, 1, $row, $row + 1, 'fill', 'fill', 0, 0);
+ $row++;
+ $self->{selectNone} = new Gtk2::Button($parent->{lang}->{ImportSelectNone});
+ $self->{selectNone}->signal_connect('clicked' => sub {
+ my @children = $self->{table}->get_children;
+ # Remove 2 items corresponding to website to keep it checked
+ splice @children, 2, 2;
+ foreach (@children)
+ {
+ $_->set_active(0) if $_->get_name eq 'GtkCheckButton';
+ }
+ });
+ $self->{table}->attach($self->{selectNone}, 0, 1, $row, $row + 1, 'fill', 'fill', 0, 0);
+
+
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCPluginsBase.pm b/lib/gcstar/GCPlugins/GCPluginsBase.pm
new file mode 100644
index 0000000..728e23a
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCPluginsBase.pm
@@ -0,0 +1,396 @@
+package GCPlugins::GCPluginsBase;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+{
+ package GCPluginParser;
+ use base qw(HTML::Parser);
+ use LWP::Simple qw($ua);
+ use HTTP::Cookies::Netscape;
+ use URI::Escape;
+ use HTML::Entities;
+ use Encode;
+ use File::Spec;
+
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ $ua->agent('Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041111 Firefox/1.0');
+ $ua->default_header('Accept-Encoding' => 'x-gzip');
+ $ua->default_header('Accept' => 'text/html');
+ $self->{ua} = $ua;
+
+ $self->{itemIdx} = -1;
+ $self->{itemsList} = ();
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getItemsNumber
+ {
+ my ($self) = @_;
+
+ return $self->{itemIdx} + 1;
+ }
+
+ sub getItems
+ {
+ my ($self) = @_;
+ return @{$self->{itemsList}};
+ }
+
+ sub load
+ {
+ my $self = shift;
+
+ $self->checkProxy;
+ $self->checkCookieJar;
+
+ $self->{itemIdx} = -1;
+ $self->{isInfo} = 0;
+ $self->{itemsList} = ();
+
+ #my $word = uri_escape_utf8($self->{title});
+ my $title2 = encode($self->getSearchCharset, $self->{title});
+ my $word = uri_escape($title2);
+ $word =~ s/%20/+/g;
+
+ my $post;
+ my $html;
+
+ # For multi-pass plugins, the plugin will have set the url to load for
+ # the next pass as nextUrl. If this doesn't exist, we're either on the
+ # first pass, or only using a one-pass plugin, so call getSearchUrl
+ # to find the url to retrieve
+ if ($self->{nextUrl})
+ {
+ $html = $self->loadPage($self->{nextUrl});
+ }
+ else
+ {
+ $html = $self->loadPage($self->getSearchUrl($word));
+ }
+
+ $self->{parsingList} = 1;
+ $html = $self->preProcess($html);
+ decode_entities($html)
+ if $self->decodeEntitiesWanted;
+ $self->{inside} = undef;
+ $self->parse($html);
+
+ my @noConversion = @{$self->getNotConverted};
+ foreach my $item (@{$self->{itemsList}})
+ {
+ foreach (keys %{$item})
+ {
+ next if $_ eq 'url';
+ $item->{$_} = $self->convertCharset($item->{$_})
+ if ! GCUtils::inArrayTest($_, @noConversion);
+ }
+ }
+
+ }
+
+ sub loadPage
+ {
+ my ($self, $url, $post, $noSave) = @_;
+ my $debugPhase = $ENV{GCS_DEBUG_PLUGIN_PHASE};
+ my $debugFile;
+ $debugFile = File::Spec->tmpdir.'/'.GCUtils::getSafeFileName($url)
+ if ($debugPhase > 0);
+ $self->{loadedUrl} = $url if ! $noSave;
+ my $response;
+ my $result;
+ if ($debugPhase != 2)
+ {
+ if ($post)
+ {
+ $response = $ua->post($url, $post);
+ }
+ else
+ {
+ $response = $ua->get($url);
+ }
+
+ #UnclePetros 03/07/2011:
+ #code to handle correctly 302 response messages
+ my $label1 = $response->code;
+ if($response->code == '302'){
+ my $location = $response->header("location");
+ $response = $ua->get($location);
+ $self->{loadedUrl} = $location;
+ }
+
+ eval {
+ $result = $response->decoded_content;
+ };
+ if ($debugPhase == 1)
+ {
+ open DEBUG_FILE, ">$debugFile";
+ print DEBUG_FILE ($result || $response->content);
+ close DEBUG_FILE;
+ }
+ }
+ else
+ {
+ local $/;
+ open DEBUG_FILE, "$debugFile";
+ $result = <DEBUG_FILE>;
+ utf8::decode($result);
+ }
+ return $result || ($response && $response->content);
+ }
+
+ sub capWord
+ {
+ my ($self, $msg) = @_;
+
+ use locale;
+
+ (my $newmsg = lc $msg) =~ s/(\s|,|^)(\w)(\w)(\w*?)/$1\U$2\E$3$4/gi;
+ return $newmsg;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return [''];
+ }
+
+ sub getSearchFields
+ {
+ my ($self, $model) = @_;
+
+ my $result = '';
+ $result .= $model->getDisplayedLabel($_).', ' foreach (@{$self->getSearchFieldsArray});
+ $result =~ s/, $//;
+ return $result;
+ }
+
+ sub hasField
+ {
+ my ($self, $field) = @_;
+
+ return $self->{hasField}->{$field};
+ }
+
+ sub getExtra
+ {
+ return '';
+ }
+
+ # Character set for web page text
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ # Character set for encoding search term, can sometimes be different
+ # to the page encoding, but we default to the same as the page set
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ return getCharset;
+ }
+
+ # For some plugins, we need extra checks to determine if urls match
+ # the language the plugin is written for. This allows us to correctly determine
+ # if a drag and dropped url is handled by a particular plugin. If these
+ # checks are necessary, return 1, and make sure plugin handles the
+ # the testURL function correctly
+ sub needsLanguageTest
+ {
+ return 0;
+ }
+
+ # Used to test if a given url is handled by the plugin. Only required if
+ # needsLanguageTest is true.
+ sub testURL
+ {
+ my ($self, $url) = @_;
+ return 1
+ }
+
+ # Determines whether plugin should be the default plugins gcstar uses.
+ # Plugins with this attribute set will appear first in plugin list,
+ # and will be highlighted with a star icon. A returned value of 1
+ # means the plugin is preferred if it's language matches the user's language,
+ # a returned value of 2 mean's it's preferred regardless of the language.
+ sub isPreferred
+ {
+ return 0;
+ }
+
+ sub getPreferred
+ {
+ return isPreferred;
+ }
+
+ sub getNotConverted
+ {
+ my $self = shift;
+ return [];
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 1;
+ }
+
+ sub getDefaultPictureSuffix
+ {
+ return '';
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+
+ my $result = $value;
+ if (ref($value) eq 'ARRAY')
+ {
+ foreach my $line(@{$value})
+ {
+ my $i = 0;
+ map {$_ = decode($self->getCharset, $_)} @{$line};
+ }
+ }
+ else
+ {
+ eval {
+ $result = decode($self->getCharset, $result);
+ };
+ }
+ return $result;
+ }
+
+ sub getItemInfo
+ {
+ my $self = shift;
+
+ eval {
+ $self->init;
+ };
+ my $idx = $self->{wantedIdx};
+ my $url = $self->getItemUrl($self->{itemsList}[$idx]->{url});
+ $self->loadUrl($url);
+ return $self->{curInfo};
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub loadUrl
+ {
+ my ($self, $url) = @_;
+ $self->checkProxy;
+ $self->checkCookieJar;
+ my $realUrl = $self->changeUrl($url);
+ my $html = $self->loadPage($realUrl);
+ $self->{parsingList} = 0;
+ #$html = $self->convertCharset($html);
+ $self->{curInfo} = {};
+
+ $html = $self->preProcess($html);
+ decode_entities($html)
+ if $self->decodeEntitiesWanted;
+
+ $self->{curInfo}->{$self->{urlField}} = $url;
+ $self->{inside} = undef;
+ $self->parse($html);
+
+ my @noConversion = @{$self->getNotConverted};
+ foreach (keys %{$self->{curInfo}})
+ {
+ next if $_ eq $self->{urlField};
+ $self->{curInfo}->{$_} = $self->convertCharset($self->{curInfo}->{$_})
+ if ! GCUtils::inArrayTest($_, @noConversion);
+ if (ref($self->{curInfo}->{$_}) ne 'ARRAY')
+ {
+ $self->{curInfo}->{$_} =~ s/\|/,/gm;
+ $self->{curInfo}->{$_} =~ s/\r//gm;
+ $self->{curInfo}->{$_} =~ s/[ \t]*$//gm;
+ }
+ }
+ $self->{curInfo}->{$self->{urlField}} .= $GCModel::linkNameSeparator.$self->getName;
+ return $self->{curInfo};
+ }
+
+ sub setProxy
+ {
+ my ($self, $proxy) = @_;
+
+ $self->{proxy} = $proxy;
+ }
+
+ sub checkProxy
+ {
+ my $self = shift;
+ $ua->proxy(['http'], $self->{proxy});
+ #$self->{ua}->proxy(['http'], $self->{proxy});
+ }
+
+ sub setCookieJar
+ {
+ my ($self, $cookieJar) = @_;
+ $self->{cookieJar} = $cookieJar;
+ }
+
+ sub checkCookieJar
+ {
+ my $self = shift;
+ $ua->cookie_jar(HTTP::Cookies::Netscape->new(
+ 'file' => "$self->{cookieJar}",
+ 'autosave' => 1,));
+ }
+
+ # Used to set the number of passes the plugin requires
+ sub getNumberPasses
+ {
+ # Most plugins only need to search once, so default to one pass
+ return 1;
+ }
+
+ # Returns undef if it doesn't support search using barcode scanner
+ sub getEanField
+ {
+ return undef;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVepisodes/GCTVepisodesCommon.pm b/lib/gcstar/GCPlugins/GCTVepisodes/GCTVepisodesCommon.pm
new file mode 100644
index 0000000..478f1b8
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVepisodes/GCTVepisodesCommon.pm
@@ -0,0 +1,67 @@
+package GCPlugins::GCTVepisodes::GCTVepisodesCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+our $MAX_ACTORS = 10;
+our $MAX_DIRECTORS = 4;
+
+use GCPlugins::GCPluginsBase;
+
+{
+ package GCPlugins::GCTVepisodes::GCTVepisodesPluginsBase;
+
+ use base qw(GCPluginParser);
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['series'];
+ }
+
+ sub loadUrl
+ {
+ my ($self, $url) = @_;
+
+ $self->SUPER::loadUrl($url);
+
+ if (! $self->{curInfo}->{title} && $self->{curInfo}->{original})
+ {
+ $self->{curInfo}->{title} = $self->{curInfo}->{original};
+ $self->{curInfo}->{original} = '';
+ }
+ return $self->{curInfo};
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdb.pm b/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdb.pm
new file mode 100644
index 0000000..f275ca5
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdb.pm
@@ -0,0 +1,360 @@
+package GCPlugins::GCTVepisodes::GCTvdb;
+
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCTVepisodes::GCTVepisodesCommon;
+
+
+{
+ package GCPlugins::GCTVepisodes::GCPluginTvdb;
+
+ use base qw(GCPlugins::GCTVepisodes::GCTVepisodesPluginsBase);
+ use XML::Simple;
+ use Encode;
+ use LWP::Simple qw($ua);
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if $page =~ /^<!DOCTYPE html/;
+ my $xml;
+ my $xs = XML::Simple->new;
+
+ if ($self->{pass} eq 1)
+ {
+ # Searching on series name
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => ['Series'],
+ KeyAttr => []
+ );
+
+ foreach my $series ( @{$xml->{Series}})
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{nextUrl} = "http://www.thetvdb.com/api/A8CC4AF70D0385F3/series/".$series->{id}."/all/".$self->siteLanguage().".xml";
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $series->{SeriesName};
+ $self->{itemsList}[$self->{itemIdx}]->{firstaired} = $series->{FirstAired};
+ }
+ }
+ else
+ {
+ if ($self->{parsingList})
+ {
+ # Searching on episodes
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => ['Episode'],
+ KeyAttr => [],
+
+ );
+
+ foreach my $episode (@{$xml->{Episode}})
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $episode->{EpisodeName}
+ if (!ref($episode->{EpisodeName}));
+ $self->{itemsList}[$self->{itemIdx}]->{season} = $episode->{SeasonNumber};
+ $self->{itemsList}[$self->{itemIdx}]->{episode} = $episode->{EpisodeNumber};
+ $self->{itemsList}[$self->{itemIdx}]->{director} = $episode->{Director}
+ if (!ref($episode->{Director}));
+ $self->{itemsList}[$self->{itemIdx}]->{writer} = $episode->{Writer}
+ if (!ref($episode->{Writer}));
+ $self->{itemsList}[$self->{itemIdx}]->{overview} = $episode->{Overview}
+ if (!ref($episode->{Overview}));
+ $self->{itemsList}[$self->{itemIdx}]->{image} = "http://thetvdb.com/banners/".$episode->{filename}
+ if (!ref($episode->{filename}));
+ $self->{itemsList}[$self->{itemIdx}]->{series} = $xml->{Series}->{SeriesName}
+ if (!ref($xml->{Series}->{SeriesName}));
+ $self->{itemsList}[$self->{itemIdx}]->{firstaired} = $xml->{Series}->{FirstAired}
+ if (!ref($xml->{Series}->{FirstAired}));
+ $self->{itemsList}[$self->{itemIdx}]->{actors} = $xml->{Series}->{Actors}
+ if (!ref($xml->{Series}->{Actors}));
+ $self->{itemsList}[$self->{itemIdx}]->{genre} = $xml->{Series}->{Genre}
+ if (!ref($xml->{Series}->{Genre}));
+ $self->{itemsList}[$self->{itemIdx}]->{runtime} = $xml->{Series}->{Runtime}
+ if (!ref($xml->{Series}->{Runtime}));
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.thetvdb.com/?tab=episode&seriesid=".$episode->{seriesid}."&seasonid=".$episode->{seasonid}."&id=".$episode->{id}."&lid=".$self->siteLanguageCode();
+ }
+ }
+ elsif ($self->{pass} != 2)
+ {
+ # Process a given url
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => ['Episode'],
+ KeyAttr => [],
+ );
+
+ # Need to grab the generic series info too
+ my $response = $ua->get('http://www.thetvdb.com/api/A8CC4AF70D0385F3/series/'.$xml->{Episode}[0]->{seriesid}.'/'.$self->siteLanguage().'.xml');
+ my $result;
+ eval {
+ $result = $response->decoded_content;
+ };
+ my $seriesxml = $xs->XMLin(
+ $result,
+ ForceArray => ['Series'],
+ KeyAttr => [],
+ );
+ $self->{curInfo}->{season} = $xml->{Episode}[0]->{SeasonNumber};
+ $self->{curInfo}->{episode} = $xml->{Episode}[0]->{EpisodeNumber};
+ $self->{curInfo}->{name} = $xml->{Episode}[0]->{EpisodeName};
+ $self->{curInfo}->{series} = $seriesxml->{Series}[0]->{SeriesName};
+ $self->{curInfo}->{director} = $xml->{Episode}[0]->{Director}
+ if (!ref($xml->{Episode}[0]->{Director}));
+ $self->{curInfo}->{director} =~ s/^\|//;
+ $self->{curInfo}->{director} =~ s/\|$//;
+ $self->{curInfo}->{firstaired} = $xml->{Episode}[0]->{FirstAired}
+ if (!ref($xml->{Episode}[0]->{FirstAired}));
+ $self->{curInfo}->{writer} = $xml->{Episode}[0]->{Writer}
+ if (!ref($xml->{Episode}[0]->{Writer}));
+ $self->{curInfo}->{writer} =~ s/^\|//;
+ $self->{curInfo}->{writer} =~ s/\|$//;
+
+ if (!ref($seriesxml->{Series}[0]->{Actors}))
+ {
+ my $actorString = $seriesxml->{Series}[0]->{Actors};
+ $actorString =~ s/^\|//;
+ $actorString =~ s/\|$//;
+ for my $actor (split(/\|/, $actorString))
+ {
+ push @{$self->{curInfo}->{actors}}, [$actor];
+ }
+ }
+
+ if (!ref($seriesxml->{Series}[0]->{Genre}))
+ {
+ my $genreString = $seriesxml->{Series}[0]->{Genre};
+ $genreString =~ s/^\|//;
+ $genreString =~ s/\|$//;
+ for my $genre (split(/\|/, $genreString))
+ {
+ push @{$self->{curInfo}->{genre}}, [$genre];
+ }
+ }
+
+ $self->{curInfo}->{time} = $seriesxml->{Series}[0]->{Runtime};
+ $self->{curInfo}->{image} = "http://thetvdb.com/banners/".$xml->{Episode}[0]->{filename}
+ if (!ref($xml->{Episode}[0]->{filename}));
+ $self->{curInfo}->{synopsis} = $xml->{Episode}[0]->{Overview}
+ if (!ref($xml->{Episode}[0]->{Overview}));
+ $self->{curInfo}->{webPage} = "http://www.thetvdb.com/?tab=episode&seriesid=".$xml->{Episode}[0]->{seriesid}."&seasonid=".$xml->{Episode}[0]->{seasonid}."&id=".$xml->{Episode}[0]->{id}."&lid=".$self->siteLanguageCode();
+ }
+ else
+ {
+ $self->{curInfo}->{season} = $self->{itemsList}[$self->{wantedIdx}]->{season};
+ $self->{curInfo}->{episode} = $self->{itemsList}[$self->{wantedIdx}]->{episode};
+ $self->{curInfo}->{name} = $self->{itemsList}[$self->{wantedIdx}]->{name};
+ $self->{curInfo}->{series} = $self->{itemsList}[$self->{wantedIdx}]->{series};
+ $self->{curInfo}->{director} = $self->{itemsList}[$self->{wantedIdx}]->{director};
+ $self->{curInfo}->{director} =~ s/^\|//;
+ $self->{curInfo}->{director} =~ s/\|$//;
+ $self->{curInfo}->{firstaired} = $self->{itemsList}[$self->{wantedIdx}]->{firstaired};
+ $self->{curInfo}->{writer} = $self->{itemsList}[$self->{wantedIdx}]->{writer};
+ $self->{curInfo}->{writer} =~ s/^\|//;
+ $self->{curInfo}->{writer} =~ s/\|$//;
+
+ my $actorString = $self->{itemsList}[$self->{wantedIdx}]->{actors};
+ $actorString =~ s/^\|//;
+ $actorString =~ s/\|$//;
+ for my $actor (split(/\|/, $actorString))
+ {
+ push @{$self->{curInfo}->{actors}}, [$actor];
+ }
+
+ my $genreString = $self->{itemsList}[$self->{wantedIdx}]->{genre};
+ $genreString =~ s/^\|//;
+ $genreString =~ s/\|$//;
+ for my $genre (split(/\|/, $genreString))
+ {
+ push @{$self->{curInfo}->{genre}}, [$genre];
+ }
+ $self->{curInfo}->{time} = $self->{itemsList}[$self->{wantedIdx}]->{runtime};
+ $self->{curInfo}->{image} = $self->{itemsList}[$self->{wantedIdx}]->{image};
+ $self->{curInfo}->{synopsis} = $self->{itemsList}[$self->{wantedIdx}]->{overview};
+ $self->{curInfo}->{webPage} = $self->{itemsList}[$self->{wantedIdx}]->{url};
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://www.thetvdb.com/api/GetSeries.php?seriesname=$word&language=".$self->siteLanguage();
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ if (!$url)
+ {
+ # If we're not passed a url, return a hint so that gcstar knows what type
+ # of addresses this plugin handles
+ $url = "http://www.thetvdb.com";
+ }
+ elsif (index($url, "api") < 0)
+ {
+ # Url isn't for the tvdb api, so we need to find the episode id
+ # and return a url corresponding to the api page for this movie
+
+ $url =~ /[\?&]id=([0-9]+)*/;
+ my $id = $1;
+ $url = "http://www.thetvdb.com/api/A8CC4AF70D0385F3/episodes/$id/".$self->siteLanguage().".xml";
+ }
+ return $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ # Make sure the url is for the api, not the main movie page
+ return $self->getItemUrl($url);
+ }
+
+ sub getNumberPasses
+ {
+ return 2;
+ }
+
+ sub getName
+ {
+ return "Tvdb";
+ }
+
+ sub needsLanguageTest
+ {
+ return 1;
+ }
+
+ sub testURL
+ {
+ my ($self, $url) = @_;
+ $url =~ /[\?&]lid=([0-9]+)*/;
+ my $id = $1;
+ return ($id == $self->siteLanguageCode());
+ }
+
+ sub getReturnedFields
+ {
+ my $self = shift;
+
+ if ($self->{pass} == 1)
+ {
+ $self->{hasField} = {
+ name => 1,
+ firstaired => 1,
+ };
+ }
+ else
+ {
+ $self->{hasField} = {
+ name => 1,
+ season => 1,
+ episode => 1,
+ };
+ }
+ }
+
+ sub getAuthor
+ {
+ return 'Zombiepig';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'en';
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+
+ sub siteLanguageCode
+ {
+ my $self = shift;
+
+ return 7;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbES.pm b/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbES.pm
new file mode 100644
index 0000000..dc753f1
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbES.pm
@@ -0,0 +1,61 @@
+package GCPlugins::GCTVepisodes::GCTvdbES;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCTVepisodes::GCTvdb;
+
+
+{
+ package GCPlugins::GCTVepisodes::GCPluginTvdbES;
+
+ use base qw(GCPlugins::GCTVepisodes::GCPluginTvdb);
+
+ sub getLang
+ {
+ return 'ES';
+ }
+
+ sub getName
+ {
+ return "Tvdb ES";
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'es';
+ }
+
+ sub siteLanguageCode
+ {
+ my $self = shift;
+
+ return 16;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbFR.pm b/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbFR.pm
new file mode 100644
index 0000000..791cee7
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbFR.pm
@@ -0,0 +1,61 @@
+package GCPlugins::GCTVepisodes::GCTvdbFR;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCTVepisodes::GCTvdb;
+
+
+{
+ package GCPlugins::GCTVepisodes::GCPluginTvdbFR;
+
+ use base qw(GCPlugins::GCTVepisodes::GCPluginTvdb);
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getName
+ {
+ return "Tvdb FR";
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'fr';
+ }
+
+ sub siteLanguageCode
+ {
+ my $self = shift;
+
+ return 17;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbIT.pm b/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbIT.pm
new file mode 100644
index 0000000..c3eab7b
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbIT.pm
@@ -0,0 +1,60 @@
+package GCPlugins::GCTVepisodes::GCTvdbIT;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCTVepisodes::GCTvdb;
+
+
+{
+ package GCPlugins::GCTVepisodes::GCPluginTvdbIT;
+
+ use base qw(GCPlugins::GCTVepisodes::GCPluginTvdb);
+
+ sub getLang
+ {
+ return 'IT';
+ }
+
+ sub getName
+ {
+ return "Tvdb IT";
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'it';
+ }
+
+ sub siteLanguageCode
+ {
+ my $self = shift;
+
+ return 15;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVseries/GCTVseriesCommon.pm b/lib/gcstar/GCPlugins/GCTVseries/GCTVseriesCommon.pm
new file mode 100644
index 0000000..119b1df
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVseries/GCTVseriesCommon.pm
@@ -0,0 +1,53 @@
+package GCPlugins::GCTVseries::GCTVseriesCommon;
+
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+our $MAX_ACTORS = 10;
+our $MAX_DIRECTORS = 4;
+
+use GCPlugins::GCPluginsBase;
+
+{
+ package GCPlugins::GCTVseries::GCTVseriesPluginsBase;
+
+ use base qw(GCPluginParser);
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['series'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVseries/GCThemoviedb.pm b/lib/gcstar/GCPlugins/GCTVseries/GCThemoviedb.pm
new file mode 100644
index 0000000..e4d4eb2
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVseries/GCThemoviedb.pm
@@ -0,0 +1,340 @@
+package GCPlugins::GCTVseries::GCthemoviedb;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCTVseries::GCTVseriesCommon;
+
+{
+
+ package GCPlugins::GCTVseries::GCPluginThemoviedb;
+
+ use base 'GCPlugins::GCTVseries::GCTVseriesPluginsBase';
+ use XML::Simple;
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if $page =~ /^<!DOCTYPE html/;
+ my $xml;
+ my $xs = XML::Simple->new;
+
+ if ($self->{parsingList})
+ {
+ if ($page !~ m/>Nothing found.<\/movie/)
+ {
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => [ 'movie', 'alternative_name' ],
+ KeyAttr => ['id']
+ );
+ my $movie;
+ foreach $movie (keys(%{$xml->{'movies'}->{'movie'}}))
+ {
+ # We only want movies, not series and everything else the api returns
+ if ($xml->{'movies'}->{'movie'}->{$movie}->{'type'} eq "movie")
+ {
+ $self->{itemIdx}++;
+ my $url = "http://api.themoviedb.org/2.1/Movie.getInfo/en/xml/9fc8c3894a459cac8c75e3284b712dfc/" . $movie;
+ # If the release date is missing, it will be returned as an array, so only save the release if
+ # it's not an array
+ my $released = "";
+ if (!ref($xml->{'movies'}->{'movie'}->{$movie}->{'released'}))
+ {
+ $released = $xml->{'movies'}->{'movie'}->{$movie}->{'released'};
+ }
+ $self->{itemsList}[ $self->{itemIdx} ]->{firstaired} = $released;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} =
+ $xml->{'movies'}->{'movie'}->{$movie}->{'name'};
+ # Now, check if there's any alternative names, and if so, add them in as
+ # additional search results.
+ for my $alternateName (
+ @{$xml->{'movies'}->{'movie'}->{$movie}->{alternative_name}})
+ {
+ if (!ref($alternateName))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{firstaired} = $released;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $alternateName;
+ }
+ }
+
+ }
+ }
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => [ 'country', 'person', 'category', 'size', 'alternative_name' ],
+ KeyAttr => ['']
+ );
+
+ if (
+ (
+ $xml->{movies}->{movie}->{name} ne
+ $self->{itemsList}[ $self->{wantedIdx} ]->{title}
+ )
+ && ($self->{itemsList}[ $self->{wantedIdx} ]->{title})
+ )
+ {
+ # Name returned by tmdb is different to the one the user selected
+ # this means they choose an translated name, so use the name they choose
+ # as the default
+ $self->{curInfo}->{title} = $self->{itemsList}[ $self->{wantedIdx} ]->{title};
+ }
+ else
+ {
+ $self->{curInfo}->{title} = $xml->{movies}->{movie}->{name};
+ }
+
+ # Try and guess the series name
+ $xml->{movies}->{movie}->{name} =~ /^(.*):/;
+ if ($1 ne '')
+ {
+ $self->{curInfo}->{series} = $1;
+ }
+ else
+ {
+ $self->{curInfo}->{series} = $xml->{movies}->{movie}->{name};
+ }
+
+ # Set season to 0 and set special flag
+ $self->{curInfo}->{season} = 0;
+ $self->{curInfo}->{specialep} = 1;
+
+ $self->{curInfo}->{webPage} = $xml->{movies}->{movie}->{url};
+
+ # The following fields could be missing from the xml, so we need to check if they're blank
+ # (in which case they'll be a array)
+ $self->{curInfo}->{synopsis} = $xml->{movies}->{movie}->{overview}
+ if (!ref($xml->{movies}->{movie}->{overview}));
+ $self->{curInfo}->{ratingpress} = $xml->{movies}->{movie}->{rating}
+ if (!ref($xml->{movies}->{movie}->{rating}));
+ $self->{curInfo}->{firstaired} = $xml->{movies}->{movie}->{released}
+ if (!ref($xml->{movies}->{movie}->{released}));
+ $self->{curInfo}->{time} = $xml->{movies}->{movie}->{runtime} . " mins"
+ if (!ref($xml->{movies}->{movie}->{runtime}));
+
+ if (!ref($xml->{movies}->{movie}->{certification}))
+ {
+ my $certification;
+ $certification = $xml->{movies}->{movie}->{certification};
+ $self->{curInfo}->{age} = 1
+ if ($certification eq 'Unrated') || ($certification eq 'Open');
+ $self->{curInfo}->{age} = 2
+ if ($certification eq 'G') || ($certification eq 'Approved');
+ $self->{curInfo}->{age} = 5
+ if ($certification eq 'PG')
+ || ($certification eq 'M')
+ || ($certification eq 'GP');
+ $self->{curInfo}->{age} = 13 if $certification eq 'PG-13';
+ $self->{curInfo}->{age} = 17 if $certification eq 'R';
+ $self->{curInfo}->{age} = 18
+ if ($certification eq 'NC-17') || ($certification eq 'X');
+ }
+
+ for my $country (@{$xml->{movies}->{movie}->{countries}->{country}})
+ {
+ $self->{curInfo}->{country} .= $country->{name} . ', ';
+ }
+ $self->{curInfo}->{country} =~ s/, $//;
+ for my $person (@{$xml->{movies}->{movie}->{cast}->{person}})
+ {
+ my $name = $person->{name};
+ # Strip any blank spaces from start and end of name
+ $name =~ s/\s*$//;
+ $name =~ s/^\s*//;
+ if ($person->{job} eq "Director")
+ {
+ $self->{curInfo}->{director} .= $name . ', ';
+ }
+ if ($person->{job} eq "Producer")
+ {
+ $self->{curInfo}->{producer} .= $name . ', ';
+ }
+ if ($person->{job} eq "Music")
+ {
+ $self->{curInfo}->{music} .= $name . ', ';
+ }
+ elsif ($person->{job} eq "Actor")
+ {
+ if ($self->{actorsCounter} < $GCPlugins::GCTVseries::GCTVseriesCommon::MAX_ACTORS)
+ {
+
+ push @{$self->{curInfo}->{actors}}, [$name];
+ my $role = $person->{character};
+ $role =~ s/\s*$//;
+ $role =~ s/^\s*//;
+ push @{$self->{curInfo}->{actors}->[ $self->{actorsCounter} ]}, $role;
+ $self->{actorsCounter}++;
+ }
+ }
+ }
+ $self->{curInfo}->{director} =~ s/, $//;
+ $self->{curInfo}->{producer} =~ s/, $//;
+ $self->{curInfo}->{music} =~ s/, $//;
+ for my $category (@{$xml->{movies}->{movie}->{categories}->{category}})
+ {
+ push @{$self->{curInfo}->{genre}}, [ $category->{name} ]
+ if ($category->{type} eq 'genre');
+ }
+ for my $image (@{$xml->{movies}->{movie}->{images}->{image}})
+ {
+ if ($image->{type} eq "poster")
+ {
+ # Fetch either the big original pic, or just the small thumbnail pic
+ if ( (($self->{bigPics}) && ($image->{size} eq "original"))
+ || (!($self->{bigPics}) && ($image->{size} eq "thumb")))
+ {
+ if (!$self->{curInfo}->{image})
+ {
+ $self->{curInfo}->{image} = $image->{url};
+ }
+ }
+ }
+ }
+
+ # We have to return something as the name, even though this field will get automatically
+ # calculated for tv series collections.
+ $self->{curInfo}->{name} = "temp";
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ firstaired => 1
+ };
+
+ return $self;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ if (!$url)
+ {
+ # If we're not passed a url, return a hint so that gcstar knows what type
+ # of addresses this plugin handles
+ $url = "http://www.themoviedb.org";
+ }
+ elsif (index($url, "api") < 0)
+ {
+ # Url isn't for the movie db api, so we need to find the movie id
+ # and return a url corresponding to the api page for this movie
+ my $found = index(reverse($url), "/");
+ if ($found >= 0)
+ {
+ my $id = substr(reverse($url), 0, $found);
+ $url =
+"http://api.themoviedb.org/2.1/Movie.getInfo/en/xml/9fc8c3894a459cac8c75e3284b712dfc/"
+ . reverse($id);
+ }
+ }
+ return $url;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return
+"http://api.themoviedb.org/2.1/Movie.search/en/xml/9fc8c3894a459cac8c75e3284b712dfc/$word";
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ # Make sure the url is for the api, not the main movie page
+ return $self->getItemUrl($url);
+ }
+
+ sub getName
+ {
+ return "The Movie DB";
+ }
+
+ sub getAuthor
+ {
+ return 'Zombiepig';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+ sub getNotConverted
+ {
+ my $self = shift;
+ return [];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVseries/GCTvdb.pm b/lib/gcstar/GCPlugins/GCTVseries/GCTvdb.pm
new file mode 100644
index 0000000..ca4dc68
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVseries/GCTvdb.pm
@@ -0,0 +1,466 @@
+package GCPlugins::GCTVseries::GCTvdb;
+
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCTVseries::GCTVseriesCommon;
+
+
+{
+ package GCPlugins::GCTVseries::GCPluginTvdb;
+
+ use base qw(GCPlugins::GCTVseries::GCTVseriesPluginsBase);
+ use XML::Simple;
+ use Encode;
+ use LWP::Simple qw($ua);
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if $page =~ /^<!DOCTYPE html/;
+ my $xml;
+ my $xs = XML::Simple->new;
+
+ if ($self->{pass} eq 1)
+ {
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => ['Series'],
+ KeyAttr => []
+ );
+
+ foreach my $series ( @{$xml->{Series}})
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{nextUrl} = "http://www.thetvdb.com/api/A8CC4AF70D0385F3/series/".$series->{id}."/all/".$self->siteLanguage().".xml";
+ $self->{itemsList}[$self->{itemIdx}]->{series} = $series->{SeriesName};
+ $self->{itemsList}[$self->{itemIdx}]->{firstaired} = $series->{FirstAired};
+ }
+ }
+ else
+ {
+ if ($self->{parsingList})
+ {
+ # Searching on episodes
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => ['Episode'],
+ KeyAttr => [],
+ );
+
+ # Need to grab the banners info too
+ my $response = $ua->get('http://www.thetvdb.com/api/A8CC4AF70D0385F3/series/'.$xml->{Episode}[0]->{seriesid}.'/banners.xml');
+ my $result;
+ eval {
+ $result = $response->decoded_content;
+ };
+ my $bannersxml = $xs->XMLin(
+ $result,
+ ForceArray => ['Banner'],
+ KeyAttr => [],
+ );
+
+ my @seasonNumbers;
+ foreach my $episode (@{$xml->{Episode}})
+ {
+ if (!grep(/\b$episode->{SeasonNumber}\b/,@seasonNumbers))
+ {
+ push (@seasonNumbers, $episode->{SeasonNumber});
+ $self->{itemIdx}++;
+
+ $self->{itemsList}[$self->{itemIdx}]->{series} = $xml->{Series}->{SeriesName}
+ if (!ref($xml->{Series}->{SeriesName}));
+ $self->{itemsList}[$self->{itemIdx}]->{season} = $episode->{SeasonNumber};
+ $self->{itemsList}[$self->{itemIdx}]->{overview} = $xml->{Series}->{Overview}
+ if (!ref($xml->{Series}->{Overview}));
+
+ # Find banner
+ foreach my $banner (@{$bannersxml->{Banner}})
+ {
+ if ($banner->{Season} == $episode->{SeasonNumber})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{image} = "http://thetvdb.com/banners/".$banner->{BannerPath}
+ if (!$self->{itemsList}[$self->{itemIdx}]->{image});
+ }
+ }
+
+ my $seasonEpisodes;
+ # Episodes
+ my $episodePos = 0;
+ foreach my $checkEpisode (@{$xml->{Episode}})
+ {
+ if (($checkEpisode->{EpisodeNumber} != 0) || (!ref($checkEpisode->{EpisodeName})))
+ {
+ # Prefer dvd episode numbers
+ if (($checkEpisode->{DVD_season} == $episode->{SeasonNumber})
+ || ((ref($checkEpisode->{DVD_season})) && ($checkEpisode->{SeasonNumber} == $episode->{SeasonNumber})))
+ {
+ if (ref($checkEpisode->{DVD_episodenumber}))
+ {
+ push (@{$seasonEpisodes},[ $checkEpisode->{EpisodeNumber}]);
+ }
+ else
+ {
+ my $trimmedEpNumber = $checkEpisode->{DVD_episodenumber};
+ $trimmedEpNumber =~ /^(\d*)/;
+ push (@{$seasonEpisodes},[ $1]);
+ }
+
+ push @{$seasonEpisodes->[ $episodePos ]}, $checkEpisode->{EpisodeName};
+ $episodePos++;
+ }
+ }
+ }
+
+ # If we found episodes, sort them
+ if (scalar( $seasonEpisodes) > 0)
+ {
+ my @sortedSeasonEpisodes = sort{ $a->[ 0 ] <=> $b->[ 0 ] } @{$seasonEpisodes};
+ @{$self->{itemsList}[$self->{itemIdx}]->{episodes}} = @sortedSeasonEpisodes;
+ }
+
+
+ $self->{itemsList}[$self->{itemIdx}]->{firstaired} = $xml->{Series}->{FirstAired}
+ if (!ref($xml->{Series}->{FirstAired}));
+ $self->{itemsList}[$self->{itemIdx}]->{actors} = $xml->{Series}->{Actors}
+ if (!ref($xml->{Series}->{Actors}));
+ $self->{itemsList}[$self->{itemIdx}]->{genre} = $xml->{Series}->{Genre}
+ if (!ref($xml->{Series}->{Genre}));
+ $self->{itemsList}[$self->{itemIdx}]->{runtime} = $xml->{Series}->{Runtime}
+ if (!ref($xml->{Series}->{Runtime}));
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.thetvdb.com/?tab=season&seriesid=".$episode->{seriesid}."&seasonid=".$episode->{seasonid}."&lid=".$self->siteLanguageCode();
+ }
+ }
+
+ }
+ elsif ($self->{pass} != 2)
+ {
+ # Process a given url
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => ['Episode'],
+ KeyAttr => [],
+ );
+
+ # Need to grab the banners info too
+ my $response = $ua->get('http://www.thetvdb.com/api/A8CC4AF70D0385F3/series/'.$self->{seriesid}.'/banners.xml');
+ my $result;
+ eval {
+ $result = $response->decoded_content;
+ };
+ my $bannersxml = $xs->XMLin(
+ $result,
+ ForceArray => ['Banner'],
+ KeyAttr => [],
+ );
+
+ $self->{curInfo}->{series} = $xml->{Series}->{SeriesName}
+ if (!ref($xml->{Series}->{SeriesName}));
+ $self->{curInfo}->{synopsis} = $xml->{Series}->{Overview}
+ if (!ref($xml->{Series}->{Overview}));
+ $self->{curInfo}->{firstaired} = $xml->{Series}->{FirstAired}
+ if (!ref($xml->{Series}->{FirstAired}));
+ $self->{curInfo}->{time} = $xml->{Series}->{Runtime}
+ if (!ref($xml->{Series}->{Runtime}));
+
+ if (!ref($xml->{Series}->{Actors}))
+ {
+ my $actorString = $xml->{Series}->{Actors};
+ $actorString =~ s/^\|//;
+ $actorString =~ s/\|$//;
+ for my $actor (split(/\|/, $actorString))
+ {
+ push @{$self->{curInfo}->{actors}}, [$actor];
+ }
+ }
+
+ if (!ref($xml->{Series}->{Genre}))
+ {
+ my $genreString = $xml->{Series}->{Genre};
+ $genreString =~ s/^\|//;
+ $genreString =~ s/\|$//;
+ for my $genre (split(/\|/, $genreString))
+ {
+ push @{$self->{curInfo}->{genre}}, [$genre];
+ }
+ }
+
+ # Find corresponding season number
+ foreach my $episode (@{$xml->{Episode}})
+ {
+ if (($episode->{seasonid} == $self->{seasonid})
+ && (!$self->{curInfo}->{season}))
+ {
+ $self->{curInfo}->{season} = $episode->{SeasonNumber};
+ $self->{curInfo}->{webPage} = "http://www.thetvdb.com/?tab=season&seriesid=".$episode->{seriesid}."&seasonid=".$episode->{seasonid}."&lid=".$self->siteLanguageCode();
+ }
+ }
+
+ my $seasonEpisodes;
+ # Episodes
+ my $episodePos = 0;
+ foreach my $checkEpisode (@{$xml->{Episode}})
+ {
+ if (($checkEpisode->{EpisodeNumber} != 0) || (!ref($checkEpisode->{EpisodeName})))
+ {
+ # Prefer dvd episode numbers
+ if (($checkEpisode->{DVD_season} == $self->{curInfo}->{season})
+ || ((ref($checkEpisode->{DVD_season})) && ($checkEpisode->{SeasonNumber} == $self->{curInfo}->{season})))
+ {
+ if (ref($checkEpisode->{DVD_episodenumber}))
+ {
+ push (@{$seasonEpisodes},[ $checkEpisode->{EpisodeNumber}]);
+ }
+ else
+ {
+ my $trimmedEpNumber = $checkEpisode->{DVD_episodenumber};
+ $trimmedEpNumber =~ /^(\d*)/;
+ push (@{$seasonEpisodes},[ $1]);
+ }
+
+ push @{$seasonEpisodes->[ $episodePos ]}, $checkEpisode->{EpisodeName};
+ $episodePos++;
+ }
+ }
+ }
+
+ # If we found episodes, sort them
+ if (scalar( $seasonEpisodes) > 0)
+ {
+ my @sortedSeasonEpisodes = sort{ $a->[ 0 ] <=> $b->[ 0 ] } @{$seasonEpisodes};
+ @{$self->{curInfo}->{episodes}} = @sortedSeasonEpisodes;
+ }
+
+ # Find banner
+ foreach my $banner (@{$bannersxml->{Banner}})
+ {
+ if ($banner->{Season} == $self->{curInfo}->{season})
+ {
+ $self->{curInfo}->{image} = "http://thetvdb.com/banners/".$banner->{BannerPath}
+ if (!$self->{curInfo}->{image});
+ }
+ }
+
+ $self->{curInfo}->{name} = "temp";
+
+ }
+ else
+ {
+ $self->{curInfo}->{season} = $self->{itemsList}[$self->{wantedIdx}]->{season};
+ $self->{curInfo}->{episode} = $self->{itemsList}[$self->{wantedIdx}]->{episode};
+ $self->{curInfo}->{name} = $self->{itemsList}[$self->{wantedIdx}]->{name};
+ $self->{curInfo}->{series} = $self->{itemsList}[$self->{wantedIdx}]->{series};
+ $self->{curInfo}->{director} = $self->{itemsList}[$self->{wantedIdx}]->{director};
+ $self->{curInfo}->{director} =~ s/^\|//;
+ $self->{curInfo}->{director} =~ s/\|$//;
+ $self->{curInfo}->{firstaired} = $self->{itemsList}[$self->{wantedIdx}]->{firstaired};
+ $self->{curInfo}->{writer} = $self->{itemsList}[$self->{wantedIdx}]->{writer};
+ $self->{curInfo}->{writer} =~ s/^\|//;
+ $self->{curInfo}->{writer} =~ s/\|$//;
+
+ my $actorString = $self->{itemsList}[$self->{wantedIdx}]->{actors};
+ $actorString =~ s/^\|//;
+ $actorString =~ s/\|$//;
+ for my $actor (split(/\|/, $actorString))
+ {
+ push @{$self->{curInfo}->{actors}}, [$actor];
+ }
+
+ my $genreString = $self->{itemsList}[$self->{wantedIdx}]->{genre};
+ $genreString =~ s/^\|//;
+ $genreString =~ s/\|$//;
+ for my $genre (split(/\|/, $genreString))
+ {
+ push @{$self->{curInfo}->{genre}}, [$genre];
+ }
+
+ $self->{curInfo}->{time} = $self->{itemsList}[$self->{wantedIdx}]->{runtime};
+ $self->{curInfo}->{image} = $self->{itemsList}[$self->{wantedIdx}]->{image};
+ $self->{curInfo}->{synopsis} = $self->{itemsList}[$self->{wantedIdx}]->{overview};
+ $self->{curInfo}->{webPage} = $self->{itemsList}[$self->{wantedIdx}]->{url};
+ $self->{curInfo}->{episodes} = $self->{itemsList}[$self->{wantedIdx}]->{episodes};
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://www.thetvdb.com/api/GetSeries.php?seriesname=$word&language=".$self->siteLanguage();
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ if (!$url)
+ {
+ # If we're not passed a url, return a hint so that gcstar knows what type
+ # of addresses this plugin handles
+ $url = "http://www.thetvdb.com";
+ }
+ elsif (index($url, "api") < 0)
+ {
+ # Url isn't for the tvdb api, so we need to find the episode id
+ # and return a url corresponding to the api page for this movie
+
+ $url =~ /[\?&]id=([0-9]+)*/;
+ my $id = $1;
+ $url =~ /[\?&]seriesid=([0-9]+)*/;
+ $self->{seriesid} = $1;
+ $url =~ /[\?&]seasonid=([0-9]+)*/;
+ $self->{seasonid} = $1;
+ $url = "http://www.thetvdb.com/api/A8CC4AF70D0385F3/series/".$self->{seriesid}."/all/".$self->siteLanguage().".xml";
+ }
+ return $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ # Make sure the url is for the api, not the main movie page
+ return $self->getItemUrl($url);
+ }
+
+ sub getNumberPasses
+ {
+ return 2;
+ }
+
+ sub getName
+ {
+ return "Tvdb";
+ }
+
+ sub needsLanguageTest
+ {
+ return 1;
+ }
+
+ sub testURL
+ {
+ my ($self, $url) = @_;
+ $url =~ /[\?&]lid=([0-9]+)*/;
+ my $id = $1;
+ return ($id == $self->siteLanguageCode());
+ }
+
+ sub getReturnedFields
+ {
+ my $self = shift;
+
+ if ($self->{pass} == 1)
+ {
+ $self->{hasField} = {
+ series => 1,
+ firstaired => 1,
+ };
+ }
+ else
+ {
+ $self->{hasField} = {
+ series => 1,
+ season => 1
+ };
+ }
+ }
+
+ sub getAuthor
+ {
+ return 'Zombiepig';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'en';
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+ sub siteLanguageCode
+ {
+ my $self = shift;
+
+ return 7;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVseries/GCTvdbES.pm b/lib/gcstar/GCPlugins/GCTVseries/GCTvdbES.pm
new file mode 100644
index 0000000..3943bf0
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVseries/GCTvdbES.pm
@@ -0,0 +1,61 @@
+package GCPlugins::GCTVseries::GCTvdbES;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCTVseries::GCTvdb;
+
+
+{
+ package GCPlugins::GCTVseries::GCPluginTvdbES;
+
+ use base qw(GCPlugins::GCTVseries::GCPluginTvdb);
+
+ sub getLang
+ {
+ return 'ES';
+ }
+
+ sub getName
+ {
+ return "Tvdb ES";
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'es';
+ }
+
+ sub siteLanguageCode
+ {
+ my $self = shift;
+
+ return 16;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVseries/GCTvdbFR.pm b/lib/gcstar/GCPlugins/GCTVseries/GCTvdbFR.pm
new file mode 100644
index 0000000..6590f30
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVseries/GCTvdbFR.pm
@@ -0,0 +1,61 @@
+package GCPlugins::GCTVseries::GCTvdbFR;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCTVseries::GCTvdb;
+
+
+{
+ package GCPlugins::GCTVseries::GCPluginTvdbFR;
+
+ use base qw(GCPlugins::GCTVseries::GCPluginTvdb);
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getName
+ {
+ return "Tvdb FR";
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'fr';
+ }
+
+ sub siteLanguageCode
+ {
+ my $self = shift;
+
+ return 17;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVseries/GCTvdbIT.pm b/lib/gcstar/GCPlugins/GCTVseries/GCTvdbIT.pm
new file mode 100644
index 0000000..cc4da08
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVseries/GCTvdbIT.pm
@@ -0,0 +1,60 @@
+package GCPlugins::GCTVseries::GCTvdbIT;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCTVseries::GCTvdb;
+
+
+{
+ package GCPlugins::GCTVseries::GCPluginTvdbIT;
+
+ use base qw(GCPlugins::GCTVseries::GCPluginTvdb);
+
+ sub getLang
+ {
+ return 'IT';
+ }
+
+ sub getName
+ {
+ return "Tvdb IT";
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'it';
+ }
+
+ sub siteLanguageCode
+ {
+ my $self = shift;
+
+ return 15;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCboardgames/GCReservoirJeux.pm b/lib/gcstar/GCPlugins/GCboardgames/GCReservoirJeux.pm
new file mode 100644
index 0000000..a1a4500
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCboardgames/GCReservoirJeux.pm
@@ -0,0 +1,418 @@
+package GCPlugins::GCboardgames::GCReservoirJeux;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCboardgames::GCboardgamesCommon;
+
+{
+ package GCPlugins::GCboardgames::GCPluginReservoirJeux;
+
+ use base qw(GCPlugins::GCboardgames::GCboardgamesPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ return;
+ }
+
+
+ if ($self->{parsingList})
+ {
+ # Parse the search results here
+ if (($tagname eq "h3") && ($attr->{class} =~ /^rusearch_result/))
+ {
+ $self->{itemIdx}++;
+ $self->{isBoardgame} = 1;
+ $self->{insideName} = 1;
+ }
+ if ($self->{isBoardgame})
+ {
+ if (($tagname eq "a") && ($attr->{href} ne "#") && ($attr->{class} =~ /^lien_item/))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isBoardgame} = 0;
+ }
+ }
+ }
+ else
+ {
+ # Parse the items page here. Basically we do this by seaching for tags which match certain criteria, then preparing to grab
+ # the text inside these tags
+
+ if (($tagname eq "h1"))
+ {
+ $self->{insideName} = 1;
+ }
+ elsif (($tagname eq "div"))
+ {
+ if ($attr->{id} eq "fiche_technique_image")
+ {
+ $self->{insideImage} = 1;
+ }
+ elsif ($attr->{id} eq "bloc_centre_extensions")
+ {
+ $self->{insideExpansionList} = 1;
+ }
+ elsif ($attr->{id} eq "bloc_centre_extensions_bottom")
+ {
+ $self->{insideExpansionList} = 0;
+ }
+ elsif ($attr->{class} eq "fiche_technique_sep")
+ {
+ $self->{insideCategoryRow} = 0;
+ $self->{insideMechanicRow} = 0;
+ }
+
+ }
+ elsif ($tagname eq "img")
+ {
+ if ($self->{insideImage})
+ {
+ $self->{curInfo}->{boxpic} = "http://www.reservoir-jeux.com".$attr->{src} if ! $self->{curInfo}->{boxpic};
+ $self->{insideImage} = 0;
+ }
+ if ($self->{insideExpansionList})
+ {
+ $self->{curInfo}->{expandedby} .= $attr->{alt}.','
+ }
+ }
+ elsif ($tagname eq "a")
+ {
+ if ($attr->{class} eq "lien_item")
+ {
+ if ($self->{nextIsExpands})
+ {
+ $self->{insideExpands} = 1;
+ $self->{nextIsExpands} = 0;
+ }
+
+ if ($attr->{href} =~ /type=editeur/)
+ {
+ $self->{insidePublisher} = 1;
+ }
+ elsif ($attr->{href} =~ /type=auteur/)
+ {
+ $self->{insideDesigner} = 1;
+ }
+ elsif ($attr->{href} =~ /type=illustrateur/)
+ {
+ $self->{insideIllustrator} = 1;
+ }
+ elsif ($attr->{href} =~ /tag_id=/)
+ {
+ if ($self->{insideMechanicRow})
+ {
+ $self->{insideMechanic} = 1;
+ }
+ elsif ($self->{insideCategoryRow})
+ {
+ $self->{insideCategory} = 1;
+ }
+ }
+ elsif ($attr->{href} =~ /type=illustrateur/)
+ {
+ $self->{insideIllustrator} = 1;
+ }
+
+
+ }
+ }
+ elsif (($tagname eq "span") && ($attr->{class} eq "prod_description"))
+ {
+ $self->{insideDescription} = 1;
+ }
+
+ if ($tagname eq "br")
+ {
+ if($self->{insideDesignerRow})
+ {
+ $self->{curInfo}->{designedby} =~ s/\s\x2d\s$//g;
+ $self->{insideDesignerRow} = 0;
+ }
+ if($self->{insideIllustratorRow})
+ {
+ $self->{curInfo}->{illustratedby} =~ s/\s\x2d\s$//g;
+ $self->{insideIllustratorRow} = 0;
+ }
+ }
+
+ if ($self->{insideDescription})
+ {
+ if (($tagname eq "br") || ($tagname eq "p"))
+ {
+ # neatens up the description a little by starting new line on br tags
+ $self->{curInfo}->{description} .= "\n";
+ }
+ elsif ($tagname eq "li")
+ {
+ # basic formatting of lists
+ $self->{curInfo}->{description} .= " - ";
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+
+ if ($self->{insideTechnicalDetails} && $tagname eq "div")
+ {
+ $self->{insideTechnicalDetails} = 0;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if (length($origtext) < 2);
+
+ $origtext =~ s/&#34;/"/g;
+ $origtext =~ s/&#179;/3/g;
+ $origtext =~ s/\n//g;
+ $origtext =~ s/^\s{2,//;
+ #French accents substitution
+ $origtext =~ s/&agrave;/à/;
+ $origtext =~ s/&Agrave;/À/;
+ $origtext =~ s/&eacute;/é/;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isBoardgame} && $self->{insideName})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $origtext;
+ $self->{insideName} = 0;
+ }
+
+ }
+ else
+ {
+ # Parse the text items page here.
+
+ if ($self->{insideName})
+ {
+ $self->{curInfo}->{name} = $origtext;
+ $self->{curInfo}->{name} =~ s/^\s+//;
+ $self->{curInfo}->{name} =~ s/\s+\Z//;
+ $self->{insideName} = 0;
+ }
+ if ($self->{inside}->{h2})
+ {
+ if ($origtext =~ /^Fiche technique/)
+ {
+ $self->{insideTechnicalDetails} = 1;
+ }
+ elsif ($origtext =~ /^M\xe9canismes/)
+ {
+ $self->{insideMechanicRow} = 1;
+ }
+ elsif ($origtext =~/^Th\xe8mes/)
+ {
+ $self->{insideCategoryRow} = 1;
+
+ }
+ }
+ if ($self->{insideTechnicalDetails})
+ {
+ if ($origtext =~ /^Date de sortie/)
+ {
+ $self->{curInfo}->{released} = $origtext;
+ $self->{curInfo}->{released} =~ s/Date de sortie : //g
+ }
+ elsif( $origtext =~ /Dur\xe9e : /)
+ {
+ $self->{curInfo}->{playingtime} = $origtext;
+ $self->{curInfo}->{playingtime} =~ s/\s*Dur\xe9e : //g;
+ }
+ elsif($origtext =~ /\xc0 partir de\s[0-9]*\sans/)
+ {
+ $self->{curInfo}->{suggestedage} = $origtext;
+ $self->{curInfo}->{suggestedage} =~ s/^\s*//g;
+ }
+ elsif ($origtext =~ /De [0-9]* \xe0 [0-9]* joueurs/)
+ {
+ $self->{curInfo}->{players} = $origtext;
+ $self->{curInfo}->{players} =~ s/^\s*De //g;
+ $self->{curInfo}->{players} =~ s/ joueurs//g;
+ }
+ }
+ if ($self->{insideDesigner})
+ {
+ # Append text (and trailing ,) to existing designer field
+ $self->{curInfo}->{designedby} .= $origtext." - ";
+ $self->{insideDesigner} = 0;
+ }
+ if ($self->{insideIllustrator})
+ {
+ # Append text (and trailing ,) to existing illustrator field
+ $self->{curInfo}->{illustratedby} .= $origtext." - ";
+ $self->{insideIllustrator} = 0;
+ }
+ if ($self->{insidePublisher})
+ {
+ $self->{curInfo}->{publishedby} = $origtext;
+ $self->{insidePublisher} = 0;
+ }
+ if ($self->{insideExpands})
+ {
+ $self->{curInfo}->{expansionfor} = $origtext;
+ $self->{insideExpands} = 0;
+ }
+ if ($self->{insideMechanic})
+ {
+ $self->{curInfo}->{mechanics} .= $self->capWord($origtext).',';
+ $self->{insideMechanic} = 0;
+ }
+ if ($self->{insideCategory})
+ {
+ $self->{curInfo}->{category} .= $self->capWord($origtext).',';
+ $self->{insideCategory} = 0;
+ }
+
+
+ if ($origtext =~ /^\s*Auteur(s)? : /)
+ {
+ $self->{insideDesignerRow} = 1;
+ }
+ if ($origtext =~ /^\s*Illustrateur(s)? : /)
+ {
+ $self->{insideIllustratorRow} = 1;
+ }
+ if ($origtext =~ /^Ce produit est une extension de :/)
+ {
+ $self->{nextIsExpands} = 1;
+ }
+ if ($self->{insideDescription})
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ }
+ }
+ }
+
+ sub comment
+ {
+ my ($self, $comment) = @_;
+
+ if ($self->{parsingList})
+ {
+
+ }
+ else
+ {
+ if ($comment =~ /\/div/)
+ {
+ if($self->{insideDescription})
+ {
+ $self->{insideDescription} = 0;
+ # remove spaces from start and end of description
+ $self->{curInfo}->{description} =~ s/^\s+//;
+ $self->{curInfo}->{description} =~ s/\s+$//;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ };
+
+ $self->{isBoardgame} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ $html =~ s/"&#34;/'"/g;
+ $html =~ s/&#34;"/"'/g;
+ $html =~ s|</a></b><br>|</a><br>|;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ # Url returned below is the for the search page, where $word is replaced by the search
+ return ('http://www.reservoir-jeux.com/recherche.php', ['search' => $word, 'secteurid' => '-1', 'dv' => '30']);
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url =~ /^http:/;
+ if ($url =~ /^\//)
+ {
+ return "http://www.reservoir-jeux.com".$url;
+ }
+ else
+ {
+ return "http://www.reservoir-jeux.com/".$url;
+ }
+ }
+
+ sub getName
+ {
+ return "Reservoir Jeux";
+ }
+
+ sub getAuthor
+ {
+ return 'Florent';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCboardgames/GCboardgamegeek.pm b/lib/gcstar/GCPlugins/GCboardgames/GCboardgamegeek.pm
new file mode 100644
index 0000000..038198f
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCboardgames/GCboardgamegeek.pm
@@ -0,0 +1,278 @@
+package GCPlugins::GCboardgames::GCboardgamegeek;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCboardgames::GCboardgamesCommon;
+
+{
+ package GCPlugins::GCboardgames::GCPluginboardgamegeek;
+
+ use base qw(GCPlugins::GCboardgames::GCboardgamesPluginsBase);
+ use XML::Simple;
+ use HTML::Entities;
+ use Encode;
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if $page =~ /^<!DOCTYPE html/;
+ my $xml;
+ my $xs = XML::Simple->new;
+
+ if ($self->{parsingList})
+ {
+ $xml = $xs->XMLin($page, ForceArray => ['boardgame'], KeyAttr => ['objectid']);
+ my $game;
+ foreach $game ( keys( %{ $xml -> {'boardgame'}} ) )
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.boardgamegeek.com/xmlapi/boardgame/".$game;
+ # Better check how the name is returned, the bgg api can be a little funny here
+ if (ref($xml->{'boardgame'}->{$game}->{'name'}))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $xml->{'boardgame'}->{$game}->{'name'}->{'content'};
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $xml->{'boardgame'}->{$game}->{'name'};
+ }
+
+ if (!ref($xml->{'boardgame'}->{$game}->{'yearpublished'}))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{released} = $xml->{'boardgame'}->{$game}->{'yearpublished'};
+ }
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin($page, ForceArray => ['name','boardgamedesigner','boardgameartist','boardgamepublisher',
+ 'boardgamecategory','boardgamemechanic','boardgameexpansion'],
+ KeyAttr => []);
+
+ $self->{curInfo}->{released} = $xml->{boardgame}->{yearpublished};
+ $self->{curInfo}->{released} =~ s/([^0-9])//g;
+ $self->{curInfo}->{players} = $xml->{boardgame}->{minplayers}."-".$xml->{boardgame}->{maxplayers};
+ $self->{curInfo}->{playingtime} = $xml->{boardgame}->{playingtime}." mins";
+ $self->{curInfo}->{suggestedage} = $xml->{boardgame}->{age};
+
+ my $primaryName = "";
+ for my $name (@{$xml->{boardgame}->{name}})
+ {
+ $primaryName = $name->{content}
+ if $name->{primary} eq "true";
+ }
+
+ if (($primaryName ne $self->{itemsList}[$self->{wantedIdx}]->{name})
+ && ($self->{itemsList}[$self->{wantedIdx}]->{name}))
+ {
+ # Name returned by boardgamegeek is different to the one the user selected
+ # this means they choose an translated name, so use the name they choose
+ # as the default, and put boardgamegeek's name in as the original (untranslated) name of the game
+ $self->{curInfo}->{name} = $self->{itemsList}[$self->{wantedIdx}]->{name};
+ $self->{curInfo}->{original} = $primaryName;
+ }
+ else
+ {
+ $self->{curInfo}->{name} = $primaryName;
+ }
+
+ # Have to decode the html type characters here
+ $self->{curInfo}->{description} = decode_entities($xml->{boardgame}->{description});
+ $self->{curInfo}->{description} =~ s/\<br\/>/\n/g;
+ $self->{curInfo}->{description} =~ s/<.*?>//g;
+
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{boxpic} = $xml->{boardgame}->{image};
+ }
+ else
+ {
+ $self->{curInfo}->{boxpic} = $xml->{boardgame}->{thumbnail};
+ }
+
+ for my $designer (@{$xml->{boardgame}->{boardgamedesigner}})
+ {
+ $self->{curInfo}->{designedby} .= $designer->{content}.', ';
+ }
+ $self->{curInfo}->{designedby} =~ s/, $//;
+
+ for my $artist (@{$xml->{boardgame}->{boardgameartist}})
+ {
+ $self->{curInfo}->{illustratedby} .= $artist->{content}.', ';
+ }
+ $self->{curInfo}->{illustratedby} =~ s/, $//;
+
+ for my $publisher (@{$xml->{boardgame}->{boardgamepublisher}})
+ {
+ $self->{curInfo}->{publishedby} .= $publisher->{content}.', ';
+ }
+ $self->{curInfo}->{publishedby} =~ s/, $//;
+
+ for my $category (@{$xml->{boardgame}->{boardgamecategory}})
+ {
+ push @{$self->{curInfo}->{category}}, [$category->{content}];
+ }
+
+ for my $mechanic (@{$xml->{boardgame}->{boardgamemechanic}})
+ {
+ push @{$self->{curInfo}->{mechanics}}, [$mechanic->{content}];
+ }
+
+ for my $expansion (@{$xml->{boardgame}->{boardgameexpansion}})
+ {
+ if ($expansion->{inbound})
+ {
+ if ($self->{curInfo}->{expansionfor})
+ {
+ $self->{curInfo}->{expansionfor} .= ", ";
+ }
+ $self->{curInfo}->{expansionfor} .= $expansion->{content};
+ }
+ else
+ {
+ push @{$self->{curInfo}->{expandedby}}, [$expansion->{content}];
+ }
+ }
+ $self->{curInfo}->{web} = "http://boardgamegeek.com/boardgame/".$xml->{boardgame}->{objectid};
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ released => 1,
+ };
+
+ return $self;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ if (!$url)
+ {
+ # If we're not passed a url, return a hint so that gcstar knows what type
+ # of addresses this plugin handles
+ $url = "http://www.boardgamegeek.com";
+ }
+ elsif (index($url,"xmlapi") < 0)
+ {
+ # Url isn't for the bgg api, so we need to find the game id
+ # and return a url corresponding to the api page for this game
+ $url =~ /\/([0-9]+)[\/]*/;
+ my $id = $1;
+ $url = "http://www.boardgamegeek.com/xmlapi/boardgame/".$id;
+ }
+ return $url;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ # Quick and dirty fixes because the bgg api struggles with some words. Should not be required anymore (7/6/2010)
+ # $word =~ s/the\+/\+/ig;
+ # $word =~ s/\+and+/\+/g;
+ # $word =~ s/\+of\+/\+/g;
+
+ return "http://www.boardgamegeek.com/xmlapi/search?search=$word";
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ # Make sure the url is for the api, not the main movie page
+ return $self->getItemUrl($url);
+ }
+
+ sub getName
+ {
+ return "Board Game Geek";
+ }
+
+ sub getAuthor
+ {
+ return 'Zombiepig';
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+ sub getNotConverted
+ {
+ my $self = shift;
+ return [];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCboardgames/GCboardgamesCommon.pm b/lib/gcstar/GCPlugins/GCboardgames/GCboardgamesCommon.pm
new file mode 100644
index 0000000..088f077
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCboardgames/GCboardgamesCommon.pm
@@ -0,0 +1,58 @@
+package GCPlugins::GCboardgames::GCboardgamesCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCPluginsBase;
+
+{
+ package GCPlugins::GCboardgames::GCboardgamesPluginsBase;
+
+ use base qw(GCPluginParser);
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['name'];
+ }
+
+ sub loadUrl
+ {
+ my ($self, $url) = @_;
+
+ $self->SUPER::loadUrl($url);
+
+ return $self->{curInfo};
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCboardgames/GCtrictrac.pm b/lib/gcstar/GCPlugins/GCboardgames/GCtrictrac.pm
new file mode 100644
index 0000000..e30e189
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCboardgames/GCtrictrac.pm
@@ -0,0 +1,462 @@
+package GCPlugins::GCboardgames::GCtrictrac;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCboardgames::GCboardgamesCommon;
+
+{
+ package GCPlugins::GCboardgames::GCPlugintrictrac;
+
+ use base qw(GCPlugins::GCboardgames::GCboardgamesPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ return;
+ }
+
+
+ if ($self->{parsingList})
+ {
+ # Parse the search results here
+
+ # Check if we are currently parsing an item page, not a search results page (ie - exact match has taken us straight to the page)
+ # Do this by checking if there is a heading on the page
+ if (($tagname eq "font") && ($attr->{style} =~ /FONT-SIZE: 20px/))
+ {
+ # Stop parsing results, switch to item parsing
+ $self->{parsingEnded} = 1;
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+
+ # Quite easy to parse the search results page since all the information we need (url, title, year) is contained within the <a>
+ # tag for the image of each search result
+
+ # TODO - check how search results look when they do not have an image??
+
+ # Check if tag is an <a>, the url referenced is valid (not "#"), and the onmouseover text looks right
+ if (($tagname eq "a") && ($attr->{href} ne "#") && ($attr->{onmouseover} =~ /^(return overlib)/))
+ {
+
+ # Add to search results
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+
+ my $mouseoverText = $attr->{onmouseover};
+
+ # Parse some regular expressions to find the name and release date
+ if ($mouseoverText =~ /<b>(.+)<\/b>/)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $1;
+ }
+ if ($mouseoverText =~ /<\/b> \((\d+)\)/)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{released} = $1;
+ }
+ }
+ }
+ else
+ {
+ # Parse the items page here. Basically we do this by seaching for tags which match certain criteria, then preparing to grab
+ # the text inside these tags
+
+ if (($tagname eq "font") && ($attr->{style} =~ /FONT-SIZE: 20px/))
+ {
+ $self->{insideName} = 1;
+ }
+ elsif (($tagname eq "font") && ($attr->{style} =~ /FONT-SIZE: 12px/))
+ {
+ if ($self->{nextIsPlayers})
+ {
+ $self->{insidePlayers} = 1;
+ $self->{nextIsPlayers} = 0;
+ }
+ if ($self->{nextIsAges})
+ {
+ $self->{insideAges} = 1;
+ $self->{nextIsAges} = 0;
+ }
+ if ($self->{nextIsPlayingTime})
+ {
+ $self->{insidePlayingTime} = 1;
+ $self->{nextIsPlayingTime} = 0;
+ }
+
+ }
+ elsif (($tagname eq "td") && ($attr->{height} eq "250") && ($attr->{width} eq "250"))
+ {
+ $self->{insideImage} = 1;
+ }
+ elsif ($tagname eq "img")
+ {
+ if ($self->{insideImage})
+ {
+ $self->{curInfo}->{boxpic} = "http://trictrac.net".$attr->{src} if ! $self->{curInfo}->{boxpic};
+ $self->{insideImage} = 0;
+ }
+ }
+ elsif ($tagname eq "a")
+ {
+ if ($self->{nextIsYear})
+ {
+ $self->{insideYear} = 1;
+ $self->{nextIsYear} = 0;
+ }
+ if ($self->{insideDesignerRow})
+ {
+ $self->{insideDesigner} = 1;
+ }
+ if ($self->{insideIllustratorRow})
+ {
+ $self->{insideIllustrator} = 1;
+ }
+ if ($self->{nextIsPublishers})
+ {
+ $self->{insidePublishers} = 1;
+ $self->{nextIsPublishers} = 0;
+ }
+ if ($self->{insideMechanicRow})
+ {
+ $self->{insideMechanic} = 1;
+ }
+ if ($self->{insideCategoryRow})
+ {
+ $self->{insideCategory} = 1;
+ }
+
+ }
+ elsif ($tagname eq "b")
+ {
+ if ($self->{insideExpansionList})
+ {
+ $self->{insideExpansion} = 1;
+ }
+ }
+ elsif (($tagname eq "p") && ( $attr->{style} =~ /TEXT-ALIGN: justify/))
+ {
+ $self->{insideDescription} = 1;
+ }
+ if ($self->{insideDescription})
+ {
+ if ($tagname eq "br")
+ {
+ # neatens up the description a little by starting new line on br tags
+ $self->{curInfo}->{description} .= "\n";
+ }
+ elsif ($tagname eq "li")
+ {
+ # basic formatting of lists
+ $self->{curInfo}->{description} .= " - ";
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ if ($tagname eq "tr")
+ {
+ if ($self->{insideDesignerRow})
+ {
+ # Use regex to strip final , off end of line
+ $self->{curInfo}->{designedby} =~ s/(, )$//;
+ $self->{insideDesignerRow} = 0;
+ }
+ if ($self->{insideIllustratorRow})
+ {
+ # Use regex to strip final , off end of line
+ $self->{curInfo}->{illustratedby} =~ s/(, )$//;
+ $self->{insideIllustratorRow} = 0;
+ }
+ if ($self->{insideMechanicRow})
+ {
+ $self->{insideMechanicRow} = 0;
+ }
+ if ($self->{insideCategoryRow})
+ {
+ $self->{insideCategoryRow} = 0;
+ }
+ }
+ elsif ($tagname eq "table")
+ {
+ if ($self->{insideExpansionList})
+ {
+ $self->{insideExpansionList} = 0;
+ }
+ }
+ elsif ($tagname eq "b")
+ {
+ if ($self->{insideExpands})
+ {
+ $self->{curInfo}->{expansionfor} =~ s/"//g;
+ $self->{insideExpands} = 0;
+ }
+ }
+ elsif (($tagname eq "td") && ($self->{insideDescription}))
+ {
+ $self->{insideDescription} = 0;
+ # remove spaces from start and end of description
+ $self->{curInfo}->{description} =~ s/^\s+//;
+ $self->{curInfo}->{description} =~ s/\s+$//;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if (length($origtext) < 2);
+
+ $origtext =~ s/&#34;/"/g;
+ $origtext =~ s/&#179;/3/g;
+ $origtext =~ s/\n//g;
+ $origtext =~ s/^\s{2,//;
+ #French accents substitution
+ $origtext =~ s/&agrave;/à/;
+ $origtext =~ s/&eacute;/é/;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+
+ }
+ else
+ {
+ # fetching information from page
+ if ($origtext =~ /^Nom VO/)
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{curInfo}->{original} =~ s/Nom VO : //;
+ }
+ if ($self->{insideName})
+ {
+ $self->{curInfo}->{name} = $origtext;
+ $self->{insideName} = 0;
+ }
+ elsif ($self->{insideYear})
+ {
+ $self->{curInfo}->{released} = $origtext;
+ $self->{curInfo}->{released} =~ s/([^0-9])//g;
+ $self->{insideYear} = 0;
+ }
+ elsif ($self->{insideDesigner})
+ {
+ # Append text (and trailing ,) to existing designer field
+ $self->{curInfo}->{designedby} .= $origtext.", ";
+ $self->{insideDesigner} = 0;
+ }
+ elsif ($self->{insideIllustrator})
+ {
+ # Append text (and trailing ,) to existing designer field
+ $self->{curInfo}->{illustratedby} .= $origtext.", ";
+ $self->{insideIllustrator} = 0;
+ }
+ elsif ($self->{insidePublishers})
+ {
+ $self->{curInfo}->{publishedby} = $origtext;
+ $self->{insidePublishers} = 0;
+ }
+ elsif ($self->{insidePlayers})
+ {
+ $self->{curInfo}->{players} = $origtext;
+ $self->{insidePlayers} = 0;
+ }
+ elsif ($self->{insideAges})
+ {
+ $self->{curInfo}->{suggestedage} = $origtext;
+ $self->{insideAges} = 0;
+ }
+ elsif ($self->{insidePlayingTime})
+ {
+ $self->{curInfo}->{playingtime} = $origtext;
+ $self->{insidePlayingTime} = 0;
+ }
+ elsif ($self->{insideExpands})
+ {
+ $self->{curInfo}->{expansionfor} .= $origtext;
+
+ }
+ elsif ($self->{insideExpansion})
+ {
+ $self->{curInfo}->{expandedby} .= $self->capWord($origtext).',';
+ $self->{insideExpansion} = 0;
+ }
+ elsif ($self->{insideDescription})
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ }
+ elsif ($self->{insideMechanic})
+ {
+ $self->{curInfo}->{mechanics} .= $self->capWord($origtext).',';
+ $self->{insideMechanic} = 0;
+ }
+ elsif ($self->{insideCategory})
+ {
+ $self->{curInfo}->{category} .= $self->capWord($origtext).',';
+ $self->{insideCategory} = 0;
+ }
+
+
+ # Pre-detection based on text (not tags) for various fields
+ # that have no specific id in tags
+ if ($origtext =~ /^Ann\xe9e/)
+ {
+ $self->{nextIsYear} = 1;
+ }
+ if ($origtext =~ /^Auteur/)
+ {
+ $self->{insideDesignerRow} = 1;
+ }
+ if ($origtext =~ /^Illustrateur/)
+ {
+ $self->{insideIllustratorRow} = 1;
+ }
+ if ($origtext =~ /^Editeur/)
+ {
+ $self->{nextIsPublishers} = 1;
+ }
+ if ($origtext =~ /^Joueurs/)
+ {
+ $self->{nextIsPlayers} = 1;
+ }
+ if ($origtext =~ /^Age/)
+ {
+ $self->{nextIsAges} = 1;
+ }
+ if ($origtext =~ /^Dur/)
+ {
+ $self->{nextIsPlayingTime} = 1;
+ }
+ if ($origtext =~ /^Ceci est une extension pour/)
+ {
+ $self->{insideExpands} = 1;
+ }
+ if ($origtext =~ /canisme\(s\)/)
+ {
+ $self->{insideMechanicRow} = 1;
+ }
+ if ($origtext =~ /Th.{1,8}me\(s\)/)
+ {
+ $self->{insideCategoryRow} = 1;
+ }
+ if ($origtext =~ /^Les extensions/)
+ {
+ $self->{insideExpansionList} = 1;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ released => 1,
+ };
+
+ $self->{isBoardgame} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ $html =~ s/"&#34;/'"/g;
+ $html =~ s/&#34;"/"'/g;
+ $html =~ s|</a></b><br>|</a><br>|;
+
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ # Url returned below is the for the search page, where $word is replaced by the search
+ return "http://trictrac.net/index.php3?id=jeux&rub=ludotheque&inf=cat&choix=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url =~ /^http:/;
+ if ($url =~ /^\//)
+ {
+ return "http://trictrac.net".$url;
+ }
+ else
+ {
+ return "http://trictrac.net/".$url;
+ }
+ }
+
+ sub getName
+ {
+ return "Tric Trac";
+ }
+
+ sub getAuthor
+ {
+ return 'Florent';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCAdlibrisFI.pm b/lib/gcstar/GCPlugins/GCbooks/GCAdlibrisFI.pm
new file mode 100644
index 0000000..34997a8
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCAdlibrisFI.pm
@@ -0,0 +1,59 @@
+package GCPlugins::GCbooks::GCAdlibrisFI;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCbooksAdlibrisCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginAdlibrisFI;
+
+ use base qw(GCPlugins::GCbooks::GCbooksAdlibrisPluginsBase);
+ use URI::Escape;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{isLang} = 'fi';
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return "Adlibris (FI)";
+ }
+
+ sub getLang
+ {
+ return 'FI';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCAdlibrisSV.pm b/lib/gcstar/GCPlugins/GCbooks/GCAdlibrisSV.pm
new file mode 100644
index 0000000..f17abdb
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCAdlibrisSV.pm
@@ -0,0 +1,59 @@
+package GCPlugins::GCbooks::GCAdlibrisSV;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCbooksAdlibrisCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginAdlibrisSV;
+
+ use base qw(GCPlugins::GCbooks::GCbooksAdlibrisPluginsBase);
+ use URI::Escape;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{isLang} = 'se';
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return "Adlibris (SV)";
+ }
+
+ sub getLang
+ {
+ return 'SV';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCAlapage.pm b/lib/gcstar/GCPlugins/GCbooks/GCAlapage.pm
new file mode 100644
index 0000000..44f3da0
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCAlapage.pm
@@ -0,0 +1,391 @@
+package GCPlugins::GCbooks::GCAlapage;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginAlapage;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'div') && ($attr->{class} eq 'infos_produit'))
+ {
+ $self->{isBook} = 1 ;
+ $self->{isUrl} = 1 ;
+ }
+ elsif ($tagname eq 'div')
+ {
+ $self->{isBook} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ($self->{isUrl}) && ($self->{isBook}))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $attr->{title};
+ $self->{isUrl} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"mot_auteurs") >= 0) && ($self->{isBook}))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'br') && ($self->{isBook}))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ }
+ else
+ {
+ if ($self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif ($self->{isPublication} eq 1)
+ {
+ $self->{isPublication} = 2 ;
+ }
+ elsif ($self->{isFormat} eq 1)
+ {
+ $self->{isFormat} = 2 ;
+ }
+ elsif ($self->{isPage} eq 1)
+ {
+ $self->{isPage} = 2 ;
+ }
+ elsif ($tagname eq 'h2')
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'tpfcommentaire') && ($self->{isDescription} eq 1))
+ {
+ $self->{isDescription} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"mot_auteurs") >= 0))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{class} eq 'thickbox tooltip') && ($self->{curInfo}->{cover} eq ''))
+ {
+ my $html = $self->loadPage( "http://www.alapage.com" . $attr->{href}, 0, 1);
+ my $found = index($html,"\"laplusgrande\"");
+ if ( $found >= 0 )
+ {
+ my $found2 = index($html,"&m=v");
+ $html = substr($html, $found +length('"laplusgrande"'),length($html)- $found -length('"laplusgrande"'));
+
+ my @array = split(/"/,$html);
+ #"
+ $self->{curInfo}->{cover} = "http://www.alapage.com" . $array[1];
+ if ( $found2 >= 0 )
+ {
+ $self->{curInfo}->{backpic} = $self->{curInfo}->{cover};
+ $self->{curInfo}->{backpic} =~ s|&m=r|&m=v|gi;
+ }
+ }
+ }
+ elsif ($tagname eq 'li')
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"mot_cdu") >= 0))
+ {
+ $self->{isGenre} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"mot_coll_serie") >= 0))
+ {
+ $self->{isSerie} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"mot_editeur") >= 0) && ( index($attr->{href},"mot_coll_serie") == -1))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{name} eq 'comment'))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'blocWithMargin') && ($self->{isDescription}) && ($self->{curInfo}->{description} eq '') )
+ {
+ $self->{isDescription} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{name} ne ''))
+ {
+ $self->{isDescription} = 0 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'edito FP_commentaire'))
+ {
+ $self->{isDescription} = 1 ;
+ }
+
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isAuthor})
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+
+ if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ', ';
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= $origtext;
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ my @array = split(/,/,$origtext);
+
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $array[0];
+ $self->{itemsList}[$self->{itemIdx}]->{edition} =~ s/^\s+//;
+ $self->{itemsList}[$self->{itemIdx}]->{edition} =~ s/\s+$//;
+
+ if ($#array ne 0 )
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $array[$#array];
+ $self->{itemsList}[$self->{itemIdx}]->{publication} =~ s/^\s+//;
+ $self->{itemsList}[$self->{itemIdx}]->{publication} =~ s/\s+$//;
+ }
+
+ $self->{isPublisher} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{curInfo}->{language} = 'Français';
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ $self->{curInfo}->{authors} .= $origtext;
+ $self->{curInfo}->{authors} .= ",";
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isISBN} = 1 if ($origtext =~ m/ISBN/i);
+ $self->{isFormat} = 1 if ($origtext =~ m/Dimensions/i);
+ $self->{isPublication} = 1 if ($origtext =~ m/Date de parution/i);
+ $self->{isPage} = 1 if ($origtext =~ m/Nombre de pages/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0 ;
+ }
+ elsif ($self->{isGenre})
+ {
+ my @array = split(/,/,$origtext);
+ my $element;
+ foreach $element (@array)
+ {
+ $element =~ s/^\s+//;
+ $self->{curInfo}->{genre} .= $element;
+ $self->{curInfo}->{genre} .= ",";
+ }
+ $self->{isGenre} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isSerie})
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isSerie} = 0 ;
+ }
+ elsif ($self->{isFormat} eq 2)
+ {
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormat} = 0 ;
+ }
+ elsif ($self->{isPublication} eq 2)
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0 ;
+ }
+ elsif ($self->{isPage} eq 2)
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0 ;
+ }
+ elsif ($self->{isDescription} eq 2)
+ {
+ $self->{curInfo}->{description} = $origtext;
+ $self->{isDescription} = 0 ;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 0,
+ edition => 1,
+ serie => 0,
+ };
+
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isAnalyse} = 0;
+ $self->{isISBN} = 0;
+ $self->{isGenre} = 0;
+ $self->{isPublication} = 0;
+ $self->{isPage} = 0;
+ $self->{isFormat} = 0;
+ $self->{isSerie} = 0;
+ $self->{isDescription} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<p>||gi;
+ $html =~ s|</p>||gi;
+ }
+ else
+ {
+ $html =~ s|<font style=&quot;font-size:13px;&quot;>||gi;
+ $html =~ s|<font style="font-size:13px;">||gi;
+ $html =~ s|</font>||gi;
+ $html =~ s|<strong>||gi;
+ $html =~ s|</strong>|</strong><tpfanalyse>|gi;
+ $html =~ s|</h3>|</h3><tpfcommentaire>|gi;
+ $html =~ s|<p>||gi;
+ $html =~ s|</p>||gi;
+ }
+
+ return $html;
+
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+ return "http://www.alapage.com/-/Recherche/?type=1&mot_isbn=" . $word;
+ }
+ else
+ {
+ return "http://www.alapage.com/-/Recherche/?type=1&mot_titre=" . $word;
+ }
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.alapage.com" . $url;
+ }
+
+ sub getName
+ {
+ return "Alapage";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn','title'];
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-15";
+ }
+
+ sub getDefaultPictureSuffix
+ {
+ return '.jpg';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCAmazon.pm b/lib/gcstar/GCPlugins/GCbooks/GCAmazon.pm
new file mode 100644
index 0000000..7d70ec4
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCAmazon.pm
@@ -0,0 +1,352 @@
+package GCPlugins::GCbooks::GCAmazon;
+
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginAmazon;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use XML::Simple;
+ use LWP::Simple qw($ua);
+ use Encode;
+ use HTML::Entities;
+ use GCUtils;
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if $page =~ /^<!DOCTYPE html/;
+ my $xml;
+ my $xs = XML::Simple->new;
+
+ if ($self->{parsingList})
+ {
+ $xml = $xs->XMLin($page, ForceArray => ['Item','Author'], KeyAttr => []);
+ my $book;
+ foreach $book ( @{ $xml -> {'Items'} -> {'Item'} })
+ {
+ $self->{itemIdx}++;
+ my $url = $self->baseAWSUrl."&Operation=ItemLookup&ResponseGroup=Large,EditorialReview&ItemId=".$book->{ASIN};
+
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $book->{ItemAttributes}->{'Title'};
+ for my $author (@{$book->{ItemAttributes}->{'Author'}})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ", "
+ if $self->{itemsList}[$self->{itemIdx}]->{authors};
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= $author;
+ }
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $book->{ItemAttributes}->{'PublicationDate'};
+ $self->{itemsList}[$self->{itemIdx}]->{format} = $book->{ItemAttributes}->{'Binding'};
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $book->{ItemAttributes}->{'Edition'};
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin($page, ForceArray => ['Author','EditorialReview','Language'], KeyAttr => []);
+ $self->{curInfo}->{title} = $xml->{Items}->{Item}->{ItemAttributes}->{Title};
+ for my $author (@{$xml->{Items}->{Item}->{ItemAttributes}->{Author}})
+ {
+ push @{$self->{curInfo}->{authors}}, [$author];
+ }
+
+ my $htmlDescription;
+ if ($xml->{Items}->{Item}->{EditorialReviews}->{EditorialReview}[0]->{Content})
+ {
+ $htmlDescription = $xml->{Items}->{Item}->{EditorialReviews}->{EditorialReview}[0]->{Content};
+ }
+ else
+ {
+ # Unfortunately the api doesn't always return the product description, which is due to
+ # copyright concerns or something. In this case, grab the product html and parse it for
+ # the description.
+ my $response = $ua->get($xml->{Items}->{Item}->{DetailPageURL});
+ my $result;
+ eval {
+ $result = $response->decoded_content;
+ };
+
+ # Replace some bad characters. TODO - will probably need to extend this for de/jp plugins
+ $result =~ s|\x{92}|'|gi;
+ $result =~ s|&#146;|'|gi;
+ $result =~ s|&#149;|*|gi;
+ $result =~ s|&#156;|oe|gi;
+ $result =~ s|&#133;|...|gi;
+ $result =~ s|\x{85}|...|gi;
+ $result =~ s|\x{8C}|OE|gi;
+ $result =~ s|\x{9C}|oe|gi;
+ $result =~ s|&#252;|ü|g;
+ $result =~ s|&#223;|ß|g;
+ $result =~ s|&#246;|ö|g;
+ $result =~ s|&#220;|Ü|g;
+ $result =~ s|&#228;|ä|g;
+ $result =~ s/&#132;/&#187;/gm;
+ $result =~ s/&#147;/&#171;/gm;
+
+ # Chop out the product description
+ $result =~ /<div class="productDescriptionWrapper">(.*?)<(\/)*?div/s;
+ $htmlDescription = $1;
+
+ # Decode
+ decode_entities($htmlDescription);
+ $htmlDescription = decode('ISO-8859-1', $htmlDescription);
+ }
+
+ # Replace some html with line breaks, strip out the rest
+ $htmlDescription =~ s/<br>/\n/ig;
+ $htmlDescription =~ s/<p>/\n\n/ig;
+ $htmlDescription =~ s/<(.*?)>//gi;
+ $htmlDescription =~ s/^\s*//;
+ $htmlDescription =~ s/\s*$//;
+ $htmlDescription =~ s/ {1,}/ /g;
+ $self->{curInfo}->{description} = $htmlDescription;
+
+ $self->{curInfo}->{publisher} = $xml->{Items}->{Item}->{ItemAttributes}->{Publisher}
+ if (!ref($xml->{Items}->{Item}->{ItemAttributes}->{Publisher}));
+ $self->{curInfo}->{publication} = $xml->{Items}->{Item}->{ItemAttributes}->{PublicationDate}
+ if (!ref($xml->{Items}->{Item}->{ItemAttributes}->{PublicationDate}));
+ $self->{curInfo}->{language} = $xml->{Items}->{Item}->{ItemAttributes}->{Languages}->{Language}[0]->{Name}
+ if (ref($xml->{Items}->{Item}->{ItemAttributes}->{Languages}->{Language}));
+ $self->{curInfo}->{pages} = $xml->{Items}->{Item}->{ItemAttributes}->{NumberOfPages}
+ if (!ref($xml->{Items}->{Item}->{ItemAttributes}->{NumberOfPages}));
+ $self->{curInfo}->{isbn} = $xml->{Items}->{Item}->{ItemAttributes}->{EAN}
+ if (!ref($xml->{Items}->{Item}->{ItemAttributes}->{EAN}));
+ $self->{curInfo}->{format} = $xml->{Items}->{Item}->{ItemAttributes}->{Binding}
+ if (!ref($xml->{Items}->{Item}->{ItemAttributes}->{Binding}));
+ $self->{curInfo}->{edition} = $xml->{Items}->{Item}->{ItemAttributes}->{Edition}
+ if (!ref($xml->{Items}->{Item}->{ItemAttributes}->{Edition}));
+ $self->{curInfo}->{web} = $xml->{Items}->{Item}->{DetailPageURL};
+
+ # Genre handling via Amazon's browsenodes. Stupidly complicated way of doing things, IMO
+ # Loop through all the nodes:
+ for my $node (@{$xml->{Items}->{Item}->{BrowseNodes}->{BrowseNode}})
+ {
+ my $genre = '';
+ my $ancestor = $node;
+
+ # Push the lowest node to the temporary genre list
+ my @genre_list = ($node->{Name});
+
+ # Start stepping down through the current node to find it's children
+ while ($ancestor->{Ancestors}->{BrowseNode})
+ {
+ $ancestor = $ancestor->{Ancestors}->{BrowseNode};
+ if (($ancestor->{Name} eq 'Specialty Stores') ||
+ ($ancestor->{Name} eq 'Refinements') ||
+ ($ancestor->{Name} eq 'Self Service') ||
+ ($ancestor->{Name} eq 'Specialty Boutique'))
+ {
+ # Some categories we definetly want to ignore, since they are full of rubbish tags
+ $genre = 'ignore';
+ last;
+ }
+ elsif ($ancestor->{Name} =~ m/A\-Z/)
+ {
+ # Clear out the current genres from the node, will be full of rubbish like "Authors A-K"
+ # Keep looping afterwards though, since there could be valid tags below the author
+ # specific ones
+ undef(@genre_list);
+ }
+ elsif ($ancestor->{Name} eq 'Subjects')
+ {
+ # Don't go deeper than a Subjects node
+ last;
+ }
+ else
+ {
+ # Add the current node to the temporary list, if it's not already included in either list
+ push @genre_list, $ancestor->{Name}
+ if ((!GCUtils::inArrayTest($ancestor->{Name}, @genre_list)) &&
+ (!GCUtils::inArrayTest($ancestor->{Name}, @{$self->{curInfo}->{genre}})));
+ }
+ }
+
+ if ($genre ne 'ignore')
+ {
+ # Add temporary list to item info
+ push @{$self->{curInfo}->{genre}}, [$_] foreach @genre_list;
+ }
+ }
+
+ # Let's sort the list for good measure
+ @{$self->{curInfo}->{genre}} = sort @{$self->{curInfo}->{genre}};
+
+
+ # Fetch either the big original pic, or just the small thumbnail pic
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{cover} = $xml->{Items}->{Item}->{LargeImage}->{URL};
+ }
+ else
+ {
+ $self->{curInfo}->{cover} = $xml->{Items}->{Item}->{SmallImage}->{URL};
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 1,
+ edition => 1,
+ };
+
+ return $self;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ if (!$url)
+ {
+ # If we're not passed a url, return a hint so that gcstar knows what type
+ # of addresses this plugin handles
+ $url = "http://".$self->baseWWWamazonUrl();
+ }
+ elsif ($url !~ m/sowacs.appspot.com/)
+ {
+ # Convert amazon url to aws url
+ $url =~ /\/dp\/(\w*)[\/|%3F]/;
+ my $asinid = $1;
+ $url = $self->baseAWSUrl."&Operation=ItemLookup&ResponseGroup=Large,EditorialReview&ItemId=".$asinid;
+ }
+ return $url;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ my $key =
+ ($self->{searchField} eq 'authors') ? 'Author' :
+ ($self->{searchField} eq 'title') ? 'Title' :
+ ($self->{searchField} eq 'isbn') ? 'Keywords' :
+ '';
+ $word =~ s/\D//g
+ if $key eq 'Keywords';
+ return $self->baseAWSUrl."&Operation=ItemSearch&$key=$word&SearchIndex=Books&ResponseGroup=Medium";
+ }
+
+ sub baseAWSUrl
+ {
+ my $self = shift;
+ return "http://sowacs.appspot.com/AWS/%5Bamazon\@gcstar.org%5D".$self->baseAmazonUrl()."/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=AKIAJJ5TJWI62A5OOTQQ&AssociateTag=AKIAJJ5TJWI62A5OOTQQ";
+ }
+
+ sub baseAmazonUrl
+ {
+ return "ecs.amazonaws.com";
+ }
+
+ sub baseWWWamazonUrl
+ {
+ return "www.amazon.com";
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ # Make sure the url is for the api, not the main movie page
+ return $self->getItemUrl($url);
+ }
+
+ sub getName
+ {
+ return "Amazon (US)";
+ }
+
+ sub getAuthor
+ {
+ return 'Zombiepig';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+ sub getNotConverted
+ {
+ my $self = shift;
+ return [];
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['title', 'authors', 'isbn'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCAmazonCA.pm b/lib/gcstar/GCPlugins/GCbooks/GCAmazonCA.pm
new file mode 100644
index 0000000..eb51a4c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCAmazonCA.pm
@@ -0,0 +1,61 @@
+package GCPlugins::GCbooks::GCAmazonCA;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCAmazon;
+
+{
+ package GCPlugins::GCbooks::GCPluginAmazonCA;
+
+ use base qw(GCPlugins::GCbooks::GCPluginAmazon);
+
+ sub baseWWWamazonUrl
+ {
+ return "www.amazon.ca";
+ }
+
+ sub baseAmazonUrl
+ {
+ return "ecs.amazonaws.ca";
+ }
+
+ sub getName
+ {
+ return "Amazon (CA)";
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub isPreferred
+ {
+ return 0;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCAmazonDE.pm b/lib/gcstar/GCPlugins/GCbooks/GCAmazonDE.pm
new file mode 100644
index 0000000..0c87502
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCAmazonDE.pm
@@ -0,0 +1,56 @@
+package GCPlugins::GCbooks::GCAmazonDE;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCAmazon;
+
+{
+ package GCPlugins::GCbooks::GCPluginAmazonDE;
+
+ use base qw(GCPlugins::GCbooks::GCPluginAmazon);
+
+ sub baseWWWamazonUrl
+ {
+ return "www.amazon.de";
+ }
+
+ sub baseAmazonUrl
+ {
+ return "ecs.amazonaws.de";
+ }
+
+ sub getName
+ {
+ return "Amazon (DE)";
+ }
+
+ sub getLang
+ {
+ return 'DE';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCAmazonFR.pm b/lib/gcstar/GCPlugins/GCbooks/GCAmazonFR.pm
new file mode 100644
index 0000000..d87af48
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCAmazonFR.pm
@@ -0,0 +1,57 @@
+package GCPlugins::GCbooks::GCAmazonFR;
+
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCAmazon;
+
+{
+ package GCPlugins::GCbooks::GCPluginAmazonFR;
+
+ use base qw(GCPlugins::GCbooks::GCPluginAmazon);
+
+ sub baseWWWamazonUrl
+ {
+ return "www.amazon.fr";
+ }
+
+ sub baseAmazonUrl
+ {
+ return "ecs.amazonaws.fr";
+ }
+
+ sub getName
+ {
+ return "Amazon (FR)";
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCAmazonUK.pm b/lib/gcstar/GCPlugins/GCbooks/GCAmazonUK.pm
new file mode 100644
index 0000000..e39a2de
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCAmazonUK.pm
@@ -0,0 +1,61 @@
+package GCPlugins::GCbooks::GCAmazonUK;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCAmazon;
+
+{
+ package GCPlugins::GCbooks::GCPluginAmazonUK;
+
+ use base qw(GCPlugins::GCbooks::GCPluginAmazon);
+
+ sub baseWWWamazonUrl
+ {
+ return "www.amazon.co.uk";
+ }
+
+ sub baseAmazonUrl
+ {
+ return "ecs.amazonaws.co.uk";
+ }
+
+ sub getName
+ {
+ return "Amazon (UK)";
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub isPreferred
+ {
+ return 0;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCBDGest.pm b/lib/gcstar/GCPlugins/GCbooks/GCBDGest.pm
new file mode 100644
index 0000000..36074aa
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCBDGest.pm
@@ -0,0 +1,477 @@
+package GCPlugins::GCbooks::GCBDGest;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginBDGest;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+ # tableau pour stocker l'identifiant propre à bdgest
+ my @tableau;
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ # parse une liste de résultat
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'tr'))
+ {
+ $self->{isBook} = 1 ;
+ $self->{isUrl} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($self->{isUrl}) && ($self->{isBook}) && (index($attr->{href},"serie-") >= 0))
+ {
+ $self->{itemIdx}++;
+ $self->{isFound} = 1 ;
+ $tableau[$self->{itemIdx}] = substr($attr->{href},index( $attr->{href},"#")+1);
+ #on retravaille l'url pour avoir toutes les pages de la série
+ my $urlRecherche = substr($attr->{href},0,index($attr->{href},"."))."__10000".substr($attr->{href},index($attr->{href},"."));
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $urlRecherche;
+ $self->{isSerie} = 1 ;
+ $self->{isUrl} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{name} eq 'TitreAlbum')&& ($self->{isBook}) && ($attr->{title} ne ''))
+ {
+ $self->{isTitle} = 1 ;
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $attr->{title};
+ }
+ elsif (($tagname eq 'td') && $self->{isTitle} eq 1)
+ {
+ $self->{isPublisher} = 1 ;
+ $self->{isTitle} = 0;
+ }
+ elsif (($tagname eq 'td') && $self->{isPublisher} eq 2)
+ {
+ $self->{isPublication} = 1 ;
+ $self->{isPublisher} = 0;
+ }
+ }
+ else # parse un item
+ {
+ if (($tagname eq 'a') && ($attr->{name} eq $tableau[$self->{wantedIdx}]))
+ {
+ $self->{isTitle} = 1 ;
+ $self->{isCover} = 1;
+ $self->{isBook} = 1 ;
+ }
+ elsif ($tagname eq 'html')
+ {
+ $self->{isCover} = 0 ;
+ }
+ elsif ($tagname eq 'head')
+ {
+ $self->{isCover} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{name} ne $tableau[$self->{wantedIdx}]) && ($attr->{name} ne ''))
+ {
+ $self->{isBook} = 0 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{color} eq '#294A6B') && ($attr->{style} eq 'font-family:Trebuchet MS; FONT-SIZE: 11pt;') && ($self->{isTitle} eq 1))
+ {
+ $self->{isTitle} = 2 ;
+ }
+# elsif (($tagname eq 'a') && ($self->{isCover} eq 0) && (index($attr->{href},"Couvertures") >= 0))
+ elsif (($tagname eq 'a') && ($self->{isCover} eq 0))
+ {
+ my $urlimage = $attr->{href};
+ $urlimage =~ s/\'//g;
+ $urlimage =~ s/\)//g;
+ $urlimage = substr($urlimage,index($urlimage,"Couvertures/"));
+ $self->{curInfo}->{cover} = 'http://www.bedetheque.com/'.$urlimage;
+ }
+ elsif (($tagname eq 'a') && ($self->{isBook}) && (index($attr->{href},"auteur") >= 0))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'td') && ($self->{isPublisher} eq 1))
+ {
+ $self->{isPublisher} = 2 ;
+ }
+ elsif (($tagname eq 'td') && $self->{isPublication} eq 1)
+ {
+ $self->{isPublication} = 2 ;
+ }
+ elsif (($tagname eq 'td') && $self->{isEdition} eq 1)
+ {
+ $self->{isEdition} = 2 ;
+ }
+ elsif (($tagname eq 'td') && $self->{isFormatPublication} eq 1)
+ {
+ $self->{isFormatPublication} = 2 ;
+ }
+ elsif (($tagname eq 'td') && $self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif (($tagname eq 'td') && $self->{isPage} eq 1)
+ {
+ $self->{isPage} = 2 ;
+ }
+ elsif (($tagname eq 'i') && $self->{isDescription} eq 1)
+ {
+ $self->{isDescription} = 2 ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{isFound} = 0;
+ $self->{inside}->{$tagname}--;
+
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isSerie})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{serie} = $origtext;
+ $self->{isSerie} = 0 ;
+ }
+ if ($self->{isPublisher} eq 1)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublisher} = 2 ;
+ }
+ if ($self->{isPublication} eq 1)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $origtext;
+ $self->{isPublication} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Je reinitialise le champs s il est cense etre vide
+ $origtext =~ s/#TPFCHAMPSVIDE#//;
+ if ($self->{isTitle} eq 2)
+ {
+ # si le titre contient INT (cas intégrale et donc sans titre de la série) on concaténe la série au titre.
+ if($origtext =~ /INT/i)
+ {
+ # on enléve le préfixe INT ou int et le point
+ $origtext =~ s/INT//i;
+ $origtext =~ s/.//;
+ $self->{curInfo}->{title} = $self->{itemsList}[$self->{wantedIdx}]->{serie}." ".$origtext;
+ }
+ else
+ {
+ # si numéro avant titre on le transforme en tome et on concaténe avec le nom de la série.
+ if($origtext =~ /[0-9]./)
+ {
+ my $tome = substr($origtext,0,index($origtext,"."));
+ $tome =~ s/^\s+//;
+ my $titre = substr($origtext,index($origtext,".")+1);
+ $titre =~ s/^\s+//;
+ $self->{curInfo}->{title} = $self->{itemsList}[$self->{wantedIdx}]->{serie}." Tome ".$tome ." : ".$titre;
+ }
+ else
+ {
+ $self->{curInfo}->{title} = $origtext;
+ }
+ }
+ $self->{curInfo}->{web} = "http://www.bedetheque.com/".$self->{itemsList}[$self->{wantedIdx}]->{url};
+ $self->{curInfo}->{serie} = $self->{itemsList}[$self->{wantedIdx}]->{serie};
+ $self->{curInfo}->{language} = 'Français';
+ $self->{isTitle} = 0 ;
+ }
+ elsif (($self->{isAuthor}) && ($self->{nbAuthor} < 3))
+ {
+ # Enleve la virgule entre le nom et le prenom
+ $origtext =~ s/,//g;
+ if (($origtext ne '') && ($origtext ne '#TPF NOIR ET BLANC TPF#'))
+ {
+ $self->{curInfo}->{authors} .= $origtext;
+ $self->{curInfo}->{authors} .= ",";
+ }
+ $self->{isAuthor} = 0;
+ $self->{nbAuthor} = $self->{nbAuthor} + 1;
+ }
+ elsif ($self->{isPublisher} eq 2)
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 3 ;
+ }
+ elsif ($self->{isPublication} eq 2)
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 3 ;
+ }
+ elsif ($self->{isEdition} eq 2)
+ {
+ $self->{curInfo}->{edition} = $origtext;
+ $self->{isEdition} = 3 ;
+ }
+ elsif ($self->{isFormatPublication} eq 2 )
+ {
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormatPublication} = 3 ;
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ $origtext =~ s/978\-//;
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 3 ;
+ }
+ elsif ($self->{isPage} eq 2)
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 3 ;
+ }
+ elsif ($self->{isDescription} eq 2)
+ {
+ if($origtext ne '')
+ {
+ if($self->{curInfo}->{description} ne '')
+ {
+ $self->{curInfo}->{description} .= "\n\n";
+ }
+ $self->{curInfo}->{description} .= "Info sur cette edition : ".$origtext;
+ }
+ $self->{isDescription} = 3 ;
+ }
+ elsif ($self->{isBook} eq 1)
+ {
+ if (($origtext eq "Editeur :") && ($self->{isPublisher} ne 3))
+ {
+ $self->{isPublisher} = 1;
+ }
+ elsif (($origtext eq "Dépot légal :") && ($self->{isPublication} ne 3))
+ {
+ $self->{isPublication} = 1;
+ }
+ elsif (($origtext eq "Collection :") && ($self->{isEdition} ne 3))
+ {
+ $self->{isEdition} = 1;
+ }
+ elsif (($origtext eq "Taille :") && ($self->{isFormatPublication} ne 3))
+ {
+ $self->{isFormatPublication} = 1;
+ }
+ elsif (($origtext eq "ISBN :") && ($self->{isISBN} ne 3))
+ {
+ $self->{isISBN} = 1;
+ }
+ elsif (($origtext eq "Planches :") && ($self->{isPage} ne 3))
+ {
+ $self->{isPage} = 1;
+ }
+ elsif (($origtext eq "Info édition : ") && ($self->{isDescription} ne 3))
+ {
+ $self->{isDescription} = 1;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ #la classe est instancié une seule fois au démarrage de l'appli.
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ serie => 1,
+ title => 1,
+ publication => 1,
+ format => 0,
+ edition => 1,
+ };
+ $self->{idPage} = 0;
+ $self->{nbAuthor} = 0;
+ $self->{isFound} = 0;
+ $self->{isSerie} = 0;
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isFormatPublication} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isPublication} = 0;
+ $self->{isFormat} = 0;
+ $self->{isSerie} = 0;
+ $self->{isPage} = 0;
+ $self->{isDescription} = 0;
+ $self->{isCover} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ #RAZ des variables (entre 2 recherches la classe reste en mémoire)
+ $self->{idPage} = 0;
+ $self->{nbAuthor} = 0;
+ $self->{isFound} = 0;
+ $self->{isSerie} = 0;
+ $self->{isEdition} = 0;
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isFormatPublication} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isPublication} = 0;
+ $self->{isFormat} = 0;
+ $self->{isSerie} = 0;
+ $self->{isPage} = 0;
+ $self->{isDescription} = 0;
+ $self->{isCover} = 0;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+# $html =~ s|<i>||gi;
+# $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ # Quand un champs n est pas renseigne il peut y avoir un souci
+ $html =~ s|<td><font color="#5C7994"></font></td>|<td><font color="#5C7994"></font>#TPFCHAMPSVIDE#</td>|gi;
+
+ $html =~ s|<font color="#D19159">||gi;
+ $html =~ s|</font>||gi;
+ # Ce n est pas un coloriste donc il ne faut pas le rajouter a la liste des auteurs
+ $html =~ s|&lt;N&amp;B&gt;|#TPF NOIR ET BLANC TPF#|gi;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ # si isbn renseigné alors url de recherche différent
+ if((length($word) eq 13 || length($word) eq 10) && ($word =~ /[0-9]/))
+ {
+ # si contient pas de caractére - alors insertion de ceux ci pour recherche chez bdgest (ISBN sur 10 au lieu de 13)
+ if($word =~ /\-/)
+ {
+ $word =~ s/978\-//;
+ return "http://www.bedetheque.com/index.php?R=1&RechISBN=". $word;
+ }
+ else
+ {
+ # Ajouts des - et enléve le 978 en début si présent
+ $word =~ s/978//;
+
+ #re calcul de la clé de vérification
+ my $total = substr($word,0,1)*10;
+ $total = $total + (substr($word,1,1)*9);
+ $total = $total + (substr($word,2,1)*8);
+ $total = $total + (substr($word,3,1)*7);
+ $total = $total + (substr($word,4,1)*6);
+ $total = $total + (substr($word,5,1)*5);
+ $total = $total + (substr($word,6,1)*4);
+ $total = $total + (substr($word,7,1)*3);
+ $total = $total + (substr($word,8,1)*2);
+ $total = 11 - ($total%11);
+
+ if($total eq 10)
+ {
+ $total = 'X';
+ }
+
+ $word = substr($word,0,1)."-".substr($word,1,2)."%25-%25".substr($word,7,2)."-".$total;
+ return "http://www.bedetheque.com/index.php?R=1&RechISBN=". $word;
+ }
+ }
+ else
+ {
+ return "http://www.bedetheque.com/index.php?R=1&RechSerie=". $word;
+ }
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.bedetheque.com/" . $url;
+ }
+
+ sub getName
+ {
+ return "BDGest";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-1";
+ }
+
+ sub getAuthor
+ {
+ return 'Rataflo';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn','title'];
+ }
+
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCBibliotekaNarodowa.pm b/lib/gcstar/GCPlugins/GCbooks/GCBibliotekaNarodowa.pm
new file mode 100644
index 0000000..927be0b
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCBibliotekaNarodowa.pm
@@ -0,0 +1,374 @@
+package GCPlugins::GCbooks::GCbooksBibliotekaNarodowa;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+my $searchISBN = "";
+
+{
+ package GCPlugins::GCbooks::GCPluginBibliotekaNarodowa;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'frameset') #od razu mamy wynik
+ {
+ $self->{isBook} = 7;
+ $self->{itemIdx}++;
+ }
+ if (($tagname eq 'frame') && ($attr->{name} eq 'bib_frame') && $self->{isBook} == 7) #od razu mamy wynik
+ {
+ $self->{isUrl} = 1;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://alpha.bn.org.pl".$attr->{src};
+ $self->{isUrl} = 0;
+ $self->{isBook} = 0;
+ }
+
+ if (($tagname eq 'tr') && ($attr->{class} eq 'browseEntry'))
+ {
+ $self->{isBook} = 1;
+ $self->{itemIdx}++;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'browseEntryData') && ($self->{isBook} == 1))
+ {
+ $self->{isAuthor} = 2;
+ }
+ if (($tagname eq 'a') && ($self->{isBook} == 1) && ($self->{isAuthor} > 0))
+ {
+ $self->{isUrl} = 1;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://alpha.bn.org.pl".$attr->{href};
+ $self->{itemsList}[$self->{itemIdx}]->{url} =~ s|frameset|bibframe|;
+ $self->{isUrl} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isTitle} = 1;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'browseEntryYear') && ($self->{isBook} == 1))
+ {
+ $self->{isPublication} = 1;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgTIAUTR'))
+ {
+ $self->{isTitle} = 1;
+ $self->{isAuthor} = 1;
+ $self->{isTranslator} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgISBN'))
+ {
+ $self->{isISBN} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgPAGES'))
+ {
+ $self->{isPage} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgPUBPD'))
+ {
+ $self->{isPublisher} = 1;
+ $self->{isPublication} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgSERIA'))
+ {
+ $self->{isSerie} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgEDITI'))
+ {
+ $self->{isEdition} = 1;
+ }
+ }
+ }
+
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'tr') && ($self->{isBook} == 1))
+ {
+ $self->{isBook} = 0;
+ }
+ }
+
+ $self->{isFound} = 0;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ $origtext =~ s|^\s*||m;
+ $origtext =~ s|\s*$||m;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isBook} == 1)
+ {
+ if ($self->{isTitle} == 1)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ if ($self->{isAuthor} > 0)
+ {
+ $origtext =~ s|\s*\/\s*(.*)\s*;|$1|;
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $1;
+ $self->{isAuthor} = 1;
+ }
+ if ($self->{isPublication} == 1)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublication} = 0;
+ }
+ }
+
+ }
+ else
+ {
+ if (($self->{isTitle} == 1) && ($self->{isAuthor} == 1) && ($self->{isTranslator} == 1))
+ {
+ my ($ti, $au, $tr, $bubu);
+ $origtext =~ m|.*(\.){1}$|;
+ $bubu = $1;
+ if ($bubu eq '.')
+ {
+ $origtext =~ s|(.*)\.$|$1|;
+ }
+ $origtext =~ m/([^\/]+)(\/\s+[^;]*)?(;\s*.*(tł|przeł|przekł)\..*)?$/;
+# $origtext =~ m|([^/]+)(/\s[^;]+)?(;.*)?$|;
+ $ti = $1;
+ $au = $2;
+ $tr = $3;
+ $ti =~ s|([^:]*):?.*$|$1|;
+ $ti =~ s|\s*$||;
+ $self->{curInfo}->{title} = $ti;
+ $self->{isTitle} = 0;
+ $au =~ s|^(.*)il\..*$|$1|;
+ $au =~ s/(\/|tekst)//g;
+ $au =~ s| i |,|g;
+ $au =~ s|, |,|g;
+ $au =~ s|^\s*||;
+ $au =~ s|\s*$||;
+ $self->{curInfo}->{authors} = $au;
+ $self->{isAuthor} = 0;
+ $tr =~ s|[\[\]]||g;
+ $tr =~ s/;\s*.*(tł|przeł|przekł)\. (\[.*\] )?(.*)\.?$/$3/;
+ $tr =~ s|(z \w+\. )?(.*)|$2|;
+ $self->{curInfo}->{translator} = $tr;
+ $self->{isTranslator} = 0;
+ }
+ if (($self->{isPublisher} == 1) && ($self->{isPublication} == 1))
+ {
+ my ($pu, $pd);
+ $origtext =~ m|(.*)\s:\s(.*),\s(.*)|;
+ $pu = $2;
+ $pd = $3;
+ $pu =~ s|([^"]*")?([^"]*)"?|$2|;
+ $pu =~ s|[\[\]]||g;
+ $self->{curInfo}->{publisher} = $pu;
+ $self->{isPublisher} = 0;
+ $pd =~ s|[^\d]||g;
+ $self->{curInfo}->{publication} = $pd;
+ $self->{isPublication} = 0;
+ }
+ if ($self->{isISBN} eq '1')
+ {
+ my ($pom1, $pom2);
+ if ($self->{searchField} eq 'isbn')
+ {
+ $pom1 = $self->{searchISBN};
+ $pom2 = $origtext;
+ $pom2 =~ s|[^\dX]||g;
+ $pom1 =~ s|-||g;
+ $pom2 =~ s|-||g;
+ if ($pom1 eq $pom2)
+ {
+ $self->{curInfo}->{isbn} = $self->{searchISBN};
+ }
+ else
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ }
+ }
+ else
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ }
+ $self->{isISBN} = 0;
+ }
+ if ($self->{isPage} eq '1')
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0;
+ }
+ if ($self->{isEdition} eq '1')
+ {
+ $origtext =~ s|[\[\]]||g;
+ $origtext =~ s|(.*)\.{1}$|$1|;
+ $self->{curInfo}->{edition} = $origtext;
+ $self->{isEdition} = 0;
+ }
+ if ($self->{isSerie} eq '1')
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isSerie} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 1,
+ };
+
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isEditor_Publication_Format_Lang} = 0 ;
+ $self->{isAnalyse} = 0;
+ $self->{isFound} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isFormat} = 0;
+ $self->{isEdition} = 0;
+ $self->{isPage} = 0;
+ $self->{isLanguage} = 0;
+ $self->{isPublication} = 0;
+ $self->{isSerie} = 0;
+ $self->{isDescription} = 0;
+ $self->{isCover} = 0;
+ $self->{isTranslator} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+ $self->{insideResults} = 0;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<b>(.*?)</b>|$1|gms;
+ $html =~ s|<td class="browseEntryData">\s*<a(.*)/a>\s*(.*)\s*|<td class="browseEntryData">$2<a$1/a>|gm;
+ }
+ else
+ {
+ $html =~ s|</?strong>||gi;
+ $html =~ s|</?br>||gi;
+ $html =~ s|</?i>||gi;
+
+ $html =~ s|<td.*>ISBN</td>\s*<.*>\s*(\w*)</td>|<div id="wrgISBN">$1</div>|m;
+ $html =~ s|<td.*>Seria</td>\s*<.*>\s*(.*)\s*</td>|<div id="wrgSERIA">$1</div>|m;
+ $html =~ s|<div id="wrgSERIA">(.*)( / [^<]*)</div>|<div id="wrgSERIA">$1</div>|;
+ $html =~ s|<td.*>Opis fiz</td>\s*<.*>\s*(\d*)\D.*</td>|<div id="wrgPAGES">$1</div>|m;
+ $html =~ s|<td.*>TytuŁ</td>\s*<.*>\s*(.*)\s*</td>|<div id="wrgTIAUTR">$1</div>|m;
+ $html =~ s|<td.*>Adres wyd</td>\s*<.*>\s*(.*)\s*</td>|<div id="wrgPUBPD">$1</div>|m;
+ $html =~ s|<td.*>Wydanie</td>\s*<.*>\s*(.*)\s*</td>|<div id="wrgEDITI">$1</div>|m;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ my $bubu;
+ if ($self->{searchField} eq 'isbn')
+ {
+ $bubu = "i";
+ $self->{searchISBN} = $word;
+ }
+ else
+ {
+ $bubu = "t";
+ $self->{searchISBN} = "";
+ }
+ return "http://alpha.bn.org.pl/search*pol/".$bubu."?SEARCH=".$word;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url;
+ return 'http://alpha.bn.org.pl'
+ }
+
+ sub getName
+ {
+ return "Biblioteka Narodowa";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ #return "UTF-8";
+ return "ISO-8859-2";
+ }
+
+ sub getAuthor
+ {
+ return 'WG';
+ }
+
+ sub getLang
+ {
+ return 'PL';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCBokkilden.pm b/lib/gcstar/GCPlugins/GCbooks/GCBokkilden.pm
new file mode 100644
index 0000000..d32c1f4
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCBokkilden.pm
@@ -0,0 +1,295 @@
+package GCPlugins::GCbooks::GCBokkilden;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginBokkilden;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ if ($self->{itemIdx} < 0)
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'h1') && ($attr->{class} eq 'normal'))
+ {
+ $self->{isBook} = 1;
+ $self->{itemIdx}++;
+ }
+ elsif ($self->{isBook})
+ {
+ if ($tagname eq 'a')
+ {
+ if (($attr->{href} =~ /produkt\.do/)
+ && (!$self->{itemsList}[$self->{itemIdx}]->{title}))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isTitle} = 1;
+ }
+ elsif ($attr->{href} =~ /sok\.do\?enkeltsok/)
+ {
+ $self->{isAuthor} = 1;
+ }
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq 'table')
+ {
+ $self->{isBook} = 1
+ if ($attr->{class} eq 'bokfaktatabell');
+ }
+ elsif ($tagname eq 'div')
+ {
+ $self->{isCover} = 1 if ($attr->{class} eq 'img-ilus')
+ && ($attr->{style} eq 'width:120px;');
+ $self->{is} = 'description' if $attr->{id} eq 'omtale-hidden';
+ }
+ elsif ($tagname eq 'img')
+ {
+ if ($self->{isCover})
+ {
+ $self->{curInfo}->{cover} = 'http://www.bokkilden.no/SamboWeb/'
+ . $attr->{src};
+ $self->{isCover} = 0;
+ }
+ }
+ elsif ($tagname eq 'h1')
+ {
+ $self->{h1Style} = $attr->{style};
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{inside}->{title})
+ {
+ $self->{parsingEnded} = 1 if $origtext !~ /S..?k p..?/;
+ }
+
+ elsif ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ elsif ($self->{isAuthor})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ','
+ if $self->{itemsList}[$self->{itemIdx}]->{authors};
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= $origtext;
+ $self->{isAuthor} = 0;
+ }
+ elsif ($self->{isBook})
+ {
+ if ($origtext =~ / \| /)
+ {
+ $origtext =~ /(\d{4})/;
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $1;
+ $self->{isBook} = 0;
+ }
+ }
+ }
+ else
+ {
+ if ($self->{is})
+ {
+ $origtext =~ s/^\s*//;
+ $self->{curInfo}->{$self->{is}} = $origtext;
+ if ($self->{is} eq 'genre')
+ {
+ $self->{curInfo}->{genre} =~ s/;\s*/,/g;
+ }
+ elsif ($self->{is} eq 'pages')
+ {
+ $self->{curInfo}->{pages} =~ s/[^0-9]//g;
+ }
+ $self->{is} = '';
+ }
+ elsif ($self->{inside}->{title})
+ {
+ $self->{tmpTitle} = $origtext;
+ }
+ elsif ($self->{inside}->{h1})
+ {
+ if (!$self->{curInfo}->{title})
+ {
+ if ($self->{h1Style})
+ {
+ $self->{tmpTitle} =~ /\s*(.*?) av (.*?) »/gim;
+ $self->{curInfo}->{title} = $1;
+ $self->{curInfo}->{authors} = $2;
+ }
+ else
+ {
+ $self->{curInfo}->{title} = $origtext;
+ }
+ }
+ }
+ elsif ($self->{inside}->{author})
+ {
+ $self->{curInfo}->{authors} .= ','
+ if $self->{curInfo}->{authors};
+ $self->{curInfo}->{authors} .= $origtext;
+ }
+ if ($self->{inside}->{translator})
+ {
+ $self->{curInfo}->{translator} .= ', '
+ if $self->{curInfo}->{translator};
+ $self->{curInfo}->{translator} .= $origtext;
+ }
+ elsif (($self->{isBook}) && $self->{inside}->{b})
+ {
+ $self->{is} =
+ ($origtext eq 'Utgitt: ') ? 'publication'
+ : ($origtext eq 'Forlag: ') ? 'publisher'
+ : ($origtext eq 'Innb.: ') ? 'format'
+ : ($origtext =~ /Spr..?k:/) ? 'language'
+ : ($origtext eq 'Sider: ') ? 'pages'
+ : ($origtext eq 'ISBN: ') ? 'isbn'
+ : ($origtext eq 'Utgave: ') ? 'edition'
+ : ($origtext eq 'Genre:') ? 'genre'
+ : '';
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 0,
+ edition => 0,
+ };
+
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+ $self->{isBook} = 0;
+ if ($self->{parsingList})
+ {
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ }
+ else
+ {
+ $self->{is} = '';
+ $self->{isCover} = 0;
+ $html =~ s|<a href="emneliste\.do\?emnekode=[.0-9]*">(.*?)</a>|$1|gim;
+ $html =~ s|<a href="sok\.do\?enkeltsok=[^"]*">([^<]*)</a>|<author>$1</author>|gim;
+ #"
+ $html =~ s|<a href="sok\.do\?.*?rolle1=Oversetter">(.*?)</a>|<translator>$1</translator>|gim;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://www.bokkilden.no/SamboWeb/sok.do?rom=MP&enkeltsok=$word&innsnevre=ja";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return "http://www.bokkilden.no/SamboWeb/$url"
+ if $url !~ m|http://www.bokkilden.no/|;
+ return $url;
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return 'UTF-8';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+ sub getName
+ {
+ return 'Bokkilden';
+ }
+
+ sub getLang
+ {
+ return 'NO';
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCBol.pm b/lib/gcstar/GCPlugins/GCbooks/GCBol.pm
new file mode 100644
index 0000000..6e882b1
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCBol.pm
@@ -0,0 +1,485 @@
+package GCPlugins::GCbooks::GCBol;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginBol;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'td')
+ {
+ if($self->{bookStep} == 0)
+ {
+ $self->{bookStep} = 1 ;
+ }
+ }
+ elsif ($tagname eq 'img')
+ {
+ if($self->{bookStep} == 1)
+ {
+ $self->{bookStep} = 2;
+ }
+ }
+ elsif ($tagname eq 'a')
+ {
+ if($self->{bookStep}==2)
+ {
+ $self->{url} = "http://www.bol.it" . $attr->{href};
+ $self->{bookStep} = 3 ;
+ $self->{isTitle} = 1 ;
+ }
+ elsif($self->{bookStep}==3)
+ {
+ $self->{bookStep} = 4 ;
+ $self->{isAuthor} = 1 ;
+ }
+ }
+ elsif ($tagname eq 'br')
+ {
+ if($self->{bookStep}==4)
+ {
+ $self->{isBook} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{url};
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $self->{title};
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $self->{author};
+
+ $self->{isFormat} = 1 ;
+ #$self->{bookStep} = 0 ;
+ }
+ }
+ elsif (
+ (($tagname ne 'h3') || ( ($tagname eq 'h3') && ($self->{bookStep} != 2) )) &&
+ (($tagname ne 'p') || ( ($tagname eq 'p') && ($self->{bookStep} != 3) )) &&
+ (($tagname ne 'span') || ( ($tagname eq 'span') && ($self->{bookStep} != 4) ))
+ )
+ {
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isAnalyse} = 0;
+ $self->{isDescription} = 0;
+ $self->{isTranslator} = 0;
+ $self->{isCover} = 0;
+ $self->{isGenre} = 0;
+ $self->{isFormat} = 0;
+ $self->{isPage} = 0;
+ $self->{isLanguage} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isPublication} = 0;
+ $self->{isISBN} = 0;
+
+ $self->{isBook} = 0;
+ $self->{bookStep} = 0;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'img') && ($attr->{class} eq 'cover'))
+ {
+ $self->{curInfo}->{cover} = "http://www.bol.it" . $attr->{src};
+ $self->{bookStep} = 1;
+ }
+ elsif (($tagname eq 'h1') && ($self->{bookStep} == 1))
+ {
+ $self->{curInfo}->{title} = "http://www.bol.it" . $attr->{src};
+ $self->{isTitle} = 1;
+ $self->{bookStep} = 2;
+ }
+ elsif ($self->{bookStep} == 2)
+ {
+ if (($tagname eq 'a') && ($self->{areAuthors} == 0))
+ {
+ $self->{isAuthor} = 1;
+ $self->{areAuthors} = 1;
+ }
+ if ($self->{areAuthors} == 1)
+ {
+ if ($tagname eq 'a')
+ {
+ $self->{isAuthor} = 1;
+ }
+ else
+ {
+ $self->{bookStep} = 3;
+ $self->{areAuthors} = 0;
+ }
+ }
+ }
+ elsif ($self->{bookStep} == 4)
+ {
+ if (($tagname eq 'a') && ($self->{areGenres} == 0))
+ {
+ $self->{isGenre} = 1;
+ $self->{areGenres} = 1;
+ }
+ if ($self->{areGenres} == 1)
+ {
+ if ($tagname eq 'a')
+ {
+ $self->{isGenre} = 1;
+ }
+ else
+ {
+ $self->{bookStep} = 5;
+ $self->{areGenres} = 0;
+ }
+ }
+ }
+ elsif ($self->{bookStep} == 6)
+ {
+ if (($tagname eq 'a') && ($self->{areTranslators} == 0))
+ {
+ $self->{isTranslator} = 1;
+ $self->{areTranslators} = 1;
+ }
+ if ($self->{areTranslators} == 1)
+ {
+ if ($tagname eq 'a')
+ {
+ $self->{isTranslator} = 1;
+ }
+ else
+ {
+ $self->{bookStep} = 6;
+ $self->{areTranslators} = 0;
+ }
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ elsif ($self->{isAuthor})
+ {
+ $self->{author} = $origtext;
+ $self->{isAuthor} = 0;
+ }
+ elsif ($self->{isFormat})
+ {
+ my @array = split(/\|/,$origtext);
+
+ $self->{itemsList}[$self->{itemIdx}]->{format} = $array[0];
+ $self->{itemsList}[$self->{itemIdx}]->{format} =~ s/^\s+//;
+ $self->{isFormat} = 0;
+ $self->{isPublisher} = 1;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublisher} = 0;
+ $self->{isPublication} = 1;
+ }
+ elsif ($self->{isPublication})
+ {
+ my @array = split(/\|/,$origtext);
+
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $array[1];
+ $self->{itemsList}[$self->{itemIdx}]->{publication} =~ s/^\s+//;
+ $self->{isPublication} = 0;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+
+ if ($origtext eq 'I contenuti')
+ {
+ $self->{isDescription} = 1;
+ }
+ elsif ($origtext eq 'Formato:')
+ {
+ $self->{isFormat} = 1;
+ }
+ elsif (substr($origtext,0,7) eq 'Pagine:')
+ {
+ $self->{isPage} = 1;
+ }
+ elsif ($origtext eq 'Lingua:')
+ {
+ $self->{isLanguage} = 1;
+ }
+ elsif ($origtext eq 'Editore:')
+ {
+ $self->{isPublisher} = 1;
+ }
+ elsif ($origtext eq 'Anno di pubblicazione')
+ {
+ $self->{isPublication} = 1;
+ }
+ elsif ($origtext eq 'Codice EAN:')
+ {
+ $self->{isISBN} = 1;
+ }
+ elsif (($origtext eq 'Traduttore:') || ($origtext eq 'Traduttori:'))
+ {
+ $self->{bookStep} = 6;
+ }
+ elsif ($origtext eq 'Generi:')
+ {
+ $self->{bookStep} = 4;
+ }
+ elsif ($origtext ne '')
+ {
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ if ($self->{curInfo}->{authors} eq '')
+ {
+ $self->{curInfo}->{authors} = $origtext;
+ }
+ else
+ {
+ $self->{curInfo}->{authors} .= ", " . $origtext;
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} = $origtext;
+ $self->{isDescription} = 0 ;
+ }
+ elsif ($self->{isFormat})
+ {
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormat} = 0;
+ }
+ elsif ($self->{isPage})
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0;
+ }
+ elsif ($self->{isLanguage})
+ {
+ $self->{curInfo}->{language} = $origtext;
+ $self->{isLanguage} = 0;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0;
+ }
+ elsif ($self->{isPublication})
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0;
+ }
+ elsif ($self->{isISBN})
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0;
+ }
+ elsif ($self->{isGenre})
+ {
+ if ($self->{curInfo}->{genre} eq '')
+ {
+ $self->{curInfo}->{genre} = $origtext;
+ }
+ else
+ {
+ $self->{curInfo}->{genre} .= ", " . $origtext;
+ }
+ $self->{isGenre} = 0 ;
+ }
+ elsif ($self->{isTranslator})
+ {
+ if ($self->{curInfo}->{translator} eq '')
+ {
+ $self->{curInfo}->{translator} = $origtext;
+ }
+ else
+ {
+ $self->{curInfo}->{translator} .= ", " . $origtext;
+ }
+ $self->{isTranslator} = 0 ;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 1,
+ edition => 1,
+ serie => 0,
+ };
+
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isAnalyse} = 0;
+ $self->{isDescription} = 0;
+ $self->{isTranslator} = 0;
+ $self->{isCover} = 0;
+ $self->{isGenre} = 0;
+ $self->{isFormat} = 0;
+ $self->{isPage} = 0;
+ $self->{isLanguage} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isPublication} = 0;
+ $self->{isISBN} = 0;
+ $self->{areAuthors} = 0;
+ $self->{areGenres} = 0;
+ $self->{areTranslators} = 0;
+
+ $self->{isBook} = 0;
+ $self->{bookStep} = 0;
+ $self->{title} = 0;
+ $self->{author} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<br><i>|<i>|gi;
+ #$html =~ s/[\n\r\t]//g;
+ }
+ else
+ {
+ my $found = index($html,'<a name="commenti">');
+ if ( $found >= 0 )
+ {
+ $html = substr($html, 0, $found);
+ }
+
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ #$html =~ s|<br>|\n|gi;
+ #$html =~ s|<br />|\n|gi;
+ #$html =~ s|<b>||gi;
+ #$html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+ return ('http://www.bol.it/libri/ricerca', ["crc" => "100", "crcselect" => "100", "g" => "$word", "tpr" => "10"] );
+ }
+ else
+ {
+ $word =~ s/\+/ /g;
+ return ('http://www.bol.it/libri/ricerca', ["crc" => "100", "crcselect" => "100", "g" => "$word", "tpr" => "10"] );
+ }
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.bol.it';
+ }
+
+ sub getName
+ {
+ return "Bol";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-15";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF, UnclePetros';
+ }
+
+ sub getLang
+ {
+ return 'IT';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCBuscape.pm b/lib/gcstar/GCPlugins/GCbooks/GCBuscape.pm
new file mode 100644
index 0000000..ad46177
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCBuscape.pm
@@ -0,0 +1,479 @@
+package GCPlugins::GCbooks::GCBuscape;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginBuscape;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'a') && ($attr->{class} eq 'xu'))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isTitle} = 1 ;
+ }
+ elsif (( $attr->{class} eq 'xj') && ($self->{itemIdx} eq '-1') && ($self->{searchField} eq 'isbn'))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{loadedUrl};
+ }
+ elsif (($tagname eq 'meta') && ($self->{itemIdx} eq '-1') && ($self->{searchField} eq 'isbn'))
+ {
+ my $html = $self->loadPage($self->{loadedUrl}, 0, 1);
+ my $found = index($html,"URL=");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('URL='),length($html)- $found -length('URL='));
+ $html = substr($html, 0, index($html,"\""));
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $html;
+ }
+ }
+ }
+ else
+ {
+ if (( $attr->{class} eq 'xj') && ($self->{isAnalyse} eq 0))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{onerror} ne '') && ($self->{curInfo}->{title} eq ''))
+ {
+ # Attention il y a 2 formats differents pour ce site
+ if ($attr->{alt} ne '')
+ {
+ $self->{curInfo}->{title} = $attr->{alt};
+ }
+ if ($attr->{title} ne '')
+ {
+ my @array = split(/\(/,reverse($attr->{title}));
+ my @array2;
+ if ($array[1] ne '')
+ {
+ $self->{curInfo}->{isbn} = reverse($array[0]);
+ $self->{curInfo}->{isbn} =~ s/\)//;
+ # J enleve le premier champs qui est sense etre le code ISBN
+ shift(@array);
+ my $element1;
+ my $element2;
+ foreach $element1 (@array)
+ {
+ if ($element2 eq '')
+ {
+ $element2 = $element1;
+ }
+ else
+ {
+ $element2 .= "(" .$element1;
+ }
+ }
+ @array2 = split(/-/,$element2);
+ }
+ else
+ {
+ @array2 = split(/-/,$array[0]);
+ }
+
+ if ($array2[1] ne '')
+ {
+ # J enleve le dernier champs qui est l auteur
+ shift(@array2);
+ }
+ my $element;
+ foreach $element (@array2)
+ {
+ if ($self->{curInfo}->{title} eq '')
+ {
+ $self->{curInfo}->{title} = $element;
+ }
+ else
+ {
+ $self->{curInfo}->{title} .= "-" .$element;
+ }
+ }
+ $self->{curInfo}->{title} = reverse($self->{curInfo}->{title});
+ }
+
+ $self->{curInfo}->{cover} = $attr->{src};
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ my @array = split(/\(/,reverse($origtext));
+ my @array2;
+ if ($array[1] ne '')
+ {
+ # J enleve le premier champs qui est sense etre le code ISBN
+ shift(@array);
+ my $element1;
+ my $element2;
+ foreach $element1 (@array)
+ {
+ if ($element2 eq '')
+ {
+ $element2 = $element1;
+ }
+ else
+ {
+ $element2 .= "(" .$element1;
+ }
+ }
+ @array2 = split(/-/,$element2);
+ }
+ else
+ {
+ @array2 = split(/-/,$array[0]);
+ }
+
+ if ($array2[1] ne '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = reverse($array2[0]);
+ my $found = index($self->{itemsList}[$self->{itemIdx}]->{authors}," Cod:");
+ if ( $found >= 0 )
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = substr($self->{itemsList}[$self->{itemIdx}]->{authors}, 0, $found);
+ }
+ # Enleve les blancs en debut de chaine
+ $self->{itemsList}[$self->{itemIdx}]->{authors} =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $self->{itemsList}[$self->{itemIdx}]->{authors} =~ s/\s+$//g;
+ shift(@array2);
+ }
+ my $element;
+ foreach $element (@array2)
+ {
+ if ($self->{itemsList}[$self->{itemIdx}]->{title} eq '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $element;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} .= "-" .$element;
+ }
+ }
+ $self->{itemsList}[$self->{itemIdx}]->{title} = reverse($self->{itemsList}[$self->{itemIdx}]->{title});
+ $self->{isTitle} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{isAnalyse} eq 1)
+ {
+ if ($origtext =~ m/Autor/i)
+ {
+ $self->{isAuthor} = 1 ;
+ $self->{isAnalyse} = 2 ;
+ }
+ elsif ($origtext =~ m/Editora/i)
+ {
+ $self->{isPublisher} = 1 ;
+ $self->{isAnalyse} = 2 ;
+ }
+ elsif ($origtext =~ m/Ano de edi/i)
+ {
+ $self->{isPublication} = 1 ;
+ $self->{isAnalyse} = 2 ;
+ }
+ elsif ($origtext =~ m/N.* de p.*ginas/i)
+ {
+ $self->{isPage} = 1 ;
+ $self->{isAnalyse} = 2 ;
+ }
+ elsif ($origtext =~ m/ISBN/i)
+ {
+ $self->{isISBN} = 1 ;
+ $self->{isAnalyse} = 2 ;
+ }
+ elsif ($origtext =~ m/Encaderna/i)
+ {
+ $self->{isFormat} = 1 ;
+ $self->{isAnalyse} = 2 ;
+ }
+ else
+ {
+ $self->{isAnalyse} = 0 ;
+ }
+
+ }
+ elsif ($self->{isAuthor} eq 1)
+ {
+ $self->{isAuthor} = 2 ;
+ }
+ elsif ($self->{isAuthor} eq 2)
+ {
+ if ($origtext =~ m/N.*o Cadastrado/i)
+ {
+ }
+ else
+ {
+ my @nom_prenom = split(/,/,$origtext);
+ # Enleve les blancs en debut de chaine
+ $nom_prenom[0] =~ s/^\s//;
+ $nom_prenom[1] =~ s/^\s//;
+ # Enleve les blancs en fin de chaine
+ $nom_prenom[0] =~ s/\s+$//;
+ $nom_prenom[1] =~ s/\s+$//;
+ if ($self->{curInfo}->{authors} eq '')
+ {
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{curInfo}->{authors} = $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{curInfo}->{authors} = $nom_prenom[0];
+ }
+ }
+ else
+ {
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{curInfo}->{authors} .= ", " . $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{curInfo}->{authors} .= ", " . $nom_prenom[0];
+ }
+ }
+ }
+
+ $self->{isAuthor} = 0 ;
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ $self->{curInfo}->{isbn} = $origtext if ( !($origtext =~ m/N.*o Cadastrado/i) && !($origtext =~ m/n.*o dispon.*vel/i));
+ $self->{isISBN} = 0 ;
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isPublisher} eq 1)
+ {
+ $self->{isPublisher} = 2 ;
+ }
+ elsif ($self->{isPublisher} eq 2)
+ {
+ $self->{curInfo}->{publisher} = $origtext if ( !($origtext =~ m/N.*o Cadastrado/i) && !($origtext =~ m/n.*o dispon.*vel/i));
+ $self->{isPublisher} = 0 ;
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isPublication} eq 1)
+ {
+ $self->{isPublication} = 2 ;
+ }
+ elsif ($self->{isPublication} eq 2)
+ {
+ $self->{curInfo}->{publication} = $origtext if ( !($origtext =~ m/N.*o Cadastrado/i) && !($origtext =~ m/n.*o dispon.*vel/i));
+ $self->{isPublication} = 0 ;
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isPage} eq 1)
+ {
+ $self->{isPage} = 2 ;
+ }
+ elsif ($self->{isPage} eq 2)
+ {
+ $self->{curInfo}->{pages} = $origtext if ( !($origtext =~ m/N.*o Cadastrado/i) && !($origtext =~ m/n.*o dispon.*vel/i));
+ $self->{isPage} = 0 ;
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isFormat} eq 1)
+ {
+ $self->{isFormat} = 2 ;
+ }
+ elsif ($self->{isFormat} eq 2)
+ {
+ $self->{curInfo}->{format} = $origtext if ( !($origtext =~ m/N.*o Cadastrado/i) && !($origtext =~ m/n.*o dispon.*vel/i));
+ $self->{isFormat} = 0 ;
+ $self->{isAnalyse} = 0 ;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 0,
+ serie => 0,
+ };
+
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isAnalyse} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isPublication} = 0;
+ $self->{isPage} = 0;
+ $self->{isISBN} = 0;
+ $self->{isFormat} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<br><i>|<i>|gi;
+ }
+ else
+ {
+ my $found = index($html,'<a name="commenti">');
+ if ( $found >= 0 )
+ {
+ $html = substr($html, 0, $found);
+ }
+
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+
+ $html =~ s|<!--||gi;
+ $html =~ s|<strong>||gi;
+ $html =~ s|</strong>|<tpfnesertarien>TPFNESERTARIEN</tpfnesertarien><tpfnesertarien></tpfnesertarien>|gi;
+
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+ return "http://compare.buscape.com.br/proc_unico?id=3482&Carac1000000000=" .$word;
+ }
+ else
+ {
+ return "http://compare.buscape.com.br/proc_unico?id=3482&Carac1000000000=" .$word;
+ }
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ # Attention il y a 2 formats differents pour ce site
+ if ($url =~ m/counter_livro.asp/i)
+ {
+ my $html = $self->loadPage($url, 0, 1);
+ my $found = index($html,"URL=");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('URL='),length($html)- $found -length('URL='));
+ $html = substr($html, 0, index($html,"\""));
+ }
+ return $html;
+ }
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "Buscape";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-1";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'PT';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['ISBN', 'title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCCasadelibro.pm b/lib/gcstar/GCPlugins/GCbooks/GCCasadelibro.pm
new file mode 100644
index 0000000..5d8f7e4
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCCasadelibro.pm
@@ -0,0 +1,420 @@
+package GCPlugins::GCbooks::GCbooksCasadelibro;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginCasadelibro;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'p') && ($attr->{class} eq 'tit'))
+ {
+ $self->{isBook} = 1 ;
+ $self->{isUrl} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($self->{isBook}) && ($self->{isUrl}))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.casadelibro.com" . $attr->{href};
+ $self->{isUrl} = 0 ;
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'p') && ($attr->{class} eq 'liz'))
+ {
+ $self->{isBook} = 0 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'autor') && ($self->{isBook}))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{class} =~ m/autor/i) && ($self->{isBook}))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'p') && ($attr->{class} eq 'puestoEditorial') && ($self->{isBook}))
+ {
+ $self->{isEditionPublication} = 1 ;
+ }
+ }
+ else
+ {
+ if ($self->{isLanguage} eq 1)
+ {
+ $self->{isLanguage} = 2 ;
+ }
+ elsif ($self->{isEdition} eq 1)
+ {
+ $self->{isEdition} = 2 ;
+ }
+ elsif ($self->{isFormat} eq 1)
+ {
+ $self->{isFormat} = 2 ;
+ }
+ elsif ($self->{isSerie} eq 1)
+ {
+ $self->{isSerie} = 2 ;
+ }
+ elsif ($self->{isPublication} eq 1)
+ {
+ $self->{isPublication} = 2 ;
+ }
+ elsif ($self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'tit_ficha'))
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif ($tagname eq 'tpfnoauthortpf')
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{class} eq 'autor2'))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'edicion_ficha'))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif ($tagname eq 'tpfstarttagtpf')
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'txt_resumen'))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{id} eq 'imgFicha') && ($attr->{src} ne '/l/grande.gif'))
+ {
+ $self->{curInfo}->{cover} = "http://www.casadelibro.com" . $attr->{src} ;
+ }
+
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ my @nom_prenom = split(/,/,$origtext);
+ # Enleve les blancs en debut de chaine
+ $nom_prenom[0] =~ s/^\s//;
+ $nom_prenom[1] =~ s/^\s//;
+ # Enleve les blancs en fin de chaine
+ $nom_prenom[0] =~ s/\s+$//;
+ $nom_prenom[1] =~ s/\s+$//;
+ if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '')
+ {
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $nom_prenom[0];
+ }
+ }
+ else
+ {
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ", " . $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ", " . $nom_prenom[0];
+ }
+ }
+
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isEditionPublication})
+ {
+ $_= $origtext;
+ if (/(.*),\s([0-9][0-9][0-9][0-9]$)/)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $1;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ }
+
+ $_= $origtext;
+ if (/(.*)\s([0-9][0-9][0-9][0-9]$)/)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $2;
+ }
+
+ $self->{isEditionPublication} = 0 ;
+ }
+ }
+ else
+ {
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isLanguage} eq 2)
+ {
+ my @array = split(/:/,$origtext);
+ $self->{curInfo}->{language} = $array[1];
+ $self->{curInfo}->{language} =~ s/^\s//;
+ $self->{curInfo}->{language} =~ s/\s+$//;
+ $self->{isLanguage} = 0 ;
+ }
+ elsif ($self->{isEdition} eq 2)
+ {
+ my @array = split(/:/,$origtext);
+ $self->{curInfo}->{edition} = $array[1];
+ $self->{curInfo}->{edition} =~ s/^\s//;
+ $self->{curInfo}->{edition} =~ s/\s+$//;
+ $self->{isEdition} = 0 ;
+ }
+ elsif ($self->{isFormat} eq 2)
+ {
+ my @array = split(/:/,$origtext);
+ $self->{curInfo}->{format} = $array[1];
+ $self->{curInfo}->{format} =~ s/^\s//;
+ $self->{curInfo}->{format} =~ s/\s+$//;
+ $self->{isFormat} = 0 ;
+ }
+ elsif ($self->{isSerie} eq 2)
+ {
+ my @array = split(/:/,$origtext);
+ $self->{curInfo}->{serie} = $array[1];
+ $self->{curInfo}->{serie} =~ s/^\s//;
+ $self->{curInfo}->{serie} =~ s/\s+$//;
+ $self->{isSerie} = 0 ;
+ }
+ elsif ($self->{isPublication} eq 2)
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{curInfo}->{publication} =~ s/^\s//;
+ $self->{curInfo}->{publication} =~ s/\s+$//;
+ $self->{isPublication} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isISBN} = 1 if ($origtext =~ m/ISBN/i);
+ $self->{isLanguage} = 1 if ($origtext =~ m/Lengua/i);
+ $self->{isEdition} = 1 if ($origtext =~ m/^n(.*)\sEdici/i);
+ $self->{isFormat} = 1 if ($origtext =~ m/Encuadernaci/i);
+ $self->{isSerie} = 1 if ($origtext =~ m/Colecci/i);
+ $self->{isPublication} = 1 if ($origtext =~ m/^A(.*)o de Edici/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ my @nom_prenom = split(/,/,$origtext);
+ # Enleve les blancs en debut de chaine
+ $nom_prenom[0] =~ s/^\s//;
+ $nom_prenom[1] =~ s/^\s//;
+ # Enleve les blancs en fin de chaine
+ $nom_prenom[0] =~ s/\s+$//;
+ $nom_prenom[1] =~ s/\s+$//;
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{curInfo}->{authors} .= $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{curInfo}->{authors} .= $nom_prenom[0];
+ }
+ $self->{curInfo}->{authors} .= ",";
+
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ my @array = split(/:/,$origtext);
+ $self->{curInfo}->{isbn} = $array[1];
+ $self->{curInfo}->{isbn} =~ s/^\s//;
+ $self->{isISBN} = 0 ;
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} = $origtext;
+ $self->{curInfo}->{description} =~ s/\t//g;
+ $self->{curInfo}->{description} =~ s/^\s//;
+ $self->{curInfo}->{description} =~ s/\s+$//;
+ $self->{isDescription} = 0 ;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 0,
+ edition => 1,
+ };
+
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isEditionPublication} = 0 ;
+ $self->{isAnalyse} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isLanguage} = 0;
+ $self->{isEdition} = 0;
+ $self->{isFormat} = 0;
+ $self->{isSerie} = 0;
+ $self->{isPublication} = 0;
+ $self->{isISBN} = 0;
+ $self->{isDescription} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|'| |gi;
+ }
+ else
+ {
+ my $found = index($html,"<div class=\"azul3\">");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, 0, $found);
+ }
+
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|"tit_ficha"><strong>|"tit_ficha">|gi;
+ $html =~ s|de </span>|<TPFNOAUTHORTPF>|gi;
+ $html =~ s|<strong>|<TPFSTARTTAGTPF>|gi;
+ $html =~ s|</strong>|<TPFSTOPTAGTPF>|gi;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+
+ return "http://www.casadellibro.com/busquedas/resultados2?titbus=&autorbus=&isbnbus=" . $word. "&editbus=&idibus=0&encbus=0&sl1=-1";
+# return "http://www.casadellibro.com/busquedas/quickResults/0,,1-i-" . $word. ",00.html?tBusq=t&tValueForSearch=" .$word. "&cFo=true&rOd=&NotQueryAgain=false";
+ }
+ else
+ {
+ my $word2 = $word;
+ $word2 =~ s|\+|%20|gi;
+ return "http://www.casadellibro.com/busquedas/quickResults2/0,," . $word2. ",00.html?Buscar=" .$word;
+ }
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.casadellibro.com/';
+ }
+
+ sub getName
+ {
+ return "Casadelibro";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'ES';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCChapitre.pm b/lib/gcstar/GCPlugins/GCbooks/GCChapitre.pm
new file mode 100644
index 0000000..242871c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCChapitre.pm
@@ -0,0 +1,430 @@
+package GCPlugins::GCbooks::GCChapitre;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginChapitre;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'a') && ( $attr->{id} =~ m/ctl00_PHCenter_SearchResult1_rpResult_ctl.._searchResultTitle_hlProduct/))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.chapitre.com" . $attr->{href};
+ $self->{isTitle} = 1 ;
+ }
+ elsif ($tagname eq 'tpfauthortpf')
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif ($tagname eq 'strong')
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ }
+ else
+ {
+ if ($self->{isAuthor} eq 2)
+ {
+ if ($tagname ne 'a')
+ {
+ $self->{isAuthor} = 0 ;
+ }
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'clear'))
+ {
+ $self->{isDescription} = 0 ;
+ }
+ elsif ($tagname eq 'td')
+ {
+ if ($self->{isPublisher} eq 1)
+ {
+ $self->{isPublisher} = 2 ;
+ }
+ elsif ($self->{isPublication} eq 1)
+ {
+ $self->{isPublication} = 2 ;
+ }
+ elsif ($self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif ($self->{isLanguage} eq 1)
+ {
+ $self->{isLanguage} = 2 ;
+ }
+ elsif ($self->{isCollection} eq 1)
+ {
+ $self->{isCollection} = 2 ;
+ }
+ elsif ($self->{isGenre} eq 1)
+ {
+ $self->{isGenre} = 2 ;
+ }
+ }
+ elsif (($tagname eq 'a') && ( $attr->{id} eq 'ctl00_PHCenter_ProductFile1_ProductTitle1_linkTitleProduct'))
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'div') && ( $attr->{id} eq 'ctl00_PHCenter_ProductFile1_ProductTitle1_pnlAuthor'))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'h2') && ( $self->{isAuthor} eq 1))
+ {
+ $self->{isAuthor} = 2 ;
+ }
+ elsif (($tagname eq 'div') && ( $attr->{id} eq 'ctl00_PHCenter_ProductFile1_ProductTitle1_pnlTranslator'))
+ {
+ $self->{isTranslator} = 1 ;
+ }
+ elsif (($tagname eq 'tpftraducteurtpf') && ( $self->{isTranslator} eq 1))
+ {
+ $self->{isTranslator} = 2 ;
+ }
+ elsif (($tagname eq 'img') && ( $attr->{id} eq 'ctl00_PHCenter_ProductFile1_ProductPicture1_imgProduct') && ( index($attr->{src},"http://images.chapitre.com/indispo") eq -1 ))
+ {
+ $self->{curInfo}->{cover} = $attr->{src};
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'presentation'))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif (($tagname eq 'tpfdescriptiontpf') && ($self->{isDescription} eq 1))
+ {
+ $self->{isDescription} = 2 ;
+ }
+ elsif ($tagname eq 'th')
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( $attr->{href} =~ m|/CHAPITRE/fr/search/Default.aspx\?collection=|i))
+ {
+ $self->{isCollection} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ( $attr->{href} =~ m|/CHAPITRE/fr/search/Default.aspx\?themeId=|i))
+ {
+ $self->{isGenre} = 2 ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ', ';
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= $origtext;
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isPublisher} = 1 if ($origtext =~ m/Editeur :/i);
+ $self->{isSerie} = 1 if ($origtext =~ m/Collection :/i);
+ $self->{isPublication} = 1 if ($origtext =~ m/Date :/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ my @array = split(/\n/,$origtext);
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $array[0];
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isPublication})
+ {
+ my @array = split(/\n/,$origtext);
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $array[0];
+ $self->{isPublication} = 0 ;
+ }
+ elsif ($self->{isSerie})
+ {
+ my @array = split(/\n/,$origtext);
+ $self->{itemsList}[$self->{itemIdx}]->{serie} = $array[0];
+ $self->{isSerie} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor} eq 2)
+ {
+ if ( $origtext ne '')
+ {
+ my @array = split(/;/,$origtext);
+ my $element;
+ foreach $element (@array)
+ {
+ my @nom_prenom = split(/,/,$element);
+ # Enleve les blancs en debut de chaine
+ $nom_prenom[0] =~ s/^\s//;
+ $nom_prenom[1] =~ s/^\s//;
+ # Enleve les blancs en fin de chaine
+ $nom_prenom[0] =~ s/\s+$//;
+ $nom_prenom[1] =~ s/\s+$//;
+ if ($self->{curInfo}->{authors} eq '')
+ {
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{curInfo}->{authors} = $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{curInfo}->{authors} = $nom_prenom[0];
+ }
+ }
+ else
+ {
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{curInfo}->{authors} .= ", " . $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{curInfo}->{authors} .= ", " . $nom_prenom[0];
+ }
+ }
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ }
+ elsif ($self->{isTranslator} eq 2)
+ {
+ $self->{curInfo}->{translator} = $origtext;
+ $self->{isTranslator} = 0 ;
+ }
+ elsif ($self->{isPublisher} eq 2)
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isDescription} eq 2)
+ {
+ $self->{curInfo}->{description} = $origtext;
+ $self->{isDescription} = 0 ;
+ }
+ elsif ($self->{isPublication} eq 2)
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isPublication} = 1 if ($origtext =~ m/parution/i);
+ $self->{isISBN} = 1 if ($origtext =~ m/EAN13/i);
+ $self->{isPublisher} = 1 if ($origtext =~ m/Editeur/i);
+ $self->{isLanguage} = 1 if ($origtext =~ m/Langue/i);
+ $self->{isCollection} = 1 if ($origtext =~ m/Collection/i);
+ $self->{isGenre} = 1 if ($origtext =~ m/Genre/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0 ;
+ }
+ elsif ($self->{isLanguage} eq 2)
+ {
+ $self->{curInfo}->{language} = $origtext;
+ $self->{isLanguage} = 0 ;
+ }
+ elsif ($self->{isCollection} eq 2)
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isCollection} = 0 ;
+ }
+ elsif ($self->{isGenre} eq 2)
+ {
+ $origtext =~ s|/|,|gi;
+ $self->{curInfo}->{genre} = $origtext;
+ $self->{isGenre} = 0 ;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 0,
+ edition => 1,
+ serie => 1,
+ };
+
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isSerie} = 0;
+ $self->{isPublication} = 0;
+ $self->{isAnalyse} = 0;
+ $self->{isDescription} = 0;
+ $self->{isISBN} = 0;
+ $self->{isLanguage} = 0;
+ $self->{isCollection} = 0;
+ $self->{isTranslator} = 0;
+ $self->{isGenre} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|</a>,|</a>,<tpfauthortpf>|gi;
+ }
+ else
+ {
+
+ $html =~ s|</strong>|</strong><tpftraducteurtpf>|gi;
+ $html =~ s|</h3>|</h3><tpfdescriptiontpf>|gi;
+
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ $word =~ s/\+/ /g;
+ return ('http://www.chapitre.com/CHAPITRE/fr/search/Default.aspx?search=true', ["quicksearch" => "$word"] );
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "Chapitre.com";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-15";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['ISBN', 'title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCDoubanbook.pm b/lib/gcstar/GCPlugins/GCbooks/GCDoubanbook.pm
new file mode 100644
index 0000000..927e099
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCDoubanbook.pm
@@ -0,0 +1,238 @@
+package GCPlugins::GCbooks::GCDoubanbook;
+
+###################################################
+#
+# Copyright 2005-2010 Bai Wensimi
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginDoubanbook;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use XML::Simple;
+ use Encode;
+ use LWP::Simple qw($ua);
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if (($page =~ /^bad isbn/) & ($page =~ /^The/));
+ my $xml;
+ my $xs = XML::Simple->new;
+
+ if ($self->{parsingList})
+ {
+ if ($page =~ /feed>$/)
+ {
+ $xml = $xs->XMLin(
+ $page,
+ forceArray=>['author'],
+ KeyAttr => ['']
+ );
+ foreach my $ItemBook ( @{$xml->{'entry'}}){
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{'url'} = $ItemBook->{'id'};
+ $self->{itemsList}[ $self->{itemIdx} ]->{'title'} = $ItemBook->{'title'};
+ foreach my $tmp_author (@{$ItemBook->{'author'}}){
+ {($self->{itemsList}[ $self->{itemIdx} ]->{'authors'} ne '' ) and $self->{itemsList}[ $self->{itemIdx} ]->{'authors'}.=',';}
+ $self->{itemsList}[ $self->{itemIdx} ]->{'authors'}.=$tmp_author->{'name'};
+ }
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin(
+ $page,
+ forceArray=>['author'],
+ KeyAttr => ['']
+ );
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{'url'} = $xml->{'id'};
+ $self->{itemsList}[ $self->{itemIdx} ]->{'title'} = $xml->{'title'};
+ foreach my $tmp_author (@{$xml->{'author'}}){
+ $self->{itemsList}[ $self->{itemIdx} ]->{'authors'}.=$tmp_author->{'name'};
+ $self->{itemsList}[ $self->{itemIdx} ]->{'authors'}.=',';
+ }
+ }
+ }
+ else
+ {
+ $xml =$xs->XMLin($page,
+ ForceArray => [ 'author' ],
+ KeyAttr => {'db:tag'=>'name','link'=>'rel'});
+ foreach my $tmp_author (@{$xml->{'author'}}){
+ $self->{curInfo}->{authors}.=$tmp_author->{'name'};
+ $self->{curInfo}->{authors}.=',';
+ }
+ $self->{curInfo}->{title}=$xml->{'title'};
+ $self->{curInfo}->{description}=$xml->{'summary'};
+ $self->{curInfo}->{web}=$xml->{'link'}->{'alternate'}->{'href'};
+ foreach my $check(@{$xml->{'db:attribute'}}){
+ my $db_attr=$check->{'name'};
+ SWITCH: {
+ $db_attr eq 'publisher' and $self->{curInfo}->{publisher}=$check->{'content'} ,last;
+ $db_attr eq 'pubdate' and $self->{curInfo}->{publication}=$check->{'content'} ,last;
+ $db_attr eq 'pages' and $self->{curInfo}->{pages}=$check->{'content'} ,last;
+ $db_attr eq 'isbn13' and $self->{curInfo}->{isbn}=$check->{'content'} ,last;
+ $db_attr eq 'binding' and $self->{curInfo}->{format}=$check->{'content'} ,last;
+ $db_attr eq 'translator' and { ($self->{curInfo}->{translator} ne '' ) and $self->{curInfo}->{translator}.=',' }, $self->{curInfo}->{translator}.=$check->{'content'} ,last;
+ $db_attr eq 'author-intro' and $self->{curInfo}->{description}.="\n\n".$check->{'content'},last;
+ ;
+ }
+ }
+
+ my $tmp_image=$xml->{'link'}->{'image'}->{'href'};
+ $tmp_image =~ s/spic/lpic/;
+ $self->{curInfo}->{cover}=$tmp_image;
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ };
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ if ($self->{searchField} eq 'isbn')
+ {
+ return "http://api.douban.com/book/subject/isbn/" .$word;
+ }
+ else
+ {
+ return "http://api.douban.com/book/subjects?q=" .$word;
+ }
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ # Make sure the url is for the api, not the main movie page
+ return $self->getItemUrl($url);
+ }
+
+ sub getNumberPasses
+ {
+ return 1;
+ }
+
+ sub getName
+ {
+ return "豆瓣";
+ }
+
+
+ sub testURL
+ {
+ my ($self, $url) = @_;
+ $url =~ /[\?&]lid=([0-9]+)*/;
+ my $id = $1;
+ return ($id == $self->siteLanguageCode());
+ }
+
+ sub getReturnedFields
+ {
+ my $self = shift;
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ };
+ }
+
+ sub getAuthor
+ {
+ return 'BW';
+ }
+
+ sub getLang
+ {
+ return 'ZH';
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "UTF-8";
+ }
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'ZH';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCFnac.pm b/lib/gcstar/GCPlugins/GCbooks/GCFnac.pm
new file mode 100644
index 0000000..9c0e804
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCFnac.pm
@@ -0,0 +1,462 @@
+package GCPlugins::GCbooks::GCFnac;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginFnac;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ return if $self->{isFound};
+ if (($tagname eq 'h3') && ($attr->{class} eq 'hStyle1'))
+ {
+ $self->{isFound} = 1 ;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{loadedUrl};
+ return;
+ }
+ elsif ($tagname eq 'td')
+ {
+ if (($attr->{width} eq '254') && (!exists $attr->{bgcolor}))
+ {
+ $self->{isBook} = 1 ;
+ $self->{isUrl} = 1 ;
+ $self->{isColonne} = 0 ;
+ }
+ else
+ {
+ $self->{isColonne} ++ ;
+ $self->{isTitle} = 2 ;
+ }
+ }
+ elsif (($attr->{class} eq 'subTitre') && (!exists $attr->{color}) && ($self->{isTitle} eq '0'))
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'tpfpublicationtpf') && ($self->{isBook}))
+ {
+ $self->{isPublication} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($self->{isBook}))
+ {
+ if ($attr->{href} =~ m|/advanced/book.do\?category=book|i)
+ {
+ $self->{isBook} = 0 ;
+ $self->{isUrl} = 0 ;
+ }
+ elsif ($self->{isUrl})
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isTitle} = 1 ;
+ $self->{isUrl} = 0 ;
+ }
+ elsif ($self->{isColonne} eq 2)
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif ($self->{isColonne} eq 4)
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq 'tr')
+ {
+ $self->{isAuthor} = 0 ;
+ $self->{isISBN} = 0 ;
+ $self->{isPublisher} = 0 ;
+ $self->{isFormat} = 0 ;
+ $self->{isSerie} = 0 ;
+ $self->{isPublication} = 0 ;
+ $self->{isPage} = 0 ;
+ $self->{isTranslator} = 0 ;
+ }
+ elsif ($self->{isAuthor} eq 1)
+ {
+ $self->{isAuthor} = 2 ;
+ }
+ elsif ($self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif ($self->{isPublisher} eq 1)
+ {
+ $self->{isPublisher} = 2 ;
+ }
+ elsif ($self->{isFormat} eq 1)
+ {
+ $self->{isFormat} = 2 ;
+ }
+ elsif ($self->{isSerie} eq 1)
+ {
+ $self->{isSerie} = 2 ;
+ }
+ elsif ($self->{isPublication} eq 1)
+ {
+ $self->{isPublication} = 2 ;
+ }
+ elsif ($self->{isPage} eq 1)
+ {
+ $self->{isPage} = 2 ;
+ }
+ elsif ($self->{isTranslator} eq 1)
+ {
+ $self->{isTranslator} = 2 ;
+ }
+ elsif (($tagname eq 'h3') && ($attr->{class} eq 'hStyle1'))
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'strong') && (($self->{isTitle}) || $attr->{class} eq 'titre dispeblock'))
+ {
+ $self->{isTitle} = 2 ;
+ }
+ elsif (($tagname eq 'th') && ($attr->{scope} eq 'row'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{class} eq 'expandimg') && ($self->{bigPics}))
+ {
+ $self->{curInfo}->{cover} = $attr->{href} ;
+ }
+ elsif (($attr->{class} eq 'activeimg') && ((!$self->{bigPics}) || ($self->{curInfo}->{cover} eq '')))
+ {
+ $self->{isCover} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($self->{isCover}))
+ {
+ $self->{curInfo}->{cover} = $attr->{src} ;
+ $self->{isCover} = 0 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} =~ /^lireLaSuite/))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{isFound} = 0 ;
+ $self->{inside}->{$tagname}--;
+ $self->{isDescription} = 0 if $tagname eq 'div';
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle} eq 1)
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if (($self->{itemsList}[$self->{itemIdx}]->{title} eq '') && ($origtext ne ''))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ }
+ elsif ($origtext ne '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} .= ' - ';
+ $self->{itemsList}[$self->{itemIdx}]->{title} .= $origtext;
+ }
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if (($self->{itemsList}[$self->{itemIdx}]->{authors} eq '') && ($origtext ne ''))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
+ }
+ elsif ($origtext ne '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ', ';
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= $origtext;
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isPublication})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $origtext;
+ $self->{isPublication} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{isTitle} eq '2')
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isAuthor} = 1 if ($origtext =~ m/Auteur/i);
+ $self->{isISBN} = 1 if ($origtext =~ m/ISBN/i);
+ $self->{isPublisher} = 1 if ($origtext =~ m/Editeur/i);
+ $self->{isFormat} = 1 if ($origtext =~ m/Format/i);
+ $self->{isSerie} = 1 if ($origtext =~ m/Collection/i);
+ $self->{isPublication} = 1 if ($origtext =~ m/Date de parution/i);
+ $self->{isPage} = 1 if ($origtext =~ m/pages/i);
+ $self->{isTranslator} = 1 if ($origtext =~ m/Traduction/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isAuthor} eq 2)
+ {
+ # Enleve les virgules
+ $origtext =~ s/,//;
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{authors} .= $origtext;
+ $self->{curInfo}->{authors} .= ",";
+ }
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0 ;
+ }
+ elsif ($self->{isPublisher} eq 2)
+ {
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ }
+ elsif ($self->{isFormat} eq 2)
+ {
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormat} = 0 ;
+ }
+ }
+ elsif ($self->{isSerie} eq 2)
+ {
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isSerie} = 0 ;
+ }
+ }
+ elsif ($self->{isPublication} eq 2)
+ {
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0 ;
+ }
+ }
+ elsif (($self->{isPage} eq 2))
+ {
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0 ;
+ }
+ }
+ elsif ($self->{isTranslator})
+ {
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{translator} = $origtext;
+ $self->{isTranslator} = 0 ;
+ }
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 0,
+ edition => 1,
+ serie => 0,
+ };
+
+ $self->{isFound} = 0;
+ $self->{isColonne} = 0;
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isPublication} = 0;
+ $self->{isFormat} = 0;
+ $self->{isSerie} = 0;
+ $self->{isPage} = 0;
+ $self->{isDescription} = 0;
+ $self->{isCover} = 0;
+ $self->{isTranslator} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|</a><br>|</a><tpfpublicationtpf>|gmi;
+ }
+ else
+ {
+ # Le descriptif pouvant contenir des balises html je le repere maintenant
+ my $found = index($html,"<strong>Mot de l'");
+ if ( $found >= 0 )
+ {
+ my $html2 = substr($html, $found +length('<strong>Mot de l\''),length($html)- $found -length('<strong>Mot de l\''));
+ my $found2 = index($html2,"<h4 ");
+ my $html3 = $html2;
+ if ( $found2 >= 0 )
+ {
+ $html3 = substr($html2, $found2 +length('<h4 '),length($html2)- $found2 -length('<h4 '));
+ $html2 = substr($html2, 0, $found2);
+ }
+
+ $found2 = index($html2,"</strong>");
+ if ( $found2 >= 0 )
+ {
+ $html2 = substr($html2, $found2 +length('</strong>'),length($html2)- $found2 -length('</strong>'));
+ }
+
+ $html2 =~ s|<li>|\n* |gi;
+ $html2 =~ s|<br>|\n|gi;
+ $html2 =~ s|<br />|\n|gi;
+ $html2 =~ s|<b>||gi;
+ $html2 =~ s|</b>||gi;
+ $html2 =~ s|<i>||gi;
+ $html2 =~ s|</i>||gi;
+ $html2 =~ s|<p>|\n|gi;
+ $html2 =~ s|</p>||gi;
+ $html2 =~ s|</h4>||gi;
+ $html2 =~ s|\x{92}|'|g;
+ $html2 =~ s|&#146;|'|gi;
+ $html2 =~ s|&#149;|*|gi;
+ $html2 =~ s|&#133;|...|gi;
+ $html2 =~ s|\x{85}|...|gi;
+ $html2 =~ s|\x{8C}|OE|gi;
+ $html2 =~ s|\x{9C}|oe|gi;
+
+ }
+
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www3.fnac.com/search/quick.do?filter=-3&text=". $word ."&category=book";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.fnac.com/';
+ }
+
+ sub getName
+ {
+ return "Fnac (FR)";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-15";
+# return "UTF-8";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCFnacPT.pm b/lib/gcstar/GCPlugins/GCbooks/GCFnacPT.pm
new file mode 100644
index 0000000..eb119a7
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCFnacPT.pm
@@ -0,0 +1,390 @@
+package GCPlugins::GCbooks::GCFnacPT;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginFnacPT;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'a') && ($attr->{class} eq 'txtpretoarial11'))
+ {
+ $self->{isBook} = 1 ;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.fnac.pt" . $attr->{href};
+ }
+ elsif (($tagname eq 'strong') && ($self->{isBook}))
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($self->{isBook}))
+ {
+ $self->{isAuthor} = 1 ;
+ $self->{isBook} = 0 ;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'span') && ($attr->{class} eq 'txtpretoarial11'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif ($self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif ($self->{isPublisher} eq 1)
+ {
+ $self->{isPublisher} = 2 ;
+ }
+ elsif ($self->{isFormat} eq 1)
+ {
+ $self->{isFormat} = 2 ;
+ }
+ elsif ($self->{isSerie} eq 1)
+ {
+ $self->{isSerie} = 2 ;
+ }
+ elsif ($self->{isPublication} eq 1)
+ {
+ $self->{isPublication} = 2 ;
+ }
+ elsif ($self->{isPage} eq 1)
+ {
+ $self->{isPage} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{class} eq 'txt_arial14'))
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'strong') && ($self->{isTitle}))
+ {
+ $self->{isTitle} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{class} eq 'txt_arial10') && ( index($attr->{href},"param=autor") >= 0))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'td') && ($attr->{class} eq 'tabfundo_branco'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{src} =~ m/Images\/catalogo\/livros/i))
+ {
+ $self->{curInfo}->{cover} = "http://www.fnac.pt" . $attr->{src};
+ }
+ elsif (($tagname eq 'td') && ($attr->{class} eq 'txtpretoarial11') && ($attr->{colspan} eq '2'))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif ($tagname eq 'object')
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif ($tagname eq 'param')
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif ($tagname eq 'embed')
+ {
+ $self->{isDescription} = 1 ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{isFound} = 0 ;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ my @array = split(/&/,$origtext);
+ my $element;
+ foreach $element (@array)
+ {
+ my @nom_prenom = split(/,/,$element);
+ if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ", " . $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ }
+
+ $self->{isAuthor} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{isTitle} eq '1')
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor} eq 1)
+ {
+ if ($origtext ne '')
+ {
+ my @array = split(/&/,$origtext);
+ my $element;
+ foreach $element (@array)
+ {
+ my @nom_prenom = split(/,/,$element);
+ # Enleve les blancs en debut de chaine
+ $nom_prenom[0] =~ s/^\s+//;
+ $nom_prenom[1] =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $nom_prenom[0] =~ s/\s+$//;
+ $nom_prenom[1] =~ s/\s+$//;
+ if ($self->{curInfo}->{authors} eq '')
+ {
+ if ($nom_prenom[1] eq '')
+ {
+ $self->{curInfo}->{authors} = $nom_prenom[0];
+ }
+ else
+ {
+ $self->{curInfo}->{authors} = $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ }
+ else
+ {
+ if ($nom_prenom[1] eq '')
+ {
+ $self->{curInfo}->{authors} = $nom_prenom[0];
+ }
+ else
+ {
+ $self->{curInfo}->{authors} .= ", " . $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ }
+ }
+
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isISBN} = 1 if ($origtext =~ m/ISBN/i);
+ $self->{isPublisher} = 1 if ($origtext =~ m/Editora/i);
+ $self->{isFormat} = 1 if ($origtext =~ m/Encaderna/i);
+ $self->{isSerie} = 1 if ($origtext =~ m/Colec/i);
+ $self->{isPublication} = 1 if ($origtext =~ m/Ano/i);
+ $self->{isPage} = 1 if ($origtext =~ m/pages/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0 ;
+ }
+ elsif ($self->{isPublisher} eq 2)
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isFormat} eq 2)
+ {
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormat} = 0 ;
+ }
+ elsif ($self->{isSerie} eq 2)
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isSerie} = 0 ;
+ }
+ elsif ($self->{isPublication} eq 2)
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0 ;
+ }
+ elsif (($self->{isPage} eq 2))
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0 ;
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ $self->{isDescription} = 0 ;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 0,
+ };
+
+ $self->{isFound} = 0;
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isPublication} = 0;
+ $self->{isFormat} = 0;
+ $self->{isSerie} = 0;
+ $self->{isPage} = 0;
+ $self->{isDescription} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ my $found = index($html,'"listagem de resultados"');
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('"listagem de resultados"'),length($html)- $found -length('"listagem de resultados"'));
+ }
+
+ $found = index($html,'"tabela de estrutura do cart');
+ if ( $found >= 0 )
+ {
+ $html = substr($html, 0, $found);
+ }
+
+ }
+ else
+ {
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|</h4>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|<center>||gi;
+ $html =~ s|</center>||gi;
+ $html =~ s|</embed>||gi;
+ $html =~ s|</object>||gi;
+
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.fnac.pt/pt/Search/Search.aspx?categoryN=&cIndex=&catalog=livros&str=". $word;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.fnac.pt/';
+ }
+
+ sub getName
+ {
+ return "Fnac (PT)";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "UTF-8";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'PT';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCISBNdb.pm b/lib/gcstar/GCPlugins/GCbooks/GCISBNdb.pm
new file mode 100644
index 0000000..2b7256c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCISBNdb.pm
@@ -0,0 +1,370 @@
+package GCPlugins::GCbooks::GCISBNdb;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginISBNdb;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'div') && ($attr->{class} eq 'bookInfo') && ($self->{searchField} ne 'isbn'))
+ {
+ $self->{isBook} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"/d/book/") >= 0) && ($self->{isBook}))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://isbndb.com" . $attr->{href};
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"/d/person/") >= 0) && ($self->{isBook}))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"/d/publisher/") >= 0) && ($self->{isBook}))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{onclick},"isbndbTrackBuy") >= 0) && ($self->{itemIdx} eq '-1'))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{loadedUrl} ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'inactive'))
+ {
+ $self->{isBook} = 0 ;
+ }
+ }
+ else
+ {
+ if ($tagname eq 'title')
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"/d/person/") >= 0))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"/d/publisher/") >= 0))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"/c/Library_Shelves/Dewey") >= 0))
+ {
+ $self->{isGenre} = 1 ;
+ }
+ elsif ($tagname eq 'h2')
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'iframe') && ($self->{curInfo}->{cover} eq ''))
+ {
+ my $html = $self->loadPage( $attr->{src}, 0, 1 );
+ my $found = index($html,"<img src=\"");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('<img src="'),length($html)- $found -length('<img src="'));
+
+ my @array = split(/"/,$html);
+ $self->{curInfo}->{cover} = $array[0];
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ', ';
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= $origtext;
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ $self->{curInfo}->{authors} .= $origtext;
+ $self->{curInfo}->{authors} .= ",";
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isFormat} = 1 if ($origtext =~ m/Book Details:/i);
+ $self->{isDescription} = 1 if ($origtext =~ m/Notes:/i);
+ $self->{isDescription} = 1 if ($origtext =~ m/Summary:/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isFormat})
+ {
+ my @array = split(/\n/,$origtext);
+ my @array2;
+ my @array3;
+ my $element;
+ my $element2;
+ foreach $element (@array)
+ {
+ @array2 = split(/:/,$element);
+ # Enleve les blancs en debut de chaine
+ $array2[1] =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $array2[1] =~ s/\s+$//g;
+ if ($array2[0] =~ m/Language/i)
+ {
+ $self->{curInfo}->{language} = $array2[1];
+ }
+ elsif ($array2[0] =~ m/Physical Description/i)
+ {
+ @array3 = split(/;/,$array2[1]);
+ foreach $element2 (@array3)
+ {
+ # Enleve les blancs en debut de chaine
+ $element2 =~ s/^\s+//;
+ $_= $element2;
+ if (/(^[0-9]+)(\s[p])(.*)/)
+ {
+ $self->{curInfo}->{pages} = $1;
+ }
+ elsif (/(.*)(\s)([0-9]+)(\s[p])(.*)/)
+ {
+ $self->{curInfo}->{pages} = $3;
+ }
+ }
+ }
+ elsif ($array2[0] =~ m/Edition Info/i)
+ {
+ @array3 = split(/;/,$array2[1]);
+ $self->{curInfo}->{format} = $array3[0];
+ $_= $array3[1];
+ if (/(.*)([0-9][0-9][0-9][0-9])(.*)/)
+ {
+ $self->{curInfo}->{publication} = $array3[1];
+ # Enleve les blancs en debut de chaine
+ $self->{curInfo}->{publication} =~ s/^\s+//;
+ }
+ }
+ }
+ $self->{isFormat} = 0 ;
+ }
+ elsif ($self->{isDescription})
+ {
+ $origtext =~ s/\n\n/\n/g;
+ $self->{curInfo}->{description} = $origtext;
+ $self->{isDescription} = 0 ;
+ }
+ elsif ($self->{isGenre})
+ {
+ my @array = split(/--/,$origtext);
+
+ $self->{curInfo}->{genre} = $array[1];
+ # Enleve les blancs en debut de chaine
+ $self->{curInfo}->{genre} =~ s/^\s+//;
+ $self->{isGenre} = 0 ;
+ }
+ elsif (($origtext =~ m/ISBN:/i) && ($self->{curInfo}->{isbn} eq ''))
+ {
+ my @array = split(/:/,$origtext);
+
+ # Enleve les blancs en debut de chaine
+ $array[1] =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $array[1] =~ s/\s+$//g;
+ my @array2 = split(/ /,$array[1]);
+
+ $self->{curInfo}->{isbn} = $array2[0];
+ # Enleve les blancs en debut de chaine
+ $self->{curInfo}->{isbn} =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $self->{curInfo}->{isbn} =~ s/\s+$//g;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 1,
+ serie => 0,
+ };
+
+ $self->{isBook} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isAnalyse} = 0;
+ $self->{isDescription} = 0;
+ $self->{isGenre} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ }
+ else
+ {
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+ return "http://isbndb.com/search-all.html?kw=" .$word;
+ }
+ else
+ {
+ return "http://isbndb.com/search-title.html?kw=" .$word ."&isn=";
+ }
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "ISBNdb";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-15";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCInternetBokHandeln.pm b/lib/gcstar/GCPlugins/GCbooks/GCInternetBokHandeln.pm
new file mode 100644
index 0000000..3b553e9
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCInternetBokHandeln.pm
@@ -0,0 +1,464 @@
+package GCPlugins::GCbooks::GCbooksInternetBokHandeln;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginInternetBokHandeln;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'span') && ($attr->{class} eq 'title1'))
+ {
+ $self->{isFound} = 1 ;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{loadedUrl};
+ }
+ elsif (($tagname eq 'td') && ($attr->{rowspan} eq '4') && ($self->{isBook} eq '0') && ($self->{isFound} eq 0))
+ {
+ # En fait la sequence est un peu tordue. Je cherche le deuxieme passage dans la sequence
+ # rowspan/a
+ $self->{isBook} = 1 ;
+ $self->{isUrl} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($self->{isBook} eq '1') && ($self->{isUrl}))
+ {
+ $self->{isBook} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ($self->{isBook} eq '2') && ($self->{isUrl}))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.internetbokhandeln.se" . $attr->{href};
+ $self->{isUrl} = 0 ;
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'author') && ($self->{isFound} eq 0))
+ {
+ $self->{isAuthor} = 1 ;
+ $self->{isBook} = 0 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'shaded') && ($self->{isFound} eq 0))
+ {
+ $self->{isEditor_Publication_Format_Lang} = 1 ;
+ $self->{isBook} = 0 ;
+ }
+ }
+ else
+ {
+ if ($self->{isAuthor} eq 1)
+ {
+ $self->{isAuthor} = 2 ;
+ }
+ elsif ($self->{isPublisher} eq 1)
+ {
+ $self->{isPublisher} = 2 ;
+ }
+ elsif ($self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif ($self->{isFormat} eq 1)
+ {
+ $self->{isFormat} = 2 ;
+ }
+ elsif ($self->{isEdition} eq 1)
+ {
+ $self->{isEdition} = 2 ;
+ }
+ elsif ($self->{isPage} eq 1)
+ {
+ $self->{isPage} = 2 ;
+ }
+ elsif ($self->{isLanguage} eq 1)
+ {
+ $self->{isLanguage} = 2 ;
+ }
+ elsif ($self->{isPublication} eq 1)
+ {
+ $self->{isPublication} = 2 ;
+ }
+ elsif ($self->{isSerie} eq 1)
+ {
+ $self->{isSerie} = 2 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'title1'))
+ {
+ $self->{isTitle} = 1 ;
+ # On initialise la variable ( sinon d une fiche sur l autre est n est pas reinitialisee )
+ $self->{isDescription} = 0;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'font5'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'p') && ($self->{curInfo}->{isbn} ne '') && ($self->{curInfo}->{description} eq '') && ($self->{isDescription} ne 2))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{id} eq 'largebook'))
+ {
+ # Pour etre sur s il n y a pas de commentaire de ne pas prendre n importe quoi
+ $self->{isDescription} = 2 ;
+ }
+ elsif (($tagname eq 'td') && ($attr->{class} eq 'pricecolumn'))
+ {
+ $self->{isCover} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($self->{isCover} eq 1))
+ {
+ # le but est de determiner s il y a une couverture ou non, et s il y en a une, on recuperera
+ # la version grand format qui est bien plus tard
+ if ($attr->{onclick} eq 'return showBig();')
+ {
+ $self->{isCover} = 2 ;
+ }
+ else
+ {
+ if ($attr->{src} eq '/i/dummy.gif')
+ {
+ # Il n y a pas d image
+ $self->{isCover} = 3 ;
+ }
+ else
+ {
+ $self->{curInfo}->{cover} = $attr->{src} ;
+ $self->{isCover} = 3 ;
+ }
+ }
+ }
+ elsif (($tagname eq 'img') && ($attr->{onclick} eq 'return hideBig();') && ($self->{isCover} eq 2))
+ {
+ $self->{curInfo}->{cover} = $attr->{src} ;
+ $self->{isCover} = 3 ;
+ }
+
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{isFound} = 0;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ my @array = split(/;/,$origtext);
+ my $element;
+ foreach $element (@array)
+ {
+ my @nom_prenom = split(/,/,$element);
+ # Enleve les blancs en debut de chaine
+ $nom_prenom[0] =~ s/^\s//;
+ $nom_prenom[1] =~ s/^\s//;
+ # Enleve les blancs en fin de chaine
+ $nom_prenom[0] =~ s/\s$//;
+ $nom_prenom[1] =~ s/\s$//;
+ if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '')
+ {
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $nom_prenom[0];
+ }
+ }
+ else
+ {
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ", " . $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ", " . $nom_prenom[0];
+ }
+ }
+ }
+
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isEditor_Publication_Format_Lang})
+ {
+ my @Editor_Publication_Format_Lang = split(/\|/,$origtext);
+
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $Editor_Publication_Format_Lang[1];
+ $self->{itemsList}[$self->{itemIdx}]->{publication} =~ s/^\s+//;
+ $self->{itemsList}[$self->{itemIdx}]->{publication} =~ s/\s$+//;
+
+ $self->{itemsList}[$self->{itemIdx}]->{format} = $Editor_Publication_Format_Lang[2];
+ $self->{itemsList}[$self->{itemIdx}]->{format} =~ s/^\s+//;
+ $self->{itemsList}[$self->{itemIdx}]->{format} =~ s/\s$+//;
+
+ $self->{isEditor_Publication_Format_Lang} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isAuthor} = 1 if ($origtext =~ m/F.*rfattare/i);
+ $self->{isISBN} = 1 if ($origtext =~ m/ISBN/i);
+ $self->{isPublisher} = 1 if ($origtext =~ m/F.*rlag/i);
+ $self->{isFormat} = 1 if ($origtext =~ m/Band/i);
+ $self->{isEdition} = 1 if ($origtext =~ m/Upplagenr/i);
+ $self->{isPage} = 1 if ($origtext =~ m/Sidor/i);
+ $self->{isLanguage} = 1 if ($origtext =~ m/Spr.*k/i);
+ $self->{isPublication} = 1 if ($origtext =~ m/Utgivning/i);
+ $self->{isSerie} = 1 if ($origtext =~ m/Serie/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isAuthor} eq 2)
+ {
+ my @array = split(/;/,$origtext);
+ my $element;
+ foreach $element (@array)
+ {
+ my @nom_prenom = split(/,/,$element);
+ # Enleve les blancs en debut de chaine
+ $nom_prenom[0] =~ s/^\s//;
+ $nom_prenom[1] =~ s/^\s//;
+ # Enleve les blancs en fin de chaine
+ $nom_prenom[0] =~ s/\s$//;
+ $nom_prenom[1] =~ s/\s$//;
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{curInfo}->{authors} .= $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{curInfo}->{authors} .= $nom_prenom[0];
+ }
+ $self->{curInfo}->{authors} .= ",";
+ }
+
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ # Il y a 2 ISBN sur le site, seul le premier m interesse
+ if ($self->{curInfo}->{isbn} eq '')
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ }
+ $self->{isISBN} = 0 ;
+ }
+ elsif ($self->{isPublisher} eq 2)
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isFormat} eq 2)
+ {
+ my @array = split(/\n/,$origtext);
+
+ $self->{curInfo}->{format} = $array[0];
+ $self->{isFormat} = 0 ;
+ }
+ elsif ($self->{isEdition} eq 2)
+ {
+ # There is some trouble on the site with this field : it is not accurrate. For example for ISBN 9113014528
+ # this field is set to 7000. So for instance this field isn't taken.
+# $self->{curInfo}->{edition} = $origtext;
+ $self->{isEdition} = 0 ;
+ }
+ elsif ($self->{isPage} eq 2)
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0 ;
+ }
+ elsif ($self->{isLanguage} eq 2)
+ {
+ $self->{curInfo}->{language} = $origtext;
+ $self->{isLanguage} = 0 ;
+ }
+ elsif ($self->{isPublication} eq 2)
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{curInfo}->{publication} =~ s|([0-9]*) ([A-Za-z]*) ([0-9]*)|$1.'/'.$self->{monthNumber}->{$2}.'/'.$3|e;
+ $self->{curInfo}->{publication} =~ s|([A-Za-z]*) ([0-9]*)|$self->{monthNumber}->{$1}.'/'.$2|e;
+ $self->{isPublication} = 0 ;
+ }
+ elsif ($self->{isSerie} eq 2)
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isSerie} = 0 ;
+ }
+ elsif ($self->{isDescription} eq 1)
+ {
+ $self->{curInfo}->{description} = $origtext;
+ $self->{isDescription} = 2 ;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{monthNumber} = {
+ Januari => '01',
+ Februari => '02',
+ Mars => '03',
+ April => '04',
+ Maj => '05',
+ Juni => '06',
+ Juli => '07',
+ Augusti => '08',
+ September => '09',
+ Oktober => '10',
+ November => '11',
+ December => '12'
+ };
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 1,
+ edition => 0,
+ };
+
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isEditor_Publication_Format_Lang} = 0 ;
+ $self->{isAnalyse} = 0;
+ $self->{isFound} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isFormat} = 0;
+ $self->{isEdition} = 0;
+ $self->{isPage} = 0;
+ $self->{isLanguage} = 0;
+ $self->{isPublication} = 0;
+ $self->{isSerie} = 0;
+ $self->{isDescription} = 0;
+ $self->{isCover} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ }
+ else
+ {
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.internetbokhandeln.se/results.html?new_search=1&all_search=" . $word. "&search_media=all";
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.internetbokhandeln.se/';
+ }
+
+ sub getName
+ {
+ return "InternetBokHandeln";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'SV';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCInternetBookShop.pm b/lib/gcstar/GCPlugins/GCbooks/GCInternetBookShop.pm
new file mode 100644
index 0000000..713646c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCInternetBookShop.pm
@@ -0,0 +1,376 @@
+package GCPlugins::GCbooks::GCInternetBookShop;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginInternetBookShop;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'td')
+ {
+ if($self->{bookStep} == 0)
+ {
+ $self->{bookStep} = 1 ;
+ }
+ }
+ elsif ($tagname eq 'img')
+ {
+ if($self->{bookStep} == 1)
+ {
+ $self->{bookStep} = 2;
+ }
+ }
+ elsif ($tagname eq 'a')
+ {
+ if($self->{bookStep}==2)
+ {
+ $self->{url} = $attr->{href} ;
+ $self->{bookStep} = 3 ;
+ $self->{isTitle} = 1 ;
+ }
+ }
+ elsif (($tagname eq 'br') && ($self->{bookStep}==3))
+ {
+ $self->{bookStep} = 4 ;
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'i') && ($self->{bookStep}==4))
+ {
+ $self->{isBook} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{url};
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $self->{title};
+
+ if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '' )
+ {
+ my @fields = split /,/, $self->{authorAndYear};
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $fields[0];
+ }
+ $self->{isPublisher} = 1;
+ }
+ elsif ($tagname ne 'b')
+ {
+ $self->{bookStep} = 0;
+ $self->{url} = '';
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isPage} = 0;
+ $self->{isSerie} = 0;
+ $self->{isTranslator} = 0;
+ $self->{isDescription} = 0;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'input') && ( $attr->{name} eq 'isbn') && ($self->{curInfo}->{isbn} eq ''))
+ {
+ $self->{curInfo}->{isbn} = $attr->{value} ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{src} =~ m/$self->{curInfo}->{isbn}/i) && ($attr->{src} =~ m/cop/i))
+ {
+ $self->{curInfo}->{cover} = $attr->{src};
+ }
+ elsif ($self->{bookStep} == 1)
+ {
+ if (($tagname eq 'a') && ($self->{areAuthors} == 0))
+ {
+ $self->{isAuthor} = 1;
+ $self->{areAuthors} = 1;
+ }
+ if ($self->{areAuthors} == 1)
+ {
+ if ($tagname eq 'a')
+ {
+ $self->{isAuthor} = 1;
+ }
+ else
+ {
+ $self->{bookStep} = 2;
+ $self->{areAuthors} = 0;
+ }
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ $self->{authorAndYear} = $origtext;
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($origtext eq 'Titolo')
+ {
+ $self->{isTitle} = 1;
+ }
+ elsif ($origtext eq 'Autore')
+ {
+ $self->{bookStep} = 1;
+ }
+ elsif ($origtext eq 'Dati')
+ {
+ $self->{isPage} = 1;
+ }
+ elsif ($origtext eq 'Editore')
+ {
+ $self->{isPublisher} = 1;
+ }
+ elsif ($origtext eq 'Traduttore')
+ {
+ $self->{isTranslator} = 1;
+ }
+ elsif ($origtext eq '(collana')
+ {
+ $self->{isSerie} = 1;
+ }
+ elsif ($origtext eq 'Descrizione')
+ {
+ $self->{isDescription} = 1;
+ }
+ else
+ {
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ elsif ($self->{isAuthor})
+ {
+ if ($self->{curInfo}->{authors} eq '')
+ {
+ $self->{curInfo}->{authors} = $origtext;
+ }
+ else
+ {
+ $self->{curInfo}->{authors} .= ", " . $origtext;
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPage})
+ {
+ my @array = split(/,/,$origtext);
+
+ $self->{curInfo}->{publication} = $array[0];
+ $self->{curInfo}->{pages} = $array[1];
+ # Enleve les blancs en debut de chaine
+ $self->{curInfo}->{pages} =~ s/^\s+//;
+ $self->{curInfo}->{pages} =~ s/p.//;
+ if ($array[3] ne '')
+ {
+ $self->{curInfo}->{format} = $array[2] . "," .$array[3];
+ }
+ else
+ {
+ $self->{curInfo}->{format} = $array[2];
+ }
+ # Enleve les blancs en debut de chaine
+ $self->{curInfo}->{format} =~ s/^\s+//;
+
+ $self->{isPage} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isTranslator})
+ {
+ $self->{curInfo}->{translator} = $origtext;
+ $self->{isTranslator} = 0 ;
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ $self->{isDescription} = 0 ;
+ }
+ elsif ($self->{isSerie})
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isSerie} = 0 ;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 1,
+ };
+
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isPage} = 0;
+ $self->{isSerie} = 0;
+ $self->{isTranslator} = 0;
+ $self->{isDescription} = 0;
+ $self->{areAuthors} = 0;
+
+ $self->{bookStep} = 0;
+ $self->{url} = '';
+ $self->{authorAndYear} = '';
+ $self->{title} = '';
+
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<br><i>|<i>|gi;
+ }
+ else
+ {
+ my $found = index($html,'<a name="commenti">');
+ if ( $found >= 0 )
+ {
+ $html = substr($html, 0, $found);
+ }
+
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|</h4>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|<center>||gi;
+ $html =~ s|</center>||gi;
+ $html =~ s|</embed>||gi;
+ $html =~ s|</object>||gi;
+
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.internetbookshop.it/ser/serpge.asp?type=keyword&x=".$word;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url;
+ return 'http://www.internetbookshop.it/';
+ }
+
+ sub getName
+ {
+ return "InternetBookShop";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-1";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'IT';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCLeLivre.pm b/lib/gcstar/GCPlugins/GCbooks/GCLeLivre.pm
new file mode 100644
index 0000000..ff4d6c4
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCLeLivre.pm
@@ -0,0 +1,334 @@
+package GCPlugins::GCbooks::GCLeLivre;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginLeLivre;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'font') && ( $attr->{size} eq '-1') && ( $attr->{face} eq 'Courier New, Courier, mono') && ( $attr->{color} eq '#990000'))
+ {
+ $self->{itemIdx}++;
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'input') && ( $attr->{name} eq 'add'))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.le-livre.com/index.php?fich=fiche_info.php3&ref=" . $attr->{value};
+ }
+ elsif (($tagname eq 'font') && ( $attr->{size} eq '-1') && ( $attr->{face} eq 'Courier New, Courier, mono') && ( $attr->{color} eq '#0000CC'))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'font') && ( $attr->{size} eq '-1') && ( $attr->{face} eq 'Times New Roman, Times, serif'))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ }
+ else
+ {
+ if ($self->{isTitle} eq 3)
+ {
+ $self->{isTitle} = 0 ;
+ $self->{isAuthor} = 1 ;
+ }
+ elsif ($self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ $self->{isISBN} = 3 ;
+ }
+ elsif ($self->{isFormat} eq 1)
+ {
+ $self->{isFormat} = 2 ;
+ }
+ elsif ($self->{isFormat} eq 2)
+ {
+ $self->{isFormat} = 3 ;
+ }
+ elsif (($tagname eq 'font') && ( $attr->{color} eq '#990000') && ($self->{curInfo}->{title} eq ''))
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'font') && ( $attr->{size} eq '2') && ( $attr->{face} eq 'Arial, Helvetica, sans-serif') && ($self->{isTitle} eq 1))
+ {
+ $self->{isTitle} = 2 ;
+ }
+ elsif (($tagname eq 'img') && ( index($attr->{src},"/photos/") >= 0) && ($self->{curInfo}->{cover} eq ''))
+ {
+ $self->{curInfo}->{cover} = $attr->{src};
+ }
+ elsif (($tagname eq 'font') && ( $attr->{color} eq '#000099'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif ($tagname eq 'tpftraducteurtpf')
+ {
+ $self->{isTranslator} = 1 ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ', ';
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= $origtext;
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $origtext =~ s|\.\.|\.|gi;
+ my @array = split(/\./,$origtext);
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $array[0];
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $array[1];
+ $self->{itemsList}[$self->{itemIdx}]->{format} = $array[2];
+ $self->{isPublisher} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{isTitle} eq 2)
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 3 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ $origtext =~ s|/ ||g;
+ $self->{curInfo}->{authors} .= $origtext;
+ $self->{curInfo}->{authors} .= ",";
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isTranslator})
+ {
+ $self->{curInfo}->{translator} = $origtext;
+ $self->{isTranslator} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isISBN} = 1 if ($origtext =~ m/ISBN/i);
+ $self->{isFormat} = 1 if ($origtext =~ m/Descriptif/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isFormat} eq 3)
+ {
+ $origtext =~ s|\.\.|\.|gi;
+ my @array = split(/\./,$origtext);
+ $self->{curInfo}->{publisher} = $array[0];
+
+ # Enleve les blancs en debut de chaine
+ $array[1] =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $array[1] =~ s/\s+$//g;
+ $_= $array[1];
+ if (/(.*)([0-9][0-9][0-9][0-9])(.*)/)
+ {
+ $self->{curInfo}->{publication} = $array[1];
+ }
+
+ # Enleve les blancs en debut de chaine
+ $array[2] =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $array[2] =~ s/\s+$//g;
+ $self->{curInfo}->{format} = $array[2];
+
+ my $element;
+ foreach $element (@array)
+ {
+ $element =~ s/^\s+//;
+ $_= $element;
+ if (/(^[0-9]+)(\s[p])(.*)/)
+ {
+ $self->{curInfo}->{pages} = $1;
+ }
+ elsif (/(^[Oo][u][v][r][a][g][e])(\s[e][n]\s)(.*)/)
+ {
+ $self->{curInfo}->{language} = $3;
+ }
+ }
+
+ $self->{isFormat} = 0 ;
+
+ }
+ elsif ($self->{isISBN} eq 3)
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0 ;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 1,
+ edition => 1,
+ serie => 0,
+ };
+
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isAnalyse} = 0;
+ $self->{isISBN} = 0;
+ $self->{isFormat} = 0;
+ $self->{isTranslator} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ }
+ else
+ {
+
+ $html =~ s|: </font>|<tpfpourfaireunebalisetpf>|gi;
+ $html =~ s|Traduction de |<tpftraducteurtpf>|gi;
+
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.le-livre.com/index.php?page=1&Categ=0&mot=". $word;
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "Le-Livre";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-15";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['ISBN', 'title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCLiberOnWeb.pm b/lib/gcstar/GCPlugins/GCbooks/GCLiberOnWeb.pm
new file mode 100644
index 0000000..1b219aa
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCLiberOnWeb.pm
@@ -0,0 +1,418 @@
+package GCPlugins::GCbooks::GCLiberOnWeb;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginLiberOnWeb;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ use Encode;
+ use HTML::Entities;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'font') && ($attr->{color} eq '#E7E4D8') && ($attr->{face} eq 'Arial'))
+ {
+ $self->{itemIdx}++;
+ $self->{isBook} = 1 ;
+ $self->{isUrl} = 1 ;
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{color} eq '#D90000') && ($attr->{size} eq '3') && ($self->{isBook}))
+ {
+ $self->{isAuthor} = 0 ;
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{color} eq '#FFFFFF') && ($attr->{size} eq '2') && ($attr->{face} eq 'Arial') && ($self->{isBook}))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|libro.asp|i) && ($self->{isBook}) && ($self->{isUrl}))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.liberonweb.com/asp/" . $attr->{href};
+ $self->{isUrl} = 0 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{color} eq '#D90000') && ($attr->{size} eq '5') && ($self->{searchField} eq 'isbn'))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{loadedUrl};
+ }
+ }
+ else
+ {
+ if (($tagname eq 'font') && ($attr->{color} eq '#E7E4D8') && ($attr->{size} eq '4'))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{color} eq '#D90000') && ($attr->{size} eq '5'))
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{face} eq 'Arial') && ($attr->{size} eq '2'))
+ {
+ $self->{isGenre} = 1 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{face} eq 'Verdana, Arial, Helvetica') && ($attr->{size} eq '2') && ($attr->{color} eq ''))
+ {
+ $self->{isFormat} = 1 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{color} eq '#6F6948') && ($attr->{size} eq '4'))
+ {
+ $self->{isAnalyse} = 0 ;
+ $self->{isDescription} = 1 ;
+ }
+ elsif ($tagname eq 'tpfserie')
+ {
+ $self->{isSerie} = 1 ;
+ }
+ elsif ($tagname eq 'tpfanalysecarac')
+ {
+ $self->{isSerie} = 0 ;
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif ($tagname eq 'tpffindesc')
+ {
+ $self->{isDescription} = 0 ;
+ }
+ elsif (($tagname eq 'tpfsautdeligne') && ($self->{isDescription}))
+ {
+ $self->{curInfo}->{description} .= "\n";
+ }
+ elsif (($tagname eq 'img') && ($attr->{src} =~ m|/images/books/|i))
+ {
+ $self->{curInfo}->{cover} = 'http://www.liberonweb.com/asp/' .$attr->{src};
+
+ my $isbn = reverse($attr->{src});
+ my $found = index($isbn,"/");
+ if ( $found >= 0 )
+ {
+ $isbn = substr($isbn, 0,$found);
+ $isbn = reverse($isbn);
+ $found = index($isbn,".");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{isbn} = substr($isbn, 0,$found);
+ }
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ if (($origtext =~ m/Collana:/i) && ($self->{itemsList}[$self->{itemIdx}]->{edition} eq ''))
+ {
+ my @array = split(/-/,$origtext);
+ # Enleve les blancs en debut de chaine
+ $array[0] =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $array[0] =~ s/\s+$//g;
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $array[0];
+ }
+ elsif (($origtext =~ m/Anno /i) && ($self->{itemsList}[$self->{itemIdx}]->{publication} eq ''))
+ {
+ my $found = index($origtext,"Anno ");
+ if ( $found >= 0 )
+ {
+ $origtext = substr($origtext, $found +length('Anno '),length($origtext)- $found -length('Anno '));
+ my @array = split(/,/,$origtext);
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $array[0];
+ # Enleve les blancs en fin de chaine
+ $self->{itemsList}[$self->{itemIdx}]->{publication} =~ s/\s+$//g;
+ }
+ }
+ $self->{isPublisher} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isGenre})
+ {
+ if ($origtext =~ m/Argomenti:/i)
+ {
+ my @array = split(/:/,$origtext);
+ # Enleve les blancs en debut de chaine
+ $array[1] =~ s/^\s+//;
+ $array[1] =~ s|, |,|gi;
+ $self->{curInfo}->{genre} = $array[1];
+ }
+ $self->{isGenre} = 0 ;
+ }
+ elsif ($self->{isFormat})
+ {
+ if ($origtext =~ m/Caratteristiche:/i)
+ {
+ my @array = split(/:/,$origtext);
+ # Enleve les blancs en debut de chaine
+ $array[1] =~ s/^\s+//;
+ $self->{curInfo}->{format} = $array[1];
+ }
+ $self->{isFormat} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ my @array = split(/-/,$origtext);
+ my $element;
+
+ foreach $element (@array)
+ {
+ my @array = split(/\(/,$element);
+ # Enleve les blancs en debut de chaine
+ $array[0] =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $array[0] =~ s/\s+$//;
+
+ if ($array[0] ne '')
+ {
+ $self->{curInfo}->{authors} .= $array[0];
+ $self->{curInfo}->{authors} .= ",";
+ }
+ }
+
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isSerie})
+ {
+ if ($origtext =~ m/Collana:/i)
+ {
+ my @array = split(/:/,$origtext);
+ # Enleve les blancs en debut de chaine
+ $array[1] =~ s/^\s+//;
+ $self->{curInfo}->{serie} = $array[1];
+ }
+ elsif (($origtext ne '') && ($self->{curInfo}->{serie} eq ''))
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ }
+ }
+ elsif ($self->{isAnalyse})
+ {
+
+ my @array = split(/ - /,$origtext);
+ my $element;
+
+ foreach $element (@array)
+ {
+ # Enleve les blancs en debut de chaine
+ $element =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $element =~ s/\s+$//;
+
+ if ($element =~ m/Pagine/i)
+ {
+ $element =~ s/Pagine //i;
+ $element =~ s/-/,/i;
+ my @array2 = split(/,/,$element);
+ if ($array2[1] eq '')
+ {
+ $self->{curInfo}->{pages} = $array2[0];
+ }
+ else
+ {
+ $self->{curInfo}->{pages} = $array2[1];
+ }
+ # Enleve les blancs en debut de chaine
+ $self->{curInfo}->{pages} =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $self->{curInfo}->{pages} =~ s/\s+$//;
+ }
+ elsif ($element =~ m/Anno/i)
+ {
+ my @array2 = split(/ /,$element);
+ $self->{curInfo}->{publication} = $array2[1];
+ }
+ }
+
+ }
+ elsif ($self->{isDescription})
+ {
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ $self->{curInfo}->{description} .= "\n";
+ }
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 0,
+ edition => 1,
+ };
+
+ $self->{isTitle} = 0;
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isSerie} = 0;
+ $self->{isGenre} = 0;
+ $self->{isFormat} = 0;
+ $self->{isDescription} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ }
+ else
+ {
+ $html =~ s|\n||gi;
+ $html =~ s|\r||gi;
+ $html =~ s|\t||gi;
+
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|<tpfsautdeligne>|gi;
+ $html =~ s|<br />|<tpfsautdeligne>|gi;
+ $html =~ s|<br clear=all>|<tpfsautdeligne>|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<!--Visualizzazione delle Note del libro-->|<tpfanalysecarac>|gi;
+ $html =~ s|<!--Visualizzazione dell'Editore e della Collana-->|<tpfserie>|gi;
+ $html =~ s|<font face=Verdana, Arial, Helvetica size=2>|<font face="Verdana, Arial, Helvetica" size=2>|gi;
+ $html =~ s|<!--mstheme-->|<tpffindesc>|gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+ return "http://www.liberonweb.com/asp/libro.asp?ISBN=" . $word;
+ }
+ else
+ {
+ return "http://www.liberonweb.com/asp/lista.asp?D1=Titolo&T1=" . $word. "&I1=1";
+ }
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "LiberOnWeb";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-15";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'IT';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCMareno.pm b/lib/gcstar/GCPlugins/GCbooks/GCMareno.pm
new file mode 100644
index 0000000..1afdc67
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCMareno.pm
@@ -0,0 +1,365 @@
+package GCPlugins::GCbooks::GCbooksMareno;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+my $searchURL = "";
+
+{
+ package GCPlugins::GCbooks::GCPluginMareno;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'title') #od razu mamy wynik?
+ {
+ $self->{isBook} = 7;
+ }
+
+ if (($tagname eq 'table') && ($attr->{class} eq 'bookData'))
+ {
+ $self->{itemIdx}++;
+ $self->{isBook} = 1;
+ }
+ if (($tagname eq 'a') && ($self->{isBook} == 1))
+ {
+ $self->{isUrl} = 1;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.mareno.pl".$attr->{href};
+ $self->{isUrl} = 0;
+ $self->{isTitle} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{class} eq 'bookAuthor') && ($self->{isBook} == 1))
+ {
+ $self->{isAuthor} = 1;
+ $self->{isFormat} = 1;
+ $self->{isPublisher} = 1;
+ $self->{isPublication} = 1;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgISBN'))
+ {
+ $self->{isISBN} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgPAGES'))
+ {
+ $self->{isPage} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgPUBLI'))
+ {
+ $self->{isPublisher} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgPDATE'))
+ {
+ $self->{isPublication} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgFORMAT'))
+ {
+ $self->{isFormat} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgDESCR'))
+ {
+ $self->{isDescription} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgTITLE'))
+ {
+ $self->{isTitle} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgAUTOR'))
+ {
+ $self->{isAuthor} = 2;
+ }
+ if ($tagname eq 'a')
+ {
+ if ($self->{isAuthor} eq '1')
+ {
+ $self->{isAuthor} = 2;
+ }
+ elsif ($self->{isAuthor} eq '2')
+ {
+ $self->{isAuthor} = 1;
+ }
+ }
+ if (($tagname eq 'a') && ($attr->{href} =~ /okladki\/big/))
+ {
+ $self->{isCover} = 1;
+ $self->{curInfo}->{cover} = "http://www.mareno.pl".$attr->{href};
+ $self->{isCover} = 0;
+ }
+ }
+ }
+
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ if ($tagname eq 'table')
+ {
+ $self->{isBook} = 0;
+ }
+ if ($tagname eq 'div')
+ {
+ $self->{isAuthor} = 0;
+ }
+
+ $self->{isFound} = 0;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isBook} == 7) #od razu mamy wynik?
+ {
+ $origtext =~ s|^\s*||gs;
+ $origtext =~ s|\s*$||gs;
+ if (($origtext ne '') && ($origtext !~ /wyszukiwanie/))
+ {
+ $self->{isUrl} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $searchURL;
+ $self->{isUrl} = 0;
+ }
+ $self->{isBook} = 0;
+ }
+ $origtext =~ s/^\s*//m;
+ $origtext =~ s/\s*$//m;
+ if ($self->{isAuthor} == 1)
+ {
+ my ($au, $fo, $pu, $pd);
+ $origtext =~ m|(#\^#- [^#]+#\^#)?(okładka\s*[^,]+,\s*)?([^,]+,\s*)?(\d*)?|s;
+ $au = $1;
+ $fo = $2;
+ $pu = $3;
+ $pd = $4;
+ $au =~ s|#\^#- ([^#]+)#\^#|$1|g;
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $au;
+ $self->{isAuthor} = 0;
+ $fo =~ s|okładka\s*([^,]+),\s*|$1|g;
+ $self->{itemsList}[$self->{itemIdx}]->{format} = $fo;
+ $self->{isFormat} = 0;
+ $pu =~ s|([^,]+),\s*|$1|g;
+ $self->{itemsList}[$self->{itemIdx}]->{publisher} = $pu;
+ $self->{isPublisher} = 0;
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $pd;
+ $self->{isPublication} = 0;
+ }
+ if ($self->{isTitle} == 1)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ }
+ else
+ {
+ $origtext =~ s/^\s*//m;
+ $origtext =~ s/\s*$//m;
+
+ if ($self->{isTitle} eq '1')
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ if ($self->{isAuthor} == 1)
+ {
+ $origtext =~ s|^\s*||;
+ $origtext =~ s|\s*$||;
+ if ($origtext ne '')
+ {
+ if ($self->{curInfo}->{authors} ne '')
+ {
+ $self->{curInfo}->{authors} .= ",";
+ }
+ $self->{curInfo}->{authors} .= $origtext;
+ }
+ $self->{isAuthor} = 2;
+ }
+ if ($self->{isFormat} == 1)
+ {
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormat} = 0;
+ }
+ if ($self->{isDescription} == 1)
+ {
+ $self->{curInfo}->{description} = $origtext;
+ $self->{isDescription} = 0;
+ }
+ if ($self->{isISBN} eq '1')
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0;
+ }
+ if ($self->{isPage} eq '1')
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0;
+ }
+ if ($self->{isPublisher} eq '1')
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0;
+ }
+ if ($self->{isPublication} eq '1')
+ {
+ $origtext =~ s|(\S*)\s*(\S{4})|$2|;
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 1,
+ edition => 0,
+ };
+
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isEditor_Publication_Format_Lang} = 0 ;
+ $self->{isAnalyse} = 0;
+ $self->{isFound} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isFormat} = 0;
+ $self->{isEdition} = 0;
+ $self->{isPage} = 0;
+ $self->{isLanguage} = 0;
+ $self->{isPublication} = 0;
+ $self->{isSerie} = 0;
+ $self->{isDescription} = 0;
+ $self->{isCover} = 0;
+ $self->{isTranslator} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+ $self->{insideResults} = 0;
+ $self->{actorsCounter} = 0;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s/<\/?(b|strong)>//gi;
+ $html =~ s|</?font[^>]*>||gi;
+ $html =~ s|<br>|#\^#|gi;
+ $html =~ s|<TABLE border="0">\s*<tr>\s*<td valign=top>\s*</td>|<table border="0" class="bookData">|gs;
+ $html =~ s|<td valign=top align=center><a href="[^"]*" class="left-menulink">\s*<IMG SRC[^>]*></a></td>||gs;
+ $html =~ s|<td valign=top align=left><A HREF([^>]*)>\s*|<a href$1>|gm;
+ $html =~ s|</a>&nbsp;\s*|</a>\n<div class="bookAuthor">|gm;
+ $html =~ s|</td></tr>|</div>|g;
+ }
+ else
+ {
+ $html =~ s/<\/?(i|br|strong)>//gi;
+
+ $html =~ s|<h1>([^<]*)</h1>|<div id="wrgTITLE">$1</div>|s;
+ $html =~ s|<h2><A(.*)</A></h2>|<div id="wrgAUTOR"><A$1</A></div>|s;
+ $html =~ s|<span class=textsmall>\s*ISBN:\s*([\dX]*)\s*</span>|<div id="wrgISBN">$1</div>|s;
+ $html =~ s|<span class=textsmall>\s*okładka:\s*([^,]*),?\s*(\d*)[^<]*</span>|<div id="wrgFORMAT">$1</div><div id="wrgPAGES">$2</div>|s;
+ $html =~ s|<span class=textsmall>\s*wydawnictwo:\s*([^,]*),\s*(\d*)\s*</span>|<div id="wrgPUBLI">$1</div><div id="wrgPDATE">$2</div>|s;
+ $html =~ s|opis produktu:\s*([^<]*)<hr>|<div id="wrgDESCR">$1</div><hr>|;
+# $html =~ s|<dt>Seria:</dt>$*\s*<dd>(.*)</dd>|<div id="wrgSERIA">$1</div>|;
+# $html =~ s|<dt>Wydanie:</dt><dd>(.*)</dd>|<div id="wrgEDITI">$1</div>|;
+# $html =~ s|<dt>Tłumaczenie:\s*</dt>$*\s*<dd>|<dd id="wrgTRANS">|;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ $searchURL = "http://www.mareno.pl/rezultat.php?tytul=".$word;
+ return $searchURL;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url;
+ return 'http://www.mareno.pl/';
+ }
+
+ sub getName
+ {
+ return "Mareno";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ #return "UTF-8";
+ return "ISO-8859-2";
+ }
+
+ sub getAuthor
+ {
+ return 'WG';
+ }
+
+ sub getLang
+ {
+ return 'PL';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCMediabooks.pm b/lib/gcstar/GCPlugins/GCbooks/GCMediabooks.pm
new file mode 100644
index 0000000..6b5f41b
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCMediabooks.pm
@@ -0,0 +1,333 @@
+package GCPlugins::GCbooks::GCMediabooks;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginMediabooks;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ use Encode;
+ use HTML::Entities;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'font') && ($attr->{class} eq 'font4Copy'))
+ {
+ $self->{isBook} = 1 ;
+ $self->{isUrl} = 1 ;
+ $self->{isDescription} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|/artigos/popUp_detalhe.jsp|i) && ($self->{isBook}) && ($self->{isUrl}))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ my $found = index($self->{itemsList}[$self->{itemIdx}]->{url},"'");
+ if ( $found >= 0 )
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = substr($self->{itemsList}[$self->{itemIdx}]->{url}, $found +length("'"),length($self->{itemsList}[$self->{itemIdx}]->{url})- $found -length("'"));
+ $found = index($self->{itemsList}[$self->{itemIdx}]->{url},"'");
+ if ( $found >= 0 )
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = substr($self->{itemsList}[$self->{itemIdx}]->{url}, 0, $found);
+ }
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.mediabooks.pt" .$self->{itemsList}[$self->{itemIdx}]->{url};
+ }
+
+ $self->{isTitle} = 1 ;
+ $self->{isUrl} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|/autores/index.jsp|i) && ($self->{isBook}))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|/editores/index.jsp|i) && ($self->{isBook}))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif (($tagname eq 'input') && ($attr->{type} eq 'hidden'))
+ {
+ $self->{isBook} = 0 ;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'a') && ($attr->{href} =~ m|/autores/index.jsp|i))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|/editores/index.jsp|i))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif ($self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif (($tagname eq 'span') && ($self->{isTitle}))
+ {
+ $self->{isTitle} = 2 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'font4Copy'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{src} =~ m|/artigos/imagens/|i))
+ {
+ if ($origtext =~ m|/artigos/imagens/livros|i)
+ {
+ }
+ else
+ {
+ $self->{curInfo}->{cover} = 'http://www.mediabooks.pt' .$attr->{src};
+ }
+
+ $self->{isTitle} = 1 ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{isFound} = 0 ;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor} eq 1)
+ {
+ # Enleve les retours chariots
+ $origtext =~ s/\n//g;
+ $origtext =~ s/\r//g;
+ if (($self->{itemsList}[$self->{itemIdx}]->{authors} eq '') && ($origtext ne ''))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
+ }
+ elsif ($origtext ne '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ', ';
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= $origtext;
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{isTitle} eq '2')
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor} eq 1)
+ {
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{authors} .= $origtext;
+ $self->{curInfo}->{authors} .= ",";
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isISBN} = 1 if ($origtext =~ m/ISBN/i);
+ $self->{isFormat} = 1 if ($origtext =~ m/Formato/i);
+ $self->{isDescription} = 1 if ($origtext =~ m/Breve Descri/i);
+ $self->{isPublication} = 1 if ($origtext =~ m/Ano de Edi/i);
+ $self->{isPage} = 1 if ($origtext =~ m/P.ginas/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isFormat})
+ {
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormat} = 0 ;
+ }
+ elsif ($self->{isPublication})
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0 ;
+ }
+ elsif ($self->{isPage})
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0 ;
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 1,
+ };
+
+ $self->{isFound} = 0;
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isFormatPublication} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isPublication} = 0;
+ $self->{isFormat} = 0;
+ $self->{isPage} = 0;
+ $self->{isDescription} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s|\n||gi;
+ $html =~ s|\r||gi;
+ $html =~ s|\t||gi;
+
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|</h4>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+ return ('http://www.mediabooks.pt/pesquisa/result_pesq.jsp', ["v_sec_id" => "1", "v_prev_sec_id" => "", "v_pes_id" => "2", "v_pesquisa" => "$word", "image.x" => "5", "image.y" => "7"] );
+ }
+ else
+ {
+ return ('http://www.mediabooks.pt/pesquisa/result_pesq.jsp', ["v_sec_id" => "1", "v_prev_sec_id" => "", "v_pes_id" => "1", "v_pesquisa" => "$word", "image.x" => "5", "image.y" => "7"] );
+ }
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.mediabooks.pt/';
+ }
+
+ sub getName
+ {
+ return "Mediabooks";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'PT';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCMerlin.pm b/lib/gcstar/GCPlugins/GCbooks/GCMerlin.pm
new file mode 100644
index 0000000..5c5129a
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCMerlin.pm
@@ -0,0 +1,389 @@
+package GCPlugins::GCbooks::GCbooksMerlin;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginMerlin;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'li') && ($attr->{class} eq 'tytul'))
+ {
+ $self->{isBook} = 1;
+ $self->{isUrl} = 1;
+ $self->{itemIdx}++;
+ }
+ if (($tagname eq 'li') && ($attr->{class} eq 'wydawca'))
+ {
+ $self->{isPublisher} = 1;
+ }
+ if (($tagname eq 'a')
+ && ($self->{isUrl} eq '1'))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.merlin.com.pl".$attr->{href};
+ $self->{isUrl} = 0;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgISBN'))
+ {
+ $self->{isISBN} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgPAGES'))
+ {
+ $self->{isPage} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgPUBLI'))
+ {
+ $self->{isPublisher} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgPDATE'))
+ {
+ $self->{isPublication} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgSERIA'))
+ {
+ $self->{isSerie} = 2;
+ }
+ if (($tagname eq 'a') && ($self->{isSerie} eq '2'))
+ {
+ $self->{isSerie} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgEDITI'))
+ {
+ $self->{isEdition} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'prodHead'))
+ {
+ $self->{isCover} = 2;
+ $self->{isTitle} = 2;
+ $self->{isFormat} = 2;
+ }
+ if (($tagname eq 'h1') && ($attr->{class} eq 'prodTitle') && ($self->{isTitle} eq '2'))
+ {
+ $self->{isTitle} = 1;
+ }
+ if (($tagname eq 'h2') && ($attr->{class} eq 'prodPerson'))
+ {
+ $self->{isAuthor} = 2;
+ }
+ if ($tagname eq 'a')
+ {
+ if ($self->{isAuthor} eq '1')
+ {
+ $self->{isAuthor} = 2;
+ }
+ elsif ($self->{isAuthor} eq '2')
+ {
+ $self->{isAuthor} = 1;
+ }
+ }
+ if (($tagname eq 'dd') && ($attr->{id} eq 'wrgTRANS'))
+ {
+ $self->{isTranslator} = 2;
+ }
+ if ($tagname eq 'a')
+ {
+ if ($self->{isTranslator} eq '1')
+ {
+ $self->{isTranslator} = 2;
+ }
+ elsif ($self->{isTranslator} eq '2')
+ {
+ $self->{isTranslator} = 1;
+ }
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'prodImg') && ($self->{isCover} eq '2'))
+ {
+ $self->{isCover} = 1;
+ }
+ if (($tagname eq 'img') && ($self->{isCover} eq '1'))
+ {
+ $self->{curInfo}->{cover} = "http://www.merlin.com.pl".$attr->{src};
+ $self->{isCover} = 0;
+ }
+ if (($tagname eq 'div') && ($attr->{class} eq 'prodFeatureSpec') && ($self->{isFormat} eq '2'))
+ {
+ $self->{isFormat} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{class} eq 'productDesc'))
+ {
+ $self->{isDescription} = 1;
+ }
+ }
+ }
+
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ if ($tagname eq 'h2')
+ {
+ $self->{isAuthor} = 0;
+ }
+ if ($tagname eq 'dd')
+ {
+ $self->{isTranslator} = 0;
+ }
+
+ $self->{isFound} = 0;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isBook} eq '1')
+ {
+ $origtext =~ s/^\s*//m;
+ $origtext =~ s/\s*$//m;
+ $self->{isBook} = 0;
+ if ($self->{inside}->{a})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isBook} = 1;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
+ }
+ }
+ if ($self->{isPublisher} eq '1')
+ {
+ $origtext =~ s/^\s*//m;
+ $origtext =~ s/\s*$//m;
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublisher} = 0;
+ }
+
+ }
+ else
+ {
+ $origtext =~ s/^\s*//m;
+ $origtext =~ s/\s*$//m;
+
+ if ($self->{isTitle} eq '1')
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ if ($self->{isAuthor} eq '1')
+ {
+ $origtext =~ s|^\s*||;
+ $origtext =~ s|\s*$||;
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{authors} .= $origtext;
+ }
+ $self->{isAuthor} = 2;
+ }
+ if ($self->{isTranslator} eq '1')
+ {
+ $origtext =~ s|^\s*||;
+ $origtext =~ s|\s*$||;
+ if ($self->{curInfo}->{translator} eq '')
+ {
+ $self->{curInfo}->{translator} = $origtext;
+ }
+ else
+ {
+ $self->{curInfo}->{translator} .= ", ".$origtext;
+ }
+ $self->{isTranslator} = 2;
+ }
+ if ($self->{isFormat} eq '1')
+ {
+ $origtext =~ s|okładka: ||m;
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormat} = 0;
+ }
+ if ($self->{isDescription} eq '1')
+ {
+ $self->{curInfo}->{description} = $origtext;
+ $self->{isDescription} = 0;
+ }
+
+ if ($self->{isISBN} eq '1')
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0;
+ }
+ if ($self->{isPage} eq '1')
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0;
+ }
+ if ($self->{isEdition} eq '1')
+ {
+ $self->{curInfo}->{edition} = $origtext;
+ $self->{isEdition} = 0;
+ }
+ if ($self->{isPublisher} eq '1')
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0;
+ }
+ if ($self->{isPublication} eq '1')
+ {
+ $origtext =~ s|(\S*)\s*(\S{4})|$2|;
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0;
+ }
+ if ($self->{isSerie} eq '1')
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isSerie} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 1,
+ };
+
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isEditor_Publication_Format_Lang} = 0 ;
+ $self->{isAnalyse} = 0;
+ $self->{isFound} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isFormat} = 0;
+ $self->{isEdition} = 0;
+ $self->{isPage} = 0;
+ $self->{isLanguage} = 0;
+ $self->{isPublication} = 0;
+ $self->{isSerie} = 0;
+ $self->{isDescription} = 0;
+ $self->{isCover} = 0;
+ $self->{isTranslator} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+ $self->{insideResults} = 0;
+ $self->{actorsCounter} = 0;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<b>(.*?)</b>|$1|gms;
+ $html =~ s|<li class="tytul">(.*)</li>\s*<li>|<li class="tytul">$1</li><li class="wydawca">|gm;
+ }
+ else
+ {
+ $html =~ s|</?strong>||gi;
+ $html =~ s|</?i>||gi;
+ $html =~ s|</?br>||gi;
+ $html =~ s|<dfn>(.*?)</dfn>||gs;
+
+ $html =~ s|<dt>ISBN:</dt><dd>(.*)</dd>|<div id="wrgISBN">$1</div>|;
+ $html =~ s|<dt>Liczba stron:</dt><dd>(.*)</dd>|<div id="wrgPAGES">$1</div>|;
+ $html =~ s|<dt>Seria:</dt>\s*<dd>(.*)</dd>|<div id="wrgSERIA">$1</div>|m;
+ $html =~ s|<dt>Wydanie:</dt><dd>(.*)</dd>|<div id="wrgEDITI">$1</div>|;
+ $html =~ s|<dt>Wydawnictwo:</dt>\s*<dd>\s*(.*)\s*,*\s*(.*)\s*</dd>|<div id="wrgPUBLI">$1</div><div id="wrgPDATE">$2</div>|m;
+ $html =~ s|<dt>Tłumaczenie:\s*</dt>\s*<dd>|<dd id="wrgTRANS">|m;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://www.merlin.com.pl/frontend/browse/search/1.html?phrase=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url;
+ return 'http://www.merlin.com.pl/';
+ }
+
+ sub getName
+ {
+ return "Merlin";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ #return "UTF-8";
+ return "ISO-8859-2";
+ }
+
+ sub getAuthor
+ {
+ return 'WG';
+ }
+
+ sub getLang
+ {
+ return 'PL';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCNUKat.pm b/lib/gcstar/GCPlugins/GCbooks/GCNUKat.pm
new file mode 100644
index 0000000..6bc22eb
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCNUKat.pm
@@ -0,0 +1,447 @@
+package GCPlugins::GCbooks::GCbooksNUKat;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+my $searchURL = "";
+my $searchISBN = "";
+
+{
+ package GCPlugins::GCbooks::GCPluginNUKat;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'title') #od razu mamy wynik
+ {
+ $self->{isBook} = 7;
+ }
+
+ if (($tagname eq 'tr') && ($attr->{class} eq 'intrRow'))
+ {
+ $self->{isBook} = 1;
+ $self->{itemIdx}++;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'intrRowCell1') && ($self->{isBook} == 1))
+ {
+ $self->{isUrl} = 2;
+ }
+ if (($tagname eq 'a') && ($self->{isUrl} == 2) && ($origtext =~ /.*function=CARDSCR.*/))
+ {
+ $self->{isUrl} = 1;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{itemsList}[$self->{itemIdx}]->{url} =~ s|skin=portal&||;
+ $self->{isUrl} = 0;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'intrAutor') && ($self->{isBook} == 1))
+ {
+ $self->{isAuthor} = 1;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'intrTytul') && ($self->{isBook} == 1))
+ {
+ $self->{isTitle} = 1;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'intrWydaw') && ($self->{isBook} == 1))
+ {
+ $self->{isPublication} = 1;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'td') && ($attr->{class} eq 'wrgTITLE'))
+ {
+ $self->{isTitle} = 1;
+ $self->{isAuthor} = 1;
+ $self->{isTranslator} = 1;
+ $self->{isArtist} = 1;
+ $self->{isISBN} = 2;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'wrgPAGES'))
+ {
+ $self->{isPage} = 1;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'wrgSERIA'))
+ {
+ $self->{isSerie} = 1;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'wrgPUBLI'))
+ {
+ $self->{isPublisher} = 1;
+ $self->{isPublication} = 1;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'wrgEDITI'))
+ {
+ $self->{isEdition} = 1;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'wrgISBN') && ($self->{isISBN} == 2))
+ {
+ $self->{isISBN} = 1;
+ }
+
+ if (($tagname eq 'div') && ($attr->{class} eq 'prodFeatureSpec') && ($self->{isFormat} eq '2'))
+ {
+ $self->{isFormat} = 1;
+ }
+ }
+ }
+
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{isFound} = 0;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isBook} == 7) #od razu mamy wynik?
+ {
+ if ($origtext =~ /Pełny opis/)
+ {
+ $self->{isUrl} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $searchURL;
+ $self->{isUrl} = 0;
+ $self->{isBook} = 0;
+ }
+ }
+ if ($self->{isBook} == 1)
+ {
+ $origtext =~ s/^\s*//m;
+ $origtext =~ s/\s*$//m;
+ if ($self->{isTitle} == 1)
+ {
+ $origtext =~ s|^\s*([^/]*)/?|$1|m;
+ $origtext =~ s|^\s*([^:]*):?|$1|m;
+ $origtext =~ s|\s*$||m;
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ if ($self->{isAuthor} == 1)
+ {
+ $origtext =~ s|\s*\/\s*(.*)\s*|$1|;
+ $origtext =~ s|^\s*([^\.]*)\.?|$1|m;
+ $origtext =~ s|([^\(]*)(\([^\)]*\))?|$1|;
+ $origtext =~ s|\s*$||m;
+ $origtext =~ s|([^,]*), (.*)|$2 $1|m;
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
+ $self->{isAuthor} = 0;
+ }
+ if ($self->{isPublication} == 1)
+ {
+ $origtext =~ s|(.*)(\d{4})\D*|$2|s;
+ $origtext =~ s|^\s*([^\.]*)\.?|$1|m;
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublication} = 0;
+ $self->{isBook} = 0;
+ }
+ }
+
+ }
+ else
+ {
+ $origtext =~ s/^\s*//m;
+ $origtext =~ s/\s*$//m;
+
+ if ($self->{isFormat} eq '1')
+ {
+ $origtext =~ s|okładka: ||m;
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormat} = 0;
+ }
+
+
+
+ if ($self->{isISBN} eq '1')
+ {
+ my ($pom1, $pom2);
+ if ($self->{searchField} eq 'isbn')
+ {
+ $pom1 = $self->{searchISBN};
+ $pom2 = $origtext;
+ $pom2 =~ s|[^\dX]||g;
+ $pom1 =~ s|-||g;
+ $pom2 =~ s|-||g;
+ if ($pom1 eq $pom2)
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0;
+ }
+ else
+ {
+ $self->{isISBN} = 2;
+ }
+ }
+ else
+ {
+ $origtext =~ s|[^\dX]||g;
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0;
+ }
+ }
+ if ($self->{isTitle} eq '1')
+ {
+ my ($pom1, $pom2, $ti, $au, $tr, $il);
+ $origtext =~ m|([^/]*)/\s*([^;]*)(; )?([^;]*)(; )?([^;]*)$|;
+ $ti = $1;
+ $au = $2;
+ $pom1 = $4;
+ $pom2 = $6;
+ $ti =~ s|^\s*||;
+ $ti =~ s|\s*$||;
+ $self->{curInfo}->{title} = $ti;
+ $self->{isTitle} = 0;
+ $au =~ s| i |,|g;
+ $au =~ s|, |,|g;
+ $au =~ s|[\[\]]||g;
+ $au =~ s|tekst||g;
+ $au =~ s|^\s*||;
+ $au =~ s|\s*$||;
+ $au =~ s|(.*)(\.{1})|$1|;
+ $self->{curInfo}->{authors} = $au;
+ $self->{isAuthor} = 0;
+ $pom1 =~ s|[\[\]]||g;
+ $pom1 =~ m|(.*)(.{1})|;
+ if ($2 eq '.')
+ {
+ $pom1 = $1;
+ }
+ $pom2 =~ s|[\[\]]||g;
+ $pom2 =~ m|(.*)(.{1})|;
+ if ($2 eq '.')
+ {
+ $pom2 = $1;
+ }
+ if ($pom2 =~ /(przeł\.|przekł\.|tł\.|tłum\.)/)
+ {
+ $tr = $pom2;
+ }
+ if ($pom2 =~ /(il\.|oprac\. graf\.)/)
+ {
+ $il = $pom2;
+ }
+ if ($pom1 =~ /(przeł\.|przekł\.|tł\.|tłum\.)/)
+ {
+ $tr = $pom1;
+ }
+ if ($pom1 =~ /(il\.|oprac\. graf\.)/)
+ {
+ $il = $pom1;
+ }
+ $tr =~ s/(przeł\.|przekł\.|tł\.|tłum\.)//;
+ $tr =~ s|z \w+\.||;
+ $tr =~ s|^\s*||;
+ $tr =~ s|\s*$||;
+ $tr =~ s| i |,|g;
+ $tr =~ s|, |,|g;
+ $self->{curInfo}->{translator} = $tr;
+ $self->{isTranslator} = 0;
+ $il =~ s/(il\.|oprac\. graf\.)//;
+ $il =~ s|^\s*||;
+ $il =~ s|\s*$||;
+ $il =~ s| i |,|g;
+ $il =~ s|, |,|g;
+ $self->{curInfo}->{artist} = $il;
+ $self->{isArtist} = 0;
+ }
+ if ($self->{isPage} eq '1')
+ {
+ $origtext =~ s|(\d*)\D.*|$1|;
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0;
+ }
+ if ($self->{isEdition} eq '1')
+ {
+ $origtext =~ s|\D*(\d*)\D.*|$1|;
+ $self->{curInfo}->{edition} = $origtext;
+ $self->{isEdition} = 0;
+ }
+ if ($self->{isPublisher} eq '1')
+ {
+ my $pom = $origtext;
+ $origtext =~ s|[^:]*:\s*(.*),.*|$1|;
+ $origtext =~ s|^\s*||;
+ $origtext =~ s|"(.*)"|$1|;
+ $self->{curInfo}->{publisher} = $origtext;
+ $pom =~ s|(.*)(\d{4})(\D*)|$2|;
+ $self->{curInfo}->{publication} = $pom;
+ $self->{isPublisher} = 0;
+ $self->{isPublication} = 0;
+ }
+ if ($self->{isSerie} eq '1')
+ {
+ $origtext =~ s|([^;]*)(;.*)|$1|;
+ $origtext =~ s|\s*$||;
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isSerie} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 1,
+ };
+
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isEditor_Publication_Format_Lang} = 0 ;
+ $self->{isAnalyse} = 0;
+ $self->{isFound} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isFormat} = 0;
+ $self->{isEdition} = 0;
+ $self->{isPage} = 0;
+ $self->{isLanguage} = 0;
+ $self->{isPublication} = 0;
+ $self->{isSerie} = 0;
+ $self->{isDescription} = 0;
+ $self->{isCover} = 0;
+ $self->{isTranslator} = 0;
+ $self->{isArtist} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+ $self->{insideResults} = 0;
+ $self->{actorsCounter} = 0;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<b>(.*?)</b>|$1|gms;
+ $html =~ s|<img .*/book.gif">||g;
+ $html =~ s|<font.*</font>||g;
+ $html =~ s|<span class="highlight[^>]+>||g;
+ $html =~ s|</?span[^>]*>||g;
+ $html =~ s|<th[^>]*>Autor</th>\s*<td><a[^>]*>([^<]*)</a>|<td class="intrAutor">$1|gs;
+ $html =~ s|<th[^>]*>Tytuł</th>\s*<td><a[^>]*>([^<]*)</a>|<td class="intrTytul">$1|gs;
+ $html =~ s|<th[^>]*>Adres wyd.</th>\s*<td>|<td class="intrWydaw">|gs;
+ }
+ else
+ {
+ $html =~ s|</?strong>||gi;
+ $html =~ s|</?i>||gi;
+ $html =~ s|</?br>||gi;
+
+ $html =~ s|<th[^>]*>Tytuł</th>\s*<td>\s*<a[^>]*>([^<]*)</a>|<td class="wrgTITLE">$1|gs;
+ $html =~ s|<th[^>]*>Strefa serii</th>\s*<td>\s*<a[^>]*>([^<]*)</a>|<td class="wrgSERIA">$1|gs;
+ $html =~ s|<th[^>]*>Adres wydawniczy</th>\s*<td>|<td class="wrgPUBLI">|gs;
+ $html =~ s|<th[^>]*>Opis fizyczny</th>\s*<td>|<td class="wrgPAGES">|gs;
+ $html =~ s|<th[^>]*>Oznaczenie wydania</th>\s*<td>|<td class="wrgEDITI">|gs;
+ $html =~ s|<th[^>]*>ISBN</th>\s*<td>|<td class="wrgISBN">|gs;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ my $bubu;
+ if ($self->{searchField} eq 'isbn')
+ {
+ $bubu = "7";
+ $self->{searchISBN} = $word;
+ }
+ else
+ {
+ $bubu = "4";
+ $self->{searchISBN} = "";
+ }
+ $searchURL = "http://www.nukat.edu.pl/cgi-bin/gw_43_3/chameleon?host=193.0.118.2%2b1111%2bDEFAULT&search=KEYWORD&function=INITREQ&conf=.%2fchameleon.conf&lng=pl&u1=".$bubu."&t1=".$word;
+ return $searchURL;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url;
+ return 'http://www.nukat.edu.pl/';
+ }
+
+ sub getName
+ {
+ return "NUKat";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "UTF-8";
+ #return "ISO-8859-2";
+ }
+
+ sub getAuthor
+ {
+ return 'WG';
+ }
+
+ sub getLang
+ {
+ return 'PL';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCNooSFere.pm b/lib/gcstar/GCPlugins/GCbooks/GCNooSFere.pm
new file mode 100644
index 0000000..c878af9
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCNooSFere.pm
@@ -0,0 +1,462 @@
+package GCPlugins::GCbooks::GCNooSFere;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginNooSFere;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ return if ( $self->{isFound} eq 2 );
+ if (($tagname eq 'td') && ($attr->{class} eq 'onglet_bleu'))
+ {
+ $self->{isFound} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m/editionslivre.asp\?numitem=/i) && !($attr->{href} =~ m/numediteur=/i) && !($attr->{href} =~ m/tri=/i))
+ {
+ $self->{isTitle} = 1 ;
+ $self->{isAuthor} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|/icarus/livres/auteur.asp\?NumAuteur=|i) && ($self->{isAuthor} eq 0))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|./editeur.asp\?numediteur=|i))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|./serie.asp\?NumSerie=|i))
+ {
+ $self->{isSerie} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m/editionslivre.asp\?numitem=/i) && ($attr->{href} =~ m/numediteur=/i))
+ {
+
+ my $html = $self->loadPage( "http://www.noosfere.org/icarus/livres/" . $attr->{href}, 0, 1 );
+ my $found = index($html,"Fiche livre&nbsp;: les &eacute;ditions");
+ if ( $found >= 0 )
+ {
+
+ while (index($html,"./niourf.asp?numlivre="))
+ {
+ $found = index($html,"./niourf.asp?numlivre=");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('./niourf.asp?numlivre='),length($html)- $found -length('./niourf.asp?numlivre='));
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $self->{saveTitle};
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $self->{saveAuthor};
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.noosfere.org/icarus/livres/niourf.asp?numlivre=" . substr($html, 0, index($html,"\""));
+ }
+ else
+ {
+ last;
+ }
+
+ }
+ }
+ else
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $self->{saveTitle};
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $self->{saveAuthor};
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.noosfere.org/icarus/livres/" . $attr->{href};
+ }
+ }
+ elsif ($tagname eq 'h1')
+ {
+ $self->{isTitle} = 1 ;
+ $self->{isAuthor} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|./niourf.asp\?numlivre=|i))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $self->{saveTitle};
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $self->{saveAuthor};
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.noosfere.org/icarus/livres/" . $attr->{href};
+ }
+ elsif (($tagname eq 'td') && ($attr->{class} eq 'onglet_biblio1'))
+ {
+ $self->{isAuthor} = 2 ;
+ }
+ elsif (($tagname eq 'table') && ($attr->{class} eq 'piedpage'))
+ {
+ $self->{isAuthor} = 0 ;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'mytpf') && ($attr->{id} eq 'TPFENDCOMMENTTPF'))
+ {
+ $self->{isDescription} = 0 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{class} eq 'TitreNiourf'))
+ {
+ $self->{isAnalyse} = 0 ;
+ $self->{isTitle} = 1 ;
+ $self->{isAuthor} = 0 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{class} eq 'AuteurNiourf'))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|/icarus/livres/auteur.asp\?NumAuteur=|i) && ($self->{isAuthor} eq 1))
+ {
+ $self->{isAuthor} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|actu_mois.asp\?|i))
+ {
+ $self->{isPublication} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|editeur.asp\?numediteur=|i) && ($self->{curInfo}->{publisher} eq ''))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|collection.asp\?NumCollection=|i) && ($self->{curInfo}->{serie} eq ''))
+ {
+ $self->{isSerie} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|/icarus/livres/auteur.asp\?NumAuteur=|i) && ($self->{isTranslator} eq 1))
+ {
+ $self->{isTranslator} = 2 ;
+ }
+ elsif ($tagname eq 'br')
+ {
+ $self->{isAnalyseTrans} = 1 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{style} eq 'font-size:12px;') && ($self->{isAnalyse} eq 0))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{name} eq 'couverture'))
+ {
+ $self->{curInfo}->{cover} = "http://www.noosfere.org/icarus/livres/" . $attr->{src} ;
+ }
+ elsif (($tagname eq 'mytpf') && ($attr->{id} eq 'TPFSTARTCOMMENTTPF'))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{isFound} = 0 ;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ $self->{saveTitle} = $origtext;
+ $self->{saveAuthor} = '';
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor} eq 1)
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if (($self->{saveAuthor} eq '') && ($origtext ne ''))
+ {
+ $self->{saveAuthor} = $origtext;
+ }
+ elsif ($origtext ne '')
+ {
+ $self->{saveAuthor} .= ', ';
+ $self->{saveAuthor} .= $origtext;
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isSerie})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{serie} = $origtext;
+ $self->{isSerie} = 0 ;
+ }
+ elsif ($self->{isFound} eq 1)
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($origtext eq 'Fiche livre')
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{loadedUrl};
+ $self->{isFound} = 2 ;
+ }
+ else
+ {
+ $self->{isFound} = 0 ;
+ }
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{isTitle} eq '1')
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAnalyse} eq 1)
+ {
+ my $found = index($origtext," pages");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{pages} = substr($origtext, 0, $found);
+ }
+ $found = index($origtext,"ISBN : ");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{isbn} = substr($origtext, $found +length('ISBN : '),length($origtext)- $found -length('ISBN : '));
+ }
+
+ $self->{isAnalyse} = 2 ;
+ }
+ elsif ($self->{isAnalyseTrans})
+ {
+ $self->{isTranslator} = 1 if ($origtext =~ m/Traduction/i);
+
+ $self->{isAnalyseTrans} = 0 ;
+ }
+ elsif ($self->{isAuthor} eq 2)
+ {
+ if (($self->{curInfo}->{authors} eq '') && ($origtext ne ''))
+ {
+ $self->{curInfo}->{authors} = $origtext;
+ }
+ elsif ($origtext ne '')
+ {
+ $self->{curInfo}->{authors} .= ', ';
+ $self->{curInfo}->{authors} .= $origtext;
+ }
+ $self->{isAuthor} = 1 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isSerie})
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isSerie} = 0 ;
+ }
+ elsif ($self->{isPublication})
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0 ;
+ }
+ elsif ($self->{isTranslator} eq 2)
+ {
+ $self->{curInfo}->{translator} = $origtext;
+ $self->{isTranslator} = 0 ;
+ }
+ elsif ($self->{isDescription})
+ {
+ if ($origtext =~ m/Pas de texte sur la quatri.me de couverture\./i)
+ {
+ }
+ else
+ {
+ $self->{curInfo}->{description} .= $origtext ."\n";
+ }
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 1,
+ serie => 1,
+ };
+
+ $self->{saveTitle} = '';
+ $self->{saveAuthor} = '';
+ $self->{isFound} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isPublication} = 0;
+ $self->{isSerie} = 0;
+ $self->{isDescription} = 0;
+ $self->{isTranslator} = 0;
+ $self->{isAnalyseTrans} = 0;
+ $self->{isAnalyse} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ # Le descriptif pouvant contenir des balises html je le repere maintenant
+ my $found = index($html,"Id=\"R");
+ if ( $found >= 0 )
+ {
+ my $html2 = substr($html, $found +length('Id="R'),length($html)- $found -length('Id="R'));
+ my $found2 = index($html2,"<TD class=\"noocell_fs15\" valign=\"top\">");
+ if ( $found2 >= 0 )
+ {
+ $html2 = substr($html2, $found2 +length('<TD class="noocell_fs15" valign="top">'),length($html2)- $found2 -length('<TD class="noocell_fs15" valign="top">'));
+ }
+
+ $found2 = index($html2,"</TD>");
+ if ( $found2 >= 0 )
+ {
+ $html2 = substr($html2, 0, $found2);
+ }
+
+ $html2 =~ s|<li>|\n* |gi;
+ $html2 =~ s|<br>|\n|gi;
+ $html2 =~ s|<br />|\n|gi;
+ $html2 =~ s|<b>||gi;
+ $html2 =~ s|</b>||gi;
+ $html2 =~ s|<i>||gi;
+ $html2 =~ s|</i>||gi;
+ $html2 =~ s|<p>|\n|gi;
+ $html2 =~ s|</p>||gi;
+ $html2 =~ s|</h4>||gi;
+ $html2 =~ s|\x{92}|'|g;
+ $html2 =~ s|&#146;|'|gi;
+ $html2 =~ s|&#149;|*|gi;
+ $html2 =~ s|&#156;|oe|gi;
+ $html2 =~ s|&#133;|...|gi;
+ $html2 =~ s|\x{85}|...|gi;
+ $html2 =~ s|\x{8C}|OE|gi;
+ $html2 =~ s|\x{9C}|oe|gi;
+
+ $html = substr($html, 0, $found) . "><mytpf id=\"TPFSTARTCOMMENTTPF\">" . $html2 ."</mytpf><mytpf id=\"TPFENDCOMMENTTPF\"></mytpf>";
+
+ }
+
+ $html =~ s|<b><p>||gmi;
+ $html =~ s|<br><br>|<br>|gmi;
+ $html =~ s|<br><|<|gmi;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+ return "http://www.noosfere.org/icarus/livres/cyborg_livre.asp?mini=1000&maxi=3000&mode=Idem&EtOuParution=NS&isbn=". $word;
+ }
+ else
+ {
+ return "http://www.noosfere.org/icarus/livres/cyborg_livre.asp?mini=1000&maxi=3000&mode=Idem&EtOuParution=NS&titre=". $word;
+ }
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.noosfere.org/';
+ }
+
+ sub getName
+ {
+ return "nooSFere";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-15";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCSaraiva.pm b/lib/gcstar/GCPlugins/GCbooks/GCSaraiva.pm
new file mode 100644
index 0000000..54dd119
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCSaraiva.pm
@@ -0,0 +1,303 @@
+package GCPlugins::GCbooks::GCSaraiva;
+
+###################################################
+#
+# Plugin for a brazilian bookstore named "Saraiva".
+# Code written by Guilherme "nirev" Nogueira.
+# guilherme at nirev dot org
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginSaraiva;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'div') && ($attr->{class} eq 'hsliceLista'))
+ {
+ $self->{isResult} = 1;
+ $self->{linkCount} = 0;
+ $self->{itemIdx}++;
+ }
+ if (($tagname eq 'span') && ($attr->{class} eq 'entry-title'))
+ {
+ $self->{isTitle} = 1;
+ }
+ if (($tagname eq 'h2') && ($attr->{class} eq 'titulo_autor'))
+ {
+ $self->{isAuthor} = 1;
+ }
+ if (($tagname eq 'a') && $self->{isResult} && $self->{linkCount} == 0 )
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{linkCount}++;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'entry-content'))
+ {
+ $self->{isResult} = 0;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'img') && ($attr->{id} eq 'imgProd'))
+ {
+ my $imgid = $attr->{src};
+ $imgid =~ s/(.)*pro_id=//;
+ $imgid =~ s/&.*$//;
+ $self->{curInfo}->{cover} = 'http://www.livrariasaraiva.com.br/imagem/imagem.dll?tam=2&pro_id='.$imgid;
+ }
+ elsif (($tagname eq 'div') && ($attr->{id} eq 'aba1'))
+ {
+ $self->{isDescription} = 1;
+ }
+ elsif (($tagname eq 'div') && ($attr->{id} eq 'aba2'))
+ {
+ $self->{divInfo} = 1;
+ }
+ elsif (($tagname eq 'div') && ($attr->{id} eq 'produtosAbasMenus'))
+ {
+ $self->{divInfo} = 0;
+ }
+ elsif (($tagname eq 'div') && ($attr->{id} eq 'tituloprod'))
+ {
+ $self->{isTitle} = 1;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} eq 'javascript:PesquisaAutor();'))
+ {
+ $self->{isAuthor} = 1;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} eq 'javascript:PesquisaMarca();'))
+ {
+ $self->{isPublisher} = 1;
+ }
+ elsif (($tagname eq 'font'))
+ {
+ $self->{isAnalyse} = 1;
+ }
+ elsif (($tagname eq 'b') && $self->{divInfo} == 1)
+ {
+ $self->{isAnalyse} = 1;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ my $texto = $origtext;
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $texto;
+ $self->{isTitle} = 0;
+ }
+ if ($self->{isAuthor})
+ {
+ my $texto = $origtext;
+ $texto =~ s/<br>//;
+ my @dados = split(' / ', $texto);
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $dados[0];
+ $self->{isAuthor} = 0;
+ }
+ }
+ else
+ {
+ if ($self->{isAuthor})
+ {
+ my @authors = split(';', $origtext);
+ my $authors = '';
+ my $tam = @authors;
+ my $count = 0;
+ for($count = 0; $count < $tam; $count++)
+ {
+ $authors[$count] =~ s/^\s*//gi;
+ $authors[$count] =~ s/\s*$//gi;
+ my @names = split(', ', $authors[$count]);
+ $authors .= ',' if ($count);
+ $authors .= $names[1].' '.$names[0];
+
+ }
+ $self->{curInfo}->{authors} = $authors;
+ $self->{isAuthor} = 0;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0;
+ }
+ elsif ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} = $origtext;
+ $self->{curInfo}->{description} =~ s/^\s*//;
+ $self->{curInfo}->{description} =~ s/\s+/ /;
+ $self->{isDescription} = 0;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isISBN} = 1 if ($origtext =~ m/I\.S\.B\.N/i);
+ $self->{isFormat} = 1 if ($origtext =~ m/Acabamento/i);
+ $self->{isPublication} = 1 if ($origtext =~ m/Edição/i);
+ $self->{isPage} = 1 if ($origtext =~ m/Número de Paginas/i);
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isISBN})
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0;
+ }
+ elsif ($self->{isFormat})
+ {
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormat} = 0;
+ }
+ elsif ($self->{isPublication})
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0;
+ }
+ elsif ($self->{isPage})
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 0,
+ serie => 0,
+ };
+
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isAnalyse} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isPublication} = 0;
+ $self->{isPage} = 0;
+ $self->{isISBN} = 0;
+ $self->{isFormat} = 0;
+ $self->{isDescription} = 0;
+ $self->{isResult} = 0;
+ $self->{linkCount} = 0;
+ $self->{divInfo} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ my $inicio_res = index($html,'<div id="esquerdaPesquisa" style="display:none;">esquerdaPesquisa</div>');
+ if ( $inicio_res >= 0 )
+ {
+ $html = substr($html, $inicio_res);
+ }
+ my $fim_res = index($html,'<div id="direitaPesquisa" style="display:none;">direitaPesquisa</div>');
+ if ( $fim_res >= 0 )
+ {
+ $html = substr($html, 0, $fim_res);
+ }
+ $html = '' if ($inicio_res < 0);
+ }
+ else
+ {
+
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ $word =~ s|\s+|\+|;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+ return "http://www.livrariasaraiva.com.br/pesquisaweb/pesquisaweb.dll/pesquisa?ORDEMN2=E&ESTRUTN1=0301&PALAVRASN1=".$word;
+ }
+ else
+ {
+ return "http://www.livrariasaraiva.com.br/pesquisaweb/pesquisaweb.dll/pesquisa?ORDEMN2=E&ESTRUTN1=0301&PALAVRASN1=".$word;
+ }
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.livrariasaraiva.com.br".$url;
+ }
+
+ sub getName
+ {
+ return "Saraiva";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-1";
+ }
+
+ sub getAuthor
+ {
+ return 'nirev';
+ }
+
+ sub getLang
+ {
+ return 'PT';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCbooksAdlibrisCommon.pm b/lib/gcstar/GCPlugins/GCbooks/GCbooksAdlibrisCommon.pm
new file mode 100644
index 0000000..ee556dc
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCbooksAdlibrisCommon.pm
@@ -0,0 +1,331 @@
+package GCPlugins::GCbooks::GCbooksAdlibrisCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCbooksAdlibrisPluginsBase;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ( (($tagname eq 'div') && ($attr->{class} eq 'productTitleFormat'))
+ || (($tagname eq 'a') && ($attr->{id} eq 'ctl00_main_frame_ctrlproduct_linkProductTitle'))
+ )
+ {
+ $self->{isFound} = 1 ;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{loadedUrl};
+ }
+ elsif (($tagname eq 'a') && ($attr->{id} =~ m/_hlkTitle/i) && ($self->{isFound} eq '0'))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.adlibris.com/" . $self->{isLang} . "/" . $attr->{href};
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{id} =~ m/ctl00_main_frame_ctrlsearchhit_rptSearchHit_ctl/i) && ($attr->{id} =~ m/_Label2/i) && ($self->{isFound} eq '0'))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{id} =~ m/ctl00_main_frame_ctrlsearchhit_rptSearchHit_ctl/i) && ($attr->{id} =~ m/_Label4/i) && ($self->{isFound} eq '0'))
+ {
+ $self->{isFormat} = 1 ;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'h1'))
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'li') && ($attr->{id} eq 'ctl00_main_frame_ctrlproduct_liISBN13'))
+ {
+ $self->{isbnLevel} = 1 ;
+ }
+ elsif ($self->{isbnLevel} > 0)
+ {
+ if ($self->{isbnLevel} < 5)
+ {
+ $self->{isbnLevel}++ ;
+ }
+ else
+ {
+ $self->{isISBN} = 1 ;
+ $self->{isbnLevel} = 0 ;
+ }
+ }
+ elsif (($tagname eq 'a') && (($attr->{id} eq 'ctl00_main_frame_ctrlproduct_rptAuthor_ctl00_linkAuthor')) || ($attr->{id} eq 'ctl00_main_frame_ctrlproduct_rptAuthor_ctl01_linkAuthor'))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{id} eq 'ctl00_main_frame_ctrlproduct_linkPublisher'))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{id} eq 'ctl00_main_frame_ctrlproduct_lblPublished'))
+ {
+ $self->{isPublication} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{id} eq 'ctl00_main_frame_ctrlproduct_lblPages'))
+ {
+ $self->{isPages} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{id} eq 'ctl00_main_frame_ctrlproduct_lblLanguage'))
+ {
+ $self->{isLanguage} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{id} eq 'ctl00_main_frame_ctrlproduct_lblFormat'))
+ {
+ $self->{isReliure} = 1 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'productDescription'))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{id} eq 'ctl00_main_frame_ctrlproduct_imgProduct_ProductImageNotLinked') && !($attr->{src} =~ m/\/noimage./i))
+ {
+ $self->{curInfo}->{cover} = $attr->{src} ;
+ }
+
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{isFound} = 0 ;
+ $self->{inside}->{$tagname}--;
+ if (($self->{isDescription}) && ($tagname eq 'div'))
+ {
+ $self->{isDescription} = 0;
+ $self->{curInfo}->{description} =~ s/^Beskrivning://g ;
+ $self->{curInfo}->{description} =~ s/^Kuvaus://g ;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ my @array = split(/&/,$origtext);
+ my $element;
+ foreach $element (@array)
+ {
+ my @nom_prenom = split(/,/,$element);
+ # Enleve les blancs en debut de chaine
+ $nom_prenom[0] =~ s/^\s+//;
+ $nom_prenom[1] =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $nom_prenom[0] =~ s/\s$+//;
+ $nom_prenom[1] =~ s/\s$+//;
+ if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ", " . $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ }
+
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isFormat})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{format} = $origtext;
+ $self->{isFormat} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ $origtext =~ s/\s+$//;
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ $self->{curInfo}->{authors} .= $origtext;
+ $self->{curInfo}->{authors} .= ",";
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isISBN})
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{curInfo}->{isbn} =~ s/\s//g;
+ $self->{isISBN} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isPublication})
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{curInfo}->{publication} =~ s/(\d\d\d\d)(\d\d)/01\/$2\/$1/g;
+ $self->{isPublication} = 0 ;
+ }
+ elsif ($self->{isPages})
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPages} = 0 ;
+ }
+ elsif ($self->{isLanguage})
+ {
+ $self->{curInfo}->{language} = $origtext;
+ $self->{isLanguage} = 0 ;
+ }
+ elsif ($self->{isReliure})
+ {
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isReliure} = 0 ;
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} .= $origtext ;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 1,
+ edition => 0,
+ };
+
+ $self->{isLang} = 'se';
+ $self->{isFound} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isFormat} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isPublicationAndPages} = 0;
+ $self->{isLangAndReliure} = 0;
+ $self->{isDescription} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s|<li>|\n* |g;
+ $html =~ s|<br>|\n|g;
+ $html =~ s|<br />|\n|g;
+ $html =~ s|<p>|\n|g;
+ $html =~ s|<b>||g;
+ $html =~ s|</b>||g;
+ $html =~ s|<i>||g;
+ $html =~ s|</i>||g;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+ return "http://www.adlibris.com/" . $self->{isLang} . "/searchresult.aspx?isbn=" . $word. "&amp%3BfromProduct=true";
+ }
+ else
+ {
+ return "http://www.adlibris.com/" . $self->{isLang} . "/searchresult.aspx?title=" . $word. "&amp%3BfromProduct=true";
+ }
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "Adlibris";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'SW';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCbooksAmazonCommon.pm b/lib/gcstar/GCPlugins/GCbooks/GCbooksAmazonCommon.pm
new file mode 100644
index 0000000..bc75766
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCbooksAmazonCommon.pm
@@ -0,0 +1,65 @@
+package GCPlugins::GCbooks::GCbooksAmazonCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+use GCPlugins::GCstar::GCAmazonCommon;
+
+{
+ package GCPlugins::GCbooks::GCbooksAmazonPluginsBase;
+
+ use base ('GCPlugins::GCbooks::GCbooksPluginsBase', 'GCPlugins::GCstar::GCPluginAmazonCommon');
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{codeField} = 'isbn';
+
+ return $self;
+ }
+
+ sub isEAN
+ {
+ my ($self, $value) = @_;
+
+ return $value =~ /^978/;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+ sub getEanField
+ {
+ return 'isbn';
+ }
+}
+
+1; \ No newline at end of file
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCbooksCommon.pm b/lib/gcstar/GCPlugins/GCbooks/GCbooksCommon.pm
new file mode 100644
index 0000000..a74e35a
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCbooksCommon.pm
@@ -0,0 +1,61 @@
+package GCPlugins::GCbooks::GCbooksCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCPluginsBase;
+
+{
+ package GCPlugins::GCbooks::GCbooksPluginsBase;
+
+ use base qw(GCPluginParser);
+ use HTML::Entities;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ $self->{searchType} = 'books';
+ return $self;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['title'];
+ }
+
+ sub getEanField
+ {
+ my $self = shift;
+ my $fields = $self->getSearchFieldsArray;
+ return 'isbn'
+ if $fields->[0] eq 'isbn';
+ return undef;
+ }
+
+}
+
+1; \ No newline at end of file
diff --git a/lib/gcstar/GCPlugins/GCcomics/GCbedetheque.pm b/lib/gcstar/GCPlugins/GCcomics/GCbedetheque.pm
new file mode 100644
index 0000000..457194a
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCcomics/GCbedetheque.pm
@@ -0,0 +1,398 @@
+package GCPlugins::GCcomics::GCbedetheque;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCcomics::GCcomicsCommon;
+
+{
+
+ package GCPlugins::GCcomics::GCPluginbedetheque;
+
+ use LWP::Simple qw($ua);
+
+ use base qw(GCPlugins::GCcomics::GCcomicsPluginsBase);
+ sub getSearchUrl
+ {
+ my ( $self, $word ) = @_;
+ if ($self->{searchField} eq 'series')
+ {
+ return "http://www.bedetheque.com/index.php?R=1&RechSerie=$word";
+ }
+ elsif ($self->{searchField} eq 'writer')
+ {
+ return "http://www.bedetheque.com/index.php?R=1&RechAuteur=$word";
+ }
+ else
+ {
+ return '';
+ }
+
+ #return "http://www.bedetheque.com/index.php?R=1&RechTexte=$word";
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['series', 'writer'];
+ }
+
+ sub getItemUrl
+ {
+ my ( $self, $url ) = @_;
+ my @array = split( /#/, $url );
+ $self->{site_internal_id} = $array[1];
+
+ return $url if $url =~ /^http:/;
+ return "http://www.bedetheque.com/" . $url;
+ }
+
+ sub getNumberPasses
+ {
+ return 1;
+ }
+
+ sub getName
+ {
+ return "Bedetheque";
+ }
+
+ sub getAuthor
+ {
+ return 'Mckmonster';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless( $self, $class );
+
+ $self->{hasField} = {
+ series => 1,
+ title => 1,
+ volume => 1,
+ };
+
+ $self->{isResultsTable} = 0;
+ $self->{isCover} = 0;
+ $self->{itemIdx} = 0;
+ $self->{last_cover} = "";
+ $self->{site_internal_id} = "";
+ $self->{serie} = "";
+ $self->{synopsis} = "";
+ $self->{current_field} = "";
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ( $self, $html ) = @_;
+
+ $self->{parsingEnded} = 0;
+ $html =~ s/\s+/ /g;
+ $html =~ s/\r?\n//g;
+
+ if ( $self->{parsingList} )
+ {
+ if ( $html =~ m/(\d+\salbum\(s\).+)/ ) {
+
+ #keep only albums, no series or objects
+ $html = $1;
+ $self->{alternative} = 0;
+ } elsif ( $html =~ m/(<div id="albums_table">.+)/ ) {
+ $html = $1;
+ $self->{alternative} = 1;
+ }
+ }
+ else
+ {
+ $html =~ m/(<div class="box main reeditions">.+)/;
+
+ #$html =~ m/(<div class="album.+)/;
+ $html = $1;
+ $self->{isResultsTable} = 0;
+ $self->{parsingEnded} = 0;
+ $self->{isCover} = 0;
+ $self->{itemIdx}++;;
+ }
+
+ return $html;
+ }
+
+ sub start
+ {
+ my ( $self, $tagname, $attr, $attrseq, $origtext ) = @_;
+
+ return if ( $self->{parsingEnded} );
+
+ if ( $self->{parsingList} )
+ {
+ if ( !defined ($self->{alternative}) || (!$self->{alternative}) )
+ {
+ if ( ( $tagname eq "a" ) && ( $attr->{href} =~ m/album-/ ) )
+ {
+ $self->{isCollection} = 1;
+ $self->{itemIdx}++;
+
+ my $searchUrl = substr($attr->{href},0,index($attr->{href},".")).substr($attr->{href},index($attr->{href},"."));
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $searchUrl;
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $attr->{title};
+
+ #$self->{itemsList}[ $self->{itemIdx} ]->{url} =
+ # "http://www.bedetheque.com/" . $attr->{href};
+ }
+ elsif ( $tagname eq "i" )
+ {
+ $self->{isSerie} = 1;
+ }
+ } else {
+ if ( ( $tagname eq "table" ) && ( $attr->{id} eq "albums_serie" ) ) {
+ $self->{inTable} = 1;
+ }
+ elsif ( ($self->{inTable}) && ( $tagname eq "td" ) && ( $attr->{class} eq "num" ) ) {
+ $self->{itemIdx}++;
+ $self->{isVolume} = 1;
+ }
+ elsif ( ($self->{inTable}) && ( $tagname eq "a" ) && ( $attr->{href} =~ m/serie-/ ) ) {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isTitle} = 1;
+ }
+ elsif ( ( $self->{isSynopsis} ) && ( $tagname eq "br" ) && ( $self->{startSynopsis} ) ) {
+
+ # This is a stop! for br ;-) and complementary of the p in the end section
+ # should be ( ( $tagname eq "p" ) || ( $tagname eq "br" ) )
+ $self->{isSynopsis} = 0;
+ $self->{startSynopsis} = 0;
+ $self->{parsingEnded} = 1;
+ }
+ }
+ }
+ else
+ {
+ if ( $tagname eq "title")
+ {
+ $self->{isIssue} = 1;
+ $self->{isTitle} = 1;
+ }
+
+ if ( ( $self->{isCover} == 0 ) && ( $tagname eq "a" ) && ( $attr->{href} =~ m/Couvertures\/.*\.[jJ][pP][gG]/ ) )
+ {
+ $self->{curInfo}->{image} = 'http://www.bedetheque.com/' . $attr->{href};
+ $self->{isCover} = 1;
+ }
+ elsif ( ( $tagname eq "div") && ( $attr->{class} eq "titre" ) ) {
+ $self->{isVolume} = 1;
+ }
+ elsif ( ( $tagname eq "ul") && ( $attr->{class} eq "infos" ) ) {
+ $self->{isResultsTable} = 1;
+ }
+ elsif ( ( $self->{isResultsTable} ) && ( $tagname eq "label" ) ) {
+ $self->{current_field} = '';
+ $self->{openlabel} = 1;
+ }
+ elsif ( ( $tagname eq "div" ) && ( $attr->{class} eq "title" ) && ( !defined( $self->{curInfo}->{title} ) || ( $self->{curInfo}->{title} =~ /^$/ ) ) ) {
+ $self->{isTitle} = 1;
+ }
+ elsif ( ( $tagname eq "span" ) && ( $attr->{class} eq "type" ) ) {
+ $self->{isSerie} = 1;
+ }
+ elsif ( $tagname eq "em" ) {
+ $self->{isSynopsis} = 1;
+ }
+ elsif ( ( $tagname eq "a" ) && ( $attr->{class} eq "titre eo" ) ) {
+ if ( $attr->{title} =~ m/.+\s-(\d+)-\s.+/ ) {
+ $self->{curInfo}->{volume} = $1;
+ }
+ }
+ }
+ }
+
+ sub text
+ {
+ my ( $self, $origtext ) = @_;
+
+ return if ( $origtext eq " " );
+
+ return if ( $self->{parsingEnded} );
+
+ if ( $self->{parsingList} )
+ {
+ if ( !defined ($self->{alternative}) || (!$self->{alternative}) ) {
+ if ( $self->{isSerie} == 1)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{series} = $origtext;
+ $self->{isSerie} = 0;
+ }
+ else
+ {
+ if ($self->{isCollection} == 1)
+ {
+
+ #sometimes the field is "-vol-title", sometimes "--vol-title"
+ $origtext =~ s/-+/-/;
+ if ( $origtext =~ m/(.+)\s-(\d+)-\s(.+)/ ) {
+ $self->{itemsList}[ $self->{itemIdx} ]->{series} = $1;
+ $self->{itemsList}[ $self->{itemIdx} ]->{volume} = $2;
+ } elsif ( $origtext =~ /-/ ){
+ my @fields = split( /-/, $origtext );
+ $self->{itemsList}[ $self->{itemIdx} ]->{series} = $fields[0];
+ $self->{itemsList}[ $self->{itemIdx} ]->{volume} = $fields[1];
+ }
+ $self->{isCollection} = 0;
+ }
+ }
+ } else {
+ if ( ( $self->{inTable} ) && ( $self->{isTitle} ) ) {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ } elsif ( ( $self->{inTable} ) && ( $self->{isVolume} ) ) {
+ $self->{itemsList}[ $self->{itemIdx} ]->{volume} = $origtext;
+ }
+ }
+ }
+ else
+ {
+ if ( $self->{isResultsTable} == 1 )
+ {
+ $origtext=~s/:\s+/:/;
+ my %td_fields_map = (
+ "Identifiant :" => '',
+ "Scénario :" => 'writer',
+ "Dessin :" => 'illustrator',
+ "Couleurs :" => 'colourist',
+ "Dépot légal :" => 'publishdate',
+ "Achevé impr. :" => 'printdate ',
+ "Estimation :" => 'cost',
+ "Editeur :" => 'publisher',
+ "Collection : " => 'collection',
+ "Taille :" => 'format',
+ "ISBN :" => 'isbn',
+ "Planches :" => 'numberboards'
+ );
+
+ if ( ( $self->{openlabel} ) && ( exists $td_fields_map{$origtext} ) ) {
+ $self->{current_field} = $td_fields_map{$origtext};
+ }
+ elsif ( defined ( $self->{current_field} ) && ( $self->{current_field} !~ /^$/ ) )
+ {
+ $origtext=~s/&nbsp;/ /g;
+ $origtext=~s/\s+$//g;
+ $self->{curInfo}->{$self->{current_field}} = $origtext;
+ $self->{current_field} = "";
+ }
+ }
+ elsif ( $self->{isVolume} )
+ {
+ $self->{curInfo}->{volume} = $origtext;
+ $self->{isVolume} = 0 ;
+ }
+
+ if ( $self->{isTitle} )
+ {
+ $self->{curInfo}->{title} = $origtext;
+ }
+ elsif ( $self->{isSerie} ) {
+ $self->{curInfo}->{series} = $origtext;
+ $self->{curInfo}->{series} =~s/^\s+//;
+ }
+ elsif ( ( $self->{isSynopsis} ) && ( ( $origtext =~ /Résumé de l'album :/ ) || ( $origtext =~ /Résumé de la série :/ ) ) ) {
+ $self->{startSynopsis} = 1;
+ }
+ elsif ( ( $self->{isSynopsis} ) && ( $self->{startSynopsis} ) ) {
+ $self->{curInfo}->{synopsis} .= " ".$origtext;
+ $self->{curInfo}->{synopsis} =~ s/^(\s)*//;
+ $self->{curInfo}->{synopsis} =~ s/(\s)*$//;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ( $self, $tagname ) = @_;
+
+ return if ( $self->{parsingEnded} );
+
+ if ( $self->{parsingList} )
+ {
+ if ( !defined ($self->{alternative}) || (!$self->{alternative}) ) {
+ if ( ( $tagname eq "i" ) && $self->{isCollection} == 1)
+ {
+
+ #end of collection, next field is title
+ $self->{isTitle} = 1;
+ $self->{isCollection} = 0;
+ }
+ } else {
+ if ( ( $self->{inTable} ) && ( $tagname eq "a" ) ) {
+ $self->{isTitle} = 0;
+ } elsif ( ( $self->{inTable} ) && ( $tagname eq "td" ) ) {
+ $self->{isVolume} = 0;
+ }
+ }
+ }
+ else
+ {
+ if ( ( $tagname eq "ul" ) && $self->{isResultsTable} == 1 )
+ {
+ $self->{isIssue} = 0;
+ $self->{isResultsTable} = 0;
+ }
+ elsif ( ( $self->{isResultsTable} ) && ( $tagname eq "label" ) ) {
+ $self->{openlabel} = 0;
+ }
+ elsif ( ( $self->{isTitle} ) && ( ( $tagname eq "div" ) || ( $tagname eq "h1" ) ) ) {
+ $self->{isTitle} = 0;
+ }
+ elsif ( ( $self->{isSerie} ) && ( $tagname eq "a" ) ) {
+ $self->{isSerie} = 0;
+ }
+ elsif ( ( $self->{isSynopsis} ) && ( $tagname eq "em" ) && ( !$self->{startSynopsis} ) ) {
+ $self->{isSynopsis} = 0;
+ $self->{startSynopsis} = 0;
+ }
+ elsif ( ( $self->{isSynopsis} ) && ( ( $tagname eq "p" ) || ( $tagname eq "br" ) ) && ( $self->{startSynopsis} ) ) {
+ $self->{isSynopsis} = 0;
+ $self->{startSynopsis} = 0;
+ $self->{parsingEnded} = 1;
+ }
+ }
+ }
+}
+
+1; \ No newline at end of file
diff --git a/lib/gcstar/GCPlugins/GCcomics/GCcomicbookdb.pm b/lib/gcstar/GCPlugins/GCcomics/GCcomicbookdb.pm
new file mode 100644
index 0000000..80b299b
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCcomics/GCcomicbookdb.pm
@@ -0,0 +1,546 @@
+package GCPlugins::GCcomics::GCcomicbookdb;
+
+###################################################
+#
+# Copyright 2005-2012 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCcomics::GCcomicsCommon;
+
+{
+
+ package GCPlugins::GCcomics::GCPlugincomicbookdb;
+
+ use LWP::Simple qw($ua);
+ use HTTP::Cookies;
+
+ use base qw(GCPlugins::GCcomics::GCcomicsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ if ($self->{pass} == 1)
+ {
+ # First pass, searching for series name
+ if ($tagname eq "h2")
+ {
+ $self->{isAtResults} = 1;
+ }
+ if ( ($tagname eq "a")
+ && ($self->{isAtResults})
+ && !($attr->{href} =~ m/ebay\.com/))
+ {
+ $self->{isCollection} = 1;
+ $self->{itemIdx}++;
+
+ $self->{itemsList}[ $self->{itemIdx} ]->{nextUrl} =
+ "http://www.comicbookdb.com/" . $attr->{href};
+ }
+ }
+ else
+ {
+ # Second pass, or fetching item info
+ if ($self->{parsingList})
+ {
+
+ if ( ($tagname eq "tbody")
+ && ($self->{isResultsTable})
+ && ($self->{isSpecialIssue} == 1))
+ {
+ $self->{isSpecialIssue} = 2;
+ }
+ # Parsing issue list
+ if (($tagname eq "a") && ($self->{isResultsTable}))
+ {
+ if ($attr->{href} =~ m/javascript/)
+ {
+ # Multiple editions of the one issue, need to be
+ # handled differently
+ $self->{isSpecialIssue} = 1;
+ }
+ elsif ($attr->{href} =~ m/storyarc.php/)
+ {
+ # Prevent story arcs from populating lists
+ }
+ elsif ($self->{isSpecialIssue} == 1)
+ {
+ $self->{resultsTableColumn}++;
+ if ($self->{resultsTableColumn} == 1)
+ {
+ $self->{isSpecialIssueNo} = 1;
+ $self->{isIssue} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} =
+ "http://www.comicbookdb.com/" . $attr->{href};
+ }
+ elsif ($self->{resultsTableColumn} == 2)
+ {
+ $self->{isTitle} = 1;
+ $self->{isSpecialTitle} = 1;
+ }
+ }
+ elsif ($self->{isSpecialIssue} == 2)
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} =
+ "http://www.comicbookdb.com/" . $attr->{href};
+ $self->{isTitle} = 1;
+ }
+ else
+ {
+ $self->{resultsTableColumn}++;
+ if ($self->{resultsTableColumn} == 1)
+ {
+ $self->{isIssue} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} =
+ "http://www.comicbookdb.com/" . $attr->{href};
+ }
+ elsif ($self->{resultsTableColumn} == 2)
+ {
+ $self->{isTitle} = 1;
+ }
+ }
+ }
+ }
+ else
+ {
+ # Fetching item info
+ if ( ($tagname eq "span")
+ && ((index $attr->{class}, "page_headline") > -1))
+ {
+ $self->{insideHeadline} = 1;
+ }
+ elsif (($tagname eq "a")
+ && ($self->{insideHeadline})
+ && ($attr->{href} =~ m/title.php/))
+ {
+ $self->{insideName} = 1;
+ }
+ elsif (($tagname eq "a")
+ && ($self->{insideHeadline})
+ && ($attr->{href} =~ m/issue_number.php/))
+ {
+ $self->{insideNumber} = 1;
+ }
+ elsif (($tagname eq "a") && ($self->{nextisWriters}))
+ {
+ $self->{insideWriters} = 1;
+ $self->{insidePencillers} = 0;
+ $self->{insideColorists} = 0;
+ }
+ elsif (($tagname eq "a") && ($self->{nextisPencillers}))
+ {
+ $self->{insideWriters} = 0;
+ $self->{insidePencillers} = 1;
+ $self->{insideColorists} = 0;
+ }
+ elsif (($tagname eq "a") && ($self->{nextisColorists}))
+ {
+ $self->{insideWriters} = 0;
+ $self->{insidePencillers} = 0;
+ $self->{insideColorists} = 1;
+ }
+ elsif (($tagname eq "a") && ($attr->{href} =~ /imprint.php/))
+ {
+ $self->{insidePublisher} = 1;
+ }
+ elsif (($tagname eq "a")
+ && ($attr->{href} =~ /publisher.php/)
+ && (!$self->{curInfo}->{publisher}))
+ {
+ $self->{insidePublisher} = 1;
+ }
+ elsif (($tagname eq "a") && ($attr->{href} =~ /coverdate.php/))
+ {
+ $self->{insideCoverDate} = 1;
+ }
+ if ( ($tagname eq "span")
+ && ((index $attr->{class}, "test") > -1)
+ && ((index $attr->{class}, "page_subheadline") > -1))
+ {
+ $self->{insideSubHeadline} = 1;
+ }
+ elsif (($tagname eq "a")
+ && ($attr->{href} =~ /^graphics\/comic_graphics\//))
+ {
+ $self->{curInfo}->{image} =
+ "http://www.comicbookdb.com/" . $attr->{href};
+ }
+ elsif (($tagname eq "img")
+ && ($attr->{src} =~ /^graphics\/comic_graphics\//)
+ && (!$self->{curInfo}->{image}))
+ {
+ $self->{curInfo}->{image} =
+ "http://www.comicbookdb.com/" . $attr->{src};
+ }
+
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+
+ if ($self->{isResultsTable})
+ {
+ if ($tagname eq "table")
+ {
+ $self->{isResultsTable} = 0;
+ }
+ elsif ($tagname eq "tr")
+ {
+ $self->{resultsTableColumn} = 0;
+ }
+ }
+
+ if ($tagname eq "tbody")
+ {
+ $self->{isSpecialIssue} = 0;
+ }
+ elsif ($tagname eq "span")
+ {
+ $self->{insideHeadline} = 0;
+ $self->{insideSubHeadline} = 0;
+ $self->{insideNumber} = 0;
+ }
+ elsif ($tagname eq "td")
+ {
+ $self->{isAtResults} = 0;
+ $self->{nextisWriters} = 0;
+ $self->{nextisPencillers} = 0;
+ $self->{nextisColorists} = 0;
+ $self->{insideWriters} = 0;
+ $self->{insidePencillers} = 0;
+ $self->{insideColorists} = 0;
+ }
+ elsif ($tagname eq "a")
+ {
+ $self->{insidePublisher} = 0;
+ $self->{insideCoverDate} = 0;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if ($origtext eq " ");
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isCollection})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{series} = $origtext;
+ $self->{isCollection} = 0;
+ }
+ if ($origtext eq "Cover Date")
+ {
+ $self->{isResultsTable} = 1;
+ }
+ if ($self->{isIssue})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{volume} = $origtext;
+ $self->{isIssue} = 0;
+ }
+ if ($self->{isSpecialIssueNo})
+ {
+ $self->{specialIssueNo} = $origtext;
+ $self->{isSpecialIssueNo} = 0;
+ }
+ if ($self->{isTitle})
+ {
+ if ($self->{isSpecialIssue} == 2)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{volume} =
+ $self->{specialIssueNo};
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} =
+ $self->{specialTitle} . $origtext;
+ }
+ else
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ }
+ $self->{isTitle} = 0;
+ }
+ if ($self->{isSpecialTitle})
+ {
+ $self->{specialTitle} = $origtext;
+ $self->{isSpecialTitle} = 0;
+ }
+ }
+ else
+ {
+ if ($self->{insideName})
+ {
+ $self->{curInfo}->{series} = $origtext;
+ #$self->{curInfo}->{series} =~ s/(\s\([0-9]*\))$//;
+ $self->{insideName} = 0;
+ }
+ elsif (($self->{insideNumber}) && ($origtext =~ /^\s*#(\d+)/))
+ {
+ # volume where #XX is in <A HREF... tag, '-' is not
+ $self->{curInfo}->{volume} = $1;
+ $self->{insideNumber} = 0;
+ }
+ elsif (($self->{insideHeadline}) && ($origtext =~ /-\s#(\d+)/))
+ {
+ # volume where #XX isn't in <A HREF... tag
+ $self->{curInfo}->{volume} = $1;
+ $self->{insideNumber} = 0;
+ }
+ elsif (($self->{insideHeadline}) && ($origtext =~ /-\s*TPB/))
+ {
+ # Trade paperback
+ $self->{curInfo}->{series} .= " TPB";
+
+ # Get volume number. Default to 1.
+ if ($origtext =~ /vol\. (\d+)/)
+ {
+ $self->{curInfo}->{volume} = $1;
+ }
+ else
+ {
+ $self->{curInfo}->{volume} = 1;
+ }
+ $self->{insideNumber} = 0;
+ }
+ elsif (($self->{insideHeadline}) && ($origtext =~ /vol\. (\d+)/))
+ {
+ $self->{curInfo}->{volume} = $1;
+ $self->{insideNumber} = 0;
+ }
+ elsif (($self->{insideHeadline}) && ($origtext =~ /-\s*Annual\s*(\d+)/))
+ {
+ # Annual volume where #XX isn't in <A HREF... tag
+ $self->{curInfo}->{volume} = $1;
+ $self->{curInfo}->{series} .= " Annual";
+ $self->{insideNumber} = 0;
+ }
+ elsif (($self->{insideSubHeadline}) && ($origtext =~ /\"(.*)\"/))
+ {
+ $self->{curInfo}->{title} = $1;
+
+ # Get printing or other note if present
+ if ($origtext =~ /\((.*)\)/)
+ {
+ $self->{curInfo}->{title} .= " (" . $1 . ")";
+ }
+ }
+ elsif ($self->{insidePublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{insidePublisher} = 0;
+ }
+ elsif ($origtext eq "Writer(s):")
+ {
+ $self->{nextisWriters} = 1;
+ $self->{nextisPencillers} = 0;
+ $self->{nextisColorists} = 0;
+ }
+ elsif ($origtext eq "Penciller(s):")
+ {
+ $self->{nextisWriters} = 0;
+ $self->{nextisPencillers} = 1;
+ $self->{nextisColorists} = 0;
+ }
+ elsif ($origtext eq "Colorist(s):")
+ {
+ $self->{nextisWriters} = 0;
+ $self->{nextisPencillers} = 0;
+ $self->{nextisColorists} = 1;
+ }
+ elsif (($origtext eq "Letterer(s):")
+ || ($origtext eq "Inker(s):")
+ || ($origtext eq "Editor(s):")
+ || ($origtext eq "Cover Artist(s):")
+ || ($origtext eq "Characters:")
+ || ($origtext eq "Groups:"))
+ {
+ $self->{nextisWriters} = 0;
+ $self->{nextisPencillers} = 0;
+ $self->{nextisColorists} = 0;
+ }
+ elsif ($self->{insideWriters})
+ {
+ if ($self->{curInfo}->{writer} eq "")
+ {
+ $self->{curInfo}->{writer} = $origtext;
+ }
+ elsif ((index $self->{curInfo}->{writer}, $origtext) == -1)
+ {
+ $self->{curInfo}->{writer} .= ", ";
+ $self->{curInfo}->{writer} .= $origtext;
+ }
+
+ $self->{insideWriters} = 0;
+ }
+ elsif ($self->{insidePencillers})
+ {
+ if ($self->{curInfo}->{illustrator} eq "")
+ {
+ $self->{curInfo}->{illustrator} = $origtext;
+ }
+ elsif ((index $self->{curInfo}->{illustrator}, $origtext) == -1)
+ {
+ $self->{curInfo}->{illustrator} .= ", ";
+ $self->{curInfo}->{illustrator} .= $origtext;
+ }
+
+ $self->{insidePencillers} = 0;
+ }
+ elsif ($self->{insideColorists})
+ {
+ if ($self->{curInfo}->{colourist} eq "")
+ {
+ $self->{curInfo}->{colourist} = $origtext;
+ }
+ elsif ((index $self->{curInfo}->{colourist}, $origtext) == -1)
+ {
+ $self->{curInfo}->{colourist} .= ", ";
+ $self->{curInfo}->{colourist} .= $origtext;
+ }
+
+ $self->{insideColorists} = 0;
+ }
+ elsif ($origtext eq "Synopsis: ")
+ {
+ $self->{nextisSynopsis} = 1;
+ }
+ elsif ($self->{nextisSynopsis})
+ {
+ if ($origtext !~ /None entered./)
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{curInfo}->{synopsis} =~ s/^(\s)*//;
+ $self->{curInfo}->{synopsis} =~ s/(\s)*$//;
+ }
+ $self->{nextisSynopsis} = 0;
+ }
+ elsif ($self->{insideCoverDate})
+ {
+ $self->{curInfo}->{printdate} = $origtext;
+ $self->{curInfo}->{printdate} =~ s/^(\s)*//;
+
+ # Translate date string to date
+ $self->{curInfo}->{printdate} =
+ GCUtils::strToTime($self->{curInfo}->{printdate}, "%B %Y");
+ $self->{curInfo}->{publishdate} = $self->{curInfo}->{printdate};
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ $self->{ua}->cookie_jar(HTTP::Cookies->new);
+
+ bless($self, $class);
+
+ $self->{isResultsTable} = 0;
+ $self->{itemIdx} = 0;
+ $self->{resultsTableColumn} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub getReturnedFields
+ {
+ my $self = shift;
+
+ if ($self->{pass} == 1)
+ {
+ $self->{hasField} = {series => 1,};
+ }
+ else
+ {
+ $self->{hasField} = {
+ title => 1,
+ volume => 1,
+ };
+ }
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ $word =~ s/\+%28\d{4}%29$//; # strip year from end of $word (title)
+
+ # Grab the home page first, or the pages fetched are blank
+ # (who knows why... must be something funky with the website)
+ my $response = $ua->get('http://www.comicbookdb.com/');
+
+ return
+ "http://www.comicbookdb.com/search.php?form_search=$word&form_searchtype=Title";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url =~ /^http:/;
+
+ return "http://www.comicbookdb.com" . $url;
+ }
+
+ sub getNumberPasses
+ {
+ return 2;
+ }
+
+ sub getName
+ {
+ return "Comic Book DB";
+ }
+
+ sub getAuthor
+ {
+ return 'Zombiepig';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCcomics/GCcomicsCommon.pm b/lib/gcstar/GCPlugins/GCcomics/GCcomicsCommon.pm
new file mode 100644
index 0000000..3b1229c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCcomics/GCcomicsCommon.pm
@@ -0,0 +1,49 @@
+package GCPlugins::GCcomics::GCcomicsCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCPluginsBase;
+
+{
+ package GCPlugins::GCcomics::GCcomicsPluginsBase;
+
+ use base qw(GCPluginParser);
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['series'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCcomics/GCmangasanctuary.pm b/lib/gcstar/GCPlugins/GCcomics/GCmangasanctuary.pm
new file mode 100644
index 0000000..d05d0c8
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCcomics/GCmangasanctuary.pm
@@ -0,0 +1,503 @@
+package GCPlugins::GCcomics::GCmangasanctuary;
+
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCcomics::GCcomicsCommon;
+
+{
+
+ package GCPlugins::GCcomics::GCPluginmangasanctuary;
+
+ use LWP::Simple qw($ua);
+
+ use base qw(GCPlugins::GCcomics::GCcomicsPluginsBase);
+
+ sub start
+ {
+ my ( $self, $tagname, $attr, $attrseq, $origtext ) = @_;
+ if ( $self->{parsingList} )# partie en rapport à la page de résultats
+ {
+
+ #The interesting part to parse looks like this :
+ #<li class="row1"><a href="/manhwa-rebirth-vol-2-simple-s1397-p682.html">Rebirth #2</a> <span>Manhwa</span></li>
+ if ( $tagname eq "a" )
+ {
+ $self->{isDebut} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = "http://www.manga-sanctuary.com" . $attr->{href};
+ $attr->{href} =~ m/\/(.*?)-.*-vol-\d+-(.*?)-s\d+-p\d+.html/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{type} = $1;
+ $self->{itemsList}[ $self->{itemIdx} ]->{format} = $2;
+ }
+ }
+ else# partie en rapport à la page de l'élément
+ {
+
+ #Commencer par récupérer l'image
+ #<a target="_blank" href="/couvertures/big/rebirth1gd.jpg"><img src="/couvertures/rebirth1gd.jpg"></a>
+ if ( ( $tagname eq "a" ) && ( $attr->{href} =~ m/couvertures.*\.[jJ][pP][gG]/ ) )
+ {
+ my $response = $ua->get("http://www.manga-sanctuary.com" . $attr->{href});
+ if ($response->content_type =~ m/text\/html/) #la grande image n'existe pas
+ {
+ $self->{downloadThumbnail} = 1;
+ }
+ else#la grande image existe
+ {
+ $self->{curInfo}->{image} = "http://www.manga-sanctuary.com" . $attr->{href};
+ }
+ }
+ if ( ( $tagname eq "img" ) && ( $attr->{src} =~ m/couvertures.*\.[jJ][pP][gG]/ ) && ($self->{downloadThumbnail} == 1) )
+ {
+ $self->{curInfo}->{image} = "http://www.manga-sanctuary.com" . $attr->{src};
+ $self->{downloadThumbnail} =0;
+ }
+ #Code général détection dt et dd
+ if ( $tagname eq "dt")
+ {
+ $self->{tagDTdetected} =1;
+ }elsif ( $tagname eq "dd")
+ {
+ $self->{tagDDdetected} =1;
+ }elsif ( $tagname eq "h3")
+ {
+ $self->{tagH3detected} =1;
+ }elsif ( $tagname eq "p")
+ {
+ $self->{tagPdetected} =1;
+ }elsif ( $tagname eq "a")
+ {
+ $self->{tagAdetected} =1;
+ }
+ #Code pour différencier les types de titres (original /français)
+ if ( ( $tagname eq "img") && ( $attr->{src} =~ m/\/design\/img\/flags/ ) && ($self->{titleDetected} == 1) )
+ {
+ $attr->{src} =~ m/\/(\d*)\.png$/;
+ if ($1 == 77)
+ {
+ $self->{titreFrancais} = 1;
+ }
+ else
+ {
+ $self->{titreFrancais} = 0;
+ }
+ }
+ #Code pour récupérer la notation
+ #<ul id="notation">\nStaff MS:<img src="/design/img/9.gif" title="8.5/10"/></ul>
+ if ( ( $tagname eq "ul") && ( $attr->{id} =~ m/notation/ ) )
+ {
+ $self->{notationDetected} = 1;
+ }elsif ( ( $tagname eq "img") && ( $self->{notationDetected} == 1 ) )
+ {
+ $attr->{title} =~ m/^(\d*\.?\d*)\/10/;
+ $self->{curInfo}->{rating} = $1;
+ $self->{notationDetected} = 0;
+
+ #Récupération du format dans l'adresse de la page.
+ #http://www.manga-sanctuary.com/manga-duds-hunt-vol-1-simple-s1169-p1477.html
+ #Peut être fait dès que webPage est renseigné, placé ici pour être sûr de n'être lancé qu'une seule fois.
+ $self->{curInfo}->{webPage} =~ m/vol-\d+-(.*?)-s\d+-p\d+\.html/;
+ $self->{curInfo}->{format} = $1;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ( $self, $tagname ) = @_;
+ if ( $self->{parsingList} )# partie en rapport à la page de résultats
+ {
+ if ( ( $tagname eq "a" ) && $self->{isFin} == 1 )
+ {
+ #end of collection, next field is title
+ $self->{isFin} = 0;
+ }
+ }
+ else# partie en rapport à la page de l'élément
+ {
+ #Code général détection dt et dd
+ if ( $tagname eq "dt")
+ {
+ $self->{tagDTdetected} =0;
+ }elsif ( $tagname eq "dd")
+ {
+ $self->{tagDDdetected} =0;
+ #RAZ en cas de champ vide
+ $self->{titleDetected} =0;
+ $self->{titreFrancais} = 1;
+ $self->{publisherDetected} =0;
+ $self->{collectionDetected} =0;
+ $self->{publishdateDetected} =0;
+ $self->{costDetected} =0;
+ $self->{typeDetected} =0;
+ $self->{categoryDetected} =0;
+ $self->{genresDetected} =0;
+ $self->{scenaristeDetected} =0;
+ $self->{dessinateurDetected} =0;
+ }elsif ( $tagname eq "div")#Le code à récupérer pour un titre h3 donné se trouve après la balise <\h3> donc on ne peut pas l'utiliser.
+ {
+ $self->{tagH3detected} =0;
+ }elsif ( $tagname eq "p")
+ {
+ $self->{tagPdetected} =0;
+ #RAZ en cas de champ vide
+ $self->{synopsisDetected} =0;
+ $self->{critiquesDetected} =0;
+ $self->{reactionsDetected} =0;
+ }elsif ( $tagname eq "a")
+ {
+ $self->{tagAdetected} =0;
+ }elsif ( $tagname eq "ul" )
+ {
+ $self->{notationDetected} = 0;
+ }
+ }
+ }
+
+ sub text
+ {
+ my ( $self, $origtext ) = @_;
+
+ return if ( $origtext eq " " );
+
+ return if ( $self->{parsingEnded} );
+
+ if ( $self->{parsingList} )# partie en rapport à la page de résultats
+ {
+ if ( $self->{isDebut} )
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{isDebut} = 0;
+ $self->{isFin} = 1;
+ }
+ }
+ else# partie en rapport à la page de l'élément
+ {
+
+ if ( $self->{tagDTdetected} == 1 )
+ {
+ #Title
+ #<dt><label>Titre <img src="/design/img/flags/112.png"></label></dt><dd>&#37507;&#22818; Last Order </dd><dt><label>Titre <img src="/design/img/flags/77.png"></label></dt><dd>Gunnm Last Order</dd>
+ if ($origtext =~ m/^Titre/)
+ {
+ $self->{titleDetected} =1;
+ }
+ #Volume
+ #<dt><label>Volume:</label></dt>\n<dd>1/23</dd>
+ elsif ($origtext =~ m/^Volume/)
+ {
+ $self->{volumeDetected} =1;
+ }
+ #Publisher
+ #<dt><label>Editeur:</label></dt>\n<dd><a href="http://www.manga-sanctuary.com/bdd/editeurs/6-glenat.html" title="Glénat">Glénat</a></dd>
+ elsif ($origtext =~ m/^Editeur/)
+ {
+ $self->{publisherDetected} =1;
+ }
+ #collection
+ #<dt><label>Label:</label></dt>\n<dd>Kana Shonen</dd>
+ elsif ($origtext =~ m/^Label/)
+ {
+ $self->{collectionDetected} =1;
+ }
+ #PublishDate
+ #<dt><label>Date de sortie:</label></dt>\n<dd>31/10/2002</dd>
+ elsif ($origtext =~ m/^Date de sortie/)
+ {
+ $self->{publishdateDetected} =1;
+ }
+ #cost
+ #<dt><label>Prix:</label></dt>\n<dd>6.5 EUR</dd>
+ elsif ($origtext =~ m/^Prix/)
+ {
+ $self->{costDetected} =1;
+ }
+ #type
+ #<dt><label>Type:</label></dt>\n<dd>Manga</dd>
+ elsif ($origtext =~ m/^Type/)
+ {
+ $self->{typeDetected} =1;
+ }
+ #category
+ #<dt><label>Catégorie:</label></dt>\n<dd>Seinen</dd>
+ elsif ($origtext =~ m/^Catégorie/)
+ {
+ $self->{categoryDetected} =1;
+ }
+ #Genres [NOTE: pas d'accès aux tags alors je le mets dans synopsis]
+ #<dt><label>Genres:</label></dt>\n<dd>Action, SF</dd>
+ elsif ($origtext =~ m/^Genres/)
+ {
+ $self->{genresDetected} =1;
+ }
+ #scenariste [de la fiche série]
+ #<dt><label>Scénariste</label></dt>
+ elsif ($origtext =~ m/^Scénariste/)
+ {
+ $self->{scenaristeDetected} =1;
+ }
+ #dessinateur [de la fiche série]
+ #<dt><label>Dessinateur</label></dt>
+ elsif ($origtext =~ m/^Dessinateur/)
+ {
+ $self->{dessinateurDetected} =1;
+ }
+ }
+
+ if ( $self->{tagDDdetected} == 1 )
+ {
+ if ($self->{titleDetected} == 1)
+ {
+ $origtext =~ m/^\s*(.*?)\s*$/;
+ if ($self->{titreFrancais} == 1)
+ {
+ #$self->{curInfo}->{title} = $1; #Je désactive le titre car c'est le même que la série
+ $self->{curInfo}->{series} = $1;
+ }
+ else
+ {
+ $self->{curInfo}->{synopsis} .= "Titre original :".$1."\n";
+ }
+ $self->{titleDetected} = 0;
+ }
+ elsif ($self->{volumeDetected} == 1)
+ {
+ $origtext =~ m/^(\d*)\//;
+ $self->{curInfo}->{volume} = $1;
+ $self->{volumeDetected} =0;
+ }
+ elsif ($self->{publisherDetected} == 1)
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{publisherDetected} =0;
+ }
+ elsif ($self->{collectionDetected} == 1)
+ {
+ $self->{curInfo}->{collection} = $origtext;
+ $self->{collectionDetected} =0;
+ }
+ elsif ($self->{publishdateDetected} == 1)
+ {
+ $self->{curInfo}->{publishdate} = $origtext;
+ $self->{publishdateDetected} =0;
+ }
+ elsif ($self->{costDetected} == 1)
+ {
+ $origtext =~ m/^\s*(\d*\.\d*)/;
+ $self->{curInfo}->{cost} = $1;
+ $self->{costDetected} =0;
+ }
+ elsif ($self->{typeDetected} == 1)
+ {
+ $self->{curInfo}->{type} = $origtext;
+ $self->{typeDetected} =0;
+ }
+ elsif ($self->{categoryDetected} == 1)
+ {
+ $self->{curInfo}->{category} = $origtext;
+ $self->{categoryDetected} =0;
+ }
+ elsif ($self->{genresDetected} == 1)
+ {
+ $origtext =~ m/^\s*(.*?)\s*$/;
+ $self->{curInfo}->{synopsis} .= "Genres : ".$1."\n\n";
+ $self->{genresDetected} =0;
+ }
+ }
+ if ( $self->{tagH3detected} == 1 )
+ {
+ #Code détection synopsis
+ # <h3><span>Synopsis</span></h3>
+ if ($origtext =~ m/^Synopsis/)
+ {
+ $self->{synopsisDetected} =1;
+ $self->{curInfo}->{synopsis} .= "Synopsis :\n"
+ }
+ #Code détection critiques
+ #<h3>Critiques du staff</h3>
+ elsif ($origtext =~ m/^Critiques du staff/)
+ {
+ $self->{critiquesDetected} =1;
+ $self->{curInfo}->{synopsis} .= "\n\nCritiques du staff :\n";
+ }
+ #Réactions désactivées car pas super intéressant
+ # #Code détection reactions
+ # #<h3>Réactions</h3>
+ # elsif ($origtext =~ m/^Réactions/)
+ # {
+ # $self->{reactionsDetected} =1;
+ # $self->{curInfo}->{synopsis} .= "\n\nRéactions :\n";
+ # }
+ }
+ if ( $self->{tagPdetected} == 1 )
+ {
+ if ($self->{synopsisDetected} == 1)
+ {
+ $origtext =~ m/^\s*(.*?)\s*$/;
+ $self->{curInfo}->{synopsis} .= $1."\n";
+ $self->{genresDetected} =0;
+ }elsif ($self->{critiquesDetected} == 1)
+ {
+ $origtext =~ m/^\s*(.*?)\s*$/;
+ $self->{curInfo}->{synopsis} .= $1."\n";
+ $self->{genresDetected} =0;
+ }
+ #Réactions désactivées car pas super intéressant
+ # elsif ($self->{reactionsDetected} == 1)
+ # {
+ # $origtext =~ m/^\s*(.*?)\s*$/;
+ # $self->{curInfo}->{synopsis} .= $1."\n";
+ # $self->{genresDetected} =0;
+ # }
+ }
+ if ( $self->{tagAdetected} == 1 )
+ {
+ if ($self->{scenaristeDetected} == 1)
+ {
+ $self->{curInfo}->{writer} = $origtext;
+ $self->{scenaristeDetected} =0;
+ }
+ elsif ($self->{dessinateurDetected} == 1)
+ {
+ $self->{curInfo}->{illustrator} = $origtext;
+ $self->{dessinateurDetected} =0;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless( $self, $class );
+#pour la recherche:
+# $self->{hasField} = {
+# series => 1,
+# title => 1,
+# volume => 1,
+# };
+ $self->{hasField} = {
+ title => 1,
+ type => 1,
+ format => 1,
+ };
+
+
+
+ $self->{itemIdx} = 0;
+ $self->{downloadThumbnail} = 0;
+ $self->{tagDTdetected} =0;
+ $self->{tagDDdetected} =0;
+ $self->{tagH3detected} =0;
+ $self->{tagPdetected} =0;
+ $self->{titleDetected} =0;
+ $self->{titreFrancais} = 1;#défaut francais
+ $self->{publisherDetected} =0;
+ $self->{collectionDetected} =0;
+ $self->{publishdateDetected} =0;
+ $self->{costDetected} =0;
+ $self->{typeDetected} =0;
+ $self->{categoryDetected} =0;
+ $self->{genresDetected} =0;
+ $self->{synopsisDetected} =0;
+ $self->{critiquesDetected} =0;
+ $self->{reactionsDetected} =0;
+ $self->{scenaristeDetected} =0;
+ $self->{dessinateurDetected} =0;
+ $self->{notationDetected} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ( $self, $html ) = @_;
+
+ if ( $self->{parsingList} ) # partie en rapport à la page de résultats
+ {
+ #keep only Volumes
+ $html =~ m/<h3>Volumes\s\(\d+\)<\/h3>\s*(.*?)\s*<h3>Critiques/s;
+ $html = $1;
+ }
+ else # partie en rapport à la page de l'élément
+ {
+ $html =~ m/<div id="contenu">\s*(<ul id="menu_fiche">\s*<li><a href="(http:\/\/www.manga-sanctuary.com.*?)">.*?)\s*<h3><span>Mes actions<\/span><\/h3>/s;
+ $html = $1;
+
+ #récupération des infos de la fiche série
+ my $response = $ua->get($2);
+ $response->content =~ m/<h3><span>Staff<\/span><\/h3>\s*(.*?<\/dl>)/s;
+
+ $html .= "\n\n <fiche série>\n\n".$1;
+
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ( $self, $word ) = @_;
+ $word =~ s/\+/ /g;
+ return ('http://www.manga-sanctuary.com/recherche/tout/', ['keywords' => $word]);
+
+ }
+
+ sub getItemUrl
+ {
+ my ( $self, $url ) = @_;
+ #Je fais le pari que cette partie n'est pas utilisée
+ # my @array = split( /#/, $url );
+ # $self->{site_internal_id} = $array[1];
+
+ return $url if $url =~ /^http:/;
+ return "http://www.manga-sanctuary.com" . $url;
+ }
+
+ sub getNumberPasses
+ {
+ return 1;
+ }
+
+ sub getName
+ {
+ return "Manga-Sanctuary";
+ }
+
+ sub getAuthor
+ {
+ return 'Biggriffon';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAlapage.pm b/lib/gcstar/GCPlugins/GCfilms/GCAlapage.pm
new file mode 100644
index 0000000..604fdc4
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAlapage.pm
@@ -0,0 +1,267 @@
+package GCPlugins::GCfilms::GCAlapage;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginAlapage;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ($attr->{class} eq "tx12noirbold")
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ elsif ($tagname eq "div")
+ {
+ if ($attr->{class} eq "acteurs")
+ {
+ $self->{isActors} = 1;
+ }
+ elsif ($attr->{class} eq "realisateur")
+ {
+ $self->{isDirector} = 1;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if ($attr->{src} =~ /^\/resize\.php\?ref=([0-9]*)/)
+ {
+ $self->{curInfo}->{image} =
+ "http://imgdata.echo.fr/disque_l?v$1r.jpg";
+ }
+ }
+ elsif ($tagname eq "span")
+ {
+ $self->{insideName} = 1 if $attr->{style} eq "color:#414B55;";
+ $self->{insideActors} = 1 if $attr->{class} eq "tx11gris";
+ }
+ elsif ($tagname eq "div")
+ {
+ $self->{insideSynopsis} = 1 if $attr->{align} eq "justify";
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($self->{isActors})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"actors"} .=
+ $self->{itemsList}[ $self->{itemIdx} ]->{"actors"}
+ ? ', ' . $self->capWord($origtext)
+ : $self->capWord($origtext);
+ $self->{isActors} = 0;
+ }
+ elsif ($self->{isDirector})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"director"} =
+ $self->capWord($origtext);
+ $self->{isDirector} = 0;
+ }
+
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+
+ if ($self->{insideName})
+ {
+ $self->{curInfo}->{title} = $self->capWord($origtext);
+ $self->{insideName} = 0;
+ }
+ elsif ($self->{insideActors})
+ {
+ $origtext =~ s/avec : (.*) - (?:[^-]* )?DVD/$1/;
+ $origtext =~ s/ - /, /g;
+ $self->{curInfo}->{actors} = $self->capWord($origtext)
+ if !$self->{curInfo}->{actors};
+ $self->{insideActors} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $origtext =~ s/\[br\]/\n/g;
+ $self->{curInfo}->{synopsis} .= $origtext;
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($origtext =~ m/R.*alisateur :/)
+ {
+ $origtext =~ s/R.*alisateur(?: :)?(.*)/$1/;
+ $origtext =~ s/ - /, /g;
+ $self->{curInfo}->{director} = $self->capWord($origtext)
+ if !$self->{curInfo}->{director};
+ }
+ elsif ($origtext =~ m/Genre :/)
+ {
+ $origtext =~ s/Genre :(.*)/$1/;
+ $origtext = $self->capWord($origtext);
+ $origtext =~ s/ \/ /,/g;
+ $origtext =~ s/,Video//g;
+ $self->{curInfo}->{genre} = $origtext if !$self->{curInfo}->{genre};
+ }
+ elsif ($origtext =~ m/Année du film :/)
+ {
+ $origtext =~ s/Année du film :(.*)/$1/;
+ $self->{curInfo}->{date} = $origtext if !$self->{curInfo}->{date};
+ }
+ elsif ($origtext =~ m/Durée du film/)
+ {
+ $origtext =~ s/Durée du film(.*)/$1/;
+ $self->{curInfo}->{time} = $origtext if !$self->{curInfo}->{time};
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 0,
+ director => 1,
+ actors => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ #Fix for character-encoding:
+ $html =~ s/’/'/g;
+ $html =~ s/…/\.\.\./g;
+ #'
+
+#<<< keep perltidy away from these lines
+ $html =~ s/<br>/\[br\]/gi;
+ $html =~ s/&nbsp;/ /g;
+ $html =~ s/<u>|<\/u>|<b>|<\/b>|<i>|<\/i>//gi;
+ $html =~ s/<SPAN class="(?:tx12gris6|tx12noir)">([^<]*)<\/SPAN>/$1/gi;
+ $html =~ s|<A href="/-/Liste/DVD/mot_real_nomprenom=.*?\?id=[0-9]*&donnee_appel=ALAPAGE" class="roll">([^<]*)</A>|<div class="realisateur">$1</div>|gi;
+ $html =~ s|<A href="/-/Liste/DVD/mot_art_nomprenom=.*?\?id=[0-9]*&donnee_appel=ALAPAGE" class="roll">([^<]*)</A>|<div class="acteurs">$1</div>|gi;
+ $html =~ s/<A href="http\:\/\/www\.alapage\.com\/-\/Liste\/DVD\/mot_(?:art_nomprenom|real_nomprenom|gen_libelle)=[^\/]*\/\?id=[0-9]*&donnee_appel=ALAPAGE[^"]*?" class="roll">([^<]*)<\/A>/$1/gi;
+ $html =~ s|<A .*?mot_gen_libelle=.*?>(.*?)</A>|$1|gi;
+ $html =~ s/<TD valign="top" class="tx12noir[^"]*">([^<]*)<\/TD>[^<]*<TD>([^<]*)<\/TD>/<td>$1 $2<\/td>/gi;
+ $html =~ s/<td class="tx12grisbold" align="center" bgcolor="\#E6E6E8">([^<]*)<\/td>[^<]*<TD width="2"><IMG src="\/turbo\/templates\/img\/pix\.gif" width="2" height="25" border="0" alt=""><\/TD>[^<]*<td class="tx10noir" align="center" bgcolor="\#F4F4F6" colspan="3">([0-9]* mn)<\/td>/<td>$1 $2<\/td>/gi;
+#>>>
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://alapage.com/mx/?type=41&tp=L&fulltext=" . $word;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://alapage.com" . $url;
+ }
+
+ sub getName
+ {
+ return "Alapage.com";
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ sub getDefaultPictureSuffix
+ {
+ return '.jpg';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAllmovie.pm b/lib/gcstar/GCPlugins/GCfilms/GCAllmovie.pm
new file mode 100644
index 0000000..e8117c5
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAllmovie.pm
@@ -0,0 +1,431 @@
+package GCPlugins::GCfilms::GCAllmovie;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginAllmovie;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if (($tagname eq "a") && ($self->{isFilm}))
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ $self->{isFilm} = 0;
+ }
+ if ($tagname eq "td")
+ {
+ if ($attr->{style} =~ m/284px/)
+ {
+ $self->{isFilm} = 1;
+ }
+ elsif ($attr->{style} =~ m/70px/)
+ {
+ $self->{isYear} = 1;
+ }
+ elsif ($attr->{style} =~ m/190px/)
+ {
+ $self->{isDirector} = 1;
+ }
+ }
+ elsif ($tagname eq "tr")
+ {
+ $self->{isFound} = 1;
+ }
+ elsif ($tagname eq "title")
+ {
+ $self->{insideHTMLtitle} = 1;
+ }
+ }
+ else
+ {
+ if (($tagname eq "span") && ($attr->{class} eq "title"))
+ {
+ $self->{insideTitle} = 1;
+ }
+ elsif (
+ ($tagname eq "div")
+ && ( ($attr->{id} eq "left-sidebar-title")
+ || ($attr->{id} eq "left-sidebar-title-small"))
+ )
+ {
+ $self->{insideLeftSidebarTitle} = 1;
+ }
+ elsif ($tagname eq "a")
+ {
+ if ($attr->{href} =~ m/sql=B/)
+ {
+ $self->{insideActors} = 1;
+ }
+ elsif ($self->{insideDirectorList})
+ {
+ $self->{insideDirector} = 1;
+ }
+ elsif ($self->{insideYearRuntime})
+ {
+ $self->{insideYear} = 1;
+ $self->{insideYearRuntime} = 0;
+ }
+ elsif ($self->{insideCountriesRating})
+ {
+ $self->{insideCountry} = 1;
+ $self->{insideCountriesRating} = 0;
+ }
+ elsif ($self->{nextIsSeries})
+ {
+ $self->{insideSeries} = 1;
+ $self->{nextIsSeries} = 0;
+ }
+ }
+ elsif ($tagname eq "img")
+ {
+ if ($attr->{src} =~ /http\:\/\/image\.allmusic\.com/)
+ {
+ $self->{curInfo}->{image} = ($attr->{src});
+ }
+ elsif ($self->{insideRatingStars})
+ {
+ $attr->{title} =~ /([\d\.]+) Stars/;
+ $self->{curInfo}->{ratingpress} = $1 * 2;
+ $self->{insideRatingStars} = 0;
+ }
+ }
+ elsif ($tagname eq "li")
+ {
+ if ($self->{insideGenreList})
+ {
+ $self->{insideGenre} = 1;
+ }
+ }
+ elsif ($tagname eq "td")
+ {
+ if ( ($self->{insideAKA})
+ && ($attr->{class} =~ m/formed-sub/))
+ {
+ $self->{insideOtherTitles} = 1;
+ }
+ elsif ($self->{nextIsRating})
+ {
+ $self->{insideRating} = 1;
+ $self->{nextIsRating} = 0;
+ }
+ elsif ($self->{nextIsRuntime})
+ {
+ $self->{insideTime} = 1;
+ $self->{nextIsRuntime} = 0;
+ }
+ elsif ($attr->{colspan} == 2)
+ {
+ if ($attr->{class} eq "large-list-title")
+ {
+ }
+ else
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ }
+ elsif ($attr->{class} eq "rating-stars")
+ {
+ $self->{insideRatingStars} = 1;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ if ($tagname eq "td")
+ {
+ $self->{insideSynopsis} = 0;
+ }
+ if ($tagname eq "div")
+ {
+ $self->{insideLeftSidebarTitle} = 0;
+ }
+ if ($tagname eq "table")
+ {
+ $self->{insideGenreList} = 0;
+ $self->{insideAKA} = 0;
+ $self->{curInfo}->{original} =~ s/(, )$//;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+ return if ((length($origtext) == 0) || ($origtext eq " "));
+
+ $origtext =~ s/&#34;/"/g;
+ $origtext =~ s/&#179;/3/g;
+ $origtext =~ s/&#[0-9]*;//g;
+ $origtext =~ s/\n//g;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if (($self->{insideHTMLtitle}))
+ {
+ if ($origtext !~ m/Results/)
+ {
+ $self->{parsingEnded} = 1;
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+ $self->{insideHTMLtitle} = 0;
+ }
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ if ($self->{isYear})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $origtext
+ if $origtext =~ m/^[0-9]{4}?/;
+ $self->{isYear} = 0;
+ }
+ if ($self->{isDirector})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} = $origtext;
+ $self->{isDirector} = 0;
+ }
+ if ($self->{isInfo})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1
+ if $origtext =~ m|\(([0-9]*)(/I+)?\)|;
+ $self->{isInfo} = 0;
+ }
+ }
+ else
+ {
+ if ($self->{insideLeftSidebarTitle})
+ {
+ if ($origtext eq "Genres")
+ {
+ $self->{insideGenreList} = 1;
+ $self->{insideLeftSidebarTitle} = 0;
+ }
+ elsif ($origtext eq "Director")
+ {
+ $self->{insideDirectorList} = 1;
+ $self->{insideLeftSidebarTitle} = 0;
+ }
+ elsif ($origtext eq "Year")
+ {
+ $self->{insideYearRuntime} = 1;
+ $self->{insideLeftSidebarTitle} = 0;
+ }
+ elsif ($origtext eq "Countries")
+ {
+ $self->{insideCountriesRating} = 1;
+ $self->{insideLeftSidebarTitle} = 0;
+ }
+ elsif ($origtext eq "AKA")
+ {
+ $self->{insideAKA} = 1;
+ $self->{insideLeftSidebarTitle} = 0;
+ }
+ }
+ elsif ($origtext =~ /Is part of the series:$/)
+ {
+ $self->{nextIsSeries} = 1;
+ }
+ if ($self->{insideActors})
+ {
+ $self->{curInfo}->{actors} .= $origtext . ', '
+ if ($self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ $self->{insideActors} = 0;
+ }
+
+ if ($self->{insideYear})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideYear} = 0;
+ $self->{nextIsRuntime} = 1;
+ }
+ if ($self->{insideTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideTitle} = 0;
+ }
+ elsif ($self->{insideGenre})
+ {
+ $self->{curInfo}->{genre} .= $self->capWord($origtext) . ',';
+ $self->{insideGenre} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{insideDirector} = 0;
+ $self->{insideDirectorList} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} .= $origtext;
+ }
+ elsif ($self->{insideCountry})
+ {
+ $self->{curInfo}->{country} = $origtext;
+ $self->{insideCountry} = 0;
+ $self->{nextIsRating} = 1;
+ }
+ elsif ($self->{insideTime})
+ {
+ $self->{curInfo}->{time} = $origtext;
+ $self->{curInfo}->{time} =~ s/.[0-9]*?://;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideRating})
+ {
+ $self->{curInfo}->{age} = 1
+ if ($origtext eq 'Unrated') || ($origtext eq 'Open');
+ $self->{curInfo}->{age} = 2
+ if ($origtext eq 'G') || ($origtext eq 'Approved');
+ $self->{curInfo}->{age} = 5
+ if ($origtext eq 'PG') || ($origtext eq 'M') || ($origtext eq 'GP');
+ $self->{curInfo}->{age} = 13 if $origtext eq 'PG13';
+ $self->{curInfo}->{age} = 17 if $origtext eq 'R';
+ $self->{curInfo}->{age} = 18
+ if ($origtext eq 'NC17') || ($origtext eq 'X');
+ $self->{insideRating} = 0;
+ }
+ elsif ($self->{insideOtherTitles})
+ {
+ $self->{tempOriginal} = $origtext;
+ $self->{tempOriginal} =~ s/\s*$//;
+ $self->{tempOriginal} =~ s/^\s*//;
+
+ $self->{curInfo}->{original} .= $self->{tempOriginal} . ', ';
+ $self->{insideOtherTitles} = 0;
+ }
+ elsif ($self->{insideSeries})
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{curInfo}->{serie} =~ s/( \[.*\])//;
+ $self->{insideSeries} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ $html =~ s/"&#34;/'"/g;
+ $html =~ s/&#34;"/"'/g;
+ $html =~ s|</a></b><br>|</a><br>|;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ my $wordFiltered = $word;
+
+ # Allmovie doesn't return correct results if searching with a prefix like 'the'
+ $wordFiltered =~ s/^(the|a)?[+\s]+[^ a-zA-Z0-9]*\s*//i;
+# return ('http://allmovie.com/search/all', ['q' => $wordFiltered,'submit' => 'SEARCH']);
+ return ('http://allmovie.com/search/all/' . $wordFiltered);
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url =~ /^http:/;
+ return "http://allmovie.com" . $url;
+ }
+
+ sub getName
+ {
+ return "Allmovie";
+ }
+
+ sub getAuthor
+ {
+ return 'Zombiepig';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAllocine.pm b/lib/gcstar/GCPlugins/GCfilms/GCAllocine.pm
new file mode 100644
index 0000000..db37774
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAllocine.pm
@@ -0,0 +1,403 @@
+package GCPlugins::GCfilms::GCAllocine;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginAllocine;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{insideResults} eq 1)
+ {
+ if ( ($tagname eq "a")
+ && ($attr->{href} =~ /^\/film\/fichefilm_gen_cfilm=/)
+ && ($self->{isMovie} eq 0))
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 0;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ elsif (($tagname eq "td") && ($self->{isMovie} eq 1))
+ {
+ $self->{isMovie} = 2;
+ }
+ elsif (($tagname eq "a") && ($self->{isMovie} eq 2))
+ {
+ $self->{isMovie} = 3;
+ }
+ elsif (($tagname eq "br") && ($self->{isMovie} eq 3))
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} =~ s/^\s*//;
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} =~ s/\s*$//;
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} =~ s/\s+/ /g;
+ $self->{isMovie} = 4;
+ }
+ elsif (($tagname eq "span")
+ && ($attr->{class} eq "fs11")
+ && ($self->{isMovie} eq 4))
+ {
+ $self->{isInfo} = 1;
+ $self->{isMovie} = 0;
+ }
+ elsif (($tagname eq "br") && ($self->{isInfo} eq 1))
+ {
+ $self->{isInfo} = 2;
+ }
+ elsif (($tagname eq "br") && ($self->{isInfo} eq 2))
+ {
+ $self->{isInfo} = 3;
+ }
+ }
+ }
+ else
+ {
+ if (($tagname eq "div") && ($attr->{class} eq "poster"))
+ {
+ $self->{insidePicture} = 1;
+ }
+ elsif (($tagname eq "img") && ($self->{insidePicture} eq 1))
+ {
+ my $src = $attr->{src};
+ if (!$self->{curInfo}->{image})
+ {
+ if ($src =~ /r_160_240/)
+ {
+ $self->{curInfo}->{image} = $src;
+ }
+ else
+ {
+ $self->{curInfo}->{image} = "empty";
+ }
+ }
+ }
+ elsif ($tagname eq "h1")
+ {
+ $self->{insideTitle} = 1;
+ }
+ elsif (($tagname eq "span") && ($self->{insideDate} eq 1))
+ {
+ $self->{insideDate} = 2;
+ }
+ elsif (($tagname eq "span") && ($attr->{itemprop} eq "duration"))
+ {
+ $self->{insideTime} = 1;
+ }
+ elsif (($tagname eq "span") && ($self->{insideDirector} eq 1))
+ {
+ $self->{insideDirector} = 2;
+ }
+ elsif (($tagname eq "a") && ($self->{insideActor} eq 1))
+ {
+ $self->{insideActor} = 2;
+ }
+ elsif (($tagname eq "span") && ($self->{insideGenre} eq 1))
+ {
+ $self->{insideGenre} = 2;
+ }
+ elsif (($tagname eq "span") && ($self->{insideCountry} eq 1))
+ {
+ $self->{insideCountry} = 2;
+ }
+ elsif (($tagname eq "span") && ($attr->{class} eq "note") && ($self->{insidePressRating} eq 1))
+ {
+ $self->{insidePressRating} = 2;
+ }
+ elsif (($tagname eq "div") && ($attr->{class} eq "breaker"))
+ {
+ $self->{insidePressRating} = 0;
+ }
+ elsif (($tagname eq "p") && ($attr->{itemprop} eq "description"))
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ elsif (($tagname eq "td") && ($self->{insideOriginal} eq 1))
+ {
+ $self->{insideOriginal} = 2;
+ }
+
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+
+ if ($tagname eq "li")
+ {
+ $self->{insideDirector} = 0;
+ $self->{insideActor} = 0;
+ $self->{insideGenre} = 0;
+ }
+ elsif ($tagname eq "div")
+ {
+ $self->{insideCountry} = 0;
+ $self->{insideSynopsis} = 0;
+ $self->{insideActor} = 0;
+ }
+ elsif ($tagname eq "th")
+ {
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($tagname eq "table")
+ {
+ $self->{insideResults} = 0;
+ }
+
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if (($origtext =~ m/(\d+) r..?sultats? trouv..?s? dans les titres de films/) && ($1 > 0))
+ {
+ $self->{insideResults} = 1;
+ }
+ if ($self->{isMovie} eq 3)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} .= $origtext;
+ }
+ if ($self->{isInfo} eq 1)
+ {
+ if ($origtext =~ /\s*([0-9]{4})/)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1;
+ }
+ }
+ elsif ($self->{isInfo} eq 2)
+ {
+ if ($origtext =~ /^\s*de (.*)/)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} = $1;
+ }
+ }
+ elsif ($self->{isInfo} eq 3)
+ {
+ if ( ($origtext =~ m/^\s*avec (.*)/)
+ && (!$self->{itemsList}[ $self->{itemIdx} ]->{actors}))
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} = $1;
+ }
+ $self->{isInfo} = 0;
+ }
+ }
+ else
+ {
+ my ($self, $origtext) = @_;
+ $origtext =~ s/[\r\n]//g;
+ $origtext =~ s/^\s*//;
+ $origtext =~ s/\s*$//;
+
+ if ($self->{insideTitle} eq 1)
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideTitle} = 0;
+ }
+ elsif (($self->{insideDate} eq 2) && (length($origtext) > 1))
+ {
+ $self->{curInfo}->{date} = $origtext
+ if !($origtext =~ /inconnu/);
+ $self->{insideDate} = 0;
+ }
+ elsif (($origtext =~ /^Date de sortie/)
+ && (!$self->{curInfo}->{date}))
+ {
+ $self->{insideDate} = 1;
+ }
+ elsif (($origtext =~ /^Date de reprise/)
+ && (!$self->{curInfo}->{date}))
+ {
+ $self->{insideDate} = 1;
+ }
+ elsif ($self->{insideTime} eq 1)
+ {
+ $origtext =~ /(\d+)h\s*(\d+)m/;
+ my $time = ($1*60) + $2;
+ $self->{curInfo}->{time} = $time." m.";
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideDirector} eq 2)
+ {
+ $origtext = ", " if $origtext =~ m/^,/;
+ $self->{curInfo}->{director} .= $origtext;
+ }
+ elsif ($origtext =~ /^R..?alis..? par/)
+ {
+ $self->{insideDirector} = 1;
+ }
+ elsif ($self->{insideActor} eq 2)
+ {
+ $origtext =~ s/plus//;
+ $origtext = "," if $origtext =~ m/^,/;
+ $self->{curInfo}->{actors} .= $origtext;
+ }
+ elsif ($origtext =~ /^Avec/)
+ {
+ $self->{insideActor} = 1;
+ }
+ elsif ($self->{insideGenre} eq 2)
+ {
+ $origtext = "," if $origtext =~ m/^,/;
+ $self->{curInfo}->{genre} .= $origtext;
+ }
+ elsif ($origtext =~ /^[\s\n]*Genre/)
+ {
+ $self->{insideGenre} = 1;
+ }
+ elsif ($self->{insideCountry} eq 2)
+ {
+ $origtext = "," if $origtext =~ m/^,/;
+ $self->{curInfo}->{country} .= $origtext;
+ }
+ elsif ($origtext =~ /Nationalité/)
+ {
+ $self->{insideCountry} = 1;
+ }
+ elsif ($origtext =~ /^Presse$/)
+ {
+ $self->{insidePressRating} = 1;
+ }
+ elsif ($self->{insidePressRating} eq 2)
+ {
+ $origtext =~ s/,/./;
+ $self->{curInfo}->{ratingpress} .= $origtext * 2;
+ }
+ elsif ($origtext =~ /^Interdit aux moins de (\d+) ans/)
+ {
+ $self->{curInfo}->{age} = $1;
+ }
+ elsif ($self->{insideSynopsis} eq 1)
+ {
+ $self->{curInfo}->{synopsis} .= $origtext;
+ }
+ elsif ($self->{insideOriginal} eq 2)
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{insideOriginal} = 0;
+ }
+ elsif ($origtext =~ /^Titre original/)
+ {
+ $self->{insideOriginal} = 1;
+ }
+
+
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{insideResults} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+ $self->{actorsCounter} = 0;
+
+ bless($self, $class);
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ # f=3 ?
+ # return "http://www.allocine.fr/recherche/?q=$word&f=3&rub=1";
+ return "http://www.allocine.fr/recherche/1/?q=$word";
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.allocine.fr" . $url;
+ }
+
+ sub getName
+ {
+ return "Allocine.fr";
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getCharset
+ {
+ # return "UTF-8"; # For 1.5.0 Win32
+ return "ISO-8859-1"; # For 1.5.0 Win32 with /lib/gcstar/GCPlugins/ ver.1.5.9svn
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAlpacineES.pm b/lib/gcstar/GCPlugins/GCfilms/GCAlpacineES.pm
new file mode 100644
index 0000000..75c6854
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAlpacineES.pm
@@ -0,0 +1,435 @@
+package GCPlugins::GCfilms::GCAlpacineES;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginAlpacineES;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+
+ # text
+ # Called each time some plain text (between tags) is processed.
+ # $origtext is the read text.
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ # Código para procesar el resultado de la busqueda
+ if ($self->{parsingList}){
+ # Guardamos la fecha.
+ if ($self->{inside}->{li} && $self->{insideInfos}){
+ $origtext =~ /. \(([0-9]{4})\)/;
+ $self->{itemsList}[$self->{itemIdx}]->{date} = $origtext;
+ }
+ # Guardamos el título
+ if ($self->{inside}->{a} && $self->{insideInfos}){
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ }
+ }
+
+ else{
+ # Eliminamos espacios iniciales, espacios dobles y espacios finales del texto
+ $origtext =~ s/^\s*|\s{2,}|\s*$//g;
+ # Estamos procesando el titulo
+ if ($self->{insideTitle})
+ {
+ # Obtenemos titulo y fecha
+ $origtext =~ /(.*) \(([0-9]{4})\)/;
+ $self->{curInfo}->{title} = $1;
+ $self->{curInfo}->{date} = $2;
+ $self->{insideTitle} = 0;
+ return;
+ }
+
+ # Si existe el hipervinculo "Ampliar" cambiamos la imagen por la ampliada
+ if ($self->{inside}->{a} && $origtext eq "Ampliar"){
+ $self->{curInfo}->{image} =~ /(http:\/\/img.alpacine.com\/carteles\/.*)-[0-9]*(\.jpg)/;
+ $self->{curInfo}->{image} = $1 . $2;
+ return;
+ }
+ # Estamos en la puntuación real
+ if($self->{insideRating}){
+ $self->{curInfo}->{ratingpress} = int( $origtext + 0.5 );
+ $self->{insideRating} = 0;
+ }
+ # No hay puntuación real, asignamos 0 por defecto
+ if($self->{inside}->{div}){
+ if($origtext =~ /Esperando \d votos/){
+ $self->{curInfo}->{ratingpress} = 0;
+ }
+ }
+ # Procesamos el titulo original
+ if ($self->{isOrigTit} eq 1) {
+ $self->{isOrigTit} = 0;
+ $self->{curInfo}->{original} = $origtext;
+ return;
+ }
+ # Procesamos los generos (gen, gen, gen, gen...)
+ if ($self->{isGenres} eq 1) {
+ if($origtext ne ""){
+ # hacemos uso de sus propias comas
+ $self->{curInfo}->{genre} .= $origtext;
+ }
+ else{
+ $self->{isGenres} = 0;
+ }
+ return;
+ }
+ # Procesamos el país
+ if ($self->{isCountry} eq 1) {
+ $self->{isCountry} = 0;
+ $self->{curInfo}->{country} = $origtext;
+ return;
+ }
+ # Procesamos la duración
+ if ($self->{isTime} eq 1) {
+ $self->{isTime} = 0;
+ $self->{curInfo}->{time} = $origtext;
+ return;
+ }
+ # Procesamos los directores
+ if ($self->{isDirector} eq 1) {
+ if($origtext ne ""){
+ if($self->{curInfo}->{director} eq ""){
+ $self->{curInfo}->{director} .= $origtext;
+ }
+ else{
+ $self->{curInfo}->{director} .= ", $origtext";
+ }
+ }
+ else{
+ $self->{isDirector} = 0;
+ }
+ return;
+ }
+ # Actores
+ if ($self->{isActors} eq 1) {
+ if($origtext ne ""){
+ if($self->{curInfo}->{actors} eq ""){
+ $self->{curInfo}->{actors} .= $origtext;
+ }
+ else{
+ $self->{curInfo}->{actors} .= ", $origtext";
+ }
+ }
+ else{
+ $self->{isActors} = 0;
+ }
+ return;
+ }
+ # Procesamos la Sinopsis
+ if ($self->{isSynopsis} eq 1) {
+ $self->{isSynopsis} = 0;
+ $self->{curInfo}->{synopsis} = $origtext;
+ return;
+ }
+ # Procesamos los premios
+ if ($self->{isAwards} eq 1) {
+ $self->{isAwards} = 0;
+ $self->{curInfo}->{synopsis} = $self->{curInfo}->{synopsis}. "\n\nPremios:\n\t".$origtext;
+ $self->{insideInfos} = 0;
+ return;
+ }
+
+ # Condiciones para procesar los campos en el siguiente ciclo
+ if($self->{insideInfos}){
+ $self->{isOrigTit} = 1 if $origtext eq "Título original:";
+ $self->{isGenres} = 1 if $origtext eq "Género:";
+ $self->{isCountry} = 1 if $origtext eq "País:";
+ $self->{isTime} = 1 if $origtext eq "Duración:";
+ $self->{isDirector} = 1 if $origtext eq "Dirección:";
+ $self->{isActors} = 1 if $origtext eq "Interpretación:";
+ $self->{isSynopsis} = 1 if $origtext eq "Sinopsis:";
+ $self->{isAwards} = 1 if $origtext eq "Premios:";
+ }
+ }
+ }
+
+
+ # end
+ # Called each time a HTML tag ends.
+ # $tagname is the tag name.
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+
+ # Código para procesar el resultado de la busqueda
+ #if ($self->{parsingList}){
+ #}
+ # Código para procesar la información de la pelicula seleccionada
+ #else {
+ #}
+ }
+
+ # In processing functions below, self->{parsingList} can be used.
+ # If true, we are processing a search results page
+ # If false, we are processing a item information page.
+
+ # $self->{inside}->{tagname} (with correct value for tagname) can be used to test
+ # if we are in the corresponding tag.
+
+ # You have a counter $self->{itemIdx} that have to be used when processing search results.
+ # It is your responsability to increment it!
+
+ # When processing search results, you have to fill the available fields for results
+ #
+ # $self->{itemsList}[$self->{movieIdx}]->{field_name}
+ #
+ # When processing a movie page, you need to fill the fields (if available)
+ # in $self->{curInfo}.
+ #
+ # $self->{curInfo}->{field_name}
+
+ # start
+ # Called each time a new HTML tag begins.
+ # $tagname is the tag name.
+ # $attr is reference to an associative array of tag attributes.
+ # $attrseq is an array reference containing all the attributes name.
+ # $origtext is the tag text as found in source file
+ # Returns nothing
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+ # Código para procesar el resultado de la busqueda para generar el listado
+ if ($self->{parsingList})
+ {
+ # Comprobamos si estamos dentro de un título utilizando el atributo class
+ if( ($tagname eq "li" ) && ($attr->{class} ne "mas" )){
+ $self->{itemIdx}++;
+ $self->{insideInfos} = 1 ;
+ return;
+ }
+ if( ($tagname eq "li" ) && ($attr->{class} eq "mas" )){
+ $self->{insideInfos} = 0;
+ return;
+ }
+ # Si estamos en un título y encontramos una tag a, es un enlace a ficha
+ if ($tagname eq "a" && $self->{insideInfos}){
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.alpacine.com".$attr->{href};
+ return;
+ }
+ }
+ # Código para procesar la información de la pelicula seleccionada
+ else {
+ if ($tagname eq "h1"){
+ $self->{insideTitle} = 1;
+ return;
+ }
+ # Si estamos dentro de una imagen y el src es el del thumb lo asignamos como imagen
+ if ($tagname eq "img")
+ {
+ # Extraemos la dirección de la imagen thumb
+ if ($attr->{src} =~ /http:\/\/img.alpacine.com\/carteles\/.*\.jpg/)
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+ }
+ return;
+ }
+
+ if ($tagname eq "div" && $attr->{class} eq "voto"){
+ $self->{insideRating} = 1;
+ return;
+ }
+
+ if( $tagname eq "div" && $attr->{class} eq "datos" ){
+ $self->{insideInfos} = 1 ;
+ return;
+ }
+ }
+ }
+
+ # preProcess
+ # Called before each page is processed. You can use it to do some substitutions.
+ # $html is the page content.
+ # Returns modified version of page content.
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ # Anulamos el html si coincide con el patron de no resultados
+ if($html =~ /^.*No hay resultados para.*$/s){
+ $html = "";
+ return $html;
+ }
+
+ # Recorta el código del listado de resultados, quedandose solo con la parte que nos interesa del html
+ # el modificador s/.../$1/s trata el flujo como una sola cadena y reemplaza todo el cuerpo con la parte que nos interesa
+ if($html =~ s/^.*<div class="titulo">Pel.culas <span class="resultados">\([0-9]* resultado[s]?\)<\/span><\/div><ul>(<li><a.*<\/a> \([0-9]*\)<\/li>).*$/$1/s){
+ return $html;
+ }
+
+ # Recorta el código de la ficha, quedandose solo con la parte que nos interesa del html
+ # Comprobamos si la pelicula contiene o no premios y nos quedamos con lo que corresponda
+ if($html =~ /^.*<div class="titulo">Premios:.*más\.\.\.<\/a><\/div><\/div>.*$/s){
+ $html =~ s/^.*<div id="titulo">(.*<\/div><\/div>.*\n.*<div class="datox"><div class="titulo">Premios:.*)más\.\.\.<\/a><\/div><\/div>.*$/$1/s;
+ }
+ else{
+ $html =~ s/^.*<div id="titulo">(.*<\/div><\/div>)\n\n\t\t\t\t\n\n\t\t\t\t<hr \/>.*$/$1/s;
+ }
+ return $html;
+ }
+
+ # changeUrl
+ # Can be used to change URL if item URL and the one used to
+ # extract information are different.
+ # Return the modified URL.
+ #sub changeUrl
+ #{
+ # my ($self, $url) = @_;
+ # return $url;
+ #}
+
+ # getExtra
+ # Used if the plugin wants an extra column to be displayed in search results
+ # Return the column title or empty string to hide the column.
+ #sub getExtra
+ #{
+ # return 'Extra';
+ #}
+
+
+ # getLang
+ # Used to fill in plugin list with user language plugins
+ # Return the language used for this site (2 letters code).
+ sub getLang
+ {
+ return "ES";
+ }
+
+
+ # getAuthor
+ # Used to display the plugin author in GUI.
+ # Returns the plugin author name.
+ sub getAuthor
+ {
+ return "DoVerMan";
+ }
+
+
+ # getName
+ # Used to display plugin name in GUI.
+ # Returns the plugin name.
+ sub getName
+ {
+ return 'Alpacine';
+ }
+
+
+ # getCharset
+ # Used to convert charset in web pages.
+ # Returns the charset as specified in pages.
+ #sub getCharset
+ #{
+ # my $self = shift;
+ # # Charset de la web
+ # return "UTF-8";
+ #}
+
+
+ # getItemUrl
+ # Used to get the full URL of an item page.
+ # Useful when url on results pages are relative.
+ # $url is the URL as found with a search.
+ # Returns the absolute URL.
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url;
+ }
+
+
+ # getSearchUrl
+ # Used to get the URL that to be used to perform searches.
+ # $word is the query
+ # Returns the full URL.
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ # Hack para evitar problemas con acentos
+ $word =~ s/%E1/a/g;
+ $word =~ s/%E9/e/g;
+ $word =~ s/%ED/i/g;
+ $word =~ s/%F3/o/g;
+ $word =~ s/%FA/u/g;
+ $word =~ s/%C1/A/g;
+ $word =~ s/%C9/E/g;
+ $word =~ s/%CD/I/g;
+ $word =~ s/%D3/O/g;
+ $word =~ s/%DA/U/g;
+
+ return "http://www.alpacine.com/buscar/?buscar=" . $word;
+
+ }
+
+
+ # Constructor
+ sub new
+ {
+ # Inicialización
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ # Campos que devuelve el plugin (1 si, 0 no). Son los que apareceran
+ # en el listado de resultados
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ # Indica si estamos procesando información útil
+ $self->{insideInfos} = 0;
+
+ # Indican el estado del procesado del listado de resultados
+ $self->{insideRating} = 0;
+ $self->{insideTitle} = 0;
+
+ $self->{isOrigTit} = 0;
+ $self->{isGenres} = 0;
+ $self->{isCountry} = 0;
+ $self->{isTime} = 0;
+ $self->{isDirector} = 0;
+ $self->{isActors} = 0;
+ $self->{isSynopsis} = 0;
+ $self->{isAwards} = 0;
+
+ return $self;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAmazon.pm b/lib/gcstar/GCPlugins/GCfilms/GCAmazon.pm
new file mode 100644
index 0000000..8692a1b
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAmazon.pm
@@ -0,0 +1,281 @@
+package GCPlugins::GCfilms::GCAmazon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsAmazonCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginAmazon;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsAmazonPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingEnded})
+ {
+ if ($self->{itemIdx} < 0)
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'input')
+ {
+ $self->{beginParsing} = 1
+ if $attr->{src} =~ /go-button-search/;
+ }
+ return if ! $self->{beginParsing};
+ if ($tagname eq 'srtitle')
+ {
+ $self->{isTitle} = 1;
+ }
+ elsif ($tagname eq 'publication')
+ {
+ $self->{isPublication} = 1;
+ }
+ elsif ($tagname eq 'actors')
+ {
+ $self->{isActors} = 1;
+ }
+ if ($tagname eq 'a')
+ {
+ my $urlId;
+ if ($urlId = $self->isItemUrl($attr->{href}))
+ {
+ $self->{isTitle} = 2 if $self->{isTitle} eq '1';
+ return if $self->{alreadyRetrieved}->{$urlId};
+ $self->{alreadyRetrieved}->{$urlId} = 1;
+ $self->{currentRetrieved} = $urlId;
+ my $url = $attr->{href};
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if (($tagname eq "img") && (!$self->{curInfo}->{image}))
+ {
+ $self->{curInfo}->{image} = $self->extractImage($attr);
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'content'))
+ {
+ $self->{insideContent} = 1;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'productDescriptionWrapper'))
+ {
+ $self->{insideSynopsis} = 1
+ if (!$self->{curInfo}->{synopsis});
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'emptyClear'))
+ {
+ $self->{insideSynopsis} = 0;
+ }
+ elsif (($tagname eq "span") && ($self->{insideAge}) && ($attr->{class} =~ /medSprite/))
+ {
+ $attr->{class} =~ s/\s*$//;
+ $self->{curInfo}->{age} = 2 if ($attr->{class} =~ m/G$/);
+ $self->{curInfo}->{age} = 5 if ($attr->{class} =~ m/PG$/);
+ $self->{curInfo}->{age} = 13 if ($attr->{class} =~ m/PG13$/);
+ $self->{curInfo}->{age} = 18 if ($attr->{class} =~ m/R$/);
+ $self->{insideAge} = 0;
+ }
+ elsif ($tagname eq "span")
+ {
+ $self->{insideNameAndDate} = 1 if $attr->{id} eq "btAsinTitle";
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ if ($tagname eq "li")
+ {
+ $self->{insideActors} = 0;
+ $self->{insideDirector} = 0;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+ return if GCPlugins::GCstar::GCPluginAmazonCommon::text(@_);
+ return if length($origtext) < 2;
+ return if ($self->{parsingEnded});
+ if ($self->{parsingList})
+ {
+ return if ! $self->{beginParsing};
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0;
+ return;
+ }
+ elsif ($self->{isPublication})
+ {
+ $origtext =~ m/([0-9]{4})/;
+ $self->{itemsList}[$self->{itemIdx}]->{date} = $1;
+ $self->{isPublication} = 0;
+ return;
+ }
+ elsif ($self->{isActors})
+ {
+ $origtext =~ s/^\s*//;
+ $origtext =~ s/\s*$//;
+ $self->{itemsList}[$self->{itemIdx}]->{actors} = $origtext
+ if ! $self->{itemsList}[$self->{itemIdx}]->{actors};
+ $self->{isActors} = 0;
+ return;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}/ /g;
+
+ if ($self->{insideNameAndDate})
+ {
+ if ($origtext =~ m/(.*) \(([0-9]{4})\)/)
+ {
+ $self->{curInfo}->{title} = $1;
+ $self->{curInfo}->{date} = $2;
+ }
+ $self->{insideNameAndDate} = 0;
+ }
+ elsif (($self->{insideActors}) && ($origtext !~ /^,/))
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/\s+,/,/;
+ if ($self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS)
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext];
+ $self->{actorsCounter}++;
+ }
+ }
+ elsif (($self->{insideDirector}) && ($origtext !~ /^,/))
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/,.$//;
+ $self->{curInfo}->{director} .= ", "
+ if $self->{curInfo}->{director};
+ $self->{curInfo}->{director} .= $origtext;
+ }
+ elsif ($self->{insideTime})
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/\n//g;
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideGenre})
+ {
+ $origtext =~ s/\s*$//;
+ $self->{curInfo}->{genre} = $origtext;
+ $self->{insideGenre} = 0;
+ }
+ elsif (($self->{insideSynopsis}) && ($origtext ne ''))
+ {
+ $self->{curInfo}->{synopsis} .= $origtext;
+ }
+ elsif ($self->{inside}->{b})
+ {
+ $self->{insideActors} = 1 if $origtext =~ /Actors:/;
+ $self->{insideDirector} = 1 if $origtext =~ /Directors:/;
+ $self->{insideTime} = 1 if $origtext =~ /Run Time:/;
+ $self->{insideGenre} = 1 if $origtext =~ /Genre:/;
+ $self->{insideAge} = 1 if $origtext =~ /Rating:/;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 1,
+ };
+
+ $self->{suffix} = 'com';
+
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ $html = $self->SUPER::preProcess($html);
+ if ($self->{parsingList})
+ {
+ $self->{isItem} = 0;
+ $html =~ s|~(.*?)<span class="bindingBlock">\(<span class="binding">(.*?)</span>( - .*?[0-9]{4})?\)</span>|<actors>$1</actors><format>$2</format><publication>$3</publication>|gsm;
+ }
+ else
+ {
+ $html =~ s/(<i>|<\/i>)//gim;
+ $html =~ s/<p>/\n/gim;
+ $html =~ s|</p>|\n|gim;
+ $html =~ s/(<ul>|<\/ul>)/\n/gim;
+ $html =~ s/<li>([^<])/- $1/gim;
+ $html =~ s|([^>])</li>|$1\n|gim;
+ $html =~ s|<br ?/?>|\n|gi;
+ $html =~ s|<a href="/gp/imdb/[^"]*">(.*?)</a>|$1|gm;
+ $html =~ s|<a href="[^"]*search-alias=dvd&field-keywords=[^"]*">(.*?)</a>|$1|gm;
+ }
+ $self->{parsingEnded} = 0;
+ $self->{alreadyRetrieved} = {};
+ $self->{beginParsing} = 0;
+
+ return $html;
+ }
+
+ sub getName
+ {
+ return "Amazon (US)";
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAmazonDE.pm b/lib/gcstar/GCPlugins/GCfilms/GCAmazonDE.pm
new file mode 100644
index 0000000..fab2b9f
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAmazonDE.pm
@@ -0,0 +1,291 @@
+package GCPlugins::GCfilms::GCAmazonDE;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsAmazonCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginAmazonDE;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsAmazonPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ if ($self->{itemIdx} < 0)
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'input')
+ {
+ $self->{beginParsing} = 1
+ if $attr->{src} =~ /go-button-search/;
+ }
+ return if ! $self->{beginParsing};
+ return if ! $self->{beginParsing};
+ if ($tagname eq 'srtitle')
+ {
+ $self->{isTitle} = 1;
+ }
+ elsif ($tagname eq 'publication')
+ {
+ $self->{isPublication} = 1;
+ }
+ elsif ($tagname eq 'actors')
+ {
+ $self->{isActors} = 1;
+ }
+ if ($tagname eq 'a')
+ {
+ my $urlId;
+ if ($urlId = $self->isItemUrl($attr->{href}))
+ {
+ $self->{isTitle} = 2 if $self->{isTitle} eq '1';
+ return if $self->{alreadyRetrieved}->{$urlId};
+ $self->{alreadyRetrieved}->{$urlId} = 1;
+ $self->{currentRetrieved} = $urlId;
+ my $url = $attr->{href};
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if (($tagname eq "img") && (!$self->{curInfo}->{image}))
+ {
+ $self->{curInfo}->{image} = $self->extractImage($attr);
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'content'))
+ {
+ $self->{insideContent} = 1;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'productDescriptionWrapper'))
+ {
+ $self->{insideSynopsis} = 1
+ if (!$self->{curInfo}->{synopsis});
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'emptyClear'))
+ {
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($tagname eq "span")
+ {
+ $self->{insideNameAndDate} = 1 if $attr->{id} eq "btAsinTitle";
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ if ($tagname eq "li")
+ {
+ $self->{insideActors} = 0;
+ $self->{insideDirector} = 0;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if GCPlugins::GCstar::GCPluginAmazonCommon::text(@_);
+ return if length($origtext) < 2;
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ return if ! $self->{beginParsing};
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0;
+ return;
+ }
+ elsif ($self->{isPublication})
+ {
+ $origtext =~ m/([0-9]{4})/;
+ $self->{itemsList}[$self->{itemIdx}]->{date} = $1;
+ $self->{isPublication} = 0;
+ return;
+ }
+ elsif ($self->{isActors})
+ {
+ $origtext =~ s/^\s*//;
+ $origtext =~ s/\s*$//;
+ $self->{itemsList}[$self->{itemIdx}]->{actors} = $origtext
+ if ! $self->{itemsList}[$self->{itemIdx}]->{actors};
+ $self->{isActors} = 0;
+ return;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+ if ($self->{insideNameAndDate})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideNameAndDate} = 0;
+ }
+ elsif (($self->{insideActors}) && ($origtext !~ /^,/))
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/\s+,/,/;
+ if ($self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS)
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext];
+ $self->{actorsCounter}++;
+ }
+ }
+ elsif (($self->{insideDirector}) && ($origtext !~ /^,/))
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/,.$//;
+ $self->{curInfo}->{director} .= ", "
+ if $self->{curInfo}->{director};
+ $self->{curInfo}->{director} .= $origtext;
+ }
+ elsif ($self->{insideTime})
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/\n//g;
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideDate})
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/\n//g;
+ $origtext =~ s/\-$//;
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideDate} = 0;
+ }
+ elsif (($self->{insideSynopsis}) && ($origtext ne ''))
+ {
+ $self->{curInfo}->{synopsis} .= $origtext;
+ }
+ elsif ($self->{insideAudio})
+ {
+ $origtext =~ s/^\s//;
+ $self->{curInfo}->{audio} = $origtext;
+ $self->{insideAudio} = 0;
+ }
+ elsif ($self->{insideSubTitle})
+ {
+ $origtext =~ s/^\s//;
+ $self->{curInfo}->{subt} = $origtext;
+ $self->{insideSubTitle} = 0;
+ }
+ elsif ($self->{inside}->{b})
+ {
+ $self->{insideActors} = 1 if $origtext =~ /Darsteller:/;
+ $self->{insideDirector} = 1 if $origtext =~ /Regisseur\(e\):/;
+ $self->{insideDate} = 1 if $origtext =~ /Erscheinungstermin:/;
+ $self->{insideTime} = 1 if $origtext =~ /Spieldauer:/;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 1,
+ };
+
+ $self->{suffix} = 'de';
+
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ $html = $self->SUPER::preProcess($html);
+ if ($self->{parsingList})
+ {
+ $self->{isItem} = 0;
+ $html =~ s|~(.*?)<span class="bindingBlock">\(<span class="binding">(.*?)</span>( - .*?[0-9]{4})?\)</span>|<actors>$1</actors><format>$2</format><publication>$3</publication>|gsm;
+
+ }
+ else
+ {
+ $html =~ s/(<i>|<\/i>)//gim;
+ $html =~ s/<p>/\n/gim;
+ $html =~ s|</p>|\n|gim;
+ $html =~ s/(<ul>|<\/ul>)/\n/gim;
+ $html =~ s/<li>([^<])/- $1/gim;
+ $html =~ s|([^>])</li>|$1\n|gim;
+ $html =~ s|<br ?/?>|\n|gi;
+ $html =~ s|<a href="/gp/imdb/[^"]*">(.*?)</a>|$1|gm;
+ $html =~ s|<a href="[^"]*search-alias=dvd&field-keywords=[^"]*">(.*?)</a>|$1|gm;
+ #"
+ $html =~ s/<a href="\/exec\/obidos\/search-handle-url\/index=dvd-de&field-(?:actor|director|keywords)=[^\/]*\/[-0-9]*">([^<]*)<\/a>/$1/gm;
+ }
+
+ $self->{parsingEnded} = 0;
+ $self->{alreadyRetrieved} = {};
+ $self->{beginParsing} = 1;
+
+ return $html;
+ }
+
+ sub getName
+ {
+ return "Amazon (DE)";
+ }
+
+ sub getLang
+ {
+ return 'DE';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAmazonFR.pm b/lib/gcstar/GCPlugins/GCfilms/GCAmazonFR.pm
new file mode 100644
index 0000000..cbb6674
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAmazonFR.pm
@@ -0,0 +1,304 @@
+package GCPlugins::GCfilms::GCAmazonFR;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsAmazonCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginAmazonFR;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsAmazonPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ if ($self->{itemIdx} < 0)
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'input')
+ {
+ $self->{beginParsing} = 1
+ if $attr->{src} =~ /go-button-search/;
+ }
+ return if ! $self->{beginParsing};
+ if ($tagname eq 'srtitle')
+ {
+ $self->{isTitle} = 1;
+ }
+ elsif ($tagname eq 'publication')
+ {
+ $self->{isPublication} = 1;
+ }
+ elsif ($tagname eq 'actors')
+ {
+ $self->{isActors} = 1;
+ }
+ if ($tagname eq 'a')
+ {
+ my $urlId;
+ if ($urlId = $self->isItemUrl($attr->{href}))
+ {
+ $self->{isTitle} = 2 if $self->{isTitle} eq '1';
+ return if $self->{alreadyRetrieved}->{$urlId};
+ $self->{alreadyRetrieved}->{$urlId} = 1;
+ $self->{currentRetrieved} = $urlId;
+ my $url = $attr->{href};
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if (($tagname eq "img") && (!$self->{curInfo}->{image}))
+ {
+ $self->{curInfo}->{image} = $self->extractImage($attr);
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'content'))
+ {
+ $self->{insideContent} = 1;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'productDescriptionWrapper'))
+ {
+ $self->{insideSynopsis} = 1
+ if (!$self->{curInfo}->{synopsis});
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'emptyClear'))
+ {
+ $self->{insideSynopsis} = 0;
+ }
+ elsif (($tagname eq "span") && ($self->{insideAge}) && ($attr->{class} =~ /medSprite/))
+ {
+ $attr->{class} =~ s/\s*$//;
+ $self->{curInfo}->{age} = 2 if ($attr->{class} =~ m/G$/);
+ $self->{curInfo}->{age} = 5 if ($attr->{class} =~ m/PG$/);
+ $self->{curInfo}->{age} = 13 if ($attr->{class} =~ m/PG13$/);
+ $self->{curInfo}->{age} = 18 if ($attr->{class} =~ m/R$/);
+ $self->{insideAge} = 0;
+ }
+ elsif ($tagname eq "span")
+ {
+ $self->{insideNameAndDate} = 1 if $attr->{id} eq "btAsinTitle";
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ if ($tagname eq "li")
+ {
+ $self->{insideActors} = 0;
+ $self->{insideDirector} = 0;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ return if ! $self->{beginParsing};
+ if (($self->{inside}->{title})
+ && ($origtext !~ /^Amazon.fr/))
+ {
+ $self->{parsingEnded} = 1;
+ }
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0;
+ return;
+ }
+ elsif ($self->{isPublication})
+ {
+ $origtext =~ m/([0-9]{4})/;
+ $self->{itemsList}[$self->{itemIdx}]->{date} = $1;
+ $self->{isPublication} = 0;
+ return;
+ }
+ elsif ($self->{isActors})
+ {
+ $origtext =~ s/^\s*//;
+ $origtext =~ s/\s*$//;
+ $self->{itemsList}[$self->{itemIdx}]->{actors} = $origtext
+ if ! $self->{itemsList}[$self->{itemIdx}]->{actors};
+ $self->{isActors} = 0;
+ return;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+
+ if ($self->{insideNameAndDate})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideNameAndDate} = 0;
+ }
+ elsif (($self->{insideActors}) && ($origtext !~ /^,/))
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/\s+,/,/;
+ if ($self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS)
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext];
+ $self->{actorsCounter}++;
+ }
+ }
+ elsif (($self->{insideDirector}) && ($origtext !~ /^,/))
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/,.$//;
+ $self->{curInfo}->{director} .= ", "
+ if $self->{curInfo}->{director};
+ $self->{curInfo}->{director} .= $origtext;
+ }
+ elsif ($self->{insideTime})
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/\n//g;
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideDate})
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/\n//g;
+ $origtext =~ s/\-$//;
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideDate} = 0;
+ }
+ elsif (($self->{insideSynopsis}) && ($origtext ne ''))
+ {
+ $self->{curInfo}->{synopsis} .= $origtext;
+ }
+ elsif ($self->{insideAudio})
+ {
+ $origtext =~ s/^\s//;
+ $self->{curInfo}->{audio} = $origtext;
+ $self->{insideAudio} = 0;
+ }
+ elsif ($self->{insideSubTitle})
+ {
+ $origtext =~ s/^\s//;
+ $self->{curInfo}->{subt} = $origtext;
+ $self->{insideSubTitle} = 0;
+ }
+ elsif ($self->{inside}->{b})
+ {
+ $self->{insideActors} = 1 if $origtext =~ /Acteurs\s*:/;
+ $self->{insideDirector} = 1 if $origtext =~ /R.alisateurs?\s*:/;
+ $self->{insideDate} = 1 if $origtext =~ /Date de sortie/;
+ $self->{insideTime} = 1 if $origtext =~ /Dur.e\s*:/;
+ $self->{insideAudio} = 1 if $origtext =~ /Langue\s*:/;
+ $self->{insideSubTitle} = 1 if $origtext =~ /Sous-titres\s*:/;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 1,
+ };
+
+ $self->{suffix} = 'fr';
+
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $html = $self->SUPER::preProcess($html);
+ if ($self->{parsingList})
+ {
+ $self->{isItem} = 0;
+ $html =~ s|~(.*?)<span class="bindingBlock">\(<span class="binding">(.*?)</span>( - .*?[0-9]{4})?\)</span>|<actors>$1</actors><format>$2</format><publication>$3</publication>|gsm;
+
+ }
+ else
+ {
+ $html =~ s/(<i>|<\/i>)//gim;
+ $html =~ s/<p>/\n/gim;
+ $html =~ s|</p>|\n|gim;
+ $html =~ s/(<ul>|<\/ul>)/\n/gim;
+ $html =~ s/<li>([^<])/- $1/gim;
+ $html =~ s|([^>])</li>|$1\n|gim;
+ $html =~ s|<br ?/?>|\n|gi;
+ $html =~ s|<a href="/gp/imdb/[^"]*">(.*?)</a>|$1|gm;
+# $html =~ s/<a href="\/exec\/obidos\/search-handle-url\/index=dvd-fr&field-(?:actor|director|keywords)=[^\/]*\/[-0-9]*">([^<]*)<\/a>/$1/gm;
+ $html =~ s/<a href="\/exec\/obidos\/search-handle-url\/index=dvd-fr&field-(?:actor|director|keywords)=[^\/]*">([^<]*)<\/a>/$1/gm;
+ #"
+ }
+
+ $self->{parsingEnded} = 0;
+ $self->{alreadyRetrieved} = {};
+ $self->{beginParsing} = 1;
+
+ return $html;
+ }
+
+ sub getName
+ {
+ return "Amazon (FR)";
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAmazonUK.pm b/lib/gcstar/GCPlugins/GCfilms/GCAmazonUK.pm
new file mode 100644
index 0000000..096bb08
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAmazonUK.pm
@@ -0,0 +1,264 @@
+package GCPlugins::GCfilms::GCAmazonUK;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+# Edited 2009 by FiXx
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsAmazonCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginAmazonUK;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsAmazonPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ if ($self->{itemIdx} < 0)
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if (($self->{beginParsing} eq 0) && ($tagname eq 'div') && ($attr->{id} eq 'Results'))
+ {
+ $self->{beginParsing} = 1;
+ }
+ if (($self->{beginParsing}) && ($tagname eq 'table') && ($attr->{class} eq 'pagnTable'))
+ {
+ $self->{beginParsing} = 0;
+ $self->{parsingEnded} = 1;
+ }
+ return if ! $self->{beginParsing};
+ if ($tagname eq 'a')
+ {
+ if (($self->{isItem}) && ($self->{isUrl}))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isUrl} = 0 ;
+ }
+ }
+ elsif (($tagname eq 'td') && ($attr->{class} eq 'dataColumn'))
+ {
+ $self->{isItem} = 1 ;
+ $self->{isUrl} = 1 ;
+ $self->{isName} = 1 ;
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if (!$self->{curInfo}->{image})
+ {
+ $self->{curInfo}->{image} = $self->extractImage($attr);
+ }
+ }
+ elsif ($tagname eq "span")
+ {
+ $self->{insideNameAndDate} = 1 if $attr->{id} eq "btAsinTitle";
+ }
+ elsif (($tagname eq "div") && ($attr->{class} eq "productDescriptionWrapper"))
+ {
+ $self->{isSynopsis} = 1;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ if (($tagname eq 'li') && ($self->{insideActors}))
+ {
+ $self->{insideActors} = 0;
+ }
+
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if GCPlugins::GCstar::GCPluginAmazonCommon::text(@_);
+ return if length($origtext) < 2;
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ return if ! $self->{beginParsing};
+ if ($self->{isName})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isName} = 0;
+ $self->{isItem} = 0;
+ $self->{inActors} = 1;
+ }
+ elsif ($self->{inActors} && $self->{inside}->{td})
+ {
+ $origtext =~ s/^\W*//;
+ $self->{itemsList}[$self->{itemIdx}]->{actors} = $origtext
+ if ! $self->{itemsList}[$self->{itemIdx}]->{actors};
+ $self->{inActors} = 0;
+ return;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+
+ if ($self->{insideNameAndDate})
+ {
+ (my $year = $origtext) =~ s/.*\[([0-9]{4})\].*/$1/ ;
+ (my $title = $origtext) =~ s/^([^\[]*).*$/$1/ ;
+ $self->{curInfo}->{title} = $title;
+ $self->{curInfo}->{origtitle} = $title;
+ $self->{curInfo}->{date} = $year;
+ $self->{insideNameAndDate} = 0;
+ }
+ elsif (($self->{insideActors}) && $self->{inside}->{a})
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/,.$//;
+ $self->{curInfo}->{actors} .= $origtext.', ';
+ }
+ elsif ($self->{insideAge})
+ {
+ $origtext =~ m/([0-9]{1,2})/;
+ $self->{curInfo}->{age} = $1;
+ $self->{insideAge} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/,.$//;
+ $self->{curInfo}->{director} = $origtext;
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideTime})
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/\n//g;
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{isSynopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext if ! $self->{hasSynopsis};
+ $self->{isSynopsis} = 0;
+ $self->{hasSynopsis} = 1;
+ }
+ elsif ($self->{inside}->{b})
+ {
+ $self->{insideActors} = 1 if $origtext =~ /Actors:/;
+ $self->{insideDirector} = 1 if $origtext =~ /Directors:/;
+ $self->{insideAge} = 1 if $origtext =~ /Classification:/;
+ $self->{insideTime} = 1 if $origtext =~ /Run Time:/;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 0,
+ director => 0,
+ actors => 1,
+ };
+
+ $self->{suffix} = 'co.uk';
+
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ $html = $self->SUPER::preProcess($html);
+ if ($self->{parsingList})
+ {
+ $self->{isItem} = 0;
+ }
+ else
+ {
+ $html =~ s/(<i>|<\/i>)//gim;
+ $html =~ s/<p>/\n/gim;
+ $html =~ s|</p>|\n|gim;
+ $html =~ s/(<ul>|<\/ul>)/\n/gim;
+ $html =~ s/<li>([^<])/- $1/gim;
+ $html =~ s|([^>])</li>|$1\n|gim;
+ $html =~ s|<br ?/?>|\n|gi;
+ $html =~ s|<a href="/gp/imdb/[^"]*">(.*?)</a>|$1|gm;
+ $html =~ s|<a href="[^"]*search-alias=dvd&field-keywords=[^"]*">(.*?)</a>|$1|gm;
+
+ $html =~ s/<a href="\/exec\/obidos\/search-handle-url\/index=dvd&field-(?:actor|director|keywords)=[^\/]*\/[-0-9]*">([^<]*)<\/a>/$1/gm;
+ }
+
+ $self->{parsingEnded} = 0;
+ $self->{alreadyRetrieved} = {};
+ $self->{beginParsing} = 0;
+
+ return $html;
+ }
+
+ sub getName
+ {
+ return "Amazon (UK)";
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getAuthor
+ {
+ return 'Tian & FiXx';
+ }
+
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAniDB.pm b/lib/gcstar/GCPlugins/GCfilms/GCAniDB.pm
new file mode 100644
index 0000000..1c62e7c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAniDB.pm
@@ -0,0 +1,279 @@
+package GCPlugins::GCfilms::GCAniDB;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginAniDB;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ if ($tagname eq 'a')
+ {
+ if ($attr->{href} =~ m/animedb\.pl\?show=animeatt&aid=([0-9]*)/)
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = "animedb\.pl\?show=anime&aid=" . $1;
+ }
+ }
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'a')
+ {
+ if ($attr->{href} =~ m/animedb\.pl\?show=anime&aid=[0-9]*/)
+ {
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++ if ($self->{itemIdx} < 0) || ($attr->{href} ne $self->{itemsList}[$self->{itemIdx}]->{url});
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ }
+ }
+ elsif ($tagname eq 'td')
+ {
+ $self->{isYear} = 1 if ($attr->{class} eq 'date year');
+ }
+ elsif ($tagname eq 'h1')
+ {
+ $self->{insideHeadline} = 1;
+ }
+ }
+ else
+ {
+ if ($tagname eq 'img')
+ {
+ if ($attr->{src} =~ m/http\:\/\/img[0-9]\.anidb\.info\/pics\/anime\/[0-9]*\.jpg/)
+ {
+ $self->{curInfo}->{image} = $attr->{src} if !$self->{curInfo}->{image};
+ }
+ }
+ elsif ($tagname eq 'p')
+ {
+ if ($attr->{class} eq 'desc')
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ }
+ elsif ($tagname eq 'th')
+ {
+ $self->{isField} = 1 if $attr->{class} eq 'field';
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ $self->{insideSynopsis} = 0 if $tagname eq 'p';
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{insideHeadline})
+ {
+ $self->{parsingEnded} = 1 if $origtext !~ m/Anime List - Search for:/;
+ $self->{insideHeadline} = 0;
+ }
+
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext
+ if ! $self->{itemsList}[$self->{itemIdx}]->{title};
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($self->{isYear})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{date} = $origtext;# if $origtext =~ m/^ [0-9]{4}(-[0-9]{4})? $/;
+ $self->{isYear} = 0;
+ }
+ }
+ else
+ {
+ if ($self->{insideSynopsis})
+ {
+ $origtext =~ s/\s{2,}/ /g;
+ $self->{curInfo}->{synopsis} .= $origtext;
+ #$self->{curInfo}->{synopsis} =~ s|GCBRGC|<br>|g;
+ #$self->{curInfo}->{synopsis} =~ s/^\s*//;
+ $self->{insideSynopsis} = 0;
+ }
+# elsif ($self->{inside}->{div})
+# {
+# $self->{curInfo}->{title} = $1 if $origtext =~ m/Title: (.*) /;
+# if ($origtext =~ m/(?:Jap. Kanji|English): (.*) /)
+# {
+# $self->{curInfo}->{original} = $1;
+# }
+# $self->{curInfo}->{date} = $1 if $origtext =~ m/Year: (.*)/;
+# $self->{curInfo}->{director} = $1 if $origtext =~ m/Companies: (.*) /;
+# if ($origtext =~ m/Genre: (.*)/)
+# {
+# $self->{curInfo}->{genre} = $1;
+# $self->{curInfo}->{genre} =~ s/ - //;
+# }
+# }
+ elsif ($self->{isField})
+ {
+ $self->{isTitle} = 1 if $origtext eq 'Title';
+ $self->{isOrig} = 1 if $origtext =~ /kanji/i;
+ $self->{isYear} = 1 if $origtext eq 'Year';
+ $self->{isGenre} = 1 if $origtext eq 'Genre';
+ $self->{isField} = 0;
+ }
+ elsif ($self->{inside}->{td})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ elsif ($self->{isOrig})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{isOrig} = 0;
+ }
+ elsif ($self->{isYear})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{isYear} = 0;
+ }
+ elsif ($self->{isGenre})
+ {
+ ($self->{curInfo}->{genre} = $origtext) =~ s/\s//g;
+ $self->{curInfo}->{genre} =~ s/-$//;
+ $self->{isGenre} = 0;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+ $self->{isField} = 0;
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ $html =~ s/<a href="animedb\.pl\?show=producer&prid=[0-9]*" title="[^"]*">([^<]*)<\/a>/$1/g;
+ $html =~ s/<a href="animedb\.pl\?show=genre" target="_blank">(Genre:)<\/a>/$1/g;
+ $html =~ s/<a href="animedb\.pl\?show=animelist&amp;genid=[^"]*" title="[^"]*">([^<]*)<\/a>/$1/g;
+ $html =~ s/ - <a href="animedb\.pl\?show=search&do\.search=1(&search\.anime.genre.[0-9]*=on){1,}" title="search for other animes with all of these genres">\[similar\]<\/a> //;
+ #$html =~ s/<td> ([^:]*): <\/td>\s*<td> ([^<]*) ?<\/td>/<div>$1: $2<\/div>/g;
+ $html =~ s/<br \/>/\n/g;
+ $html =~ s/<b>Awards:<\/b><br><a href="[^"]*" target="_blank"><img src="[^"]*" border=0 alt="[^"]*" title="[^"]*"><\/a> <hr>//g;
+
+ #Removed italic strings (useful for synopsis source)
+ $html =~ s|<i>(.*?)</i>|$1|g;
+ #Extract synopsis
+ #$html =~ s|<td>([^<]*?)</td>\s*?</tr>\s*?</table>\s*?<hr>|<div class="synopsis">$1</div>|ms;
+
+ #Remove Headline tag
+ $html =~ s/>\W*?<!-- headline -->/>/;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://anidb.info/perl-bin/animedb.pl?show=animelist&adb.search=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return 'http://anidb.info/perl-bin/' . $url;
+ }
+
+ sub getName
+ {
+ return 'AniDB';
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAnimator.pm b/lib/gcstar/GCPlugins/GCfilms/GCAnimator.pm
new file mode 100644
index 0000000..45704d0
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAnimator.pm
@@ -0,0 +1,236 @@
+package GCPlugins::GCfilms::GCAnimator;
+
+###################################################
+#
+# Copyright 2005-2009 zserghei
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+use Encode qw(encode);
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginAnimator;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ my $url = $attr->{href};
+ if ($url =~ m/\/db\/\?p\=show\_film/)
+ {
+ $self->{isMovie} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "td" && $attr->{class} eq "FilmName")
+ {
+ $self->{insideTitle} = 1;
+ }
+ elsif ($tagname eq "td" && $attr->{class} eq "FilmType")
+ {
+ $self->{insideTime} = 1;
+ $self->{insideDate} = 1;
+ }
+ elsif ($tagname eq "td" && $attr->{class} eq "FilmComments")
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ elsif ($tagname eq "img")
+ {
+ $self->{curInfo}->{image} = $attr->{src}
+ if !$self->{curInfo}->{image}
+ && ($attr->{id} eq "SlideShow" || $attr->{width} =~ m/3\d{2}/);
+ $self->{curInfo}->{image} = "http://www.animator.ru/" . $self->{curInfo}->{image}
+ if $self->{curInfo}->{image} =~ m/^\//;
+ $self->{curInfo}->{image} = "http://www.animator.ru/db/" . $self->{curInfo}->{image}
+ if $self->{curInfo}->{image} =~ m/^\.\.\//;
+ $self->{insideImage} = 0;
+ }
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ my ($title, $date);
+ if ($origtext =~ m/«(.*)»\s\(([0-9]*)\s.+\)/)
+ {
+ ($title, $date) = ($1, $2);
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $title;
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $date;
+ }
+ else
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ }
+ $self->{isMovie} = 0;
+ return;
+ }
+ }
+ else
+ {
+ utf8::decode($origtext);
+ $origtext =~ s/^\s+//;
+ $origtext =~ s/\s+$//;
+ if ($self->{insideTitle})
+ {
+ $origtext =~ s/^\W//;
+ $origtext =~ s/\W$//;
+ $origtext = ucfirst(lc($origtext));
+ $self->{curInfo}->{title} = $origtext;
+ $self->{curInfo}->{genre} = "Мультфильм";
+ $self->{curInfo}->{audio} = "русский";
+ $self->{insideTitle} = 0;
+ }
+ elsif ($self->{insideDate})
+ {
+ if ($origtext =~ m/([0-9]+)\sг/)
+ {
+ $self->{curInfo}->{date} = $1;
+ if ($self->{curInfo}->{date} < 1992)
+ {
+ $self->{curInfo}->{country} = "СССР";
+ }
+ else
+ {
+ $self->{curInfo}->{country} = "Россия";
+ }
+ $self->{insideDate} = 0;
+ }
+ }
+ elsif ($self->{insideDirector})
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} .=
+ $self->{curInfo}->{synopsis} ? "\n" . $origtext : $origtext;
+ $self->{insideSynopsis} = 0;
+ }
+ if ($self->{insideTime})
+ {
+ if ($origtext =~ m/,\s+([0-9]+)\s+мин/)
+ {
+ $self->{curInfo}->{time} = $1;
+ $self->{insideTime} = 0;
+ }
+ }
+ if ($self->{inside}->{td})
+ {
+ $self->{insideDirector} = 1 if $origtext =~ m/режиссер/;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return "Animator";
+ }
+
+ sub getAuthor
+ {
+ return 'zserghei';
+ }
+
+ sub getLang
+ {
+ return 'RU';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "KOI8-R";
+# return "Windows-1251";
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://www.animator.ru/db/?p=search&text=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return "http://www.animator.ru/" . $url;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ $self->{parsingEnded} = 0;
+ $html =~ tr
+ {АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя}
+ {юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ};
+ return $html;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAnimeNfoA.pm b/lib/gcstar/GCPlugins/GCfilms/GCAnimeNfoA.pm
new file mode 100644
index 0000000..9347637
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAnimeNfoA.pm
@@ -0,0 +1,266 @@
+package GCPlugins::GCfilms::GCAnimeNfoA;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginAnimeNfoA;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ($attr->{href} =~ m/animetitle,[0-9]*,[a-z]*,[a-z0-9_]*\.html/)
+ {
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $attr->{href};
+ }
+ }
+ elsif ($tagname eq "td")
+ {
+ if ($attr->{class} eq "anime_info")
+ {
+ $self->{couldBeYear} = 1;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq 'table')
+ {
+ if ($attr->{class} eq 'anime_info')
+ {
+ $self->{insideInfos} = 1;
+ }
+ }
+ elsif ($tagname eq 'img')
+ {
+ if ($attr->{class} eq 'float')
+ {
+ $self->{curInfo}->{image} = 'http://www.animenfo.com/' . $attr->{src};
+ }
+ }
+ elsif ($tagname eq 'a')
+ {
+ if ($attr->{href} =~ /animebygenre\.php\?genre=/)
+ {
+ $self->{insideGenre} = 1;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if (length($origtext) < 2) && ($origtext !~ /\d+$/);
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($self->{couldBeYear})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $origtext if $origtext =~ m/^[0-9]{4}$/;
+ $self->{couldBeYear} = 0;
+ return;
+ }
+ }
+ else
+ {
+ if ($self->{insideInfos})
+ {
+ if ($origtext eq "Title")
+ {
+ $self->{insideName} = 1;
+ }
+ elsif ($origtext eq "Japanese Title")
+ {
+ $self->{insideOrig} = 1;
+ }
+ elsif ($origtext eq "Total Episodes")
+ {
+ $self->{insideTime} = 1;
+ }
+ elsif ($origtext eq "Year Published")
+ {
+ $self->{insideDate} = 1;
+ }
+ elsif ($origtext eq "Director")
+ {
+ $self->{insideDirector} = 1;
+ }
+ elsif ($origtext eq "User Rating")
+ {
+ $self->{insideRating} = 1;
+ }
+ elsif ($origtext =~ m/Description/)
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ elsif ($self->{insideName})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideName} = 0;
+ }
+ elsif ($self->{insideOrig})
+ {
+ $self->{curInfo}->{original} = $origtext if $origtext ne "Official Site";
+ $self->{insideOrig} = 0;
+ }
+ elsif ($self->{insideTime})
+ {
+ $origtext =~ s/^(\d+)\s*(.*)/$1 episodes $2/;
+ $self->{curInfo}->{time} .= $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideGenre})
+ {
+ $self->{curInfo}->{genre} .= $origtext . ',';
+ $self->{insideGenre} = 0;
+ }
+ elsif ($self->{insideDate})
+ {
+ $self->{curInfo}->{date} = $origtext if $origtext =~ m/[0-9]{4}/;
+ $self->{insideDate} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ $self->{curInfo}->{director} = $origtext if $origtext ne "US Distribution";
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideRating})
+ {
+ $origtext =~ m|([\d\.]+)/10\.0|;
+ $self->{curInfo}->{ratingpress} = int ($1 + 0.5);
+ $self->{insideRating} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext if !$self->{curInfo}->{synopsis};
+ $self->{insideSynopsis} = 0;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $html =~ s/<br \/>/\n/g;
+ $html =~ s/<script language='JavaScript'>.*?<\/script>//g;
+ $html =~ s|<i>([^<]*)</i>|$1|g;
+ $html =~ s|\t||g;
+ $html =~ s/<a onMouseOut='[^']*' onMouseOver='[^']*' href='animebygenre\.php\?genre=[0-9]*'>([^<]*)<\/a>/$1/g;
+ $html =~ s/<a href='animebyyear\.php\?year=[0-9]{4}'>([0-9]{4})<\/a>/<font class='DefaultFont'>$1<\/font>/;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.animenfo.com/search.php?option=keywords&queryin=anime_titles&query=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return 'http://www.animenfo.com/' . $url;
+ }
+
+ sub getName
+ {
+ return "AnimeNfo Anime";
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getNotConverted
+ {
+ my $self = shift;
+ return ['orig'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAnimeka.pm b/lib/gcstar/GCPlugins/GCfilms/GCAnimeka.pm
new file mode 100644
index 0000000..f4e3c77
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAnimeka.pm
@@ -0,0 +1,295 @@
+package GCPlugins::GCfilms::GCAnimeka;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+###################################
+# #
+# Plugin soumis par MeV #
+# #
+###################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginAnimeka;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ if (($tagname eq 'form')
+ && ($attr->{name} eq 'form_note_serie')
+ && (! $self->{itemsList}[0]->{url}))
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $attr->{action};
+ }
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if (($tagname eq "img")
+ && ($attr->{class} eq "rechercheindeximg")
+ && ($attr->{alt} eq "Animesindex"))
+ {
+ $self->{parsingEnded} = 1 if $attr->{src} !~ /rechercheindex\.gif/;
+ }
+
+ if ($tagname eq "a")
+ {
+ if (($attr->{href} =~ /^\/animes\/detail\//))
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if ($attr->{class} eq "picture")
+ {
+ $self->{curInfo}->{image} = "http://animeka.com" . $attr->{src};
+ }
+ elsif (($attr->{class} eq "animeslegendimg")
+ && ($attr->{src} =~ /^\/_distiller\/show_flag\.php\?id=/))
+ {
+ if (!$self->{curInfo}->{country})
+ {
+ $self->{curInfo}->{country} = $attr->{alt};
+ }
+ elsif ($self->{curInfo}->{country} !~ $attr->{alt})
+ {
+ $self->{curInfo}->{country} .= ", " . $attr->{alt};
+ }
+ }
+ }
+ elsif ($tagname eq "td")
+ {
+ $self->{insideInfos} = 1 if $attr->{class} eq "animestxt";
+ $self->{insideName} = 1 if $attr->{class} eq "animestitle";
+ }
+ elsif ($tagname eq "div")
+ {
+ $self->{insideSynopsis} = 1 if $attr->{class} eq "synopsis";
+ $self->{insideAlternate} = 1 if $attr->{class} eq "alternate";
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if ($self->{parsingEnded});
+
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{inside}->{script})
+ {
+ if ($origtext =~ /document\.location\.href="(.*?)"/)
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $1;
+ }
+ return;
+ }
+
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{"title"} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($self->{isYear})
+ {
+ $origtext =~ s/ : ([0-9]{4}) - [0-9]*\s*[A-Z]*/$1/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $origtext;
+ $self->{isYear} = 0;
+ }
+ elsif ($self->{inside}->{u})
+ {
+ $self->{isYear} = 1 if $origtext =~ /Ann.e \/ nombre et format/;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+
+ if ($self->{insideInfos})
+ {
+ $origtext =~ s/(.*), $/$1/;
+ if ($origtext =~ /TITRE ORIGINAL : (.*)/)
+ {
+ $self->{curInfo}->{original} = $1;
+ }
+ elsif ($origtext =~ /AUTEUR(?:S)? : (.*)/)
+ {
+ $self->{curInfo}->{director} = $self->capWord($1);
+ }
+ elsif (($origtext =~ /VOLUMES, TYPE . DUR.E : (.*)/)
+ || ($origtext =~ /TYPE . DUR.E : (.*)/))
+ {
+ $self->{curInfo}->{time} = $self->capWord($1);
+ }
+ elsif ($origtext =~ /ANN.E DE PRODUCTION : (.*)/)
+ {
+ $self->{curInfo}->{date} = $self->capWord($1);
+ }
+ elsif ($origtext =~ /GENRE(?:S)? :/)
+ {
+ $origtext =~ s/(?:, )|(?: & )/,/g;
+ $origtext =~ /GENRE(?:S)? : (.*)/;
+ $self->{curInfo}->{genre} = $self->capWord($1);
+ }
+ $self->{insideInfos} = 0;
+ }
+ elsif ($self->{insideName})
+ {
+ if ($origtext =~ /(.*?)( \(([0-9]{4})\))?$/)
+ {
+ $self->{curInfo}->{title} = $1;
+ $self->{curInfo}->{date} = $3;
+ }
+ $self->{insideName} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $origtext =~ s/\[br\]/\n/g;
+ $origtext =~ s/\[endline\]//g;
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($self->{insideAlternate})
+ {
+ $origtext =~ s/\[br\]/\n/g;
+ $origtext =~ s/\[endline\]//g;
+ $self->{curInfo}->{original} = $origtext if ! $self->{curInfo}->{original};
+ $self->{insideAlternate} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ $html =~ s/&nbsp;/ /g;
+ $html =~ s/&amp;/&/g;
+ $html =~ s/<b>|<\/b>//g;
+ $html =~ s/<i>|<\/i>//g;
+ $html =~ s/<br \/>/\[br\]/g;
+ $html =~ s/\n/\[endline\]/g;
+ $html =~ s/<span style="background:#CBD1DD;">([^<]*)<\/span>/$1/g;
+ $html =~ s/\[<a href="\/animes\/(?:studios|genres|pers)\/.*?\.html">([^<]*)<\/a>\] /$1, /g;
+ $html =~ s/<a href="\/avis\/index.html"[^>]*>([^<]*)<\/a>/$1/g;
+ $html =~ s/<td [^>]*>Synopsis<\/td><\/tr><tr><td [^>]*><table [^>]*><tr><td [^>]*>(.*?)<\/td><\/tr><\/table><\/td>/<div class="synopsis">$1<\/div>/;
+ $html =~ s/<td [^>]*>Titre alternatif<\/td><\/tr><tr><td [^>]*><table [^>]*><tr><td [^>]*>(.*?)<\/td><\/tr><\/table><\/td>/<div class="alternate">$1<\/div>/;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.animeka.com/search/index.html?req=$word&zone_series=1&go_search=1&cat=search";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.animeka.com" . $url;
+ }
+
+ sub getName
+ {
+ return "Animeka.com";
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+ sub getCharset
+ {
+ return "ISO-8859-1";
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCBeyazPerde.pm b/lib/gcstar/GCPlugins/GCfilms/GCBeyazPerde.pm
new file mode 100644
index 0000000..e05ce80
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCBeyazPerde.pm
@@ -0,0 +1,340 @@
+package GCPlugins::GCfilms::GCBeyazPerde;
+
+###################################################
+#
+# Copyright 2007-2009 Zuencap
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginBeyazPerde;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ($attr->{href} =~ /\/film\// && $attr->{class} eq "turuncucizgisiz_11_px")
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if ($attr->{src} =~ /^\/images\/film\//)
+ {
+ $self->{curInfo}->{image} = "http://beyazperde.mynet.com" . $attr->{src}
+ if !$self->{curInfo}->{image};
+ }
+ }
+ elsif ($tagname eq "td")
+ {
+ if ($self->{insideSynopsis} == 1)
+ {
+ $self->{insideSynopsis} = 2;
+ }
+ }
+ elsif ($tagname eq "h1")
+ {
+ if ($attr->{class} eq "baslik_filmadi31")
+ {
+ $self->{insideTitle} = 1;
+ }
+ }
+ elsif ($tagname eq "h2")
+ {
+ if ($attr->{class} eq "baslik_filmadi32")
+ {
+ $self->{insideTitle} = 2;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ if (!$self->{parsingList})
+ {
+ if ($tagname eq "table")
+ {
+ if ($self->{insideActors})
+ {
+ $self->{insideActors} = 0;
+ $self->{insideSynopsis} = 1;
+ }
+ $self->{insideTime} = 0;
+ }
+ elsif ($tagname eq "td")
+ {
+ if ($self->{insideSynopsis} == 2)
+ {
+ $self->{insideSynopsis} = 0;
+ }
+ }
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ $origtext =~ s/&#34;/"/g;
+ $origtext =~ s/&#179;/3/g;
+ $origtext =~ s/&#[0-9]*;//g;
+ $origtext =~ s/\n//g;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie} == 0)
+ {
+ return;
+ }
+ elsif ($self->{isMovie} == 1)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ }
+ elsif ($self->{isMovie} == 2)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1 if $origtext =~ m/\(([0-9]*)\)/;
+ }
+ elsif ($self->{isMovie} == 5)
+ {
+ if ($origtext eq "Y:")
+ {
+ $self->{isMovie}++;
+ }
+ }
+ elsif ($self->{isMovie} == 7)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} = $origtext;
+ }
+ elsif ($self->{isMovie} == 9)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} = $origtext;
+ $self->{isMovie} = -1;
+ }
+
+ $self->{isMovie}++;
+ return;
+ }
+ else
+ {
+ if ($self->{insideGenre} && ($self->{inside}->{a}))
+ {
+ $self->{curInfo}->{genre} = $self->capWord($origtext);
+ $self->{insideGenre} = 0;
+ }
+ elsif ($self->{insideDirector} && ($self->{inside}->{a}))
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideSynopsis} == 2)
+ {
+ ($self->{curInfo}->{synopsis} .= $origtext) =~ s/^\s*//;
+ }
+ elsif ($self->{insideTime})
+ {
+ if ($self->{insideTime} == 1)
+ {
+ if ($self->{inside}->{a})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideTime}++;
+ }
+ }
+ elsif ($self->{insideTime} == 2)
+ {
+ if ($self->{inside}->{a})
+ {
+ $self->{curInfo}->{country} = $origtext;
+ $self->{insideTime}++;
+ }
+ }
+ elsif ($origtext =~ / dk\./)
+ {
+ $origtext =~ s/.*, (.*) dk\./$1 dk\./;
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ }
+ elsif ($self->{insideActors})
+ {
+ if ($self->{inside}->{a})
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext]
+ if ($self->{actorsCounter} <
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ }
+ elsif ($self->{inside}->{font} && ($origtext =~ m/\((.*)\)/))
+ {
+ # As we incremented it above, we have one more chance here to add a role
+ # Without <= we would skip the role for last actor
+ push @{$self->{curInfo}->{actors}->[$self->{actorsCounter}-1]}, $1
+ if ($self->{actorsCounter} <=
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ }
+ }
+ elsif ($self->{insideOtherTitles})
+ {
+ if ($origtext =~ m/(.*?) \(International.*/)
+ {
+ $self->{curInfo}->{title} = $1;
+ $self->{insideOtherTitles} = 0;
+ }
+ }
+ elsif ($self->{insideTitle} == 1)
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideTitle} = 0;
+ }
+ elsif ($self->{insideTitle} == 2)
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{insideTitle} = 0;
+ }
+
+ if ($self->{inside}->{span})
+ {
+ $self->{insideDirector} = 1 if $origtext =~ m/Y\xf6netmen : /;
+ $self->{insideGenre} = 1 if $origtext eq "T\xfcr : ";
+ $self->{insideTime} = 1 if $origtext =~ m/Yapım/;
+ $self->{insideActors} = 1
+ if $origtext =~ m/Oyuncular/ || $origtext =~ m/Seslendirenler/;
+ if ($origtext =~ m{SinePuan:\s+(\d+\,\d+)\s+})
+ {
+ my $rating = $1;
+ $rating =~ s/,/./;
+ $self->{curInfo}->{ratingpress} = int($rating + 0.5);
+ }
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 1,
+ };
+
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ #Fix for character-encoding:
+ $html =~ s/\x85/\.\.\./g;
+ $html =~ s/\x92/'/g;
+ $html =~ s/\x93/“/g;
+ $html =~ s/\x94/”/g;
+
+ $html =~ s/"&#34;/'"/g;
+ $html =~ s/&#34;"/"'/g;
+ $html =~ s/&nbsp;/ /g;
+ $html =~ s|</a></b><br>|</a><br>|;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://beyazperde.mynet.com/arama.asp?kat=film&keyword=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://beyazperde.mynet.com/';
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+ sub getName
+ {
+ return "Beyaz Perde";
+ }
+
+ sub getAuthor
+ {
+ return 'Zuencap';
+ }
+
+ sub getLang
+ {
+ return 'TR';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "utf-8";
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCCartelesPeliculasES.pm b/lib/gcstar/GCPlugins/GCfilms/GCCartelesPeliculasES.pm
new file mode 100644
index 0000000..e0aff39
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCCartelesPeliculasES.pm
@@ -0,0 +1,351 @@
+package GCPlugins::GCfilms::GCCartelesPeliculasES;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginCartelesPeliculasES;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+
+ # text
+ # Called each time some plain text (between tags) is processed.
+ # $origtext is the read text.
+ sub text
+ {
+ my ($self, $origtext) = @_;
+ return if length($origtext) < 2;
+
+ # Código para procesar el resultado de la busqueda
+ if ($self->{parsingList}){
+ # Guardamos el título
+ if ($self->{inside}->{h3} && $self->{insideInfos}){
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ }
+ return;
+ }
+ # Codigo para el contenido de la ficha
+ else{
+ # Eliminamos espacios iniciales, espacios dobles y espacios finales del texto
+ $origtext =~ s/^\s*|\s{2,}|\s*$//g;
+ # Estamos procesando el titulo
+ if ($self->{insideTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideTitle} = 0;
+ return;
+ }
+ # Estamos en la puntuación
+ if ($self->{inside}->{strong} && ($origtext =~ /[0-5],[0-5][0-5]/))
+ {
+ $self->{curInfo}->{rating} = ($origtext/5)*10;
+ return;
+ }
+
+ # Procesamos el titulo original
+ if ($self->{isOrigTit} eq 1) {
+ $self->{isOrigTit} = 0;
+ # Indicamos que en el siguiente paso hay que leer año,pais,duracion
+ $self->{isOther} = 1;
+ # Reemplazamos la primera , por # y después obtenemos el texto
+ $origtext =~ s/,/#/;
+ $origtext =~ s/#.*//;
+ $self->{curInfo}->{original} = $origtext;
+ return;
+ }
+ # Procesamos Año, pais, duracion
+ if ($self->{isOther} eq 1) {
+ # Comprobamos si tiene el formato de año, pais, duración
+ if($origtext =~ /^(.*), (.*), (.*)$/){
+ $self->{isOther} = 0;
+ $self->{curInfo}->{date} = $1;
+ $self->{curInfo}->{country} = $2;
+ $self->{curInfo}->{time} = $3;
+ }
+ return;
+ }
+ # Procesamos los directores
+ if ($self->{isDirector} eq 1) {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{isDirector} = 0;
+ return;
+ }
+ # Actores
+ if ($self->{isActors} eq 1) {
+ $self->{curInfo}->{actors} = $origtext;
+ $self->{isActors} = 0;
+ }
+ # sinopsis
+ if ($self->{isSynopsis} eq 1) {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{isSynopsis} = 0;
+ }
+
+ # Condiciones para procesar los campos en el siguiente ciclo
+ if($self->{inside}->{p}){
+ $self->{isOrigTit} = 1 if $origtext eq "akas:";
+ $self->{isDirector} = 1 if $origtext eq "Director:";
+ $self->{isActors} = 1 if $origtext eq "Intérpretes:";
+ $self->{isSynopsis} = 1 if $origtext eq "Sinopsis:";
+ return;
+ }
+
+ }
+ }
+
+
+ # end
+ # Called each time a HTML tag ends.
+ # $tagname is the tag name.
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ }
+
+ # In processing functions below, self->{parsingList} can be used.
+ # If true, we are processing a search results page
+ # If false, we are processing a item information page.
+
+ # $self->{inside}->{tagname} (with correct value for tagname) can be used to test
+ # if we are in the corresponding tag.
+
+ # You have a counter $self->{itemIdx} that have to be used when processing search results.
+ # It is your responsability to increment it!
+
+ # When processing search results, you have to fill the available fields for results
+ #
+ # $self->{itemsList}[$self->{movieIdx}]->{field_name}
+ #
+ # When processing a movie page, you need to fill the fields (if available)
+ # in $self->{curInfo}.
+ #
+ # $self->{curInfo}->{field_name}
+
+ # start
+ # Called each time a new HTML tag begins.
+ # $tagname is the tag name.
+ # $attr is reference to an associative array of tag attributes.
+ # $attrseq is an array reference containing all the attributes name.
+ # $origtext is the tag text as found in source file
+ # Returns nothing
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+ # Código para procesar el resultado de la busqueda para generar el listado
+ if ($self->{parsingList})
+ {
+ # Comprobamos si estamos dentro del marcador que inicia la info de un titulo
+ if( ($tagname eq "h3" ) && ($attr->{class} eq "entry-title" )){
+ # Indicamos que tenemos que se puede leer la info e incrementamos el número de resultados
+ $self->{itemIdx}++;
+ $self->{insideInfos} = 1 ;
+ return;
+ }
+ # Si estamos en un título y encontramos una tag a, es un enlace a ficha
+ if ($tagname eq "a" && $self->{insideInfos}){
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ return;
+ }
+
+ if(($tagname eq "div") && ($attr->{class} eq "entry-summary" ) && $self->{insideInfos}){
+ $self->{insideInfos} = 0;
+ return;
+ }
+ }
+ # Código para procesar la información de la pelicula seleccionada
+ else {
+ if ($tagname eq "h1"){
+ $self->{insideTitle} = 1;
+ return;
+ }
+ # Si estamos dentro de una imagen y no se ha asignado ninguna, la asignamos
+ if (($tagname eq "img") & !$self->{curInfo}->{image})
+ {
+ # Imágenes en cmg:
+ # Thumb http://www.cartelespeliculas.com/galeria/albums/003/thumbs_23p47303003.jpg
+ # ./../../galeria/albums/005/thumbs_23p43025005.jpg
+ # Normal: http://www.cartelespeliculas.com/galeria/albums/003/23p47303003.jpg
+ # Extraemos la dirección de la imagen a partir del thumb
+ if ($attr->{src} =~ /\.\/\.\.\/\.\.\/(galeria\/albums\/[0-9]*\/)thumbs_(.*)$/)
+ {
+ $self->{curInfo}->{image} = "http://www.cartelespeliculas.com/". $1 .$2;
+ }
+ return;
+ }
+ }
+ }
+
+ # preProcess
+ # Called before each page is processed. You can use it to do some substitutions.
+ # $html is the page content.
+ # Returns modified version of page content.
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ # Anulamos el html si coincide con el patron de no resultados
+ if($html =~ /^.*Lo sentimos, no se ha encontrado.*$/s){
+ $html = "";
+ return $html;
+ }
+
+ # Recorta el código del listado de resultados, quedandose solo con la parte que nos interesa del html
+ # el modificador s/.../$1/s trata el flujo como una sola cadena y reemplaza todo el cuerpo con la parte que nos interesa
+ if($html =~ s/^.*<ul class="hfeed posts-default clearfix">(.*)\t<\/li>\n\t\t<\/ul>.*$/$1/s){
+ return $html;
+ }
+
+ # Recorta el código de la ficha, quedandose solo con la parte que nos interesa del html
+ if($html =~ s/^.*<div id="content" class="section">\n\n\n\n\t\t(.*)<\/li>\n<\/ul>\n<\/div>.*$/$1/s){
+ return $html;
+ }
+ return $html;
+ }
+
+ # changeUrl
+ # Can be used to change URL if item URL and the one used to
+ # extract information are different.
+ # Return the modified URL.
+ #sub changeUrl
+ #{
+ # my ($self, $url) = @_;
+ # return $url;
+ #}
+
+ # getExtra
+ # Used if the plugin wants an extra column to be displayed in search results
+ # Return the column title or empty string to hide the column.
+ #sub getExtra
+ #{
+ # return 'Extra';
+ #}
+
+
+ # getLang
+ # Used to fill in plugin list with user language plugins
+ # Return the language used for this site (2 letters code).
+ sub getLang
+ {
+ return "ES";
+ }
+
+
+ # getAuthor
+ # Used to display the plugin author in GUI.
+ # Returns the plugin author name.
+ sub getAuthor
+ {
+ return "DoVerMan";
+ }
+
+
+ # getName
+ # Used to display plugin name in GUI.
+ # Returns the plugin name.
+ sub getName
+ {
+ return "CartelesPeliculas";
+ }
+
+
+ # getCharset
+ # Used to convert charset in web pages.
+ # Returns the charset as specified in pages.
+ #sub getCharset
+ #{
+ # my $self = shift;
+ # # Charset de la web
+ # return "UTF-8";
+ #}
+
+
+ # getItemUrl
+ # Used to get the full URL of an item page.
+ # Useful when url on results pages are relative.
+ # $url is the URL as found with a search.
+ # Returns the absolute URL.
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url;
+ }
+
+
+ # getSearchUrl
+ # Used to get the URL that to be used to perform searches.
+ # $word is the query
+ # Returns the full URL.
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.cartelespeliculas.com/wp/?s=" . $word;
+ }
+
+
+ # Constructor
+ sub new
+ {
+ # Inicialización
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ # Campos que devuelve el plugin (1 si, 0 no). Son los que apareceran
+ # en el listado de resultados
+ $self->{hasField} = {
+ title => 1,
+ date => 0,
+ director => 0,
+ actors => 0
+ };
+
+ # Indica si estamos procesando información útil
+ $self->{insideInfos} = 0;
+
+ # Indican el estado del procesado del listado de resultados
+ $self->{insideTitle} = 0;
+
+ # Indican el estado del procesado del listado de resultados (0 no procesar, 1 es el siguiente, 2 procesando)
+ $self->{isOther} = 0;
+ $self->{isTitle} = 0;
+ $self->{isOrigTit} = 0;
+ $self->{isDirector} = 0;
+ $self->{isActors} = 0;
+ $self->{isSynopsis} = 0;
+
+ return $self;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCCinemaClock.pm b/lib/gcstar/GCPlugins/GCfilms/GCCinemaClock.pm
new file mode 100644
index 0000000..26ce915
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCCinemaClock.pm
@@ -0,0 +1,271 @@
+package GCPlugins::GCfilms::GCCinemaClock;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+###################################
+# #
+# Plugin soumis par MeV #
+# #
+###################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginCinemaClock;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ($attr->{href} =~
+/http\:\/\/www\.CinemaClock\.com\/aw\/crva\.aw\/p\.clock\/r\.que\/m\.Montreal\/j\.f\/i\./
+ )
+ {
+ my $url = $attr->{href};
+ $url =~ s/http\:\/\/www\.CinemaClock\.com(.*)/$1/;
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if ($self->{curInfo}->{image} !~ /^\/images\/dvd\//)
+ {
+ if ($attr->{src} =~ /^\/images\/dvd\/med\/(.*)\.gif/)
+ {
+ $self->{curInfo}->{image} =
+ "http://www.cinemaclock.com/images/dvd/" . $1 . ".jpg";
+ }
+ elsif ($attr->{src} =~ /^\/images\/dvd\//)
+ {
+ $self->{curInfo}->{image} =
+ "http://www.cinemaclock.com" . $attr->{src};
+ }
+ elsif ($attr->{src} =~ /^\/images\/posters\//)
+ {
+ $self->{curInfo}->{image} =
+ "http://www.cinemaclock.com" . $attr->{src};
+ }
+ elsif ($attr->{src} =~ /^\/images\//)
+ {
+ $self->{curInfo}->{image} =
+ "http://www.cinemaclock.com" . $attr->{src}
+ if !$self->{curInfo}->{image};
+ }
+ }
+ }
+ elsif ($tagname eq "div")
+ {
+ $self->{insideInfos} = 1 if $attr->{class} eq "informations";
+ $self->{insideName} = 1 if $attr->{class} eq "movietitle";
+ }
+ elsif ($tagname eq "p")
+ {
+ $self->{insideSynopsis} = 1 if $attr->{style} eq "text-align: justify";
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} =
+ $self->capWord($origtext);
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($origtext =~ /\(([0-9]{4})\)/)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+
+ if ($self->{insideInfos})
+ {
+ if ($origtext =~ /Ann.e\:.(.*)/)
+ {
+ $self->{curInfo}->{date} = $1;
+ }
+ elsif ($origtext =~ /Pays\:.(.*)/)
+ {
+ $self->{curInfo}->{country} = $1;
+ }
+ elsif ($origtext =~ /Genre\:.(.*)/)
+ {
+ $self->{curInfo}->{genre} = $self->capWord($1);
+ $self->{curInfo}->{genre} =~ s/, /,/g;
+ }
+ elsif ($origtext =~ /Dur.e\:.(.*)/)
+ {
+ $self->{curInfo}->{time} = $1;
+ }
+ elsif ($origtext =~ /R.alis..par\:.(.*)/)
+ {
+ $self->{curInfo}->{director} = $1;
+ }
+ elsif ($origtext =~ /En.vedette\:.(.*)/)
+ {
+ $self->{curInfo}->{actors} = $1;
+ }
+ elsif ($origtext =~ /Classement\:.(.*)/)
+ {
+ $self->{curInfo}->{age} = 2 if $origtext =~ /G/;
+ $self->{curInfo}->{age} = $1 if $origtext =~ /([0-9]+)/;
+ }
+ elsif ($origtext =~ /Guide.parental\:.(.*)/)
+ {
+ $self->{curInfo}->{age} = 5 if $self->{curInfo}->{age} == 2;
+ }
+ $self->{insideInfos} = 0;
+ }
+ elsif ($self->{insideName})
+ {
+ $origtext =~ s/"//g;
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideName} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($origtext =~ /Version fran.aise de(.*)/)
+ {
+ $self->{curInfo}->{original} = $1;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ #<<< keep perltidy away
+ $html =~ s{<b>|</b>}{}g;
+ $html =~ s{<a href="/aw/cpea\.aw/p\.clock/r\.que/m\.Montreal/j\.f/i\.[0-9]*/a\.[^"]*">([^<]*)</a>}
+ {$1}g;
+ $html =~ s{<span class=arialb2>([^<]*)</span></td>[^<]*<td><span class=arial2>([^<]*)</span>}
+ {/<div class="informations">$1$2</div>}g;
+ $html =~ s{<span class=movietitle>([^<]*)</span>}
+ {<div class="movietitle">$1</div>};
+ $html =~ s{<font color=[^>]*>|</font>|<span class=[^>]*>|</span>}
+ {}g;
+ #>>>
+
+# $html =~ s/<a href="\/aw\/cpea\.aw\/p\.clock\/r\.que\/m\.Montreal\/j\.f\/i\.[0-9]*\/a\.[^"]*">([^<]*)<\/a>/$1/g;
+# $html =~ s/<span class=arialb2>([^<]*)<\/span><\/td>[^<]*<td><span class=arial2>([^<]*)<\/span>/<div class="informations">$1$2<\/div>/g;
+# $html =~ s/<span class=movietitle>([^<]*)<\/span>/<div class="movietitle">$1<\/div>/;
+# $html =~ s/<font color=[^>]*>|<\/font>|<span class=[^>]*>|<\/span>//g;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.cinemaclock.com/aw/csra.aw?"
+ . "p=clock&r=que&m=Montreal&j=f&key=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.cinemaclock.com" . $url;
+ }
+
+ sub getName
+ {
+ return "CinemaClock.com";
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCCinemotions.pm b/lib/gcstar/GCPlugins/GCfilms/GCCinemotions.pm
new file mode 100644
index 0000000..c90c91a
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCCinemotions.pm
@@ -0,0 +1,284 @@
+package GCPlugins::GCfilms::GCCinemotions;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginCinemotions;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'a')
+ {
+ if (($attr->{href} =~ /^\/modules\/Films\/fiche\//)
+ && ($attr->{class} eq "link4"))
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ }
+ }
+ elsif (($tagname eq 'img') && (($attr->{src} =~ /^\/data\/films\//)
+ || ($attr->{src} =~ /^\/modules\/Films\/img\/webpasdaffiche\.jpg/)))
+ {
+ $self->{isMovie} = 0;
+ $self->{itemIdx}--;
+ }
+ elsif ($tagname eq 'font')
+ {
+ if ($attr->{class} eq 'link4dtext')
+ {
+ $self->{isInfo}=1;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq 'img')
+ {
+ if (($attr->{src} =~ m|/data/films/|)
+ && ($attr->{src} !~ m|/data/films/[^_]*_[0-9]{4}_[0-9]*\.jpg|)
+ && ($attr->{width} == 150))
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{image} =~ s/\/h200\//\//;
+ }
+ }
+ }
+ elsif ($tagname eq 'font')
+ {
+ $self->{insideOrig} = 1 if $attr->{class} eq 'titrevo_film';
+ $self->{insideInfos} = 1 if ($attr->{face} eq 'arial')
+ && ($attr->{size} eq '2');
+ $self->{insideArtists} = 1 if ($attr->{face} eq 'verdana,geneva,arial')
+ && ($attr->{size} eq '2');
+ $self->{insideSynopsis} = 1 if ($attr->{class} eq 'link6')
+ && ($self->{inside}->{fieldset})
+ && (!$self->{curInfo}->{synopsis});
+ }
+ elsif ($tagname eq 'h2')
+ {
+ $self->{insideOrig} = 1 if $attr->{style} eq 'color: #333333; font-size:13px';
+ }
+ elsif ($tagname eq 'br')
+ {
+ if ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} .= "\n";
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ $self->{insideSynopsis} = 0 if $tagname eq 'font';
+
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+ $origtext =~ s/\s{2,}//g;
+ $origtext =~ s/\n*//g if !$self->{insideSynopsis};
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ if (($self->{inside}->{h1}) || ($self->{inside}->{h2}))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ }
+ elsif ($self->{isInfo})
+ {
+ if (($origtext =~ /([0-9]{4}) - [0-9]*h[0-9]*/)
+ || ($origtext =~ /([0-9]{4}) - [0-9]* mn/))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{date} = $1;
+ }
+ elsif ($origtext =~ /^\s*R.alisation : (.*)/)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{director} =$1;
+ }
+ elsif ($origtext =~ /^\s*avec (.*)/)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{actors} = $1;
+ $self->{isInfo} = 0; #$html =~ s|<br\s*/>|\n|g;
+
+ }
+ }
+ }
+ else
+ {
+ if ($self->{inside}->{h1}
+ && !$self->{curInfo}->{title})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ }
+ elsif ($self->{insideOrig})
+ {
+ $self->{curInfo}->{original} = $origtext
+ if !$self->{curInfo}->{original};
+ $self->{insideOrig} = 0;
+ }
+ if ($self->{insideInfos})
+ {
+ if ($origtext =~ /([0-9]{4})- (.*?)- ([^-]*)(?:- (.*))?/)
+ {
+ my $date = $1, my $nat = $2, my $type = $3, my $time = $4;
+ $nat =~ s|/|, |g;
+ $type =~ s|/|,|g;
+
+ $self->{curInfo}->{date} = $date;
+ $self->{curInfo}->{country} = $nat;
+ $self->{curInfo}->{genre} = $type;
+ $self->{curInfo}->{time} = $time;
+ }
+ $self->{insideInfos} = 0;
+ }
+ elsif ($self->{insideArtists})
+ {
+ if ($origtext =~ /R.alisation\s*:\s*(.*)/)
+ {
+ $self->{curInfo}->{director} = $1 if !$self->{curInfo}->{director};
+ }
+ elsif ($origtext =~ /avec\s*:?\s*(.*)/i)
+ {
+ if (!$self->{curInfo}->{actors})
+ {
+ $self->{curInfo}->{actors} = $1;
+ $self->{curInfo}->{actors} =~ s/\s*\(([^\)]*)\)\s*/;$1/g;
+ }
+ }
+ $self->{insideArtists} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} .= $origtext;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ $html =~ s/<!--[^-]*-->//g;
+ $html =~ s/<b>|<\/b>//g;
+ $html =~ s/&nbsp;/ /g;
+ $html =~ s/\\'//g;
+ $html =~ s|<A HREF="/modules/Artistes/fiche/[0-9]*[^>]*>(.*?)</A>|$1|gi;
+ $html =~ s/<font class=link_news_2>([^<]*)<\/font>/$1/gi;
+ $html =~ s/<font class=link4dtext>([^<]*)<br>([^<]*)<\/TD>/<font class=link4dtext>$1 $2<\/font><\/TD>/gi;
+ $html =~ s|<h1>Oops\!</h1>||gi;
+
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#156;|oe|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.cinemotions.com/recherche/$word.html"
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return 'http://www.cinemotions.com' . $url;
+ }
+
+ sub getName
+ {
+ return 'Cinemotions.com';
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCCsfd.pm b/lib/gcstar/GCPlugins/GCfilms/GCCsfd.pm
new file mode 100644
index 0000000..ea84b45
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCCsfd.pm
@@ -0,0 +1,699 @@
+# Replace SiteTemplate with your plugin name.
+# The package name must exactly match the file name (.pm)
+package GCPlugins::GCfilms::GCCsfd;
+
+###################################################
+#
+# Copyright 2005-2009 Tian
+# Copyright 2007,2011 Petr Gajdůšek <gajdusek.petr@centrum.cz>
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+#use warnings;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ # Replace SiteTemplate with your exporter name
+ # It must be the same name as the one used for file and main package name
+ package GCPlugins::GCfilms::GCPluginCsfd;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ # getSearchCharset
+ # Charset of search term
+ sub getSearchCharset
+ {
+ return 'UTF-8';
+ }
+
+ # getSearchUrl
+ # Used to get the URL that to be used to perform searches.
+ # $word is the query
+ # Returns the full URL.
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://www.csfd.cz/hledat/?q=$word";
+ }
+
+ # getItemUrl
+ # Used to get the full URL of a movie page.
+ # Useful when url on results pages are relative.
+ # $url is the URL as found with a search.
+ # Returns the absolute URL.
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ $url = "http://www.csfd.cz" . $url if ($url !~ /^http:/);
+ return $url;
+ }
+
+ # getCharset
+ # Used to convert charset in web pages.
+ # Returns the charset as specified in pages.
+ #sub getCharset {
+ # my $self = shift;
+ #
+ # return "UTF-8";
+ #}
+
+ # getName
+ # Used to display plugin name in GUI.
+ # Returns the plugin name.
+ sub getName
+ {
+ return "CSFD.cz";
+ }
+
+ # getAuthor
+ # Used to display the plugin author in GUI.
+ # Returns the plugin author name.
+ sub getAuthor
+ {
+ return 'Petr Gajdůšek';
+ }
+
+ # getLang
+ # Used to fill in plugin list with user language plugins
+ # Return the language used for this site (2 letters code).
+ sub getLang
+ {
+ return 'CS';
+ }
+
+ # hasSearchYear
+ # Used to hide year column in search results
+ # Return 0 to hide column, 1 to show it.
+ sub hasSearchYear
+ {
+ return 1;
+ }
+
+ # hasSearchDirector
+ # Used to hide director column in search results
+ # Return 0 to hide column, 1 to show it.
+ sub hasSearchDirector
+ {
+ return 1;
+ }
+
+ # hasSearchActors
+ # Used to hide actors column in search results
+ # Return 0 to hide column, 1 to show it.
+ sub hasSearchActors
+ {
+ return 1;
+ }
+
+ # getExtra
+ # Used if the plugin wants an extra column to be displayed in search results
+ # Return the column title or empty string to hide the column.
+ sub getExtra
+ {
+
+ return 'Žánr';
+ }
+
+ # changeUrl
+ # Can be used to change URL if movie URL and the one used to
+ # extract information are different.
+ # Return the modified URL.
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ # preProcess
+ # Called before each page is processed. You can use it to do some substitutions.
+ # $html is the page content.
+ # Returns modified version of page content.
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ $self->{parsingEnded} = 0;
+ if ($self->{parsingList})
+ {
+ # Search results
+
+ # Initial values for search results parsing
+ # There are two movies list:
+ # First with detailed info (title, genre, origin country, year, directors, actors)
+ # Second with brief list of other movies (title, year)
+
+ # We are in brief list containing other movies without details
+ $self->{insideOtherMovies} = 0;
+ # Movie link; movie's details follow if not in brief list
+ $self->{isMovie} = 0;
+
+ ## Details:
+
+ # Movie's details will follow: Genre, origin, actors, directors, year
+ $self->{insideDetails} = 0;
+ # In movie's details after paragraph with Genre, origin and date
+ $self->{wasDetailsInfo} = 0;
+ # In movie's details: directors and actors
+ $self->{directors} = ();
+ $self->{directorsCounter} = 0;
+ $self->{actors} = ();
+ $self->{actorsCounter} = 0;
+ $self->{insideDirectors} = 0;
+ $self->{insideActors} = 0;
+
+ # Movie year
+ $self->{isYear} = 0;
+
+ ## Preprocess
+
+ # directors and actors
+ $html =~ s/\n\s*Režie:\s([^\n]*)/<div class="directors">$1<\/div>/g;
+ $html =~ s/\n\s*Hrají:\s([^\n].*)/<div class="actors">$1<\/div>/g;
+ # year
+ $html =~ s/<span class="film-year">\(([0-9]+)\)<\/span>/<span class="film-year">$1<\/span>/g;
+ }
+ else
+ {
+ # Movie page
+
+ # Initial values for search results parsing
+
+ # array containg other movie titles (not exported to GCStar)
+ $self->{titles} = ();
+ # in list containing other movie titles
+ $self->{isTitles} = 0;
+ # in the original title (title for same country as movie's origin)
+ $self->{isOrigTitle} = 0;
+ # original title (if not set during parsing it will be set to main title at the end)
+ $self->{origTitle} = undef;
+ $self->{titlesCounter} = 0;
+
+ $self->{insideGenre} = 0;
+
+ $self->{awaitingSynopsis} = 0;
+ $self->{insideSynopsis} = 0;
+
+ # inside details with country, date (year) and time (length)
+ $self->{insideInfo} = 0;
+
+ $self->{insideRating} = 0;
+
+ # User comments
+ # Each comment consists of commenter (user) and his comment
+
+ $self->{insideCommentAuthor} = 0;
+ $self->{awaitingComment} = 0;
+ $self->{insideComment} = 0;
+
+ # In directors and actors
+ $self->{insideDirectors} = 0;
+ $self->{insideActors} = 0;
+ $self->{directors} = ();
+ $self->{directorsCounter} = 0;
+ $self->{actors} = ();
+ $self->{actorsCounter} = 0;
+
+ ## Preprocess
+
+ # removee <br /> and <br>
+ $html =~ s/<br( \/)?>/\n/g;
+ ## Synopsis
+ # remove list bullet
+ $html =~ s/<img src="http:\/\/img.csfd.cz\/sites\/web\/images\/common\/li.gif"[^>]*>//g;
+ # remove hyperlink to user profile
+ $html =~ s/(&nbsp;<span class="source[^\(]*\()<a[^>]*>([^<]*)<\/a>/$1uživatel $2/g;
+ # remove <span></span> around synopsis source
+ $html =~ s/&nbsp;<span class="source[^\(]*\(([^\)]*)\)<\/span>/\n-- $1/g;
+ $html =~ s/<div data-truncate="570">([^<]*)<\/div>/$1/g;
+ }
+ return $html;
+ }
+
+ # In processing functions below, self->{parsingList} can be used.
+ # If true, we are processing a search results page
+ # If false, we are processing a movie information page.
+
+ # $self->{inside}->{tagname} (with correct value for tagname) can be used to test
+ # if we are in the corresponding tag.
+
+ # You have a counter $self->{movieIdx} that have to be used when processing search results.
+ # It is your responsability to increment it!
+
+ # When processing search results, you have to fill (if available) following fields:
+ #
+ # $self->{movieList}[$self->{movieIdx}]->{title}
+ # $self->{movieList}[$self->{movieIdx}]->{url}
+ # $self->{movieList}[$self->{movieIdx}]->{actors}
+ # $self->{movieList}[$self->{movieIdx}]->{director}
+ # $self->{movieList}[$self->{movieIdx}]->{date}
+ # $self->{movieList}[$self->{movieIdx}]->{extra}
+
+ # When processing a movie page, you need to fill the fields (if available) in $self->{curInfo}. They are:
+ #
+ # $self->{curInfo}->{title}
+ # $self->{curInfo}->{director}
+ # $self->{curInfo}->{original} (Original title)
+ # $self->{curInfo}->{actors}
+ # $self->{curInfo}->{genre} (Comma separated list of movie type)
+ # $self->{curInfo}->{country} (Movie Nationality or country)
+ # $self->{curInfo}->{date}
+ # $self->{curInfo}->{time}
+ # $self->{curInfo}->{synopsis}
+ # $self->{curInfo}->{image}
+ # $self->{curInfo}->{audio}
+ # $self->{curInfo}->{subt}
+ # $self->{curInfo}->{age} 0 : No information
+ # 1 : Unrated
+ # 2 : All audience
+ # 5 : Parental Guidance
+ # >= 10 : Minimum age value
+
+ # start
+ # Called each time a new HTML tag begins.
+ # $tagname is the tag name.
+ # $attr is reference to an associative array of tag attributes.
+ # $attrseq is an array reference containing all the attributes name.
+ # $origtext is the tag text as found in source file
+ # Returns nothing
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+
+ if ($self->{parsingEnded})
+ {
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+
+ # in brief list of other movies (without details)
+ if ($tagname eq "ul" and $attr->{class} eq "films others")
+ {
+ $self->{insideOtherMovies} = 1;
+ }
+
+ # in link to movie page
+ if ($tagname eq "a" and $attr->{href} =~ m/\/film\/[0-9]+-.*/)
+ {
+ $self->{isMovie} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $attr->{href};
+ $self->{insideDetails} = 1 if ($self->{insideOtherMovies} != 1);
+ $self->{wasDetailsInfo} = 0;
+ }
+
+ # directors and actors
+ if ($tagname eq "div")
+ {
+ $self->{insideDirectors} = 1 if ($attr->{class} eq "directors");
+ $self->{insideActors} = 1 if ($attr->{class} eq "actors");
+ }
+
+ # year
+ if ($tagname eq "span")
+ {
+ $self->{isYear} = 1 if ($attr->{class} eq "film-year");
+ }
+ }
+ else
+ {
+
+ # Synopsis
+ if ( $tagname eq "div"
+ and $attr->{class} eq "content"
+ and $self->{awaitingSynopsis})
+ {
+ $self->{insideSynopsis} = 1;
+ $self->{awaitingSynopsis} = 0;
+ }
+
+ # Poster
+ if ( $tagname eq "img"
+ and $attr->{src} =~ /^http:\/\/img\.csfd\.cz\/posters\//)
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+ }
+
+ # Original name and other names
+ if ($tagname eq "ul" and $attr->{class} eq "names")
+ {
+ $self->{isTitles} = 1;
+ }
+
+ if ($tagname eq "img" and $self->{isTitles})
+ {
+ $self->{isOrigTitle} = 1 if ($attr->{alt} !~ /název$/);
+ $self->{isSKTitle} = 1 if ($attr->{alt} =~ /SK název$/);
+ }
+
+ # Genre
+ if ($tagname eq "p" and $attr->{class} eq "genre")
+ {
+ $self->{insideGenre} = 1;
+ }
+
+ # Info (country ,date, time = duration)
+ if ($tagname eq "p" and $attr->{class} eq "origin")
+ {
+ $self->{insideInfo} = 1;
+ }
+
+ # Rating
+ if ($tagname eq "h2" and $attr->{class} eq "average")
+ {
+ $self->{insideRating} = 1;
+ }
+
+ # Comments
+ if ($tagname eq "h5" and $attr->{class} eq "author")
+ {
+ $self->{insideCommentAuthor} = 1;
+ }
+ if ($self->{awaitingComment} and $tagname eq "p" and $attr->{class} eq "post")
+ {
+ $self->{awaitingComment} = 0;
+ $self->{insideComment} = 1;
+ }
+
+ }
+ }
+
+ # end
+ # Called each time a HTML tag ends.
+ # $tagname is the tag name.
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+
+ if ($self->{parsingList})
+ {
+
+ # movie details
+ $self->{insideDetails} = 0
+ if ($tagname eq "div")
+ and $self->{insideDetails};
+
+ # directors and actors
+ if ($tagname eq "div")
+ {
+ if ($self->{insideDirectors})
+ {
+ $self->{insideDirectors} = 0;
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} =
+ join(', ', @{$self->{directors}});
+ $self->{directors} = ();
+ $self->{directorsCounter} = 0;
+ }
+ if ($self->{insideActors})
+ {
+ $self->{insideActors} = 0;
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} =
+ join(', ', @{$self->{actors}});
+ $self->{actors} = ();
+ $self->{actorsCounter} = 0;
+ }
+ }
+ }
+ else
+ {
+
+ # Synopsis
+ $self->{insideSynopsis} = 0 if ($tagname eq "div");
+
+ # Titles
+ if ($tagname eq "ul" and $self->{isTitles})
+ {
+ $self->{isTitles} = 0;
+ }
+
+ if ( $tagname eq "body" )
+ {
+ $self->{curInfo}->{original} ||= $self->{curInfo}->{title};
+ }
+
+ # Actors
+ if ($tagname eq "div" and $self->{insideActors})
+ {
+ $self->{curInfo}->{actors} = join(', ', @{$self->{actors}});
+ $self->{insideActors} = 0;
+ }
+
+ # Directors
+ if ($tagname eq "div" and $self->{insideDirectors})
+ {
+ $self->{curInfo}->{director} = join(', ', @{$self->{directors}});
+ $self->{insideDirectors} = 0;
+ }
+
+ # Comment
+
+ $self->{insideCommentAuthor} = 0
+ if ($tagname eq "h5" and $self->{insideCommentAuthor});
+
+ if ($tagname eq "li" and $self->{isComment})
+ {
+ $self->{curInfo}->{comment} .= "\n";
+ $self->{isComment} = 0;
+ }
+
+ # Debug
+ if ($tagname eq "body" and $self->{debug})
+ {
+ use Data::Dumper;
+ print Dumper $self->{curInfo};
+ }
+ }
+ }
+
+ # text
+ # Called each time some plain text (between tags) is processed.
+ # $origtext is the read text.
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+ $origtext =~ s/^\s+|\s+$//g;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{inside}->{h1} && $origtext !~ m/Vyhledávání/i)
+ {
+ $self->{parsingEnded} = 1;
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+
+ # Movie title
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} = $origtext;
+ $self->{isMovie} = 0;
+ return;
+ }
+
+ # Date (year)
+ elsif ($self->{isYear})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"date"} = $origtext;
+ $self->{isYear} = 0;
+ }
+
+ # Extra movie info: genre, origin, date
+ elsif ( $self->{inside}->{p}
+ and $self->{insideDetails}
+ and $self->{wasDetailsInfo} == 0)
+ {
+ my @tmp = split(', ', $origtext);
+ my $pos = $#tmp;
+ my ($year, $country, $genre) = (undef, undef, undef);
+ $year = $tmp[$pos] if ($tmp[$pos] =~ /^\d+$/);
+ $pos--;
+ $country = $tmp[$pos] if ($pos >= 0);
+ $pos--;
+ $genre = $tmp[$pos] if ($pos >= 0);
+
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $year if (defined $year);
+ $self->{itemsList}[ $self->{itemIdx} ]->{country} = $country
+ if (defined $country);
+ $self->{itemsList}[ $self->{itemIdx} ]->{extra} = $genre
+ if (defined $genre);
+ $self->{wasDetailsInfo} = 1;
+ }
+
+ # Directors
+ elsif ($self->{inside}->{a} and $self->{insideDirectors})
+ {
+ push @{$self->{directors}}, $origtext;
+ $self->{directorsCounter}++;
+ }
+
+ # Actors
+ elsif ($self->{inside}->{a} and $self->{insideActors})
+ {
+ push @{$self->{actors}}, $origtext;
+ $self->{actorsCounter}++;
+ }
+ }
+ else
+ {
+
+ # Movie titles
+ if ($self->{inside}->{h1})
+ {
+ $self->{curInfo}->{title} = $origtext
+ if !$self->{curInfo}->{title};
+ }
+ if ($self->{inside}->{h3} and $self->{isTitles})
+ {
+ $self->{titlesCounter}++;
+ $self->{titles}[ $self->{titlesCounter} ] = $origtext;
+ if ($self->{isOrigTitle})
+ {
+ $self->{curInfo}->{original} ||= $origtext;
+ $self->{isOrigTitle} = 0;
+ }
+ if ($self->{isSKTitle} and $self->{lang} eq "SK")
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isSKTitle} = 0;
+ }
+ }
+
+ # Genre
+ if ($self->{insideGenre})
+ {
+ $origtext =~ s/ \/ /,/g;
+ $self->{curInfo}->{genre} = $origtext;
+ $self->{insideGenre} = 0;
+ }
+
+ # Extra movie info: country, date (year), time
+ if ($self->{insideInfo})
+ {
+ my ($country, $year, $time) = split(', ', $origtext);
+ $country =~ s/ \/ /,/g;
+
+ $self->{curInfo}->{country} = $country;
+ $self->{curInfo}->{date} = $year;
+ $self->{curInfo}->{time} = $time;
+
+ $self->{insideInfo} = 0;
+ }
+
+ # Directors and Actors
+ if ($self->{inside}->{h4})
+ {
+ $self->{insideDirectors} = 1 if ($origtext =~ /^Režie:/);
+ $self->{insideActors} = 1 if ($origtext =~ /^Hrají:/);
+ }
+
+ if ($self->{inside}->{a} and $self->{insideDirectors})
+ {
+ push @{$self->{directors}}, $origtext;
+ $self->{directorsCounter}++;
+ }
+ if ($self->{inside}->{a} and $self->{insideActors})
+ {
+ #push @{$self->{curInfo}->{actors}}, [$origtext]
+ # if ($self->{actorsCounter} <
+ # $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ #$self->{actorsCounter}++;
+ push @{$self->{actors}}, $origtext;
+ $self->{actorsCounter}++;
+ }
+
+ # Synopsis
+ if ($self->{inside}->{h3})
+ {
+ $self->{awaitingSynopsis} = 1 if ($origtext eq "Obsah");
+ }
+ if ($self->{inside}->{li} and $self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} .= $origtext . "\n\n\n";
+ }
+
+ # Rating
+ if ($self->{insideRating})
+ {
+ $origtext =~ s/([0-9]+)%/$1/;
+ $self->{curInfo}->{ratingpress} = int($origtext / 10 + .5)
+ if ($origtext ne "");
+ $self->{insideRating} = 0;
+ }
+
+ # Comments
+ if ($self->{inside}->{a} and $self->{insideCommentAuthor})
+ {
+ $self->{curInfo}->{comment} .= $origtext . " napsal(a):\n";
+ $self->{awaitingComment} = 1;
+ }
+ if ($self->{insideComment})
+ {
+ $self->{curInfo}->{comment} .= $origtext . "\n\n";
+ $self->{insideComment} = 0;
+ }
+ }
+ }
+
+ # new
+ # Constructor.
+ # Returns object reference.
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ # Do your init stuff here
+
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 1,
+ country => 1
+ };
+
+ $self->{lang} = "CS";
+
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ $self->{debug} = ($ENV{GCS_DEBUG_PLUGIN_PHASE} > 0);
+
+ return $self;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCCulturalia.pm b/lib/gcstar/GCPlugins/GCfilms/GCCulturalia.pm
new file mode 100644
index 0000000..55c6692
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCCulturalia.pm
@@ -0,0 +1,241 @@
+package GCPlugins::GCfilms::GCCulturalia;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+###################################
+# #
+# Plugin soumis par MeV #
+# #
+###################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginCulturalia;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ($attr->{href} =~ /^\.\.\/art\/ver\.php\?art=/)
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if ($attr->{src} =~ /\.\.\/(imatges\/articulos\/[0-9]*-1\.jpg)/)
+ {
+ $self->{curInfo}->{image} = "http://www.culturalianet.com/" . $1;
+ }
+ }
+ elsif ($tagname eq "font")
+ {
+ $self->{insideName} = 1 if $attr->{class} eq "titulo2";
+ $self->{insideInfos} = 1 if $attr->{class} eq "titulo3";
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ if ($origtext =~ /De ([^\(]*) \(([0-9]{4})\)/)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{"director"} = $1;
+ $self->{itemsList}[ $self->{itemIdx} ]->{"date"} = $2;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ }
+ else
+ {
+ $origtext =~ s/\.$//;
+ $self->{itemsList}[$self->{itemIdx}]->{"title"} = $origtext if !$self->{itemsList}[$self->{itemIdx}]->{"title"};
+ }
+ return;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+ $origtext =~ s/\n//g if !$self->{insideSynopsis};
+
+ if ($self->{insideName})
+ {
+ if ($origtext =~ /([^\(]*)\. \(([0-9]{4})\)/)
+ {
+ $self->{curInfo}->{title} = $1;
+ $self->{curInfo}->{date} = $2;
+ }
+ $self->{insideName} = 0;
+ }
+ elsif ($self->{insideInfos})
+ {
+ $origtext =~ s/ , //;
+ $origtext =~ s/(, )*$//;
+ if ($origtext =~ /Género\:(.*)/)
+ {
+ ($self->{curInfo}->{genre} = $1) =~ s/ \/ /,/g;
+ }
+ elsif ($origtext =~ /Nacionalidad\:(.*)/)
+ {
+ $self->{curInfo}->{country} = $1;
+ }
+ elsif ($origtext =~ /Director\:(.*)/)
+ {
+ $self->{curInfo}->{director} = $1;
+ }
+ elsif ($origtext =~ /Actores\:(.*)/)
+ {
+ $self->{curInfo}->{actors} = $1;
+ }
+ elsif ($origtext =~ /Sinopsis\:(.*)/)
+ {
+ ($self->{curInfo}->{synopsis} = $1) =~ s/, //;
+ }
+ elsif ($origtext =~ /Duración\:(.*)/)
+ {
+ ($self->{curInfo}->{time} = $1) =~ s/\.$//;
+ }
+ $self->{insideInfos} = 0;
+ }
+ elsif ($origtext =~ /^Sinopsis\:(.*)/)
+ {
+ ($self->{curInfo}->{synopsis} = $1) =~ s/, //;
+ $self->{curInfo}->{synopsis} =~ s/(, )*$//;
+ }
+ if ($self->{inside}->{i})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $html =~ s{</?b>}{}g;
+ $html =~ s/<br>/, /g;
+ $html =~ s{<a href=\.\./art/ver_e\.php\?nombre=[0-9]*>([^<]*)</a>}
+ {$1}g;
+ $html =~ s{<font class.=..titulo3.>([^<]*)</font>([^<]*)}
+ {<font class ='titulo3'>$1 $2</font>}g;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.culturalianet.com/bus/resu.php?texto=$word&donde=1";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.culturalianet.com/bus/" . $url;
+ }
+
+ sub getName
+ {
+ return "CulturaliaNet";
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'ES';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "Windows-1252";
+ }
+
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCDVDEmpire.pm b/lib/gcstar/GCPlugins/GCfilms/GCDVDEmpire.pm
new file mode 100644
index 0000000..a32a7a8
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCDVDEmpire.pm
@@ -0,0 +1,427 @@
+package GCPlugins::GCfilms::GCDVDEmpire;
+
+###################################################
+#
+# Copyright 2009 by FiXx
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginDVDEmpire;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start {
+ my ( $self, $tagname, $attr, $attrseq, $origtext ) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ( $self->{parsingList} ) {
+ if ( $self->{outOfMovieList} )
+ {
+ return;
+ }
+ elsif (( $self->{inMovieList} )
+ && ( $self->{inMovie} eq 0 )
+ && ( $tagname eq 'a' )
+ && ( $attr->{href} =~ /^(\/Exec\/v4_item.asp\?item_id=[0-9]*)$/ ) )
+ {
+ my $url = $1;
+ $self->{isMovie} = 1;
+ $self->{inMovie} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ elsif (( $self->{inMovie} )
+ && ( $tagname eq 'img' )
+ && ( $attr->{src} =~ /(.*gen\/movies\/[0-9]*t.jpg)/ ) )
+ {
+ (my $image = $attr->{src}) =~ s/t.jpg$/h.jpg/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{image} = $image;
+ }
+ elsif (( $self->{inMovie} )
+ && ( $tagname eq 'a' )
+ && ( $attr->{href} =~ /cast_id/ ) )
+ {
+ $self->{isActors} = 1;
+ }
+ elsif (( $self->{inMovie} )
+ && ( $tagname eq 'td' )
+ && ( $attr->{bgcolor} eq '#D7DDE7' ) )
+ {
+ $self->{inMovie} = 0;
+ }
+ elsif (( $tagname eq 'div' )
+ && ( $attr->{id} eq 'Search_Container' ) )
+ {
+ $self->{inMovieList} = 1;
+ }
+ elsif ( ( $self->{inMovieList} )
+ && ( $tagname eq 'endsearch' ))
+ {
+ $self->{inMovieList} = 0;
+ $self->{outOfMovieList} = 1;
+ }
+ }
+ else {
+ if ( $self->{parsingEnded} )
+ {
+ if (!$self->{infoSet})
+ {
+ $self->{curInfo}->{image} = $self->{itemsList}[$self->{wantedIdx}]->{image};
+ $self->{curInfo}->{date} = $self->{itemsList}[$self->{wantedIdx}]->{date}; #"short text"
+ $self->{curInfo}->{time} = $self->{itemsList}[$self->{wantedIdx}]->{time}; #"short text"
+ $self->{curInfo}->{age} = $self->{itemsList}[$self->{wantedIdx}]->{age}; #"options"
+ ($self->{curInfo}->{backpic} = $self->{curInfo}->{image}) =~ s/h.jpg/b.jpg/; #"image"
+
+ $self->{infoSet} = 1;
+ }
+ return;
+ }
+ elsif ( ($tagname eq 'div')
+ && ($attr->{id} eq 'Search_Container') )
+ {
+ $self->{isContent} = 1;
+ }
+ elsif ( ( $self->{isContent} )
+ && ( $tagname eq 'div' ) )
+ {
+ $self->{inNonContentDiv} = 1;
+ }
+ elsif ( $self->{isContent})
+ {
+ if ( ($tagname eq 'td')
+ && ($attr->{class} eq 'fontxlarge') )
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif ($tagname eq 'rating')
+ {
+ $self->{isRating} = 1 ;
+ }
+ elsif ($tagname eq 'actors')
+ {
+ $self->{isActors} = 1 ;
+ }
+ elsif ( ($self->{isActors})
+ && ($tagname eq 'a')
+ && ($attr->{href} =~ /v4_list_cast.asp/) )
+ {
+ $self->{isActor} = 1 ;
+ }
+ elsif ($tagname eq 'directors')
+ {
+ $self->{isDirectors} = 1 ;
+ }
+ elsif ( ($self->{isDirectors})
+ && ($tagname eq 'a')
+ && ($attr->{href} =~ /v4_list_cast.asp/) )
+ {
+ $self->{isDirector} = 1 ;
+ }
+ elsif ($tagname eq 'genres')
+ {
+ $self->{isGenres} = 1 ;
+ }
+ elsif ( ($self->{isGenres})
+ && ($tagname eq 'a')
+ && ($attr->{href} =~ /v2_category.asp/) )
+ {
+ $self->{isGenre} = 1 ;
+ }
+ elsif ($tagname eq 'audio')
+ {
+ $self->{inAudio} = 1 ;
+ }
+ elsif ( ($self->{inAudio})
+ && ($tagname eq 'td') )
+ {
+ $self->{isAudio} = 1 ;
+ }
+ elsif ( ($self->{isTitle})
+ && ($tagname eq 'strong') )
+ {
+ $self->{isTitle} = 2 ;
+ }
+ elsif ( ($self->{startSynopsis})
+ && ($tagname eq 'td') )
+ {
+ $self->{isSynopsis} = 1 ;
+ }
+ elsif ( ($self->{isSynopsis})
+ && ($tagname eq 'br') )
+ {
+ $self->{synopsisLineBreak} = 1 ;
+ }
+ }
+ }
+ }
+
+ sub end {
+ my ( $self, $tagname ) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ if ( !$self->{parsingList} )
+ {
+ if ( $self->{parsingEnded} )
+ {
+ return;
+ }
+ if ($self->{isContent})
+ {
+ if ( ( $tagname eq 'div' )
+ && ( !$self->{inNonContentDiv} ) )
+ {
+ $self->{isContent} = 0;
+ $self->{parsingEnded} = 1;
+ }
+ elsif ( ( $tagname eq 'div' )
+ && ( $self->{inNonContentDiv} ) )
+ {
+ $self->{inNonContentDiv} = 0;
+ }
+ elsif ( ( $tagname eq 'table' )
+ && ( $self->{isSynopsis} ) )
+ {
+ $self->{startSynopsis} = 0;
+ $self->{SynopsisEnded} = 1;
+ $self->{isSynopsis} = 0;
+ }
+ elsif ( ($self->{isActors} ) && ($tagname eq 'actors') )
+ {
+ $self->{isActors} = 0 ;
+ }
+ elsif ( ($self->{isGenres} ) && ($tagname eq 'genres') )
+ {
+ $self->{isGenres} = 0 ;
+ }
+ elsif ( ($self->{isDirectors} ) && ($tagname eq 'directors') )
+ {
+ $self->{isDirectors} = 0 ;
+ }
+ elsif ( ($self->{isAudio})
+ && ($tagname eq 'td') )
+ {
+ $self->{isAudio} = 0 ;
+ $self->{inAudio} = 0 ;
+ }
+ }
+ }
+
+ }
+
+ sub text {
+ my ( $self, $origtext ) = @_;
+
+ if ( $self->{parsingList} )
+ {
+ if ( ( $self->{inMovieList} ) && ( $self->{isMovie} ) )
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{isMovie} = 0;
+ }
+ elsif ( ( $self->{inMovie} ) && ( $origtext =~ /([^~]*)~~~([0-9]*)mins.~~~Release Date:[^~]*~~~Prod Year: ([0-9]{4})/ ) )
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{age} = 1
+ if ( $1 eq 'Unrated' ) || ( $1 eq 'Open' );
+ $self->{itemsList}[ $self->{itemIdx} ]->{age} = 2
+ if ( $1 eq 'G' ) || ( $1 eq 'Approved' );
+ $self->{itemsList}[ $self->{itemIdx} ]->{age} = 5
+ if ( $1 eq 'PG' ) || ( $1 eq 'M' ) || ( $1 eq 'GP' );
+ $self->{itemsList}[ $self->{itemIdx} ]->{age} = 13
+ if $1 eq 'PG-13';
+ $self->{itemsList}[ $self->{itemIdx} ]->{age} = 17
+ if $1 eq 'R';
+ $self->{itemsList}[ $self->{itemIdx} ]->{age} = 18
+ if ( $1 eq 'NC-17' ) || ( $1 eq 'X' );
+
+ $self->{itemsList}[ $self->{itemIdx} ]->{time} = $2 . ' min';
+
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $3;
+ }
+ elsif ( ( $self->{inMovie} ) && ( $self->{isActors} ) )
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} .= $origtext . ', ';
+ $self->{isActors} = 0;
+ }
+ }
+ else {
+ $origtext =~ s/^\s*//;
+
+ return if !$origtext;
+ if ( $self->{parsingEnded} )
+ {
+ return;
+ }
+ if ($self->{isContent})
+ {
+ if ( $self->{isTitle} eq 2)
+ {
+ $self->{curInfo}->{title} = $origtext; #"short text"
+ $self->{curInfo}->{original} = $origtext; #"short text"
+ $self->{isTitle} = 0 ;
+ }
+ elsif ( $self->{isRating})
+ {
+ $self->{curInfo}->{ratingpress} = int($origtext * 2); #"number"
+ $self->{isRating} = 0 ;
+ }
+ elsif ( ( !$self->{SynopsisEnded} )
+ && ( $origtext eq 'Synopsis' ) )
+ {
+ $self->{startSynopsis} = 1 ;
+ }
+ elsif ( $self->{isSynopsis} )
+ {
+ $self->{curInfo}->{synopsis} .= "\n\n" if $self->{synopsisLineBreak};
+ $self->{curInfo}->{synopsis} .= $origtext ; #"long text"
+ $self->{curInfo}->{synopsis} .= " " if $self->{synopsisLineBreak};
+ $self->{synopsisLineBreak} = 0 ;
+ }
+ elsif ( $self->{isActor} )
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext]
+ if ($self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ $self->{isActor} = 0 ;
+ }
+ elsif ( $self->{isGenre} )
+ {
+ push @{$self->{curInfo}->{genre}}, [$origtext];
+ $self->{isGenre} = 0 ;
+ }
+ elsif ( $self->{isDirector} )
+ {
+ $self->{curInfo}->{director} .= $origtext; #"long text"
+ $self->{isDirector} = 0 ;
+ $self->{isDirectors} = 0 ;
+ }
+ elsif ( $self->{isAudio} )
+ {
+ (my $language = $origtext) =~ s/([^:]*):(.*)/$1/ ;
+ my $audio = $2 ;
+ $language =~ s/\s// ;
+ $audio =~ s/\r// ;
+ push @{$self->{curInfo}->{audio}}, [$language, $audio];
+ }
+ }
+ }
+ }
+
+ sub new {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless( $self, $class );
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ actors => 1,
+ age => 1,
+ time => 1,
+ image => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{inMovie} = 0;
+ $self->{isContent} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess {
+ my ( $self, $html ) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s/<\/nobr>[ ]*~[ ]*<nobr>/~~~/g ;
+ $html =~ s/<b>Phone #:<\/b>/<endsearch>here<\/endsearch>/g ;
+
+ }
+ else
+ {
+ $html =~ s/<b>([0-9\.]*)<\/b> out of <b>5<\/b>/<rating>$1<\/rating>/g ; #/
+ $html =~ s/<b>Actors:<\/b>/<actors>/g ;
+ $html =~ s/<b>Writers:<\/b>/<\/actors>/g ;
+ $html =~ s/<b>Directors:<\/b>(.*cast_id[^\/]*<\/a>)/<directors>$1<\/directors>/g ; #/
+ $html =~ s/<b>Genre<\/b>(.*cat_id[^\/]*<\/a>)/<genres>$1<\/genres>/g ; #/
+ $html =~ s/<b>Audio:<\/b>/<audio><\/audio>/g ;
+ $html =~ s/<font face='[^']*' size='[^']*' color='#FFFFFF'>i<\/font>/ /g ;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl {
+ my ( $self, $word ) = @_;
+
+ my $searchvalue = 32 ;
+ my $strictmatching = 0;
+ if ($strictmatching)
+ {
+ $searchvalue = 64 ;
+ }
+ return "http://www.dvdempire.com/Exec/v1_search_all.asp?string=$word&pp=5&search_refined=$searchvalue";
+ }
+
+ sub getItemUrl {
+ my ( $self, $url ) = @_;
+
+ return 'http://www.dvdempire.com/' . $url;
+ }
+
+ sub changeUrl {
+ my ( $self, $url ) = @_;
+
+ return $url;
+ }
+
+ sub getName {
+ return "DVDEmpire (EN)";
+ }
+
+ sub getCharset {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ sub getAuthor {
+ return 'FiXx';
+ }
+
+ sub getLang {
+ return 'EN';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCDVDFr.pm b/lib/gcstar/GCPlugins/GCfilms/GCDVDFr.pm
new file mode 100644
index 0000000..d75c2f6
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCDVDFr.pm
@@ -0,0 +1,374 @@
+package GCPlugins::GCfilms::GCDVDFr;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+###################################
+# #
+# Plugin soumis par MeV #
+# #
+###################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginDVDFr;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'dvd')
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ }
+ elsif ($tagname eq 'id')
+ {
+ $self->{isID} = 1;
+ }
+ elsif ($tagname eq 'fr')
+ {
+ $self->{isTitleFR} = 1;
+ }
+ elsif (($tagname eq 'star') && ($attr->{type} =~ /R.alisateur/))
+ {
+ $self->{isDirector} = 1;
+ }
+ elsif ($tagname eq "media")
+ {
+ $self->{isMedia} = 1;
+ }
+ elsif ($tagname eq "edition")
+ {
+ $self->{isEdition} = 1;
+ }
+ }
+ else
+ {
+ if (($tagname eq "cover") || ($tagname eq "jaquette"))
+ {
+ $self->{insideImage} = 1;
+ }
+ elsif ($tagname eq "url")
+ {
+ $self->{insideURL} = 1;
+ }
+ elsif (($tagname eq "fr") || ($tagname eq "titres_fr"))
+ {
+ $self->{insideTitleFR} = 1;
+ }
+ elsif (($tagname eq "vo") || ($tagname eq "titres_vo"))
+ {
+ $self->{insideTitleVO} = 1;
+ }
+ elsif ($tagname eq "pays")
+ {
+ $self->{insideNat} = 1;
+ }
+ elsif ($tagname eq "annee")
+ {
+ $self->{insideYear} = 1;
+ }
+ elsif ($tagname eq "synopsis")
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ elsif ($tagname eq "duree")
+ {
+ $self->{insideTime} = 1;
+ }
+ elsif ($tagname eq "realisateur")
+ {
+ $self->{insideDirector} = 1;
+ }
+ elsif ($tagname eq "star")
+ {
+ $self->{insideDirector} = 1 if $attr->{type} eq "Réalisateur";
+ $self->{insideActors} = 1
+ if (! $attr->{type}) || ($attr->{type} eq "Acteur");
+ }
+ elsif ($tagname eq "categorie")
+ {
+ $self->{insideGenre} = 1;
+ }
+ elsif ($tagname eq "rating")
+ {
+ $self->{curInfo}->{age} = 2 if $attr->{id} == 1;
+ $self->{curInfo}->{age} = 5 if $attr->{id} == 2;
+ $self->{curInfo}->{age} = 12 if $attr->{id} == 3;
+ $self->{curInfo}->{age} = 13 if $attr->{id} == 4;
+ $self->{curInfo}->{age} = 16 if $attr->{id} == 5;
+ $self->{curInfo}->{age} = 18 if $attr->{id} > 5;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if (length($origtext) < 2) && (! $self->{isID});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isID})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.dvdfr.com/api/dvd.php?id=$origtext";
+ $self->{isID} = 0;
+ }
+ elsif ($self->{isDirector})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{"director"} .= $self->{itemsList}[$self->{itemIdx}]->{"director"} ? ", " . $origtext : $origtext
+ if ($self->{directorCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_DIRECTORS);
+ $self->{directorCounter}++;
+ $self->{isDirector} = 0;
+ }
+ elsif ($self->{isMovie})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{"title"} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{directorCounter} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($self->{isTitleFR})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{"title"} = $origtext;
+ $self->{isTitleFR} = 0;
+ }
+ elsif ($self->{isMedia})
+ {
+ $origtext = '' if $origtext !~ /\w/;
+ $self->{itemsList}[$self->{itemIdx}]->{"format"} = $origtext;
+ $self->{isMedia} = 0;
+ }
+ elsif ($self->{isEdition})
+ {
+ $origtext = '' if $origtext !~ /\w/;
+ $self->{itemsList}[$self->{itemIdx}]->{"extra"} = $origtext;
+ $self->{isEdition} = 0;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+
+ if ($self->{insideImage})
+ {
+ if ($origtext =~ m|/microapp/jaquette.php\?id=([0-9]*)|)
+ {
+ my $dir = int($1 / 1000);
+ $self->{curInfo}->{image} = "http://dvdfr.com/images/dvd/cover_200x280/$dir/$1.jpg";
+ }
+ else
+ {
+ $self->{curInfo}->{image} = $origtext;
+ }
+ $self->{insideImage} = 0;
+ }
+ elsif ($self->{insideURL})
+ {
+ $self->{curInfo}->{$self->{urlField}} = $origtext;
+ $self->{insideURL} = 0;
+ }
+ elsif ($self->{insideTitleFR})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideTitleFR} = 0;
+ }
+ elsif ($self->{insideTitleVO})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{insideTitleVO} = 0;
+ }
+ elsif ($self->{insideNat})
+ {
+ $self->{curInfo}->{country} .= $self->{curInfo}->{country} ? ", " . $origtext : $origtext;
+ $self->{insideNat} = 0;
+ }
+ elsif ($self->{insideYear})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideYear} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{curInfo}->{synopsis} =~ s/\n/ /g;
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($self->{insideTime})
+ {
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ $self->{curInfo}->{director} .= $self->{curInfo}->{director} ? ", " . $origtext : $origtext
+ if ($self->{directorCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_DIRECTORS);
+ $self->{directorCounter}++;
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideActors})
+ {
+ $self->{curInfo}->{actors} .= $self->{curInfo}->{actors} ? ", " . $origtext : $origtext
+ if ($self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ $self->{insideActors} = 0;
+ }
+ elsif ($self->{insideGenre})
+ {
+ $self->{curInfo}->{genre} .= $self->{curInfo}->{genre} ? "," . $origtext : $origtext;
+ $self->{insideGenre} = 0;
+ }
+ elsif (($self->{inside}->{track}) && ($self->{inside}->{langue}))
+ {
+ if ($self->{curInfo}->{audio} !~ /(^|,)$origtext(,|$)/)
+ {
+ $self->{curInfo}->{audio} .= ',' if $self->{curInfo}->{audio};
+ $self->{curInfo}->{audio} .= $origtext;
+ }
+ }
+ elsif (($self->{inside}->{soustitrage}) && ($self->{inside}->{soustitre}))
+ {
+ if ($self->{curInfo}->{subt} !~ /(^|,)$origtext(,|$)/)
+ {
+ $self->{curInfo}->{subt} .= ',' if $self->{curInfo}->{subt};
+ $self->{curInfo}->{subt} .= $origtext;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 0,
+ director => 1,
+ actors => 0,
+ format => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{directorCounter} = 0;
+ $self->{actorsCounter} = 0;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ $word = 'ean:'.$word
+ if $word =~ /^[\dX]{8}[\dX]*$/;
+
+ return "http://www.dvdfr.com/api/search.php?title=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url unless $url eq '';
+ return "http://www.dvdfr.com/";
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ $url =~ s/\/dvd\//\/api\//;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "DVDFr.com";
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getExtra
+ {
+ return 'Edition';
+ }
+
+ sub getEanField
+ {
+ return 'title';
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCDVDPost.pm b/lib/gcstar/GCPlugins/GCfilms/GCDVDPost.pm
new file mode 100644
index 0000000..4bb6456
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCDVDPost.pm
@@ -0,0 +1,269 @@
+package GCPlugins::GCfilms::GCDVDPost;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+###################################
+# #
+# Plugin soumis par MeV #
+# #
+###################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginDVDPost;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if (($attr->{href} =~ /^product_info\.php\?products_id=/))
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if ($attr->{src} =~ /http:\/\/images\.dvdpost\.be\/\/dvd/)
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+ }
+ elsif ($self->{insideAge})
+ {
+ (my $fileName = $attr->{src}) =~ s|.+/([^/]+)$|$1|;
+ $self->{curInfo}->{age} = 2 if $fileName eq 'all.gif';
+ $self->{curInfo}->{age} = 12 if $fileName eq '-12.gif';
+ $self->{curInfo}->{age} = 16 if $fileName eq '-16.gif';
+ $self->{insideAge} = 0;
+ }
+ }
+ elsif ($tagname eq "table")
+ {
+ if ( ($attr->{cellpadding} eq "0")
+ && ($attr->{cellspacing} eq "0")
+ && ($attr->{width} eq "100%")
+ && ($attr->{border} ne "0"))
+ {
+ $self->{insideSynopsisFather} = 1;
+ }
+ }
+ elsif ($tagname eq "td")
+ {
+ if ($attr->{style} eq "text-align:right;font-size:9px;color:gray")
+ {
+ $self->{insideGenre} = 1;
+ }
+ elsif (($attr->{class} eq "boxText") && $attr->{align} eq "left")
+ {
+ if ($self->{insideSynopsisFather} == 1)
+ {
+ $self->{insideSynopsis} = 1;
+ $self->{insideSynopsisFather} = 0;
+ }
+ else
+ {
+ $self->{insideSynopsis} = 0;
+ }
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\n*//g if !$self->{insideSynopsis};
+ $origtext =~ s/\s{2,}//g;
+
+ if ($self->{insideDate})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideDate} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ $origtext =~ s/ ,/, /g;
+ $origtext =~ s/^(.*), /$1/;
+ $self->{curInfo}->{director} = $origtext if !$self->{curInfo}->{director};
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($self->{insideNat})
+ {
+ $self->{curInfo}->{country} = $origtext;
+ $self->{insideNat} = 0;
+ }
+ elsif ($self->{insideTime})
+ {
+ $self->{curInfo}->{time} = $origtext . " min";
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideActors})
+ {
+ $origtext =~ s/ ,/, /g;
+ $origtext =~ s/^(.*), /$1/;
+ $self->{curInfo}->{actors} = $origtext if !$self->{curInfo}->{actors};
+ $self->{insideActors} = 0;
+ }
+ elsif ($self->{insideOrig})
+ {
+ $self->{curInfo}->{original} = $origtext if !$self->{curInfo}->{original};
+ $self->{insideOrig} = 0;
+ }
+ elsif ($self->{inside}->{b})
+ {
+ $self->{insideDirector} = 1 if $origtext =~ m/R.alisateur/;
+ $self->{insideTime} = 1 if $origtext =~ m/Dur.e/;
+ $self->{insideActors} = 1 if $origtext =~ m/Acteurs/;
+ $self->{insideAge} = 1 if $origtext =~ m/Public/;
+ }
+ elsif ($self->{inside}->{table})
+ {
+ if ($origtext =~ /(.*) \( ([0-9]{4}) \)/)
+ {
+ $self->{curInfo}->{title} = $1 if !$self->{curInfo}->{title};
+ $self->{curInfo}->{date} = $2 if !$self->{curInfo}->{date};
+ }
+ elsif ($self->{insideGenre})
+ {
+ $origtext =~ s/\|/,/g;
+ $self->{curInfo}->{genre} = $origtext;
+ $self->{insideGenre} = 0;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 0,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $html =~ s/&nbsp;/ /g;
+ $html =~ s/<u>|<\/u>//g;
+ $html =~ s/<a href="directors\.php\?directors\_id=[0-9]*">([^<]*)<\/a>/$1/gi;
+ $html =~ s/<a href="actors\.php\?actors\_id=[0-9]*">([^<]*)<\/a>/$1/gi;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.dvdpost.be/advanced_search_result2.php?language=fr&keywords=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.dvdpost.be/" . $url . "&language=fr" unless $url eq '';
+ return "http://www.dvdpost.be/";
+ }
+
+ sub getName
+ {
+ return "DVDPost.be";
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCDicshop.pm b/lib/gcstar/GCPlugins/GCfilms/GCDicshop.pm
new file mode 100644
index 0000000..d50ea4d
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCDicshop.pm
@@ -0,0 +1,343 @@
+package GCPlugins::GCfilms::GCDicschop;
+
+###################################################
+#
+# Copyright 2005-2010 Tian, Michael Mayer
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginDicshop;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ return if $self->{parsingEnded};
+ if ($tagname eq 'div')
+ {
+ if ($attr->{class} eq 'ds_l_h')
+ {
+ $self->{isMovie} = 1;
+ }
+ elsif ($attr->{class} eq 'ds_l_b')
+ {
+ $self->{isMovie} = 0;
+ }
+ elsif ($attr->{class} eq 'settingSavePlusContainer')
+ {
+ $self->{parsingEnded} = 1;
+ }
+ }
+ elsif ($self->{isMovie} && ($tagname eq 'a'))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $attr->{href};
+ }
+ }
+ else
+ {
+ return if $self->{parsingEnded};
+
+ if ($tagname eq 'div')
+ {
+ if ($attr->{class} eq "header_section hs_spec")
+ {
+ $self->{isInfo} = 1;
+ }
+ elsif ($attr->{class} eq "header_section hs_omdomme")
+ {
+ $self->{isSynopsis} = 0;
+ }
+ elsif ($attr->{class} =~ m/right_cont_section/)
+ {
+ $self->{parsingEnded} = 1;
+ }
+ elsif (($attr->{class} =~ m/^item([12])$/) && $self->{isInfo})
+ {
+ $self->{isItem} = $1;
+ }
+ elsif ($attr->{class} =~ m/ds_produkt_left/)
+ {
+ $self->{isCover} = 1;
+ }
+ elsif ($attr->{class} =~ m/ds_omdomme_top/)
+ {
+ $self->{isRating} = 1;
+ }
+ elsif ($attr->{class} =~ m/ds_omdomme_cust/)
+ {
+ $self->{isRating} = 0;
+ }
+ }
+ elsif ($tagname eq 'img')
+ {
+ if ($self->{isCover} && (!$self->{curInfo}->{image}))
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{image} =~ s|front_normal|front_large|;
+ $self->{curInfo}->{backpic} = $self->{curInfo}->{image};
+ $self->{curInfo}->{backpic} =~ s|front_large|back_large|;
+ }
+ }
+ elsif ($self->{isRating})
+ {
+ $self->{curInfo}->{ratingpress} += 2
+ if ($attr->{src} =~ m/rate_big_1.gif/);
+ $self->{curInfo}->{ratingpress} += 1
+ if ($attr->{src} =~ m/rate_big_05.gif/);
+ }
+ }
+ elsif ($tagname eq 'script')
+ {
+ $self->{isSynopsis} = 0;
+ }
+ elsif ($tagname eq 'br')
+ {
+ $self->{curInfo}->{synopsis} .= "\n"
+ if ($self->{isSynopsis} && $self->{curInfo}->{synopsis});
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ if ($tagname eq 'div')
+ {
+ $self->{isCover} = 0;
+ }
+ elsif ($tagname eq 'p')
+ {
+ $self->{curInfo}->{synopsis} .= "\n"
+ if ($self->{isSynopsis} && $self->{curInfo}->{synopsis});
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ $origtext =~ s/^\s*//;
+ $origtext =~ s/\s*$//;
+ return if !$origtext;
+
+ if ($self->{parsingList})
+ {
+ # evaluate the search result page
+ if ($self->{isMovie})
+ {
+ if ($self->{inside}->{b})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ }
+ elsif ($self->{inside}->{div})
+ {
+ $origtext =~ /^.*?(\d{4}) +(med +([^-.]*))?/;
+ if ($1)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1;
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} = $3;
+ }
+ else
+ {
+ $origtext =~ /med +([^-.]*)/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} = $1
+ if $1;
+ }
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} =~ s/ och/,/g;
+ $self->{isMovie} = 0;
+ }
+ }
+ }
+ else
+ {
+ return if $self->{parsingEnded};
+ # evaluate the film details page
+ if ($self->{inside}->{h3})
+ {
+ if ($origtext eq "Filmens handling")
+ {
+ $self->{isSynopsis} = 1;
+ }
+ }
+ elsif ($self->{isSynopsis}) # important: elsif, not only if!
+ {
+ $self->{curInfo}->{synopsis} .= $origtext;
+ }
+ elsif ($self->{isItem} == 1)
+ {
+ $self->{key} = $origtext;
+ }
+ elsif ($self->{isItem} == 2)
+ {
+ if ( ($self->{key} eq "Grupp:")
+ or ($self->{key} eq "Genre:")
+ or ($self->{key} eq "Underkategori:"))
+ {
+ $origtext =~ s| *film$||i; # remove the trailing "film"
+ $origtext =~ s|/|,|i;
+ $self->{curInfo}->{genre} .= $origtext . ","
+ if (!($self->{curInfo}->{genre} =~ m/$origtext/));
+ }
+ elsif ($self->{key} eq "Speltid:")
+ {
+ $self->{curInfo}->{time} = $origtext;
+ }
+ elsif ($self->{key} eq "Svensk titel:")
+ {
+ $self->{curInfo}->{title} = $origtext;
+ }
+ elsif ($self->{key} eq "Originaltitel:")
+ {
+ $self->{curInfo}->{original} = $origtext;
+ }
+ elsif ($self->{key} eq "Produktionsland:")
+ {
+ if ($self->{curInfo}->{country}) {
+ $self->{curInfo}->{country} .= ", ";
+ }
+ $self->{curInfo}->{country} .= $origtext;
+ }
+ elsif ($self->{key} =~ m/Premi.*r:/)
+ {
+ $self->{curInfo}->{date} = $origtext;
+ }
+ elsif ($self->{key} eq "Regi:")
+ {
+ if ($self->{curInfo}->{director})
+ {
+ $self->{curInfo}->{director} .= ", ";
+ }
+ $self->{curInfo}->{director} = $origtext;
+ }
+ elsif ($self->{key} =~ m/despelare:$/)
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext]
+ if ($self->{actorsCounter} <
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ }
+ elsif ($self->{key} =~ m/ldersgr.*ns:/)
+ {
+ $origtext =~ m/^(\d+) /;
+ $self->{curInfo}->{"age"} = $1;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 1,
+ age => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isRating} = 0;
+ $self->{isCover} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+ $self->{isTitle} = 0;
+ $self->{isSynopsis} = 0;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.discshop.se/shop/search_solr.php?lang=&cont=ds&"
+ . "soktext=$word&subsite_set=movies&lang=se&subsite=bluray&&ref=";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return 'http://www.discshop.se/shop/' . $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "Discshop.se";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "Windows-1252";
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ sub getLang
+ {
+ return 'SV';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCDoubanfilm.pm b/lib/gcstar/GCPlugins/GCfilms/GCDoubanfilm.pm
new file mode 100644
index 0000000..e3e8563
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCDoubanfilm.pm
@@ -0,0 +1,255 @@
+package GCPlugins::GCfilms::GCDoubanfilm;
+
+###################################################
+#
+# Copyright 2005-2010 Bai Wensimi
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginDoubanfilm;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+ use XML::Simple;
+ use Encode;
+ use LWP::Simple qw($ua);
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if (($page =~ /^bad imdb/) & ($page =~ /^The/));
+ my $xml;
+ my $xs = XML::Simple->new;
+
+ if ($self->{parsingList})
+ {
+ if ($page =~ /feed>$/)
+ {
+ $xml = $xs->XMLin(
+ $page,
+ forceArray=>['author'],
+ KeyAttr => ['']
+ );
+ foreach my $ItemMovie( @{$xml->{'entry'}}){
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{'url'} = $ItemMovie->{'id'};
+ $self->{itemsList}[ $self->{itemIdx} ]->{'title'} = $ItemMovie->{'title'};
+ foreach my $tmp_author (@{$ItemMovie->{'author'}}){
+ {($self->{itemsList}[ $self->{itemIdx} ]->{'director'} ne '' ) and $self->{itemsList}[ $self->{itemIdx} ]->{'director'}.=',';}
+ $self->{itemsList}[ $self->{itemIdx} ]->{'director'}.=$tmp_author->{'name'};
+ }
+ foreach my $check1(@{$ItemMovie->{'db:attribute'}}){
+ my $db_attr1=$check1->{'name'};
+ SWITCH1: {
+ $db_attr1 eq 'country' and $self->{itemsList}[ $self->{itemIdx} ]->{'country'}=$check1->{'content'} ,last SWITCH1;
+ $db_attr1 eq 'pubdate' and $self->{itemsList}[ $self->{itemIdx} ]->{'date'}=$check1->{'content'} ,last SWITCH1;
+ ;
+ }
+ }
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin(
+ $page,
+ forceArray=>['author'],
+ KeyAttr => ['']
+ );
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{'url'} = $xml->{'id'};
+ $self->{itemsList}[ $self->{itemIdx} ]->{'title'} = $xml->{'title'};
+ foreach my $tmp_author (@{$xml->{'author'}}){
+ $self->{itemsList}[ $self->{itemIdx} ]->{'director'}.=$tmp_author->{'name'};
+ $self->{itemsList}[ $self->{itemIdx} ]->{'director'}.=',';
+ }
+ foreach my $check(@{$xml->{'db:attribute'}}){
+ my $db_attr=$check->{'name'};
+ SWITCH: {
+ $db_attr eq 'country' and $self->{itemsList}[ $self->{itemIdx} ]->{country}=$check->{'content'} ,last;
+ $db_attr eq 'pubdate' and $self->{itemsList}[ $self->{itemIdx} ]->{date}=$check->{'content'} ,last;
+ }
+ }
+ }
+ }
+ else
+ {
+ $xml =$xs->XMLin($page,
+ ForceArray => [ 'author' ],
+ KeyAttr => {'db:tag'=>'name','link'=>'rel'});
+ foreach my $tmp_author (@{$xml->{'author'}}){
+ {($self->{itemsList}[ $self->{itemIdx} ]->{'director'} ne '' ) and $self->{itemsList}[ $self->{itemIdx} ]->{'director'}.=',';}
+ $self->{curInfo}->{director}.=$tmp_author->{'name'};
+ }
+ $self->{curInfo}->{title}=$xml->{'title'};
+ $self->{curInfo}->{original}=$xml->{'title'};
+ $self->{curInfo}->{webPage}=$xml->{'link'}->{'alternate'}->{'href'};
+ $self->{curInfo}->{synopsis}=$xml->{'summary'};
+ foreach my $check(@{$xml->{'db:attribute'}}){
+ my $db_attr=$check->{'name'};
+ SWITCH2: {
+ $db_attr eq 'country' and $self->{curInfo}->{country}=$check->{'content'} ,last SWITCH2;
+ $db_attr eq 'pubdate' and $self->{curInfo}->{date}=$check->{'content'} ,last SWITCH2;
+ $db_attr eq 'cast' and { ($self->{curInfo}->{actors} ne '' ) and $self->{curInfo}->{actors}.=',' }, $self->{curInfo}->{actors}.=$check->{'content'} ,last SWITCH2;
+ ;
+ }
+ }
+
+ my $tmp_image=$xml->{'link'}->{'image'}->{'href'};
+ $tmp_image =~ s/spic/lpic/;
+ $self->{curInfo}->{image}=$tmp_image;
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ director => 1,
+ date => 1,
+ country => 1,
+ };
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ if ($self->{searchField} eq 'imdb')
+ {
+ return "http://api.douban.com/movie/subject/imdb/" .$word;
+ }
+ else
+ {
+ return "http://api.douban.com/movie/subjects?q=" .$word;
+ }
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ # Make sure the url is for the api, not the main movie page
+ return $self->getItemUrl($url);
+ }
+
+ sub getNumberPasses
+ {
+ return 1;
+ }
+
+ sub getName
+ {
+ return "豆瓣";
+ }
+
+
+ sub testURL
+ {
+ my ($self, $url) = @_;
+ $url =~ /[\?&]lid=([0-9]+)*/;
+ my $id = $1;
+ return ($id == $self->siteLanguageCode());
+ }
+
+ sub getReturnedFields
+ {
+ my $self = shift;
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ country => 1,
+ };
+
+ }
+
+ sub getAuthor
+ {
+ return 'BW';
+ }
+
+ sub getLang
+ {
+ return 'ZH';
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "UTF-8";
+ }
+ sub getSearchFieldsArray
+ {
+ return ['imdb', 'title'];
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'ZH';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCFilmAffinityEN.pm b/lib/gcstar/GCPlugins/GCfilms/GCFilmAffinityEN.pm
new file mode 100644
index 0000000..2774b36
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCFilmAffinityEN.pm
@@ -0,0 +1,334 @@
+package GCPlugins::GCfilms::GCFilmAffinityEN;
+
+###################################################
+#
+# Copyright 2005-2007 Tian
+# Edited 2009 by FiXx
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginFilmAffinityEN;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{parsingEnded})
+ {
+ if ( ($tagname eq 'a')
+ && ($attr->{href} =~ /\/en\/.*\.php\?movie_id=([0-9]*)/))
+ {
+ $self->{hasUrl} = 'film' . $1 . '.html';
+ }
+ }
+ elsif (!$self->{isMovie}
+ && ($tagname eq 'a')
+ && ($attr->{href} =~ /^\/en\/(film.*)$/))
+ {
+ my $url = $1;
+ $self->{isMovie} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ elsif (($tagname eq 'span')
+ && ($attr->{style} eq 'font-size: 10px; color:#666666'))
+ {
+ $self->{isDirector} = 1;
+ }
+ elsif (($tagname eq 'div')
+ && ($attr->{style} eq 'font-size: 10px'))
+ {
+ $self->{isActors} = 1;
+ }
+ }
+ else
+ {
+ if ( ($tagname eq 'span')
+ && ($attr->{style} eq 'color:#990000; font-size:16; font-weight: bold;'))
+ {
+ $self->{isTitle} = 1;
+ }
+ elsif ($tagname eq 'img')
+ {
+ if ($attr->{src} =~ /^\/imgs\/countries/)
+ {
+ $self->{curInfo}->{country} = $attr->{title};
+ }
+ elsif ($attr->{src} =~ /pics.*filmaffinity\.com\/.*-full\.jpg/)
+ {
+ $self->{curInfo}->{image} = $attr->{src}
+ if not exists $self->{curInfo}->{image};
+ }
+ }
+ elsif ($tagname eq 'a')
+ {
+ if ($attr->{href} =~ /pics.*filmaffinity\.com\/.*-large\.jpg/)
+ {
+ $self->{curInfo}->{image} = $attr->{href};
+ }
+ }
+ elsif ($tagname eq 'td')
+ {
+ if ($attr->{style} =~ /font-size:22px; font-weight: bold;/)
+ {
+ $self->{isRating} = 1;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{parsingEnded})
+ {
+ if ($self->{hasUrl})
+ {
+ $self->{itemsList}[0]->{url} = $self->{hasUrl};
+ $self->{hasUrl} = 0;
+ }
+ return;
+ }
+ if ($self->{inside}->{title} && ($origtext !~ /^Search\s+for /))
+ {
+ $self->{parsingEnded} = 1;
+ $self->{hasUrl} = 0;
+ $self->{itemIdx} = 0;
+ }
+ elsif ($self->{isMovie})
+ {
+ return if $origtext !~ /\w/;
+ return if $origtext eq 'Add to lists';
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isTitle} = 1;
+ }
+ elsif ($self->{isTitle})
+ {
+ (my $year = $origtext) =~ s/\s*\(([0-9]{4})\)\s*/$1/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $year;
+ $self->{isTitle} = 0;
+ }
+ elsif ($self->{isDirector})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} = $origtext;
+ $self->{isDirector} = 0;
+ }
+ elsif ($self->{isActors})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} = $origtext;
+ $self->{isActors} = 0;
+ }
+ }
+ else
+ {
+ $origtext =~ s/^\s*//;
+
+ return if !$origtext;
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ elsif ($self->{isOrig})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{isOrig} = 0;
+ }
+ elsif ($self->{isDate})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{isDate} = 0;
+ }
+ elsif ($self->{isTime})
+ {
+ $self->{curInfo}->{time} = $origtext;
+ $self->{isTime} = 0;
+ }
+ elsif ($self->{isDirector})
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{isDirector} = 0;
+ }
+ elsif ($self->{isActors})
+ {
+ if ($self->{inside}->{a} && $origtext)
+ {
+ $origtext =~ s/\n//g;
+ $self->{curInfo}->{actors} .= $origtext . ', ';
+ }
+ }
+ elsif ($self->{isGenre})
+ {
+ $self->{curInfo}->{genre} = $origtext;
+ $self->{curInfo}->{genre} =~ s/\s*\/\s*/,/g;
+ $self->{isGenre} = 0;
+ }
+ elsif ($self->{isSynopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{isSynopsis} = 0;
+ }
+ elsif ($self->{isRating})
+ {
+ $origtext =~ s/,/\./; # replace comma
+ $self->{curInfo}->{ratingpress} = int($origtext + 0.5);
+ $self->{isRating} = 0;
+ }
+
+ if ($self->{inside}->{b})
+ {
+ if ($origtext eq 'ORIGINAL TITLE')
+ {
+ $self->{isOrig} = 1;
+ }
+ elsif ($origtext eq 'YEAR')
+ {
+ $self->{isDate} = 1;
+ }
+ elsif ($origtext eq 'RUNNING TIME')
+ {
+ $self->{isTime} = 1;
+ }
+ elsif ($origtext eq 'DIRECTOR')
+ {
+ $self->{isDirector} = 1;
+ }
+ elsif ($origtext eq 'CAST')
+ {
+ $self->{isActors} = 1;
+ }
+ elsif ($origtext eq 'STUDIO/PRODUCER')
+ {
+ $self->{curInfo}->{actors} =~ s/, $//;
+ $self->{isActors} = 0;
+ }
+ elsif ($origtext eq 'GENRE')
+ {
+ $self->{isGenre} = 1;
+ }
+ elsif ($origtext eq 'SYNOPSIS/PLOT')
+ {
+ $self->{isSynopsis} = 1;
+ }
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.filmaffinity.com/en/search.php?"
+ ."stext=$word&stype=title";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return 'http://www.filmaffinity.com/en/' . $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "Film affinity (EN)";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ sub getAuthor
+ {
+ return 'Tian & PIN edited by FiXx';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCFilmAffinityES.pm b/lib/gcstar/GCPlugins/GCfilms/GCFilmAffinityES.pm
new file mode 100644
index 0000000..4c39ae5
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCFilmAffinityES.pm
@@ -0,0 +1,334 @@
+package GCPlugins::GCfilms::GCFilmAffinityES;
+
+###################################################
+#
+# Copyright 2005-2007 Tian
+# Edited 2009 by FiXx
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginFilmAffinityES;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{parsingEnded})
+ {
+ if ( ($tagname eq 'a')
+ && ($attr->{href} =~ /\/es\/.*\.php\?movie_id=([0-9]*)/))
+ {
+ $self->{hasUrl} = 'film' . $1 . '.html';
+ }
+ }
+ elsif (!$self->{isMovie}
+ && ($tagname eq 'a')
+ && ($attr->{href} =~ /^\/es\/(film.*)$/))
+ {
+ my $url = $1;
+ $self->{isMovie} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ elsif (($tagname eq 'span')
+ && ($attr->{style} eq 'font-size: 10px; color:#666666'))
+ {
+ $self->{isDirector} = 1;
+ }
+ elsif (($tagname eq 'div')
+ && ($attr->{style} eq 'font-size: 10px'))
+ {
+ $self->{isActors} = 1;
+ }
+ }
+ else
+ {
+ if ( ($tagname eq 'span')
+ && ($attr->{style} eq 'color:#990000; font-size:16; font-weight: bold;'))
+ {
+ $self->{isTitle} = 1;
+ }
+ elsif ($tagname eq 'img')
+ {
+ if ($attr->{src} =~ /^\/imgs\/countries/)
+ {
+ $self->{curInfo}->{country} = $attr->{title};
+ }
+ elsif ($attr->{src} =~ /pics.*filmaffinity\.com\/.*-full\.jpg/)
+ {
+ $self->{curInfo}->{image} = $attr->{src}
+ if not exists $self->{curInfo}->{image};
+ }
+ }
+ elsif ($tagname eq 'a')
+ {
+ if ($attr->{href} =~ /pics.*filmaffinity\.com\/.*-large\.jpg/)
+ {
+ $self->{curInfo}->{image} = $attr->{href};
+ }
+ }
+ elsif ($tagname eq 'td')
+ {
+ if ($attr->{style} =~ /font-size:22px; font-weight: bold;/)
+ {
+ $self->{isRating} = 1;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{parsingEnded})
+ {
+ if ($self->{hasUrl})
+ {
+ $self->{itemsList}[0]->{url} = $self->{hasUrl};
+ $self->{hasUrl} = 0;
+ }
+ return;
+ }
+ if ($self->{inside}->{title} && ($origtext !~ /^Búsqueda\s+de /))
+ {
+ $self->{parsingEnded} = 1;
+ $self->{hasUrl} = 0;
+ $self->{itemIdx} = 0;
+ }
+ elsif ($self->{isMovie})
+ {
+ return if $origtext !~ /\w/;
+ return if $origtext eq 'Añadir a listas';
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isTitle} = 1;
+ }
+ elsif ($self->{isTitle})
+ {
+ (my $year = $origtext) =~ s/\s*\(([0-9]{4})\)\s*/$1/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $year;
+ $self->{isTitle} = 0;
+ }
+ elsif ($self->{isDirector})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} = $origtext;
+ $self->{isDirector} = 0;
+ }
+ elsif ($self->{isActors})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} = $origtext;
+ $self->{isActors} = 0;
+ }
+ }
+ else
+ {
+ $origtext =~ s/^\s*//;
+
+ return if !$origtext;
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ elsif ($self->{isOrig})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{isOrig} = 0;
+ }
+ elsif ($self->{isDate})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{isDate} = 0;
+ }
+ elsif ($self->{isTime})
+ {
+ $self->{curInfo}->{time} = $origtext;
+ $self->{isTime} = 0;
+ }
+ elsif ($self->{isDirector})
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{isDirector} = 0;
+ }
+ elsif ($self->{isActors})
+ {
+ if ($self->{inside}->{a} && $origtext)
+ {
+ $origtext =~ s/\n//g;
+ $self->{curInfo}->{actors} .= $origtext . ', ';
+ }
+ }
+ elsif ($self->{isGenre})
+ {
+ $self->{curInfo}->{genre} = $origtext;
+ $self->{curInfo}->{genre} =~ s/\s*\/\s*/,/g;
+ $self->{isGenre} = 0;
+ }
+ elsif ($self->{isSynopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{isSynopsis} = 0;
+ }
+ elsif ($self->{isRating})
+ {
+ $origtext =~ s/,/\./; # replace comma
+ $self->{curInfo}->{ratingpress} = int($origtext + 0.5);
+ $self->{isRating} = 0;
+ }
+
+ if ($self->{inside}->{b})
+ {
+ if ($origtext eq 'TÍTULO ORIGINAL')
+ {
+ $self->{isOrig} = 1;
+ }
+ elsif ($origtext eq 'AÑO')
+ {
+ $self->{isDate} = 1;
+ }
+ elsif ($origtext eq 'DURACIÓN')
+ {
+ $self->{isTime} = 1;
+ }
+ elsif ($origtext eq 'DIRECTOR')
+ {
+ $self->{isDirector} = 1;
+ }
+ elsif ($origtext eq 'REPARTO')
+ {
+ $self->{isActors} = 1;
+ }
+ elsif ($origtext eq 'PRODUCTORA')
+ {
+ $self->{curInfo}->{actors} =~ s/, $//;
+ $self->{isActors} = 0;
+ }
+ elsif ($origtext eq 'GÉNERO')
+ {
+ $self->{isGenre} = 1;
+ }
+ elsif ($origtext eq 'SINOPSIS')
+ {
+ $self->{isSynopsis} = 1;
+ }
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.filmaffinity.com/es/search.php?"
+ ."stext=$word&stype=title";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return 'http://www.filmaffinity.com/es/' . $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "Film affinity (ES)";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ sub getAuthor
+ {
+ return 'Tian & PIN edited by FiXx';
+ }
+
+ sub getLang
+ {
+ return 'ES';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCFilmUP.pm b/lib/gcstar/GCPlugins/GCfilms/GCFilmUP.pm
new file mode 100644
index 0000000..8a47dff
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCFilmUP.pm
@@ -0,0 +1,252 @@
+package GCPlugins::GCfilms::GCFilmUP;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+#use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginFilmUP;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ my $url;
+
+ $url =
+ "http://filmup.leonardo.it/cgi-bin/search.cgi?"
+ . "ps=10&fmt=long&q=$word"
+ . "&ul=%25%2Fsc_%25&x=52&y=7&m=all&wf=2221&wm=wrd&sy=0";
+
+ return $url;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url unless $url eq '';
+ return 'http://filmup.leonardo.it/';
+ }
+
+ sub getName
+ {
+ return "FilmUP";
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ sub getLang
+ {
+ return 'IT';
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'a')
+ {
+ if ($self->{insideInfos})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $self->{lasUrl};
+ $self->{insideInfos} = 0;
+ }
+
+ $self->{lasUrl} = $attr->{href};
+ }
+ }
+ else
+ {
+ if ($tagname eq 'img')
+ {
+ $self->{curInfo}->{image} = $self->getItemUrl . $attr->{src}
+ if $attr->{src} =~ /^locand\// && ($attr->{src} ne 'locand/no.gif');
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{inside}->{dt} && $self->{inside}->{a})
+ {
+ if ($origtext =~ m/FilmUP - Scheda: (.*)/)
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $1;
+ $self->{insideInfos} = 1;
+ }
+ }
+ if ( $self->{inside}->{small}
+ && $self->{inside}->{table}
+ && $self->{insideInfos})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1
+ if $origtext =~ /Anno: ([0-9]+)/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} = $1
+ if $origtext =~ /Regia: (.*?)((Sito)|$)/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} = $1
+ if $origtext =~ /Cast: (.*?)$/;
+ }
+ }
+ else
+ {
+ if ($self->{inside}->{h1})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ }
+ elsif ($self->{inside}->{td} && ($origtext !~ /^[\r\n]+$/))
+ {
+ $self->{insideTime} = 0 if $origtext =~ /Regia:/;
+ if ($self->{insideOriginal})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{insideOriginal} = 0;
+ }
+ elsif ($self->{insideNat})
+ {
+ $self->{curInfo}->{country} = $origtext;
+ $self->{insideNat} = 0;
+ }
+ elsif ($self->{insideDate})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideDate} = 0;
+ }
+ elsif ($self->{insideGenre})
+ {
+ if (!$self->{curInfo}->{genre})
+ {
+ $origtext =~ s|/|,|;
+ $self->{curInfo}->{genre} = $origtext;
+ }
+ $self->{insideGenre} = 0;
+ }
+ elsif ($self->{insideTime})
+ {
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideActors})
+ {
+ $self->{curInfo}->{actors} = $origtext;
+ $self->{insideActors} = 0;
+ }
+
+ $self->{insideOriginal} = 1 if $origtext =~ /Titolo originale:/;
+ $self->{insideNat} = 1 if $origtext =~ /Nazione:/;
+ $self->{insideDate} = 1 if $origtext =~ /Anno:/;
+ $self->{insideGenre} = 1 if $origtext =~ /Genere:/;
+ $self->{insideTime} = 1 if $origtext =~ /Durata:/;
+ $self->{insideDirector} = 1 if $origtext =~ /Regia:/;
+ $self->{insideActors} = 1 if $origtext =~ /Cast:/;
+ }
+ if ($self->{inside}->{synopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 1,
+ };
+
+ bless($self, $class);
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $html =~ s/\222/'/g;
+
+ $html =~ s{<font face="arial, helvetica" size="3">(.*?)</font>}
+ {<h1>$1</h1>}g;
+ $html =~ s{</table>.<br>.<font face="arial, helvetica" size="2">(.*?)</font>}
+ {</table><synopsis>$1</synopsis>}ms;
+ $html =~ s{<font face="arial, helvetica" size="2">Trama:(.*?)</font>}
+ {<synopsis>$1</synopsis>};
+ $html =~ s{Trama:<br>}{};
+ $html =~ s{<span .*?>|</span>} {}g;
+ $html =~ s{<a .*?href="\/?personaggi.*?>(.+?)</a>} {$1}g;
+
+ $html =~ s{<font .*?>|</font>} {}g;
+ $html =~ s{</?b>} {}g;
+
+ return $html;
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "Windows-1252";
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCFilmWeb.pm b/lib/gcstar/GCPlugins/GCfilms/GCFilmWeb.pm
new file mode 100644
index 0000000..f7c18cd
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCFilmWeb.pm
@@ -0,0 +1,369 @@
+package GCPlugins::GCfilms::GCFilmWeb;
+
+###################################################
+#
+# Copyright 2005-2010 Tian, Michael Mayer
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginFilmWeb;
+
+ use LWP::Simple qw($ua);
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{parsingEnded})
+ {
+ if ( ($tagname eq 'input')
+ && ($attr->{name} eq 'id'))
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{title} = '';
+ $self->{itemsList}[0]->{url} =
+ 'http://www.filmweb.pl/Film?id=' . $attr->{value};
+ }
+ }
+
+ if ($tagname eq 'a')
+ {
+ if ($attr->{class} eq 'searchResultTitle')
+ {
+ $self->{isMovie} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $attr->{href};
+ }
+ elsif ($attr->{href} =~ m|/search/film\?countryIds=|)
+ {
+ $self->{isCountry} = 1;
+ }
+ }
+ elsif ($tagname eq 'span')
+ {
+ if ($attr->{class} eq 'searchResultDetails')
+ {
+ $self->{isYear} = 1;
+ }
+ }
+ }
+ else
+ {
+ return if ($self->{parsingEnded});
+
+ if ($tagname eq 'strong')
+ {
+ if ($attr->{class} eq "rating")
+ {
+ $self->{isRating} = 1;
+ }
+ }
+ elsif ($tagname eq 'div')
+ {
+ if ($attr->{class} eq "time")
+ {
+ $self->{isTime} = 1;
+ }
+ elsif ($attr->{class} eq "posterLightbox")
+ {
+ $self->{isImage} = 1;
+ }
+ elsif ($attr->{class} =~ /castListWrapper/)
+ {
+ $self->{isCast} = 1;
+ }
+ elsif ($attr->{class} =~ /additional-info/)
+ {
+ $self->{parsingEnded} = 1;
+ }
+ }
+ elsif ($tagname eq 'span')
+ {
+ if ($attr->{class} eq 'filmDescrBg')
+ {
+ $self->{isSynopsis} = 1;
+ }
+ }
+ elsif (($tagname eq 'a') && $self->{isImage})
+ {
+ # big image
+ $self->{curInfo}->{image} = $attr->{href};
+ }
+ elsif (($tagname eq 'img') && $self->{isImage})
+ {
+ # small image
+ $self->{curInfo}->{image} = $attr->{src}
+ if (!$self->{bigPics});
+ $self->{isImage} = 0;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ if ($tagname eq "tr")
+ {
+ $self->{key} = "";
+ }
+
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ $origtext =~ s/^\s*//m;
+ $origtext =~ s/\s*$//m;
+
+ return if !$origtext;
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+
+ if ($self->{isMovie})
+ {
+ if ($self->{inside}->{a})
+ {
+ my $title;
+ my $original;
+ ($title, $original) = split (/\s*\/\s*/, $origtext, 2);
+ return if !$title;
+
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $title;
+ $self->{itemsList}[ $self->{itemIdx} ]->{original} = $original;
+ $self->{isMovie} = 0;
+ }
+ }
+ elsif ($self->{isYear})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1
+ if $origtext =~ /([0-9]{4})/;
+ $self->{isYear} = 0;
+ }
+ elsif ($self->{isCountry})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{country} .=
+ $self->{itemsList}[ $self->{itemIdx} ]->{country} ?
+ ", " . $origtext
+ : $origtext;
+ $self->{isCountry} = 0;
+ }
+ }
+ else
+ {
+
+ if ($self->{inside}->{title})
+ {
+ # content of title field is formatted like this:
+ # Obcy - 8. pasażer "Nostromo" / Alien (1979) - Filmweb
+ # or (if polish title and original title are identical):
+ # Batman (1989) - Filmweb
+ $origtext =~ m|(.*)\s+\((\d{4})\)\s+-\s+Filmweb|;
+ $self->{curInfo}->{date} = $2;
+ ($self->{curInfo}->{original},
+ $self->{curInfo}->{title}) = split (/\s+\/\s+/, $1, 2);
+ if (!$self->{curInfo}->{title})
+ {
+ $self->{curInfo}->{title} = $self->{curInfo}->{original};
+ }
+ }
+ elsif ($self->{isRating})
+ {
+ $origtext =~ s/,/\./;
+ $self->{curInfo}->{ratingpress} = int ($origtext + 0.5);
+ $self->{isRating} = 0;
+ }
+ elsif ($self->{isSynopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{isSynopsis} = 0;
+ }
+ elsif ($self->{inside}->{th})
+ {
+ $self->{key} = $origtext;
+ }
+ elsif ($self->{inside}->{td} && $self->{inside}->{a})
+ {
+ if ($self->{key} eq "reżyseria:")
+ {
+ $self->{curInfo}->{director} .=
+ $self->{curInfo}->{director} ? ", " . $origtext : $origtext;
+ }
+ if ($self->{key} eq "produkcja:")
+ {
+ $self->{curInfo}->{country} .=
+ $self->{curInfo}->{country} ? ", " . $origtext : $origtext;
+ }
+ if ($self->{key} eq "gatunek:")
+ {
+ $self->{curInfo}->{genre} .=
+ $self->{curInfo}->{genre} ? ", " . $origtext : $origtext;
+ }
+ }
+ elsif ($self->{isCast})
+ {
+ if ($self->{inside}->{h3})
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext]
+ if ($self->{actorsCounter} <
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ $self->{isRole} = 1;
+ }
+ else
+ {
+ if ($self->{isRole}
+ && ($self->{actorsCounter} <=
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS))
+ {
+ # As we incremented it above, we have one more
+ # chance here to add a role Without <= we would skip
+ # the role for last actor
+ push @{$self->{curInfo}->{actors}->[ $self->{actorsCounter}-1 ]}, $origtext
+ }
+ $self->{isRole} = 0;
+ }
+ }
+ elsif ($self->{isTime})
+ {
+ $self->{curInfo}->{time} = $origtext;
+ $self->{isTime} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ original => 1,
+ country => 1,
+ };
+
+ $self->{isMovie} = 0;
+ $self->{isYear} = 0;
+ $self->{isCountry} = 0;
+ $self->{curName} = undef; # why?
+ $self->{curUrl} = undef; # why?
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+ $self->{insideResults} = 0;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|</?b>||gms;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ # Grab the home page first to receive a fresh, valid cookie
+ my $response = $ua->get('http://www.filmweb.pl/');
+
+ return "http://www.filmweb.pl/search?q=$word&alias=film";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url =~ /^http:/;
+ return "http://www.filmweb.pl" . $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return 'FilmWeb';
+ }
+
+ sub getExtra
+ {
+ return '';
+ }
+
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return 'ISO-8859-2';
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ sub getLang
+ {
+ return 'PL';
+ }
+
+ sub getDefaultPictureSuffix
+ {
+ return '.jpg';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCIbs.pm b/lib/gcstar/GCPlugins/GCfilms/GCIbs.pm
new file mode 100644
index 0000000..2cb141d
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCIbs.pm
@@ -0,0 +1,409 @@
+package GCPlugins::GCfilms::GCIbs;
+###################################################
+#
+# Copyright 2008 t-storm
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginIbs;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ return;
+ if ($tagname eq "a")
+ {
+ if ($attr->{href} =~ m/mymovies\/list\?pending\&add=([0-9]*)/)
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = '/title/tt' . $1 . '/';
+ }
+ }
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ my $url = $attr->{href};
+ if ( ($url =~ /^http:\/\/www.ibs.it\/dvd\/[0-9]+\//)
+ && (!$self->{alreadyListed}->{$url}))
+ {
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ $self->{alreadyListed}->{$url} = 1;
+ }
+ }
+ elsif ($tagname eq 'td')
+ {
+ if ($attr->{class} eq 'ttitolettobianco')
+ {
+ $self->{isYear} = 1;
+ $self->{isMovie} = 0;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "a")
+ {
+ $self->{currentHref} = $attr->{href};
+
+ if ($attr->{href} =~
+m/javascript:Jackopen\('http:\/\/giotto.internetbookshop.it\/cop\/copdjc.asp\?e=([0-9]+)'\)/
+ )
+ {
+ $self->{curInfo}->{image} =
+ "http://giotto.internetbookshop.it/cop/copdjc.asp?e=$1";
+ }
+ if ($attr->{href} =~ m/^\/film\/regista\//)
+ {
+ $self->{insideDirector} = 1;
+ }
+ elsif ($attr->{href} =~ m/^\/film\/attore\//)
+ {
+ $self->{insideActors} = 1;
+ $self->{insideRoles} = 0;
+ $self->{insideDirector} = 0;
+ }
+ else
+ {
+ $self->{insideSynopsis} = 0 if ($attr->{href} =~ m/plotsummary/);
+ $self->{insideGenre} = 1
+ if ($attr->{href} =~ m|/Sections/Genres/|)
+ && !($self->{curInfo}->{synopsis}
+ || $self->{curInfo}->{country}
+ || $self->{curInfo}->{time});
+ }
+ }
+ elsif ($tagname eq 'td')
+ {
+ if ($attr->{class} eq 'lbarrasup')
+ {
+ $self->{isMovie} = 1;
+ $self->{insideSynopsis} = 0;
+ }
+ }
+ elsif ($tagname eq "SPAN")
+ {
+ if ($self->{inside}->{langue})
+ {
+ $self->{inside}->{langueLANG} = 1;
+ $self->{inside}->{langueCODEC} = 0;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ if ($tagname eq "SPAN")
+ {
+ if ($self->{inside}->{langue})
+ {
+ $self->{inside}->{langueLANG} = 0;
+ $self->{inside}->{langueCODEC} = 1;
+ }
+ }
+
+ $self->{inside}->{$tagname}--;
+
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ $origtext =~ s/&#34;/"/g;
+ $origtext =~ s/&#179;/3/g;
+ $origtext =~ s/&#[0-9]*;//g;
+ $origtext =~ s/\n//g;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $self->{listDate};
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ if ($self->{isYear})
+ {
+ $origtext =~ /([0-9]+)/;
+ $self->{listDate} = $1;
+ $self->{isYear} = 0;
+ }
+ if ($self->{isDirector})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 0;
+ $self->{isDirector} = 0;
+ return;
+ }
+ $self->{isDirector} = 1 if $origtext =~ m/Regia di /;
+ }
+ else
+ {
+ $self->{inside}->{langue} = 0 if $origtext =~ m/Lingua sottotitoli/;
+ if ($self->{insideGenre})
+ {
+ $origtext =~ s/\s*$//;
+ $self->{curInfo}->{genre} .= $self->capWord($origtext) . ',';
+ $self->{curInfo}->{genre} =~ s|\s*/\s*|,|g;
+ $self->{insideGenre} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ ($self->{curInfo}->{synopsis} .= $origtext) =~ s/^\s*//;
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($self->{isCountry})
+ {
+ $origtext =~ /(.+), (.+)/;
+ $self->{curInfo}->{country} .= $1;
+ $self->{curInfo}->{date} = $2;
+ $self->{isCountry} = 0;
+ }
+ elsif ($self->{insideTime})
+ {
+ $self->{curInfo}->{time} = $origtext;
+ $self->{curInfo}->{time} =~ s/.*?://;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideActors})
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext]
+ if ($self->{actorsCounter} <
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ $self->{insideActors} = 0;
+ }
+ elsif ($self->{insideRoles})
+ {
+ # As we incremented it above, we have one more chance here to add a role
+ # Without <= we would skip the role for last actor
+ push @{$self->{curInfo}->{actors}->[ $self->{actorsCounter} - 1 ]},
+ $origtext
+ if ($self->{actorsCounter} <=
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{insideRoles} = 0;
+ }
+ elsif ($self->{inside}->{langue})
+ {
+ if ($self->{inside}->{span})
+ {
+ $self->{curInfo}->{language} = $origtext;
+ }
+ else
+ {
+ $origtext =~ s/^, //;
+ $origtext =~ s/ - $//;
+ push @{$self->{curInfo}->{audio}},
+ [ $self->{curInfo}->{language}, $origtext ];
+ }
+ }
+ elsif ($self->{inside}->{soustitre})
+ {
+ my @sottotitoli = split(' - ', $origtext);
+ my $subss;
+ foreach $subss (@sottotitoli)
+ {
+ push @{$self->{curInfo}->{subt}}, [$subss];
+ }
+
+ $self->{inside}->{soustitre} = 0;
+ }
+ elsif ($self->{isMovie})
+ {
+
+ if ($self->{isMovie1})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isMovie1} = 0;
+ }
+ elsif ($self->{isMovie2})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isMovie2} = 0;
+ }
+ }
+ else
+ {
+ if ($origtext =~ m{User\s+Rating:\s+(\d+\.\d+)/10\s+})
+ {
+ $self->{curInfo}->{ratingpress} = int($1 + 0.5);
+ }
+ ; # if
+ }
+ ; # if
+
+ if ($origtext eq "Titolo")
+ {
+ $self->{isMovie1} = 1;
+ $self->{isMovie2} = 0;
+ }
+ elsif ($origtext eq "Titolo originale")
+ {
+ $self->{isMovie1} = 0;
+ $self->{isMovie2} = 1;
+ }
+ elsif ($origtext eq "Paese, Anno")
+ {
+ $self->{isCountry} = 1;
+ }
+ elsif ($origtext eq "Dati tecnici")
+ {
+ $self->{insideTime} = 1;
+ }
+ elsif ($origtext eq "Genere")
+ {
+ $self->{insideGenre} = 1;
+ }
+ elsif ($origtext eq "Descrizione")
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ elsif ($origtext =~ m/Vietato ai minori di ([0-9]+) anni/)
+ {
+ $self->{curInfo}->{age} = $1;
+ }
+ elsif ($origtext eq "Lingua audio")
+ {
+ $self->{inside}->{langue} = 1;
+ }
+ elsif ($origtext eq "Lingua sottotitoli")
+ {
+ $self->{inside}->{langue} = 0;
+ $self->{inside}->{soustitre} = 1;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ $html =~ s/"&#34;/'"/g;
+ $html =~ s/&#34;"/"'/g;
+ $html =~ s|</a></b><br>|</a><br>|;
+ $html =~ s{</?(?:b|small)>}{}gi;
+
+ if ($self->{parsingList})
+ {
+ $self->{alreadyListed} = {};
+ }
+ else
+ {
+ $html =~ s|<a href="synopsis">[^<]*</a>||gi;
+ $html =~ s|<a href="/name/.*?">([^<]*)</a>|$1|gi;
+ $html =~ s|<a href="/character/ch[0-9]*/">([^<]*)</a>|$1|gi;
+ #$html =~ s|<a href="/Sections/.*?">([^<]*)</a>|$1|gi;
+ $self->{curInfo}->{actors} = [];
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.ibs.it/dvd/ser/serpge.asp?ty=kw&dh=100&SEQ=Q&T=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url =~ /^http:/;
+ return "http://www.ibs.it" . $url;
+ }
+
+ sub getName
+ {
+ return "Internet Bookshop";
+ }
+
+ sub getAuthor
+ {
+ return 't-storm';
+ }
+
+ sub getLang
+ {
+ return 'IT';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCImdb.pm b/lib/gcstar/GCPlugins/GCfilms/GCImdb.pm
new file mode 100644
index 0000000..70af804
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCImdb.pm
@@ -0,0 +1,439 @@
+package GCPlugins::GCfilms::GCImdb;
+
+###################################################
+#
+# Copyright 2010 groms
+#
+# Features:
+# + Multiple directors separated by comma
+# + Multiple countries separated by comma
+# + Correct URL in case of redirection
+# + Fetches Original Title
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginImdb;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ my $url = $attr->{href};
+ if (($url =~ /^\/title\//) && (!$self->{alreadyListed}->{$url}))
+ {
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ $self->{alreadyListed}->{$url} = 1;
+ }
+ }
+ }
+ else
+ {
+
+ if ($tagname eq "link")
+ {
+ if ($attr->{rel} eq "canonical")
+ {
+ $self->{curInfo}->{webPage} = $attr->{href};
+ }
+ }
+ elsif ($tagname eq "h1")
+ {
+ if ($attr->{class} eq "header")
+ {
+ $self->{insideHeader} = 1;
+ }
+ }
+ elsif ($tagname eq "div")
+ {
+ if ($attr->{class} eq "infobar")
+ {
+ $self->{insideInfobar} = 1;
+ }
+ }
+ elsif ($tagname eq "table")
+ {
+ if ($attr->{class} eq "cast_list")
+ {
+ $self->{insideCastList} = 1;
+ }
+ }
+ elsif ($tagname eq "span")
+ {
+ if ($attr->{itemprop} eq "ratingValue")
+ {
+ $self->{insideRating} = 1;
+ }
+ elsif ($attr->{class} eq "title-extra")
+ {
+ $self->{insideOriginalTitle} = 1;
+ }
+ }
+ elsif ($tagname eq "img")
+ {
+ if ($self->{insidePrimaryImage})
+ {
+ if (!($attr->{src} =~ m/nopicture/))
+ {
+ ($self->{curInfo}->{image} = $attr->{src}) =~ s/_V1\._.+\./_V1\._SX1000_SY1000_\./;
+ }
+ }
+ elsif ($self->{insideInfobar} && $attr->{src} =~ m|/certificates/us/|)
+ {
+ my $cert = $attr->{title};
+ $self->{curInfo}->{age} = 1 if ($cert eq 'Unrated') || ($cert eq 'Open');
+ $self->{curInfo}->{age} = 2 if ($cert eq 'G') || ($cert eq 'Approved');
+ $self->{curInfo}->{age} = 5 if ($cert eq 'PG') || ($cert eq 'M') || ($cert eq 'GP');
+ $self->{curInfo}->{age} = 13 if $cert eq 'PG_13';
+ $self->{curInfo}->{age} = 17 if $cert eq 'R';
+ $self->{curInfo}->{age} = 18 if ($cert eq 'NC_17') || ($cert eq 'X');
+ }
+ }
+ elsif ($tagname eq "a")
+ {
+ if ($self->{insideHeader} && $attr->{href} =~ m/year/)
+ {
+ $self->{insideYear} = 1;
+ }
+ elsif ($self->{insideInfobar} && $attr->{href} =~ m/genre/)
+ {
+ $self->{insideGenre} = 1;
+ }
+ }
+ elsif ($tagname eq 'td')
+ {
+ if ($self->{insideCastList})
+ {
+ if ($attr->{class} eq 'name')
+ {
+ $self->{insideActor} = 1;
+ }
+ elsif ($attr->{class} eq 'character')
+ {
+ $self->{insideRole} = 1;
+ }
+ }
+ elsif ($attr->{id} eq "img_primary") {
+ $self->{insidePrimaryImage} = 1;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie} && ($tagname eq 'a'))
+ {
+ $self->{isMovie} = 0;
+ my $url = $self->{itemsList}[$self->{itemIdx}]->{url};
+ if (!$self->{itemsList}[$self->{itemIdx}]->{title})
+ {
+ $self->{alreadyListed}->{$url} = 0;
+ $self->{itemIdx}--;
+ }
+ }
+ } else {
+ if ($tagname eq "h1")
+ {
+ $self->{insideHeader} = 0;
+ }
+ elsif ($tagname eq "a")
+ {
+ $self->{insideYear} = 0;
+ $self->{insideGenre} = 0;
+ $self->{insideActor} = 0;
+ $self->{insideRole} = 0;
+ }
+ elsif ($tagname eq "div")
+ {
+ $self->{insideInfobar} = 0;
+ $self->{insideNat} = 0;
+ $self->{insideDirector} = 0;
+ $self->{insideStoryline} = 0;
+ $self->{insideReleaseDate} = 0;
+ }
+ elsif ($tagname eq "span")
+ {
+ $self->{insideRating} = 0;
+ $self->{insideOriginalTitle} = 0;
+ }
+ elsif ($tagname eq "table")
+ {
+ $self->{insideCastList} = 0;
+ }
+ elsif ($tagname eq "td")
+ {
+ $self->{insidePrimaryImage} = 0;
+ }
+ elsif ($self->{insideCastList})
+ {
+ if ($self->{actor} && $self->{role})
+ {
+ $self->{actor} =~ s/^\s+|\s+$//g;
+ $self->{actor} =~ s/\s{2,}/ /g;
+ push @{$self->{curInfo}->{actors}}, [$self->{actor}];
+ $self->{role} =~ s/^\s+|\s+$//g;
+ $self->{role} =~ s/\s{2,}/ /g;
+ push @{$self->{curInfo}->{actors}->[$self->{actorsCounter}]}, $self->{role};
+ $self->{actorsCounter}++;
+ }
+ $self->{actor} = "";
+ $self->{role} = "";
+ }
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ $origtext =~ s/^\s+|\s+$//g;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{inside}->{h1} && $origtext !~ m/IMDb\s*Title\s*Search/i)
+ {
+ $self->{parsingEnded} = 1;
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ if ($self->{isInfo})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{date} = $1 if $origtext =~ m|\(([0-9]*)(/I+)?\)|;
+ $self->{isInfo} = 0;
+ }
+ }
+ else
+ {
+ if ($self->{insideHeader})
+ {
+ if ($self->{insideYear})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ }
+ elsif (!$self->{curInfo}->{title})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ if (!$self->{curInfo}->{original})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ }
+ }
+ elsif ($self->{insideOriginalTitle} && !$self->{inside}->{i})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ }
+ }
+ elsif ($self->{insideInfobar})
+ {
+ if ($self->{insideGenre})
+ {
+ if ($self->{curInfo}->{genre})
+ {
+ $self->{curInfo}->{genre} .= ",";
+ }
+ $self->{curInfo}->{genre} .= $origtext;
+ }
+ elsif ($origtext =~ m/([0-9]+ min)/)
+ {
+ $self->{curInfo}->{time} = $1;
+ }
+ }
+ elsif ($self->{insideRating} && $origtext =~ m/[0-9]\.[0-9]/)
+ {
+ $self->{curInfo}->{ratingpress} = int($origtext + 0.5);
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} .= $origtext;
+ }
+ elsif ($self->{insideNat})
+ {
+ if ($origtext =~ m/[^\s].+/)
+ {
+ if ($self->{curInfo}->{country} =~ m/.+/)
+ {
+ $self->{curInfo}->{country} .= ", ".$origtext;
+ }
+ else
+ {
+ $self->{curInfo}->{country} = $origtext;
+ }
+ }
+ }
+ elsif ($self->{insideCastList})
+ {
+ if ($self->{insideActor})
+ {
+ $self->{actor} .= $origtext;
+ }
+ elsif ($self->{insideRole})
+ {
+ $self->{role} .= $origtext;
+ }
+ }
+ elsif ($self->{insideStoryline} && $self->{inside}{p})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{insideStoryline} = 0;
+ }
+ elsif ($self->{insideDirector} && $self->{inside}->{div})
+ {
+ $origtext =~ s/,/, /;
+ $self->{curInfo}->{director} .= $origtext;
+ }
+ elsif ($self->{insideReleaseDate} && !$self->{curInfo}->{date}) {
+ if ($origtext =~ m/([0-9]{4})/)
+ {
+ $self->{curInfo}->{date} = $1;
+ $self->{insideReleaseDate} = 0;
+ }
+ }
+
+ if ($self->{inside}->{h2})
+ {
+ $self->{insideStoryline} = 1 if ($origtext eq "Storyline");
+ }
+ elsif ($self->{inside}->{h4})
+ {
+ $self->{insideDirector} = 1 if $origtext =~ m/Directors?:/;
+ $self->{insideTime} = 1 if $origtext =~ m/Runtime:/;
+ $self->{insideNat} = 1 if $origtext =~ m/Country:/;
+ $self->{insideReleaseDate} = 1 if $origtext =~ m/Release Date:/;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ if ($self->{parsingList})
+ {
+ $self->{alreadyListed} = {};
+ }
+ else
+ {
+ #$html =~ s|<a href="synopsis">[^<]*</a>||gi;
+ #$html =~ s|<a href="/name/.*?"[^>]*>([^<]*)</a>|$1|gi;
+ #$html =~ s|<a href="/character/ch[0-9]*/">([^<]*)</a>|$1|gi;
+ #$html =~ s|<a href="/Sections/.*?">([^<]*)</a>|$1|gi;
+
+ # Commented out this line, causes bug #14420 when importing from named lists
+ #$self->{curInfo}->{actors} = [];
+ }
+
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.imdb.com/find?s=tt&q=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.imdb.com" if $url eq "";
+ return $url if $url =~ /^http:/;
+ return "http://www.imdb.com".$url;
+ }
+
+ sub getName
+ {
+ return "IMDb";
+ }
+
+ sub getAuthor
+ {
+ return 'groms';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCKinopoisk.pm b/lib/gcstar/GCPlugins/GCfilms/GCKinopoisk.pm
new file mode 100644
index 0000000..d950395
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCKinopoisk.pm
@@ -0,0 +1,386 @@
+package GCPlugins::GCfilms::GCKinopoisk;
+
+use strict;
+use utf8;
+use Encode qw(encode);
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginKinopoisk;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingEnded})
+ {
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ($attr->{class} eq "all")
+ {
+ my $url = $attr->{href};
+ if ($url =~ m/\/level\/1\/film/)
+ {
+ $self->{isMovie} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ }
+ }
+ if ($attr->{class} eq "orange")
+ {
+ $self->{isYear} = 1;
+ }
+ }
+ elsif ($tagname eq "title")
+ {
+ $self->{insideHTMLtitle} = 1;
+ }
+ }
+ else
+ {
+ if ($attr->{class} eq "moviename-big" && $attr->{style} eq "margin: 0; padding: 0")
+ {
+ $self->{insideTitle} = 1;
+ }
+ elsif ($tagname eq "span")
+ {
+ if ($attr->{style} eq "color: #666; font-size: 13px")
+ {
+ $self->{insideOriginal} = 1;
+ }
+ elsif ($attr->{class} eq "_reachbanner_" && $self->{insideSynopsis} == 0)
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ }
+ elsif ($tagname eq "a")
+ {
+ if ($attr->{href} =~ m/\/level\/10\/m\_act\%5Byear\%5D/)
+ {
+ $self->{insideDate} = 1;
+ }
+ if ($attr->{href} =~ m/\/level\/10\/m\_act\%5Bcountry\%5D/)
+ {
+ if ($self->{isCountry} >= 2)
+ {
+ $self->{insideCountry} = 1;
+ $self->{isCountry}++;
+ }
+ }
+ if ($attr->{href} =~ m/\/level\/4\/people/)
+ {
+ if ($self->{isDirector} >= 2)
+ {
+ $self->{insideDirector} = 1;
+ $self->{isDirector}++;
+ }
+ }
+ if ($attr->{href} =~ m/\/level\/10\/m\_act\%5Bgenre\%5D/)
+ {
+ $self->{insideGenre} = 1;
+ $self->{isGenre}++;
+ }
+ if ($self->{insideActorList})
+ {
+ $self->{isActors} += 1;
+ $self->{insideActors} = 1;
+ }
+ }
+ elsif ($tagname eq "td")
+ {
+ if ($attr->{class} eq "type")
+ {
+ $self->{isDirector} = 1;
+ $self->{isTime} = 1;
+ $self->{isCountry} = 1;
+ }
+ elsif ($self->{isTime} == 2)
+ {
+ $self->{insideTime} = 1;
+ $self->{isTime} = 0;
+ }
+ elsif ($attr->{style} eq "vertical-align: top; height: 15px" && $attr->{align} eq "right" && $self->{isActors} >= 0)
+ {
+ $self->{isActors} += 1;
+ $self->{insideActors} = 1;
+ }
+ }
+ elsif ($tagname eq "img" && $attr->{style} eq "border: none; border-left: 10px #f60 solid")
+ {
+ if ($attr->{src} ne "/images/image_none.gif")
+ {
+ $self->{curInfo}->{image} = "http://www.kinopoisk.ru".$attr->{src};
+ }
+ }
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+ return if ($self->{parsingEnded});
+ if ($self->{parsingList})
+ {
+ if (($self->{insideHTMLtitle}))
+ {
+ if ($origtext =~ m/Результаты\sпоиска/)
+ {
+ #
+ }
+ else
+ {
+ $self->{parsingEnded} = 1;
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+ $self->{insideHTMLtitle} = 0;
+ }
+ if ($self->{isMovie})
+ {
+ my ($title, $date);
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isMovie} = 0;
+ return;
+ }
+ elsif ($self->{isYear})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{date} = $origtext;
+ $self->{isYear} = 0;
+ return;
+ }
+ }
+ else
+ {
+ if ($origtext =~ m/В\s*главных\s*ролях:/)
+ {
+ $self->{insideActorList} = 1;
+ }
+ if ($origtext =~ m/Роли\s*дублировали:/)
+ {
+ $self->{insideActorList} = 0;
+ }
+ if ($self->{insideTitle})
+ {
+ $origtext =~ s/\s+$//;
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideTitle} = 0;
+ }
+ elsif ($self->{insideOriginal})
+ {
+ $origtext =~ s/^\s+//;
+ $self->{curInfo}->{original} = $origtext;
+ $self->{insideOriginal} = 0;
+ }
+ elsif ($self->{insideDate})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideDate} = 0;
+ }
+ elsif ($self->{insideCountry} == 1)
+ {
+ if ($self->{isCountry} == 3)
+ {
+ $self->{curInfo}->{country} = $origtext;
+ }
+ elsif ($self->{isCountry} > 3)
+ {
+ $self->{curInfo}->{country} = $self->{curInfo}->{country}.", ".$origtext;
+ }
+ $self->{insideCountry} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ if ($self->{isDirector} == 3)
+ {
+ $self->{curInfo}->{director} = $origtext;
+ }
+ elsif ($self->{isDirector} > 3)
+ {
+ $self->{curInfo}->{director} = $self->{curInfo}->{director}.", ".$origtext;
+ }
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideActors})
+ {
+ if ($self->{isActors} == 1)
+ {
+ $self->{curInfo}->{actors} = $origtext;
+ }
+ elsif ($self->{isActors} > 1)
+ {
+ if ($origtext eq "...")
+ {
+ $self->{isActors} = -1;
+ }
+ else
+ {
+ $self->{curInfo}->{actors} = $self->{curInfo}->{actors}.", ".$origtext;
+ }
+ }
+ $self->{insideActors} = 0;
+ }
+ elsif ($self->{insideSynopsis} == 1)
+ {
+ #$origtext =~ s/^\s+//;
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{insideSynopsis} = 2;
+ }
+ elsif ($self->{isTime} == 1 || $self->{isDirector} == 1 || $self->{isCountry} == 1)
+ {
+ $self->{isDirector} = 0;
+ $self->{isTime} = 0;
+ $self->{isCountry} = 0;
+ if ($origtext eq "время")
+ {
+ $self->{isTime} = 2;
+ }
+ elsif ($origtext eq "режиссер")
+ {
+ $self->{isDirector} = 2;
+ }
+ elsif ($origtext eq "страна")
+ {
+ $self->{isCountry} = 2;
+ }
+ }
+ elsif ($self->{insideTime})
+ {
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideGenre})
+ {
+ if ($self->{isGenre} == 1)
+ {
+ $self->{curInfo}->{genre} = $origtext;
+ }
+ elsif ($self->{isGenre} > 1)
+ {
+ $self->{curInfo}->{genre} = $self->{curInfo}->{genre}.", ".$origtext;
+ }
+ $self->{insideGenre} = 0;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ if ($self->{parsingList})
+ {
+ # Your code for processing search results here
+ }
+ else
+ {
+ if ($tagname eq "tr" && $self->{isDirector} >= 2)
+ {
+ $self->{isDirector} = 0;
+ }
+ elsif ($tagname eq "tr" && $self->{isGenre} != 0)
+ {
+ $self->{isGenre} = 0;
+ }
+ elsif ($tagname eq "td")
+ {
+ $self->{insideActorList} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{isYear} = 0;
+ $self->{isDirector} = 0;
+ $self->{isActors} = 0;
+ $self->{isTime} = 0;
+ $self->{isGenre} = 0;
+ $self->{isCountry} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+ $self->{insideActorList} = 0;
+ return $self;
+ }
+
+ sub getName
+ {
+ return "Kinopoisk";
+ }
+
+ sub getAuthor
+ {
+ return 'Nazarov Pavel';
+ }
+
+ sub getLang
+ {
+ return 'RU';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "windows-1251";
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+ return "windows-1251";
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://www.kinopoisk.ru/index.php?kp_query=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url =~ /^http:/;
+ return "http://www.kinopoisk.ru/" . $url;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ $html =~ s/&#133;/\.\.\./g;
+ $html =~ s/\x92/'/g;
+ $html =~ s/\x93/“/g;
+ $html =~ s/\x94/”/g;
+ $html =~ s/&#151;/—/g;
+ $html =~ s/"&#34;/'"/g;
+ $html =~ s/&#34;"/"'/g;
+ $html =~ s|</a></b><br>|</a><br>|;
+ $html =~ s/<br><br>/\x0A/g;
+ return $html;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCMediadis.pm b/lib/gcstar/GCPlugins/GCfilms/GCMediadis.pm
new file mode 100644
index 0000000..4caf406
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCMediadis.pm
@@ -0,0 +1,316 @@
+package GCPlugins::GCfilms::GCMediadis;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginMediadis;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ( ($attr->{href} =~ m|http://www\.mediadis\.com/video/detail\.asp|)
+ && ($attr->{class} eq 'a-blue'))
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ elsif (($self->{couldBeCast}==1)
+ && ($attr->{href} =~ m|http://www\.mediadis\.com/products/search\.asp|))
+ {
+ # yes, found the magic link. director(s) to follow.
+ $self->{couldBeCast} = 2;
+ }
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'search-list'))
+ {
+ if ($attr->{align} eq 'center')
+ {
+ $self->{couldBeYear} = 1;
+ }
+ if (($attr->{align} eq 'left') && ($attr->{colspan} eq '5'))
+ {
+ $self->{couldBeCast} = 1;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if ($attr->{src} =~ /^http:\/\/www\.(dvdzone2|mediadis)\.com\/pictures\/big\//)
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+ }
+ }
+ elsif ($tagname eq "p")
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ elsif ($tagname eq "span")
+ {
+ if (($attr->{class} eq "detail-title"))
+ {
+ $self->{insideName} = 1;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'tr') {
+ $self->{couldBeCast} = 0;
+ }
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ $origtext =~ s/^\s*(\S*)\s*$/$1/; # remove surrouding whitespace
+
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $self->capWord($origtext);
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($self->{couldBeYear})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1
+ if $origtext =~ m/([0-9]{4})/;
+ $self->{couldBeYear} = 0;
+ }
+ elsif ($self->{couldBeCast} == 2) # waiting for director name
+ {
+ if ($origtext eq "-")
+ {
+ $self->{couldBeCast} = 3; # read actors now
+ }
+ elsif (!$self->{itemsList}[ $self->{itemIdx} ]->{director})
+ {
+ # revert the failed name transposure done my mediadis:
+ $origtext =~ s/^(.*) (\S+)$/$2 $1/;
+ # only one entry, no list.
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} = $origtext;
+ }
+ }
+ elsif ($self->{couldBeCast} == 3) # waiting for actors names
+ {
+ if ($origtext)
+ {
+ # revert the failed name transposure done my mediadis:
+ $origtext =~ s/^(.*) (\S+)$/$2 $1/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} .= $origtext;
+ }
+ }
+ }
+ else
+ {
+ $origtext =~ s/ : //g if !$self->{insideSynopsis};
+ if ($self->{insideRating})
+ {
+ $origtext =~ s{(\d+),(\d+)/10}{$1.$2};
+ $self->{curInfo}->{ratingpress} = int ($origtext + 0.5);
+ $self->{insideRating} = 0;
+ }
+ elsif ($self->{insideGenre})
+ {
+ $origtext =~ s/ - /,/g;
+ # don't scream! Convert all caps to first cap only.
+ $self->{curInfo}->{genre} .= ucfirst(lc($origtext));
+ $self->{insideGenre} = 0;
+ }
+ elsif ($self->{insideDate})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideDate} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ if (!$self->{curInfo}->{director})
+ {
+ my @directors = split(/\s+-\s+/, $origtext);
+ for (my $i=0; $i<@directors; $i++)
+ {
+ # revert the failed name transposure done my mediadis:
+ $directors[$i] =~ s/^(.*) (\S+)$/$2 $1/;
+ }
+ $self->{curInfo}->{director} = join (', ', @directors);
+ }
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} .= $origtext . "\n\n";
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($self->{insideNat})
+ {
+ $self->{curInfo}->{country} = $origtext;
+ $self->{insideNat} = 0;
+ }
+ elsif ($self->{insideTime})
+ {
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideActors})
+ {
+ foreach my $name (split(/\s+-\s+/, $origtext))
+ {
+ # revert the failed name transposure done my mediadis:
+ # move the first name part back in front.
+ $name =~ s/^(.*) (\S+)$/$2 $1/;
+ # and store the actors in a proper list.
+ push @{$self->{curInfo}->{actors}}, [$name]
+ if ($self->{actorsCounter} <
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ }
+ $self->{insideActors} = 0;
+ }
+ elsif ($self->{insideOrig})
+ {
+ $self->{curInfo}->{original} = $self->capWord($origtext) if !$self->{curInfo}->{original};
+ $self->{insideOrig} = 0;
+ }
+ elsif (($self->{inside}->{span}) && ($self->{insideName}))
+ {
+ $self->{curInfo}->{title} = $self->capWord($origtext) if !$self->{curInfo}->{title};
+ }
+ elsif ($self->{inside}->{strong})
+ {
+ $self->{insideDate} = 1 if $origtext =~ m/Year/;
+ $self->{insideDirector} = 1 if $origtext =~ m/Director\(s\)/;
+ $self->{insideGenre} = 1 if $origtext =~ m/Genres/;
+ $self->{insideOrig} = 1 if $origtext =~ m/Original title/;
+ $self->{insideTime} = 1 if $origtext =~ m/Duration/;
+ $self->{insideNat} = 1 if $origtext =~ m/Country/;
+ $self->{insideActors} = 1 if $origtext =~ m/Actors/
+ or $origtext =~ m/Voice of/;
+ }
+ if ($self->{inside}->{td})
+ {
+ if ($origtext =~ m/Global rating/)
+ {
+ $self->{insideRating} = 1;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 0, # hide the date as it is wrong most of the time
+ director => 1,
+ actors => 1
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $html =~ s|<a (class="underline" )?href="http://www\.mediadis\.com/products/search\.asp\?par=[0-9]*" title="Filmography">([^<]*)</a>|$2|g;
+ $html =~ s/&nbsp;/ /g;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.mediadis.com/video/search.asp?t=19&pl=all&kw=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url unless $url eq '';
+ return 'http://www.mediadis.com/video/';
+ }
+
+ sub getName
+ {
+ return 'Mediadis';
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCMetropoliES.pm b/lib/gcstar/GCPlugins/GCfilms/GCMetropoliES.pm
new file mode 100644
index 0000000..f628a33
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCMetropoliES.pm
@@ -0,0 +1,382 @@
+package GCPlugins::GCfilms::GCMetropoliES;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginMetropoliES;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ # preProcess
+ # Called before each page is processed. You can use it to do some substitutions.
+ # $html is the page content.
+ # Returns modified version of page content.
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+# Recorta el código del listado de resultados, quedandose solo con la parte que nos interesa del html
+# el modificador s/.../$1/s trata el flujo como una sola cadena y reemplaza todo el cuerpo con la parte que nos interesa
+ $html =~ s/^.*(<table width="100%" border="0" cellspacing="0" cellpadding="5">.*<\/td>\n <\/tr>\n<\/table>)\n\n\n.*$/$1/gs;
+
+ # Recorta el código de la ficha, quedandose solo con la parte que nos interesa del html
+ $html =~ s/^.*(<table width="100%" border="0" cellspacing="0" cellpadding="5">.*<\/td>\n <\/tr>\n<\/table>)\n<table.*$/$1/gs;
+ return $html;
+ }
+
+ # text
+ # Called each time some plain text (between tags) is processed.
+ # $origtext is the read text.
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ # Código para procesar el resultado de la busqueda
+ if ($self->{parsingList})
+ {
+ if ($self->{isDate} eq 2)
+ {
+ $self->{isDate} = 0;
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $origtext;
+ $self->{isTitle} = 1;
+ return;
+ }
+
+ if ($self->{isTitle} eq 2)
+ {
+ $self->{isTitle} = 0;
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{isOrigTit} = 1;
+ return;
+ }
+ if ($self->{isOrigTit} eq 2)
+ {
+ $self->{isOrigTit} = 0;
+ $self->{isDirector} = 1;
+ return;
+ }
+
+ if ($self->{isDirector} eq 2)
+ {
+ $self->{isDirector} = 0;
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} = $origtext;
+ $self->{insedeInfos} = 0;
+ return;
+ }
+ return;
+ }
+
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+ #$origtext =~ s/\n//g if !$self->{insideSynopsis};
+ if ($self->{insideName})
+ {
+ if ($origtext =~ /([^\(]*) \(([0-9]{4})\)/)
+ {
+ $self->{curInfo}->{title} = $1;
+ $self->{curInfo}->{date} = $2;
+ }
+ $self->{insideName} = 0;
+ }
+ if ($self->{inside}->{td})
+ {
+ if ($origtext =~ /(.*), (.*), (.*) Min\./)
+ {
+ $self->{curInfo}->{original} = $1;
+ $self->{curInfo}->{country} = $2;
+ $self->{curInfo}->{time} = $3;
+ }
+ elsif ($self->{insideActors})
+ {
+ $self->{insideActors}--;
+ if ($self->{insideActors} eq 0)
+ {
+ $self->{insideActors} = 0;
+ $self->{curInfo}->{actors} = $origtext;
+ }
+ }
+ }
+ if ($self->{insideDirector})
+ {
+ $self->{insideDirector} = 0;
+ $self->{curInfo}->{director} = $origtext;
+ }
+
+ if ($self->{inside}->{span})
+ {
+ if ($origtext =~ /Int.rpretes:/)
+ {
+ $self->{insideActors} = 2;
+ }
+ }
+ if ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{insideSynopsis} = 0;
+ $self->{insideInfos} = 0;
+ }
+ }
+ }
+
+ # end
+ # Called each time a HTML tag ends.
+ # $tagname is the tag name.
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+
+ # Código para procesar el resultado de la busqueda
+ #if ($self->{parsingList}){
+ #}
+ # Código para procesar la información de la pelicula seleccionada
+ #else {
+ #}
+ }
+
+ # In processing functions below, self->{parsingList} can be used.
+ # If true, we are processing a search results page
+ # If false, we are processing a item information page.
+
+ # $self->{inside}->{tagname} (with correct value for tagname) can be used to test
+ # if we are in the corresponding tag.
+
+ # You have a counter $self->{itemIdx} that have to be used when processing search results.
+ # It is your responsability to increment it!
+
+ # When processing search results, you have to fill the available fields for results
+ #
+ # $self->{itemsList}[$self->{movieIdx}]->{field_name}
+ #
+ # When processing a movie page, you need to fill the fields (if available)
+ # in $self->{curInfo}.
+ #
+ # $self->{curInfo}->{field_name}
+
+ # start
+ # Called each time a new HTML tag begins.
+ # $tagname is the tag name.
+ # $attr is reference to an associative array of tag attributes.
+ # $attrseq is an array reference containing all the attributes name.
+ # $origtext is the tag text as found in source file
+ # Returns nothing
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+ # Código para procesar el resultado de la busqueda para generar el listado
+ if ($self->{parsingList})
+ {
+ # Comprobamos si estamos dentro de un tr con la info de un titulo
+ if (($tagname eq "tr") && (($attr->{bgcolor} eq "#ECF5FF") || ($attr->{bgcolor} eq "#FFFFFF")))
+ {
+ $self->{insideInfos} = 1;
+ # Lo primero a leer es la fecha. Indicamos que es el siguiente a procesar
+ $self->{isDate} = 1;
+ $self->{isTitle} = 0;
+ $self->{isOrigTit} = 0;
+ $self->{isDirector} = 0;
+ # Aumentamos el número de resultados encontrados
+ $self->{itemIdx}++;
+ return;
+ }
+
+ # Comprobamos que campo de la información estamos pocesando
+ if ($tagname eq "td" && $self->{insideInfos})
+ {
+ $self->{isDate} = 2 if $self->{isDate} eq 1;
+ $self->{isOrigTit} = 2 if $self->{isOrigTit} eq 1;
+ $self->{isDirector} = 2 if $self->{isDirector} eq 1;
+ }
+ if ($tagname eq "a" && $self->{isTitle})
+ {
+ $self->{isTitle} = 2;
+ # Guardamos la Url del enlace
+ my $url = $attr->{href};
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ # Código para procesar la información de la pelicula seleccionada
+ else
+ {
+ # Si estamos dentro de una imagen y no se ha asignado ninguna, la asignamos
+ if (($tagname eq "img") & !$self->{curInfo}->{image})
+ {
+# Imágenes en cmg:
+# Thumb http://carteles.metropoliglobal.com/galerias/data/1149/1563-2008-rastrooculto-espanol-210459-thumb.jpg
+# Normal: http://carteles.metropoliglobal.com/galerias/data/1149/1563-2008-rastrooculto-espanol-210459.jpg
+# Extraemos la dirección de la imagen a partir del thumb
+ if ($attr->{src} =~ /\.\.\/(galerias\/data\/[0-9]*\/.*)-thumb\.jpg/)
+ {
+ $self->{curInfo}->{image} = "http://carteles.metropoliglobal.com/" . $1 . ".jpg";
+ }
+ }
+
+ # Comprobamos el rating
+ if ($tagname eq "img")
+ {
+ # En cmg la puntuación está asignada con una imagen con el formato ratingX.gif donde
+ # X está entre 0 y 5
+ if ($attr->{src} =~ /imagenes\/rating([0-5])\.gif/)
+ {
+ $self->{curInfo}->{ratingpress} = ($1 / 5) * 10;
+ }
+ }
+ elsif ($tagname eq "span")
+ {
+ $self->{insideName} = 1 if $attr->{class} eq "title";
+ $self->{insideInfos} = 1 if $attr->{class} eq "title";
+ }
+ elsif ($tagname eq "td")
+ {
+ $self->{insideDirector} = 1 if $attr->{width} eq "84%";
+ if ($self->{insideInfos})
+ {
+ $self->{insideSynopsis} = 1 if $attr->{colspan} eq "2";
+ }
+ }
+ }
+ }
+
+ # changeUrl
+ # Can be used to change URL if item URL and the one used to
+ # extract information are different.
+ # Return the modified URL.
+ #sub changeUrl
+ #{
+ # my ($self, $url) = @_;
+ # return $url;
+ #}
+
+ # getExtra
+ # Used if the plugin wants an extra column to be displayed in search results
+ # Return the column title or empty string to hide the column.
+ #sub getExtra
+ #{
+ # return 'Extra';
+ #}
+
+ # getLang
+ # Used to fill in plugin list with user language plugins
+ # Return the language used for this site (2 letters code).
+ sub getLang
+ {
+ return "ES";
+ }
+
+ # getAuthor
+ # Used to display the plugin author in GUI.
+ # Returns the plugin author name.
+ sub getAuthor
+ {
+ return "DoVerMan";
+ }
+
+ # getName
+ # Used to display plugin name in GUI.
+ # Returns the plugin name.
+ sub getName
+ {
+ return 'CartelesMetropoliGlobal';
+ }
+
+ # getCharset
+ # Used to convert charset in web pages.
+ # Returns the charset as specified in pages.
+ sub getCharset
+ {
+ my $self = shift;
+ # Charset de la web
+ return "iso-8859-1";
+ }
+
+ # getItemUrl
+ # Used to get the full URL of an item page.
+ # Useful when url on results pages are relative.
+ # $url is the URL as found with a search.
+ # Returns the absolute URL.
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ # url contendrá ficha.php?......
+
+ return "http://carteles.metropoliglobal.com/paginas/$url";
+ }
+
+ # getSearchUrl
+ # Used to get the URL that to be used to perform searches.
+ # $word is the query
+ # Returns the full URL.
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://carteles.metropoliglobal.com/paginas/ficha.php"
+ . "?qbtitulo=$word&qbbuscar=titulo&Submit=Buscar&qsec=buscar";
+ }
+
+ # Constructor
+ sub new
+ {
+ # Inicialización
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ # Campos que devuelve el plugin (1 si, 0 no). Son los que apareceran
+ # en el listado de resultados
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 0,
+ };
+
+ # Indica si estamos procesando información útil
+ $self->{insideInfos} = 0;
+
+ # Indican el estado del procesado del listado de resultados (0 no procesar, 1 es el siguiente, 2 procesando)
+ $self->{isDate} = 0;
+ $self->{isTitle} = 0;
+ $self->{isOrigTit} = 0;
+ $self->{isDirector} = 0;
+
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCMonsieurCinema.pm b/lib/gcstar/GCPlugins/GCfilms/GCMonsieurCinema.pm
new file mode 100644
index 0000000..1e989c2
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCMonsieurCinema.pm
@@ -0,0 +1,272 @@
+package GCPlugins::GCfilms::GCMonsieurCinema;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+###################################
+# #
+# Plugin soumis par MeV #
+# #
+###################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginMonsieurCinema;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ($attr->{href} =~ /^http\:\/\/cinema\.tiscali\.fr\/fichefilm\.aspx/)
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if ($attr->{src} =~
+ m|^http\://media\.monsieurcinema\.com/film/[0-9]*/[0-9]*/[0-9]*\.jpg|)
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+ }
+ }
+ elsif ($tagname eq "b")
+ {
+ if ($attr->{class} eq "sous_titre")
+ {
+ $self->{insideName} = 1;
+ }
+ }
+ elsif ($tagname eq "span")
+ {
+ if ($attr->{class} eq "sous_titre")
+ {
+ $self->{insideDate} = 1;
+ }
+ }
+ elsif ($tagname eq "div")
+ {
+ if ($attr->{class} eq "movie_infos")
+ {
+ $self->{insideInfos} = 1;
+ }
+ elsif ($attr->{align} eq "justify")
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($origtext =~ /, de ([^(]*)�\(([0-9]{4})\)/)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"director"} = $1;
+ $self->{itemsList}[ $self->{itemIdx} ]->{"date"} = $2;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+ $origtext =~ s/\[endline\]/\n/g if !$self->{insideSynopsis} && !$self->{insideCast};
+
+ if ($self->{insideName})
+ {
+ $self->{curInfo}->{title} = $self->capWord($origtext);
+ $self->{insideName} = 0;
+ }
+ elsif ($self->{insideDate})
+ {
+ if ($origtext =~ /\(([0-9]{4})\)/)
+ {
+ $self->{curInfo}->{date} = $1;
+ $self->{insideCast} = 1;
+ }
+ $self->{insideDate} = 0;
+ }
+ elsif ($self->{insideInfos})
+ {
+ if (($origtext =~ /Genre\s*\:\s*(.*)/) || ($origtext =~ /Catégorie\s*\:\s*(.*)/))
+ {
+ $self->{curInfo}->{genre} .= $self->{curInfo}->{genre} ? "," . $1 : $1;
+ $self->{curInfo}->{genre} =~ s/, /,/g;
+ }
+ elsif ($origtext =~ /Durée\s*\:\s*(.*)/)
+ {
+ $self->{curInfo}->{time} = $1;
+ }
+ elsif ($origtext =~ /Pays\s*\:\s*(.*)/)
+ {
+ $self->{curInfo}->{country} = $1;
+ }
+ elsif ($origtext =~ /Public\s*\:\s*(.*)/)
+ {
+ if ($1 eq 'Tous publics')
+ {
+ $self->{curInfo}->{age} = 2;
+ }
+ else
+ {
+ $self->{curInfo}->{age} = $1;
+ $self->{curInfo}->{age} =~ s/.*?([0-9]+).*/$1/;
+ }
+ }
+ $self->{insideInfos} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $origtext =~ s/\[endline\]/\n/g;
+ $self->{curInfo}->{synopsis} = $origtext if !$self->{curInfo}->{synopsis};
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($self->{insideCast})
+ {
+ $origtext =~ s/\[endline\]//g;
+ $origtext =~ s/ |
+//g;
+ if ($origtext =~ /de(.*)avec(.*)/)
+ {
+ $self->{curInfo}->{director} = $1;
+ $self->{curInfo}->{actors} = $2;
+ }
+ $self->{insideCast} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 0,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $html =~ s{</?b>}{}g;
+ $html =~ s/<br>/\[endline\]/gi;
+ $html =~ s{<span style="text-transform\:uppercase;">([^<]*)</span>}
+ {$1}g;
+ $html =~ s{<div style="float\:left;width\:100px">([^<]*)</div>[^<]*<div style="float\:left;">([^<]*)</div>}
+ {<div class="movie_infos">$1 \: $2</div>}g;
+ $html =~ s{<a href="http\://cinema\.tiscali\.fr/recherche\.aspx\?file=http&amp;keys=[^"]*">([^<]*)</a>}
+ {$1}g;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://cinema.tiscali.fr/recherche.aspx?file=http&keys=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url unless $url eq '';
+ return "http://cinema.tiscali.fr/";
+ }
+
+ sub getName
+ {
+ return "MonsieurCinema.com";
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getCharset
+ {
+ return "utf8";
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCMovieMeter.pm b/lib/gcstar/GCPlugins/GCfilms/GCMovieMeter.pm
new file mode 100644
index 0000000..f325817
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCMovieMeter.pm
@@ -0,0 +1,429 @@
+package GCPlugins::GCfilms::GCMovieMeter;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+# Copyright 2007 Petr Gajdusek (Pajdus) <gajdusek.petr@centrum.cz>
+# Copyright 2007 Mattias de Hollander (MaTiZ) <mdehollander@gmail.com>
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ # Replace SiteTemplate with your exporter name
+ # It must be the same name as the one used for file and main package name
+ package GCPlugins::GCfilms::GCPluginMovieMeter;
+
+ use HTTP::Cookies;
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ # getSearchUrl
+ # Used to get the URL that to be used to perform searches.
+ # $word is the query
+ # Returns the full URL.
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ my $url;
+
+ # Your code here
+
+ my $response =
+ $self->{ua}->post("http://www.moviemeter.nl/film/search", [ 'search[title]' => $word ]);
+ $url = return "http://www.moviemeter.nl/film/searchresults/";
+
+ return $url;
+ }
+
+ # getItemUrl
+ # Used to get the full URL of a movie page.
+ # Useful when url on results pages are relative.
+ # $url is the URL as found with a search.
+ # Returns the absolute URL.
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url;
+ return 'http://www.moviemeter.nl';
+ }
+
+ # getCharset
+ # Used to convert charset in web pages.
+ # Returns the charset as specified in pages.
+ sub getCharset
+ {
+ my $self = shift;
+
+ #return "WINDOWS-1250";
+ return "ISO-8859-1";
+ }
+
+ # getName
+ # Used to display plugin name in GUI.
+ # Returns the plugin name.
+ sub getName
+ {
+ return "MovieMeter.nl";
+ }
+
+ # getAuthor
+ # Used to display the plugin author in GUI.
+ # Returns the plugin author name.
+ sub getAuthor
+ {
+ return 'MaTiZ';
+ }
+
+ # getLang
+ # Used to fill in plugin list with user language plugins
+ # Return the language used for this site (2 letters code).
+ sub getLang
+ {
+ return 'NL';
+ }
+
+ # hasSearchYear
+ # Used to hide year column in search results
+ # Return 0 to hide column, 1 to show it.
+ sub hasSearchYear
+ {
+ return 1;
+ }
+
+ # hasSearchDirector
+ # Used to hide director column in search results
+ # Return 0 to hide column, 1 to show it.
+ sub hasSearchDirector
+ {
+ return 0;
+ }
+
+ # hasSearchActors
+ # Used to hide actors column in search results
+ # Return 0 to hide column, 1 to show it.
+ sub hasSearchActors
+ {
+ return 0;
+ }
+
+ # getExtra
+ # Used if the plugin wants an extra column to be displayed in search results
+ # Return the column title or empty string to hide the column.
+ sub getExtra
+ {
+ return 'Original Title';
+ #return '';
+ }
+
+ # changeUrl
+ # Can be used to change URL if movie URL and the one used to
+ # extract information are different.
+ # Return the modified URL.
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ # start
+ # Called each time a new HTML tag begins.
+ # $tagname is the tag name.
+ # $attr is reference to an associative array of tag attributes.
+ # $attrseq is an array reference containing all the attributes name.
+ # $origtext is the tag text as found in source file
+ # Returns nothing
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingList})
+ {
+
+ # Your code for processing search results here
+ if ($tagname eq "a")
+ {
+ if ($attr->{href} =~ m/\/film\/[0-9]+/)
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ elsif ($tagname eq "div")
+ {
+ if ($attr->{class} =~ /filmresults/)
+ {
+ $self->{isYear} = 1;
+ }
+ }
+ elsif ($tagname eq "span")
+ {
+ if ($attr->{class} =~ /subtext/)
+ {
+ $self->{altTitle} = 1;
+ }
+ }
+ }
+ else
+ {
+ # Your code for processing movie information here
+ if ($tagname eq "h1")
+ {
+ $self->{insideName} = 1;
+ }
+ elsif ($tagname eq "img")
+ {
+ if ($attr->{class} eq "poster")
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+ }
+ }
+ elsif ($tagname eq "a")
+ {
+ if ($self->{insideFilmInfo})
+ {
+ if ($attr->{href} =~ /director/)
+ {
+ $self->{insideFilmDir} = 1;
+ $self->{filminfo_dir} += 1;
+ }
+ }
+ }
+ elsif ($tagname eq "div")
+ {
+ if ($attr->{id} eq "film_info")
+ {
+ $self->{insideFilmInfo} = 1;
+ $self->{filminfo_id} = 0;
+ }
+ elsif ($attr->{id} eq "beslistresults")
+ {
+ $self->{insideFilmInfo} = 0;
+ }
+ elsif ($attr->{id} eq "film_votes")
+ {
+ $self->{insideRating} = 1;
+ }
+
+ }
+ }
+ }
+
+ # end
+ # Called each time a HTML tag ends.
+ # $tagname is the tag name.
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+
+ if ($self->{parsingList})
+ {
+ # Your code for processing search results here
+
+ }
+ else
+ {
+ # Your code for processing movie information here
+
+ # optional
+ if ($tagname eq "div")
+ {
+ if ($self->{insideRating})
+ {
+ $self->{insideRating} = 0;
+ }
+ }
+ elsif ($tagname eq "a")
+ {
+ if ($self->{insideFilmDir})
+ {
+ $self->{insideFilmDirOUT} = 1;
+ $self->{insideFilmDir} = 0;
+ }
+ }
+ }
+ }
+
+ # text
+ # Called each time some plain text (between tags) is processed.
+ # $origtext is the read text.
+ sub text
+ {
+ my ($self, $origtext) = @_;
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ # Your code for processing search results here
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($self->{isYear})
+ {
+ # Remove brackets from year: from (2002) to 2002
+ $origtext =~ s/(\)|\()//g;
+ # Remove leading or trailing whitespace
+ $origtext =~ s/^\s+|\s+$//g;
+ $self->{itemsList}[ $self->{itemIdx} ]->{"date"} = $origtext;
+ $self->{isYear} = 0;
+ }
+ elsif ($self->{altTitle})
+ {
+ $origtext =~ /Alternatieve titel:\s(.*)/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{"extra"} =
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"};
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} = $1;
+ $self->{altTitle} = 0;
+ }
+
+ }
+ else
+ {
+ # Your code for processing movie information here
+ if ($self->{insideName})
+ {
+ # First try to use the search results information, otherwise
+ # parse the movie information
+ my $title = $self->{itemsList}[ $self->{wantedIdx} ]->{"title"};
+ if ($title)
+ {
+ $self->{curInfo}->{title} = $title;
+ $self->{curInfo}->{date} = $self->{itemsList}[ $self->{wantedIdx} ]->{"date"};
+ $self->{curInfo}->{original} =
+ $self->{itemsList}[ $self->{wantedIdx} ]->{"extra"};
+ }
+
+ else
+ {
+ # Split Little Miss Sunshine (2006) into title and year
+ my ($title, $year) = ($origtext =~ /(\D+)\s\((\d+)\)/);
+ $self->{curInfo}->{title} = $title;
+ $self->{curInfo}->{date} = $year;
+ }
+ $self->{insideName} = 0;
+ }
+ elsif ($self->{insideFilmInfo})
+ {
+ $self->{filminfo_id} += 1;
+ # Country Genre Time
+ if ($self->{filminfo_id} == 2)
+ {
+ my @parts = split("\n", $origtext);
+ $self->{curInfo}->{country} = $parts[0];
+ my $genre = $parts[1];
+ $genre =~ s/\s\/\s/,/;
+ $self->{curInfo}->{genre} = $genre;
+ my $time = $parts[2];
+ $time =~ s/\sminuten//;
+ $self->{curInfo}->{time} = $time;
+ }
+ # Director
+ elsif ($self->{insideFilmDir})
+ {
+ if (exists $self->{curInfo}->{director})
+ {
+ $self->{curInfo}->{director} =
+ $self->{curInfo}->{director} . ", " . $origtext;
+ }
+ else
+ {
+ $self->{curInfo}->{director} = $origtext;
+
+ }
+ }
+ if ($origtext =~ s/\nmet\s//)
+ {
+ my @parts = split("\n\n", $origtext);
+ $self->{curInfo}->{synopsis} = $parts[1];
+ $parts[0] =~ s/ en /, /;
+ foreach my $actor (split("\s*,\s*", $parts[0]))
+ {
+ push @{$self->{curInfo}->{actors}}, [$actor]
+ if $self->{actorsCounter} <
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS;
+ $self->{actorsCounter}++;
+ }
+ }
+ }
+ elsif ($self->{insideRating})
+ {
+ # Use a dot instead of a comma as decimal seperator
+ $origtext =~ s/,/./;
+ # Scale rating to a maximum of 10
+ # and round to integer
+ $self->{curInfo}->{ratingpress} = int($origtext * 2 + 0.5);
+ }
+ }
+ }
+
+ # new
+ # Constructor.
+ # Returns object reference.
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ $self->{ua}->cookie_jar(HTTP::Cookies->new);
+
+ # Do your init stuff here
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+
+ return $self;
+ }
+
+ # preProcess
+ # Called before each page is processed. You can use it to do some substitutions.
+ # $html is the page content.
+ # Returns modified version of page content.
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ # replace <BR> and <P> tags with \n (also, </BR>,</P>, <P/>, <BR/> )
+ $html =~ s/\<(\/)?(BR|P)(\s*\/)?\>/\n/mgi;
+
+ return $html;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCMoviecovers.pm b/lib/gcstar/GCPlugins/GCfilms/GCMoviecovers.pm
new file mode 100644
index 0000000..f1a5e6c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCMoviecovers.pm
@@ -0,0 +1,246 @@
+package GCPlugins::GCfilms::GCMoviecovers;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginMoviecovers;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if (($attr->{href} =~ /^\/film\/titre_/) && ($self->{inside}->{li}))
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 0;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ my $src = $attr->{src};
+ my $alt = $attr->{alt};
+ if (!$self->{curInfo}->{image})
+ {
+ if ($alt =~ /^Recto/)
+ {
+ $src =~ s/http\:\/\/www\.moviecovers\.com\/DATA\/thumbs\/films\-[A-Za-z0-9-]+\/(.*)/$1/;
+ $self->{curInfo}->{image} =
+ "http://data.moviecovers.com/DATA/zipcache/" . $src;
+ }
+ }
+ }
+ }
+
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+
+ if ($self->{inside}->{li})
+ {
+ my $element = undef;
+ if ($origtext =~ /^ \([0-9]{4}\)/)
+ {
+ $origtext =~ s/ \(([0-9]{4})\)/$1/;
+ $element = "date";
+ $self->{isInfo} = 0;
+ }
+ $self->{itemsList}[ $self->{itemIdx} ]->{$element} = $origtext
+ if $element;
+ }
+
+ }
+ else
+ {
+
+ if ($self->{inside}->{title})
+ {
+ $self->{curInfo}->{title} = $origtext if length($origtext) > 2;
+ }
+
+ if ($self->{inside}->{td})
+ {
+ if ($self->{insideOriginal})
+ {
+ $origtext =~ s/^\s+//;
+ $origtext =~ s/\s+$//;
+ $self->{curInfo}->{original} = $origtext;
+ $self->{insideOriginal} = 0;
+ }
+ elsif (($self->{insideGenre}) && ($self->{inside}->{a}))
+ {
+ $self->{curInfo}->{genre} = $origtext;
+ $self->{insideGenre} = 0;
+ }
+ elsif (($self->{insideDirector}) && ($self->{inside}->{a}))
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{insideDirector} = 0;
+ }
+ elsif (($self->{insideNat}) && ($self->{inside}->{a}))
+ {
+ $self->{curInfo}->{country} = $origtext;
+ $self->{insideNat} = 0;
+ }
+ elsif ($self->{insideTime})
+ {
+ $origtext =~ s/^\s+//;
+ $origtext =~ s/\s+$//;
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideDate} && ($self->{inside}->{a}))
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideDate} = 0;
+ }
+ elsif (($self->{insideActors}) && ($self->{inside}->{a}))
+ {
+ $self->{curInfo}->{actors} .= $origtext . ', '
+ if ($self->{actorsCounter} <
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ ($self->{curInfo}->{synopsis} .= $origtext) =~ s/^\s*//;
+ }
+ }
+ if ($self->{inside}->{th})
+ {
+ $self->{insideDirector} = 1 if $origtext =~ m/Réalisateur/;
+ $self->{insideActors} = 1 if $origtext =~ m/Acteurs principaux/;
+ $self->{insideGenre} = 1 if $origtext =~ m/Genre/;
+ $self->{insideTime} = 1 if $origtext =~ m/Durée/;
+ $self->{insideNat} = 1 if $origtext =~ m/Nationalité/;
+ $self->{insideDate} = 1 if $origtext =~ m/Année/;
+# $self->{insideSynopsis} = 1 if $origtext =~ m/Résumé/;
+ $self->{insideOriginal} = 1 if $origtext =~ m/Titre original/;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ bless($self, $class);
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.moviecovers.com/multicrit.html?titre=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.moviecovers.com" . $url;
+ }
+
+ sub getName
+ {
+ return "MovieCovers.com";
+ }
+
+ sub getAuthor
+ {
+ return 'Patrick Fratczak';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getCharset
+ {
+ return "ISO-8859-1";
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCNasheKino.pm b/lib/gcstar/GCPlugins/GCfilms/GCNasheKino.pm
new file mode 100644
index 0000000..9e093c7
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCNasheKino.pm
@@ -0,0 +1,222 @@
+package GCPlugins::GCfilms::GCNasheKino;
+
+###################################################
+#
+# Copyright 2005-2009 zserghei
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+use Encode qw(encode);
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginNasheKino;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ my $url = $attr->{href};
+ if ($attr->{class} eq "ab10" && $url =~ m/\/data.movies\?id/)
+ {
+ $self->{isMovie} = 1;
+ $self->{isDate} = 2;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ if ( $tagname eq "a"
+ && $attr->{class} eq "ab10"
+ && $self->{isDate} == 2)
+ {
+ $self->{isDate} = 1;
+ }
+ }
+ else
+ {
+ if ( $tagname eq "a"
+ && $attr->{class} eq "ab10"
+ && $self->{inside}->{h1})
+ {
+ $self->{insideDate} = 1;
+ }
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{isMovie} = 0;
+ return;
+ }
+ elsif ($self->{isDate} == 1)
+ {
+ if ($origtext =~ m/([0-9]+)\sг/)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1;
+ $self->{isDate} = 0;
+ }
+ }
+ }
+ else
+ {
+ utf8::decode($origtext);
+ $origtext =~ s/^\s+//;
+ $origtext =~ s/\s+$//;
+ if ($self->{inside}->{h1})
+ {
+ $self->{curInfo}->{title} = $origtext
+ if !$self->{curInfo}->{title};
+ }
+ if ($self->{insideDate})
+ {
+ if ($origtext =~ m/([0-9]+)\sг/)
+ {
+ $self->{curInfo}->{date} = $1;
+ if ($self->{curInfo}->{date} < 1992)
+ {
+ $self->{curInfo}->{country} = "СССР";
+ }
+ else
+ {
+ $self->{curInfo}->{country} = "Россия";
+ }
+ $self->{curInfo}->{audio} = "русский";
+ $self->{insideDate} = 0;
+ }
+ }
+ if ($self->{insideDirector})
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ if ($origtext =~ m/\S+/)
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{insideSynopsis} = 0;
+ }
+ }
+ elsif ($self->{insideActors})
+ {
+ $self->{insideActors} = 0 if $origtext =~ m/Сценарий:/;
+ if ( $origtext !~ m/^,/
+ && $self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS)
+ {
+ $self->{curInfo}->{actors} .= (
+ $self->{curInfo}->{actors}
+ ? ", " . $origtext
+ : $origtext
+ );
+ $self->{actorsCounter}++;
+ }
+ }
+ $self->{insideDirector} = 1 if $origtext =~ m/Режиссер\(ы\):/;
+ $self->{insideActors} = 1 if $origtext =~ m/Актер\(ы\):/;
+ $self->{insideSynopsis} = 1 if $origtext =~ m/О\sфильме:/;
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return "NasheKino";
+ }
+
+ sub getAuthor
+ {
+ return 'zserghei';
+ }
+
+ sub getLang
+ {
+ return 'RU';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "Windows-1251";
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://www.nashekino.ru/data.find?t=0&yr=&sval=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return "http://www.nashekino.ru/" . $url;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ $self->{parsingEnded} = 0;
+ return $html;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCOFDb.pm b/lib/gcstar/GCPlugins/GCfilms/GCOFDb.pm
new file mode 100644
index 0000000..511ec4e
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCOFDb.pm
@@ -0,0 +1,304 @@
+package GCPlugins::GCfilms::GCOFDb;
+
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginOFDb;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ( ($attr->{href} =~ m/view\.php\?page=film&fid=[0-9]*/)
+ || ($attr->{href} =~ m|^film/[0-9]*|))
+ {
+ $self->{isTitle} = 1;
+ $self->{isInfo} = 0;
+ $self->{isOriginal} = 0;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $attr->{href};
+ }
+ }
+ elsif ($tagname eq "font")
+ {
+ if ($self->{isInfo})
+ {
+ $self->{isOriginal} = 1;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "font")
+ {
+ if ($attr->{face} eq "Arial,Helvetica,sans-serif")
+ {
+ if ($attr->{size} eq "3")
+ {
+ $self->{insideName} = 1;
+ }
+ elsif ($attr->{size} eq "2")
+ {
+ $self->{insideInfosNames} = 1 if $attr->{class} eq "Normal";
+ $self->{insideInfos} = 1 if $attr->{class} eq "Daten";
+ }
+ }
+ }
+ elsif ($tagname eq "img")
+ {
+ if ($attr->{src} =~ m|img\.ofdb\.de/film/[0-9]+/[0-9]*.jpg|)
+ {
+ $self->{curInfo}->{image} = $attr->{src}
+ if !$self->{curInfo}->{image};
+ }
+ elsif ($attr->{src} eq "images/design3/notenspalte.png")
+ {
+ $self->{curInfo}->{ratingpress} = int( $attr->{alt} + 0.5 )
+ if ! $self->{curInfo}->{ratingpress};
+ }
+ }
+ elsif ($tagname eq "a")
+ {
+ if ($attr->{href} =~ m/view\.php\?page=blaettern&Kat=Land&Text=(.*)/)
+ {
+ $self->{insideCountry} = 1;
+ }
+ $self->{curInfo}->{date} = $1
+ if ($attr->{href} =~ m/view\.php\?page=blaettern&Kat=Jahr&Text=([0-9]{4})/);
+ }
+ elsif (($tagname eq "div") && ($attr->{class} eq "synopsis"))
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ if ($tagname eq "tr")
+ {
+ $self->{insideDirector} = 0;
+ $self->{insideActors} = 0;
+ $self->{insideGenre} = 0;
+ $self->{insideInfos} = 0;
+ }
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} = $origtext;
+ $self->{isTitle} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($self->{isOriginal})
+ {
+ $origtext =~ s{^\s*/\s*}{};
+ $self->{itemsList}[ $self->{itemIdx} ]->{original} = $origtext;
+ $self->{isOriginal} = 0;
+ return;
+ }
+ elsif (($self->{isInfo}) && ($origtext =~ m/\((\d{4})\)/))
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1;
+ $self->{isInfo} = 0;
+ }
+ }
+ else
+ {
+ if ($self->{insideName})
+ {
+ $self->{curInfo}->{title} = $origtext if !$self->{curInfo}->{title};
+ $self->{insideName} = 0;
+ }
+ elsif ($self->{insideInfosNames})
+ {
+ $self->{insideOrig} = 1 if $origtext =~ m/Originaltitel:/;
+ $self->{insideDirector} = 1 if $origtext =~ m/Regie:/;
+ $self->{insideActors} = 1 if $origtext =~ m/Darsteller:/;
+ $self->{insideGenre} = 1 if $origtext =~ m/Genre\(s\):/;
+ $self->{insideInfosNames} = 0;
+ }
+ elsif ($self->{insideCountry})
+ {
+ $self->{curInfo}->{country} .= ', ' if $self->{curInfo}->{country};
+ $self->{curInfo}->{country} .= $origtext;
+ $self->{insideCountry} = 0;
+ }
+ elsif ($self->{insideInfos} && $self->{inside}->{font})
+ {
+ if ($self->{insideOrig})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{insideOrig} = 0;
+ $self->{insideInfos} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ $self->{curInfo}->{director} .=
+ $self->{curInfo}->{director}
+ ? ', ' . $origtext
+ : $origtext;
+ }
+ elsif ($self->{insideActors})
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext]
+ if $self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS;
+ $self->{actorsCounter}++;
+ }
+ elsif ($self->{insideGenre})
+ {
+ push @{$self->{curInfo}->{genre}}, [$origtext];
+ }
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $origtext =~ m/(http.*?)(\s|$)/;
+ my $page = $self->loadPage($1, 0, 1);
+ $page =~ m|<font face="Arial,Helvetica,sans-serif" size="2" class="Blocksatz">.*?</a><br>[^<]*</b>(?:</b>)?<br><br>(.*?)</font>|ms;
+ $self->{curInfo}->{synopsis} = $1;
+ $self->{curInfo}->{synopsis} =~ s/<br \/>/\n/gi;
+ $self->{insideSynopsis} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ original => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isYear} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|onmouseover="[^"]*"||gms;
+ }
+ $html =~ s{<a href="view\.php\?page=liste&Name=[^"]*">([^<]*)</a>}
+ {$1}g;
+ $html =~ s{<a href="view\.php\?page=genre&Genre=[^"]*">([^<]*)</a>}
+ {$1}g;
+ $html =~ s{<font face="Arial,Helvetica,sans-serif" size="2" class="Blocksatz"><p class="Blocksatz"><b>Inhalt:<\/b>\s?([^<]*)<a href="(view\.php\?page=inhalt&fid=[0-9]*&sid=[0-9]*)">\s?<b>\[mehr\]</b></a></p></font>}
+ {<div class="synopsis">$1\nhttp://www.ofdb.de/$2</div>};
+ $html =~ s{<font face="Arial,Helvetica,sans-serif" size="2" class="Blocksatz"><p\s*class="Blocksatz"><b>Inhalt:</b>\s?([^<]*)<a href="(plot/[0-9]*[^"]*)">\s?<b>\[mehr\]</b></a></p></font>}
+ {<div class="synopsis">$1\nhttp://www.ofdb.de/$2</div>}gm;
+ $html =~ s{%DF}{ss};
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ # if $word looks like an EAN, do a EAN search, otherwise title search
+ my $kat = ($word =~ /^[\dX]{8}[\dX]*$/) ? "EAN" : "Titel";
+
+ return "http://www.ofdb.de/view.php?page=suchergebnis&Kat=$kat&SText=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ utf8::decode($url);
+ return 'http://www.ofdb.de/' . $url;
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub getName
+ {
+ return "OFDb.de";
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'DE';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCOdeonHU.pm b/lib/gcstar/GCPlugins/GCfilms/GCOdeonHU.pm
new file mode 100644
index 0000000..0bd78c8
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCOdeonHU.pm
@@ -0,0 +1,305 @@
+package GCPlugins::GCfilms::GCOdeonHU;
+
+# GCstar 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.
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginOdeonHU;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ($attr->{href} =~ m:(kat.phtml\?id=.*):)
+ { #?
+ my $url = '/' . $1;
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "span")
+ {
+ $self->{insideTitle} = ($attr->{class} eq "ver11 modB colDD0008");
+ }
+ elsif ($tagname eq "td")
+ {
+ $self->{insideFieldName} = ($attr->{class} eq "ver9 col102643");
+ $self->{insideFieldValue} = ($attr->{class} eq "ver11 colblack");
+ $self->{insidePersonType} = ($attr->{class} eq "ver9 col1D5263 pad5");
+ $self->{insideSynopsis} = ($attr->{class} eq "ver11 col102643 pad2");
+ $self->{insideRating} = ($attr->{class} eq "text_cat_score");
+
+ if ($self->{insideSynopsis}
+ && (length($self->{curInfo}->{synopsis}) > 20))
+ {
+ $self->{insideSynopsis} = 0;
+ }
+ }
+ elsif ($tagname eq "img")
+ {
+ #if (! $self->{curInfo}->{image}) {
+ if ($attr->{src} =~ m:img/album/.*\.jpg$:)
+ {
+ my $img = 'http://odeon.hu/';
+ $img .= $attr->{src};
+ $self->{curInfo}->{image} = $img;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ if ($tagname eq "a")
+ {
+ $self->{isMovie} = 0;
+ }
+ if ($tagname eq "td")
+ {
+ $self->{insideFieldName} = 0;
+ $self->{insideFieldValue} = 0;
+ $self->{insidePersonType} = 0;
+ $self->{insideSynopsis} = 0;
+ $self->{insideRating} = 0;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ #return if length($origtext) < 2;
+
+ $origtext =~ s/&#34;/"/g;
+ $origtext =~ s/&#179;/3/g;
+ $origtext =~ s/&#[0-9]*;//g;
+ $origtext =~ s/\n//g;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ if ($self->{inside}->{b})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} .= $origtext;
+ return;
+ }
+ else
+ {
+ if ($origtext =~ m/\[(.*),\s+([0-9]+)\]/)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $2;
+ $self->{itemsList}[ $self->{itemIdx} ]->{original} = $1;
+ $self->{isMovie} = 0;
+ }
+ }
+ }
+ }
+ else
+ {
+ if ($self->{insideTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideTitle} = 0;
+ return;
+ }
+
+ if ($self->{insideFieldName})
+ {
+ $self->{FieldName} = "original" if $origtext =~ m/^eredeti/;
+ $self->{FieldName} = "date" if $origtext =~ m/^..?v:/;
+ $self->{FieldName} = "country" if $origtext =~ m/^nemzet:/;
+ $self->{FieldName} = "time" if $origtext =~ m/^hossz:/;
+ $self->{FieldName} = "todo" if $origtext =~ m/^k..?p:/;
+ $self->{FieldName} = "todo" if $origtext =~ m/^kiad/;
+ $self->{FieldName} = "todo" if $origtext =~ m/^dial..?gus:/;
+ $self->{FieldName} = "genre" if $origtext =~ m/^m..?faj:/;
+
+ $self->{insideFieldName} = 0;
+ return;
+ }
+
+ if ($self->{insideFieldValue})
+ {
+ my $txt = $origtext;
+ my $name = $self->{FieldName};
+ $txt =~ s/^\s*//;
+ $txt =~ s/\s*$//;
+ $txt =~ s/\s+/ /g;
+ $txt =~ s/\s*perc$// if $name eq "time";
+ return
+ if $txt =~ m/^\s*$/;
+
+ if ($self->{curInfo}->{$name} !~ m/^\s*$/)
+ {
+ $self->{curInfo}->{$name} .= "," . $txt;
+ }
+ else
+ {
+ $self->{curInfo}->{$name} = $txt;
+ }
+
+ return;
+ }
+
+ if ($self->{insidePersonType})
+ {
+ if ($self->{inside}->{b})
+ {
+ my $name = 0;
+ $name = "director" if $origtext =~ m/^Rendez/;
+ $name = "actors" if $origtext =~ m/^Szerepl/;
+ if ($name)
+ {
+ $self->{PersonType} = $name;
+ }
+ else
+ {
+ $self->{insidePersonType} = 0;
+ }
+ return;
+ }
+ elsif ($self->{inside}->{a})
+ {
+ my $name = $self->{PersonType};
+ if ($self->{curInfo}->{$name} !~ m/^\s*$/)
+ {
+ $self->{curInfo}->{$name} .= "," . $origtext;
+ }
+ else
+ {
+ $self->{curInfo}->{$name} = $origtext;
+ }
+ #$self->{curInfo}->{actors} .= $origtext.', '
+ #if ($self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ #$self->{actorsCounter}++;
+ }
+
+ return;
+ }
+
+ if ($self->{insideSynopsis})
+ {
+ my $txt = $origtext;
+ $txt =~ s/\r/\n/g;
+ $txt =~ s/^\s+//g;
+ $txt =~ s/\s+$//g;
+ $self->{curInfo}->{synopsis} .= $txt;
+ }
+ if ($self->{insideRating})
+ {
+ $self->{curInfo}->{ratingpress} = int($origtext + 0.5)
+ if $origtext =~ /^[0-9.]+$/;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ original => 1,
+ };
+
+ $self->{isMovie} = 0;
+ $self->{insideDescription} = 0;
+ $self->{insideSynopsis} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ $html =~ s/"&#34;/'"/g;
+ $html =~ s/&#34;"/"'/g;
+ $html =~ s|</a></b><br>|</a><br>|;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s{</?span[^>]*>}{}gi; # remove all <span> tags
+ }
+
+ $self->{insideDescription} = 0;
+ $self->{insideSynopsis} = 0;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://odeon.hu/kat.phtml?".
+ "search=$word&scat=5&btn_hirlev.x=13&btn_hirlev.y=5";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.odeon.hu$url";
+ }
+
+ sub getName
+ {
+ return "odeon.hu";
+ }
+
+ sub getAuthor
+ {
+ return 'Anonymous';
+ }
+
+ sub getLang
+ {
+ return 'HU';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCOnet.pm b/lib/gcstar/GCPlugins/GCfilms/GCOnet.pm
new file mode 100644
index 0000000..29eef60
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCOnet.pm
@@ -0,0 +1,327 @@
+#
+# More information here: http://wiki.gcstar.org/en/websites_plugins
+#
+# GCcollection should be replaced with the kind of collection your
+# plugin deals with. e.g. GCfilms, GCgames, GCbooks,...
+
+# Replace SiteTemplate with your plugin name.
+# The package name must exactly match the file name (.pm)
+package GCPlugins::GCcollection::GCOnet;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ # Replace SiteTemplate with your exporter name
+ # It must be the same name as the one used for file and main package name
+ package GCPlugins::GCfilms::GCPluginOnet;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ # getSearchUrl
+ # Used to get the URL that to be used to perform searches.
+ # $word is the query
+ # Returns the full URL.
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ # Your code here
+
+ return "http://film.onet.pl/filmoteka.html?S=$word";
+ }
+
+ # getItemUrl
+ # Used to get the full URL of an item page.
+ # Useful when url on results pages are relative.
+ # $url is the URL as found with a search.
+ # Returns the absolute URL.
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ # Your code here
+
+ return "http://film.onet.pl/" . $url;
+ }
+
+ # getCharset
+ # Used to convert charset in web pages.
+ # Returns the charset as specified in pages.
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-2";
+ }
+
+ # getName
+ # Used to display plugin name in GUI.
+ # Returns the plugin name.
+ sub getName
+ {
+ return "Onet";
+ }
+
+ # getAuthor
+ # Used to display the plugin author in GUI.
+ # Returns the plugin author name.
+ sub getAuthor
+ {
+ return 'Marek Cendrowicz';
+ }
+
+ # getLang
+ # Used to fill in plugin list with user language plugins
+ # Return the language used for this site (2 letters code).
+ sub getLang
+ {
+ return 'PL';
+ }
+ # getExtra
+ # Used if the plugin wants an extra column to be displayed in search results
+ # Return the column title or empty string to hide the column.
+ sub getExtra
+ {
+ return "";
+ }
+
+ # changeUrl
+ # Can be used to change URL if item URL and the one used to
+ # extract information are different.
+ # Return the modified URL.
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ # In processing functions below, self->{parsingList} can be used.
+ # If true, we are processing a search results page
+ # If false, we are processing a item information page.
+
+ # $self->{inside}->{tagname} (with correct value for tagname) can be used to test
+ # if we are in the corresponding tag.
+
+ # You have a counter $self->{itemIdx} that have to be used when processing search results.
+ # It is your responsability to increment it!
+
+ # When processing search results, you have to fill the available fields for results
+ #
+ # $self->{itemsList}[$self->{movieIdx}]->{field_name}
+ #
+ # When processing a movie page, you need to fill the fields (if available)
+ # in $self->{curInfo}.
+ #
+ # $self->{curInfo}->{field_name}
+
+ # start
+ # Called each time a new HTML tag begins.
+ # $tagname is the tag name.
+ # $attr is reference to an associative array of tag attributes.
+ # $attrseq is an array reference containing all the attributes name.
+ # $origtext is the tag text as found in source file
+ # Returns nothing
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{inside}->{list_title} && $tagname eq 'a')
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $attr->{href};
+ $self->{listTitle} = 1;
+ }
+ }
+ else
+ {
+ if ($attr->{class} eq 'tyw')
+ {
+ $self->{itemTitle} = 1;
+ }
+ elsif ($tagname eq 'div' && $attr->{class} eq 'a2')
+ {
+ $self->{itemDescription} = 1;
+ }
+ elsif ($attr->{class} eq 'item_actor')
+ {
+ $self->{itemActor} = 1;
+ }
+ elsif ($tagname eq 'img'
+ && $attr->{class} eq 'pic'
+ && ($attr->{alt} eq 'Galeria' || $attr->{alt} eq 'Plakat'))
+ {
+ $self->{curInfo}->{image} = "http://film.onet.pl/" . $attr->{src};
+ }
+ }
+ }
+
+ # end
+ # Called each time a HTML tag ends.
+ # $tagname is the tag name.
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ }
+
+ # text
+ # Called each time some plain text (between tags) is processed.
+ # $origtext is the read text.
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{listTitle})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{listTitle} = 0;
+ }
+ elsif ($self->{inside}->{list_date})
+ {
+ ($self->{itemsList}[ $self->{itemIdx} ]->{date}) = ($origtext =~ m/,\s+(\d+)$/);
+ }
+ }
+ else
+ {
+ if ($self->{itemTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{itemTitle} = 0;
+ }
+ elsif ($self->{inside}->{item_country})
+ {
+ ($self->{curInfo}->{original}) = ($origtext =~ m/(.*)\s+\(/);
+ ($self->{curInfo}->{country}, $self->{curInfo}->{date}) =
+ ($origtext =~ m/(\w+),\s+(\d+)\)/);
+ $origtext =~ s|/|, |g;
+ ($self->{curInfo}->{genre}) = ($origtext =~ m/\)(.*)/);
+ }
+ elsif ($self->{inside}->{item_time})
+ {
+ ($self->{curInfo}->{time}, $self->{curInfo}->{age}) =
+ ($origtext =~ m/czas\s+(\d+).*\s+od\s+(\d+)/);
+ }
+ elsif ($self->{inside}->{item_director})
+ {
+ $self->{curInfo}->{director} .= $origtext;
+ }
+ elsif ($self->{itemDescription})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{itemDescription} = 0;
+ }
+ elsif ($self->{itemActor})
+ {
+ $self->{curInfo}->{actors} .=
+ $self->{curInfo}->{actors} ? ", " . $origtext : $origtext;
+ $self->{itemActor} = 0;
+ }
+ elsif ($self->{inside}->{item_rating})
+ {
+ ($self->{curInfo}->{ratingpress}) = int($origtext * 2 + 0.5);
+ }
+ }
+ }
+
+ # new
+ # Constructor.
+ # Returns object reference.
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ # This member should be initialized as a reference
+ # to a hash. Each keys is a field that could be
+ # in results with value 1 or 0 if it is returned
+ # or not. For the list of keys, check the model file
+ # (.gcm) and search for tags <field> in
+ # /collection/options/fields/results
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{title} = '';
+ $self->{itemsList}[0]->{url} = '';
+
+ # Do your init stuff here
+ bless($self, $class);
+ return $self;
+ }
+
+ # preProcess
+ # Called before each page is processed. You can use it to do some substitutions.
+ # $html is the page content.
+ # Returns modified version of page content.
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $html =~ s{<B>(.*?)</B>}{$1}gms;
+
+ if ($self->{parsingList})
+ {
+
+ $html =~ s{<TD class=a2 width="100%">(.*?)</TD>}
+ {<list_title>$1</list_title>}gms;
+ $html =~ s{<FONT class=a0 color="#993300">(.*?)</FONT>}
+ {<list_date>$1</list_date>}gms;
+ }
+ else
+ {
+ $html =~ s{<BR>}{}g;
+ $html =~ s{<TD class=a2 valign=top width="100%">(.*?)<}
+ {<item_country>$1</item_country><}gms;
+ $html =~ s{<SPAN class=a1>(.*?)</SPAN>}
+ {<item_time>$1</item_time>}gms;
+ $html =~ s{Re.yseria:&nbsp;&nbsp;(.*?)Scenariusz}
+ {<item_director>$1</item_director>}gms;
+ $html =~ s{Re.yseria:&nbsp;&nbsp;(.*?)wi.cej}
+ {<item_director>$1</item_director>}gms;
+ $html =~ s{a2><A class=u}
+ {a2><A class=item_actor}gms;
+ $html =~ s{Ocena filmu.*([0-9]\.[0-9]+)/5}
+ {<item_rating>$1</item_rating>}gms;
+ }
+ return $html;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCPortHU.pm b/lib/gcstar/GCPlugins/GCfilms/GCPortHU.pm
new file mode 100644
index 0000000..e460584
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCPortHU.pm
@@ -0,0 +1,343 @@
+package GCPlugins::GCfilms::GCPortHU;
+
+# GCstar 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.
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginPortHU;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ($attr->{href} =~ m:(/pls/fi/films.film_page.*):)
+ {
+ if ($self->{insideBoldText})
+ {
+ my $url = $1;
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ else
+ {
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 0;
+ }
+ }
+ }
+ elsif ($tagname eq "span")
+ {
+ if ($attr->{class} eq "txt")
+ {
+ $self->{isInfo}++
+ if $self->{isInfo};
+ }
+ $self->{insideBoldText} = ($attr->{class} eq "btxt");
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if ( ($attr->{class} eq "object_picture")
+ && (!$self->{curInfo}->{image}))
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+ $self->{insideOtherTitles} = 0;
+ $self->{insideDescription} = 1;
+ }
+ }
+ elsif ($tagname eq "div")
+ {
+ if (($attr->{class} eq "separator")
+ && $self->{insideActors})
+ {
+ $self->{insideActors} = 0;
+ $self->{insideSynopsis} = 1;
+ }
+ elsif (($attr->{class} eq "object_picture")
+ && (!$self->{curInfo}->{image}))
+ {
+ $attr->{style} =~ m/url\(([^\)]*)\)/;
+ $self->{curInfo}->{image} = $1;
+ $self->{insideOtherTitles} = 0;
+ $self->{insideDescription} = 1;
+ }
+ }
+ elsif ($tagname eq "span")
+ {
+ if ($attr->{class} eq "blackbigtitle")
+ {
+ $self->{insideTitle} = 1;
+ }
+ elsif ($attr->{class} eq "btxt")
+ {
+ $self->{insideBoldText} = 1;
+ }
+ else
+ {
+ $self->{insideBoldText} = 0;
+ }
+ $self->{insideNormalText} = ($attr->{class} eq "txt");
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ $origtext =~ s/&#34;/"/g;
+ $origtext =~ s/&#179;/3/g;
+ $origtext =~ s/&#[0-9]*;//g;
+ $origtext =~ s/\n//g;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ if ($self->{isInfo} == 1)
+ {
+ if ($origtext =~ m/\((.*)\)/)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{original} = $1;
+ }
+ $self->{isInfo} = 0
+ if $origtext =~ m/^&nbsp;&nbsp;$/;
+ }
+ if ($self->{isInfo} == 2)
+ {
+ if ($origtext =~ m/([0-9]+)\)/)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1;
+ }
+ if ($origtext =~ m/([0-9]+)\sperc/)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{time} = $1;
+ }
+ $self->{isInfo} = 0;
+ }
+ }
+ else
+ {
+ if ($self->{insideTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideTitle} = 0;
+ $self->{insideOtherTitles} = 1;
+ $self->{insideDescription} = 1;
+ return;
+ }
+ if ( $self->{insideOtherTitles}
+ && $self->{insideNormalText})
+ {
+ if ($origtext =~ m/\((.*)\)/)
+ {
+ $self->{curInfo}->{original} = $1;
+ }
+ $self->{insideOtherTitles} = 0;
+ return;
+ }
+ if ( $self->{insideDescription}
+ && $self->{insideBoldText})
+ {
+ if ($origtext =~ m/([0-9]+)\s+perc/)
+ {
+ $self->{curInfo}->{time} = $1;
+ }
+ if ($origtext =~ m/([0-9]+)$/)
+ {
+ $self->{curInfo}->{date} = $1;
+ }
+ if ($origtext =~ m/^([0-9]+)\s+�v/)
+ {
+ $self->{curInfo}->{age} = $1;
+ }
+ }
+
+ if ($origtext =~ m/^rendez/)
+ {
+ $self->{insideDirector} = 1;
+ $self->{insideOtherTitles} = 0;
+ $self->{insideDescription} = 0;
+ return;
+ }
+ if ($self->{insideDirector})
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{insideDirector} = 0;
+ return;
+ }
+
+ if ($origtext =~ m/^szerepl/)
+ {
+ $self->{insideActors} = 1;
+ return;
+ }
+ if ($self->{insideActors})
+ {
+ if ($self->{inside}->{a})
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext]
+ if ($self->{actorsCounter} <
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ return;
+ }
+ elsif ($origtext =~ m/\((.*)\)/)
+ {
+ # As we incremented it above, we have one more chance here to add a role
+ # Without <= we would skip the role for last actor
+ push @{$self->{curInfo}->{actors}->[ $self->{actorsCounter} - 1 ]},
+ $1
+ if ($self->{actorsCounter} <=
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ }
+ }
+
+ if ( $origtext =~ m/^(Linkek|Bemutat|Aj�nl�k)/
+ && $self->{insideBoldText})
+ {
+ $self->{parsingEnded} = 1;
+ $self->{insideSynopsis} = 0;
+ return;
+ }
+
+ if ( $self->{insideSynopsis}
+ && $self->{insideNormalText}
+ && $self->{inside}->{span}
+ && !$self->{inside}->{a})
+ {
+ ($self->{curInfo}->{synopsis} .= $origtext) =~ s/^\s*//;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ original => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{insideDescription} = 0;
+ $self->{insideSynopsis} = 0;
+ $self->{insideActors} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ $html =~ s/"&#34;/'"/g;
+ $html =~ s/&#34;"/"'/g;
+ $html =~ s|</a></b><br>|</a><br>|;
+
+ $self->{insideDescription} = 0;
+ $self->{insideSynopsis} = 0;
+ $self->{insideActors} = 0;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ my $base_url = 'http://www.port.hu/pls/ci/cinema.film_creator';
+ return "$base_url?i_text=$word&i_film_creator=1";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.port.hu$url";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+ sub getName
+ {
+ return "port.hu";
+ }
+
+ sub getAuthor
+ {
+ return 'Anonymous';
+ }
+
+ sub getLang
+ {
+ return 'HU';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCStopklatka.pm b/lib/gcstar/GCPlugins/GCfilms/GCStopklatka.pm
new file mode 100644
index 0000000..8f4290e
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCStopklatka.pm
@@ -0,0 +1,355 @@
+#
+# More information here: http://wiki.gcstar.org/en/websites_plugins
+#
+# GCcollection should be replaced with the kind of collection your
+# plugin deals with. e.g. GCfilms, GCgames, GCbooks,...
+
+# Replace SiteTemplate with your plugin name.
+# The package name must exactly match the file name (.pm)
+package GCPlugins::GCcollection::GCStopklatka;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ # Replace SiteTemplate with your exporter name
+ # It must be the same name as the one used for file and main package name
+ package GCPlugins::GCfilms::GCPluginStopklatka;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ # getSearchUrl
+ # Used to get the URL that to be used to perform searches.
+ # $word is the query
+ # Returns the full URL.
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ # Your code here
+
+ return "http://www.stopklatka.pl/szukaj/szukaj.asp?kategoria=film&szukaj=$word";
+ }
+
+ # getItemUrl
+ # Used to get the full URL of an item page.
+ # Useful when url on results pages are relative.
+ # $url is the URL as found with a search.
+ # Returns the absolute URL.
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ # Your code here
+
+ return "http://www.stopklatka.pl/" . $url;
+ }
+
+ # getCharset
+ # Used to convert charset in web pages.
+ # Returns the charset as specified in pages.
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-2";
+ }
+
+ # getName
+ # Used to display plugin name in GUI.
+ # Returns the plugin name.
+ sub getName
+ {
+ return "Stopklatka";
+ }
+
+ # getAuthor
+ # Used to display the plugin author in GUI.
+ # Returns the plugin author name.
+ sub getAuthor
+ {
+ return 'Marek Cendrowicz';
+ }
+
+ # getLang
+ # Used to fill in plugin list with user language plugins
+ # Return the language used for this site (2 letters code).
+ sub getLang
+ {
+ return 'PL';
+ }
+ # getExtra
+ # Used if the plugin wants an extra column to be displayed in search results
+ # Return the column title or empty string to hide the column.
+ sub getExtra
+ {
+ return "";
+ }
+
+ # changeUrl
+ # Can be used to change URL if item URL and the one used to
+ # extract information are different.
+ # Return the modified URL.
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ # In processing functions below, self->{parsingList} can be used.
+ # If true, we are processing a search results page
+ # If false, we are processing a item information page.
+
+ # $self->{inside}->{tagname} (with correct value for tagname) can be used to test
+ # if we are in the corresponding tag.
+
+ # You have a counter $self->{itemIdx} that have to be used when processing search results.
+ # It is your responsability to increment it!
+
+ # When processing search results, you have to fill the available fields for results
+ #
+ # $self->{itemsList}[$self->{movieIdx}]->{field_name}
+ #
+ # When processing a movie page, you need to fill the fields (if available)
+ # in $self->{curInfo}.
+ #
+ # $self->{curInfo}->{field_name}
+
+ # start
+ # Called each time a new HTML tag begins.
+ # $tagname is the tag name.
+ # $attr is reference to an associative array of tag attributes.
+ # $attrseq is an array reference containing all the attributes name.
+ # $origtext is the tag text as found in source file
+ # Returns nothing
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{inside}->{list_details})
+ {
+ if ($tagname eq 'a')
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $attr->{href};
+ }
+
+ $self->{listTitle} = 1
+ if ($attr->{class} eq 'searchTitle textB');
+
+ $self->{listYear} = 1
+ if ($attr->{class} eq 'searchTitle');
+ }
+ }
+ else
+ {
+ if ($attr->{class} eq 'wydarzenie_tytul')
+ {
+ $self->{pre_itemTitle} = 1;
+ }
+ elsif ($self->{pre_itemTitle})
+ {
+ if ($tagname eq 'h1')
+ {
+ $self->{itemTitle} = 1;
+ }
+ elsif ($tagname eq 'h2')
+ {
+ $self->{itemOriginalTitle} = 1;
+ }
+ elsif ($tagname eq 'table')
+ {
+ $self->{pre_itemTitle} = 0;
+ }
+ }
+ elsif ($attr->{class} eq 'film_pozycja')
+ {
+ $self->{pre_itemDetails} = 1;
+ }
+ elsif ($attr->{class} eq 'main_sub_table film')
+ {
+ $self->{itemMain} = 1;
+ }
+ elsif ($tagname eq 'img' && $self->{itemMain})
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+ }
+ }
+ }
+
+ # end
+ # Called each time a HTML tag ends.
+ # $tagname is the tag name.
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ }
+
+ # text
+ # Called each time some plain text (between tags) is processed.
+ # $origtext is the read text.
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{listTitle})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{listTitle} = 0;
+ }
+ elsif ($self->{listYear})
+ {
+ $origtext =~ s/\((.*?)\)/$1/gms;
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $origtext;
+ $self->{listYear} = 0;
+ }
+ }
+ else
+ {
+ if ($self->{itemTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{itemTitle} = 0;
+ }
+ elsif ($self->{itemOriginalTitle})
+ {
+ $origtext =~ s/\s*\((.*?)\)/$1/gms;
+ $self->{curInfo}->{original} = $origtext;
+ $self->{itemOriginalTitle} = 0;
+ }
+ elsif ($self->{itemDirector})
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{itemDirector} = 0;
+ $self->{pre_itemDetails} = 0;
+ }
+ elsif ($self->{itemDetails})
+ {
+ (
+ $self->{curInfo}->{genre}, $self->{curInfo}->{country},
+ $self->{curInfo}->{date}, $self->{curInfo}->{time}
+ ) = split(/, /, $origtext);
+ $self->{curInfo}->{time} =~ s/ min//;
+ $self->{itemDetails} = 0;
+ $self->{pre_itemDetails} = 0;
+ }
+ elsif ($self->{itemActors})
+ {
+ $self->{curInfo}->{actors} = $origtext;
+ $self->{itemActors} = 0;
+ $self->{pre_itemDetails} = 0;
+ }
+ elsif ($self->{itemMain})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{itemMain} = 0;
+ }
+ elsif ($self->{inside}->{item_rank})
+ {
+ $self->{curInfo}->{ratingpress} = int($origtext + 0.5);
+ $self->{pre_itemDetails} = 0;
+ }
+ elsif ($self->{pre_itemDetails})
+ {
+ $self->{itemDirector} = 1
+ if ($origtext eq 'reżyseria:');
+
+ $self->{itemDetails} = 1
+ if ($origtext eq 'szczegóły:');
+
+ $self->{itemActors} = 1
+ if ($origtext eq 'obsada:');
+ }
+ }
+ }
+
+ # new
+ # Constructor.
+ # Returns object reference.
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ # This member should be initialized as a reference
+ # to a hash. Each keys is a field that could be
+ # in results with value 1 or 0 if it is returned
+ # or not. For the list of keys, check the model file
+ # (.gcm) and search for tags <field> in
+ # /collection/options/fields/results
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{title} = '';
+ $self->{itemsList}[0]->{url} = '';
+
+ # Do your init stuff here
+ bless($self, $class);
+ return $self;
+ }
+
+ # preProcess
+ # Called before each page is processed. You can use it to do some substitutions.
+ # $html is the page content.
+ # Returns modified version of page content.
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ # Your code to modify $html here.
+ if ($self->{parsingList})
+ {
+ $html =~
+ s|<!-- record_start -->(.*?)<!-- record_end -->|<list_details>$1</list_details>|gms;
+ }
+ else
+ {
+ $html =~ s|<nobr>(.*?)</nobr>|$1|gms;
+ $html =~ s|<span class="bold">(.*?)</span>|$1|gms;
+ $html =~ s|<a href="/filmowcy/osoba.*?">(.*?)</a>|$1|gms;
+ $html =~
+s|script type="text/javascript">document.write\(getOcena\((.*?)\)\);</script>|<item_rank>$1</item_rank>|gms;
+ }
+ return $html;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCThemoviedb.pm b/lib/gcstar/GCPlugins/GCfilms/GCThemoviedb.pm
new file mode 100644
index 0000000..f7636cc
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCThemoviedb.pm
@@ -0,0 +1,337 @@
+package GCPlugins::GCfilms::GCthemoviedb;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginThemoviedb;
+
+ use base 'GCPlugins::GCfilms::GCfilmsPluginsBase';
+ use XML::Simple;
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if $page =~ /^<!DOCTYPE html/;
+ my $xml;
+ my $xs = XML::Simple->new;
+
+ if ($self->{parsingList})
+ {
+ if ($page !~ m/>Nothing found.<\/movie/)
+ {
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => [ 'movie', 'alternative_name' ],
+ KeyAttr => ['id']
+ );
+ my $movie;
+ foreach $movie (keys(%{$xml->{'movies'}->{'movie'}}))
+ {
+ # We only want movies, not series and everything else the api returns
+ if ($xml->{'movies'}->{'movie'}->{$movie}->{'type'} eq "movie")
+ {
+ $self->{itemIdx}++;
+ my $url =
+"http://api.themoviedb.org/2.1/Movie.getInfo/".$self->siteLanguage()."/xml/9fc8c3894a459cac8c75e3284b712dfc/"
+ . $movie;
+ # If the release date is missing, it will be returned as an array, so only save the release if
+ # it's not an array
+ my $released = "";
+ if (!ref($xml->{'movies'}->{'movie'}->{$movie}->{'released'}))
+ {
+ $released = $xml->{'movies'}->{'movie'}->{$movie}->{'released'};
+ }
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $released;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} =
+ $xml->{'movies'}->{'movie'}->{$movie}->{'name'};
+ # Now, check if there's any alternative names, and if so, add them in as
+ # additional search results.
+ for my $alternateName (
+ @{$xml->{'movies'}->{'movie'}->{$movie}->{alternative_name}})
+ {
+ if (!ref($alternateName))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $released;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $alternateName;
+ }
+ }
+
+ }
+ }
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => [ 'country', 'person', 'category', 'size', 'alternative_name' ],
+ KeyAttr => ['']
+ );
+ my $usingAlternateName = 0;
+ if (
+ (
+ $xml->{movies}->{movie}->{name} ne
+ $self->{itemsList}[ $self->{wantedIdx} ]->{title}
+ )
+ && ($self->{itemsList}[ $self->{wantedIdx} ]->{title})
+ )
+ {
+ # Name returned by tmdb is different to the one the user selected
+ # this means they choose an translated name, so use the name they choose
+ # as the default, and put tmdb's name in as the original (untranslated) name of the movie
+ $self->{curInfo}->{title} = $self->{itemsList}[ $self->{wantedIdx} ]->{title};
+ $self->{curInfo}->{original} = $xml->{movies}->{movie}->{name};
+ }
+ else
+ {
+ $self->{curInfo}->{title} = $xml->{movies}->{movie}->{name};
+ }
+ # Now, add any alternate names
+ for my $alternateName (@{$xml->{movies}->{movie}->{alternative_name}})
+ {
+ if ((!ref($alternateName)) && ($alternateName ne $self->{curInfo}->{title}))
+ {
+ $self->{curInfo}->{original} .= ", "
+ if $self->{curInfo}->{original};
+ $self->{curInfo}->{original} .= $alternateName;
+ }
+ }
+
+ $self->{curInfo}->{webPage} = $xml->{movies}->{movie}->{url};
+
+ # The following fields could be missing from the xml, so we need to check if they're blank
+ # (in which case they'll be a array)
+ $self->{curInfo}->{synopsis} = $xml->{movies}->{movie}->{overview}
+ if (!ref($xml->{movies}->{movie}->{overview}));
+ $self->{curInfo}->{ratingpress} = $xml->{movies}->{movie}->{rating}
+ if (!ref($xml->{movies}->{movie}->{rating}));
+ $self->{curInfo}->{date} = $xml->{movies}->{movie}->{released}
+ if (!ref($xml->{movies}->{movie}->{released}));
+ $self->{curInfo}->{time} = $xml->{movies}->{movie}->{runtime} . " mins"
+ if (!ref($xml->{movies}->{movie}->{runtime}));
+
+ if (!ref($xml->{movies}->{movie}->{certification}))
+ {
+ my $certification;
+ $certification = $xml->{movies}->{movie}->{certification};
+ $self->{curInfo}->{age} = 1
+ if ($certification eq 'Unrated') || ($certification eq 'Open');
+ $self->{curInfo}->{age} = 2
+ if ($certification eq 'G') || ($certification eq 'Approved');
+ $self->{curInfo}->{age} = 5
+ if ($certification eq 'PG')
+ || ($certification eq 'M')
+ || ($certification eq 'GP');
+ $self->{curInfo}->{age} = 13 if $certification eq 'PG-13';
+ $self->{curInfo}->{age} = 17 if $certification eq 'R';
+ $self->{curInfo}->{age} = 18
+ if ($certification eq 'NC-17') || ($certification eq 'X');
+ }
+
+ for my $country (@{$xml->{movies}->{movie}->{countries}->{country}})
+ {
+ push @{$self->{curInfo}->{country}}, $country->{name};
+ }
+ $self->{curInfo}->{country} =~ s/, $//;
+ for my $person (@{$xml->{movies}->{movie}->{cast}->{person}})
+ {
+ my $name = $person->{name};
+ # Strip any blank spaces from start and end of name
+ $name =~ s/\s*$//;
+ $name =~ s/^\s*//;
+ if ($person->{job} eq "Director")
+ {
+ $self->{curInfo}->{director} .= $name . ', ';
+ }
+ elsif ($person->{job} eq "Actor")
+ {
+ if ($self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS)
+ {
+ push @{$self->{curInfo}->{actors}}, [$name];
+ my $role = $person->{character};
+ $role =~ s/\s*$//;
+ $role =~ s/^\s*//;
+ push @{$self->{curInfo}->{actors}->[ $self->{actorsCounter} ]}, $role;
+ $self->{actorsCounter}++;
+ }
+ }
+ }
+ $self->{curInfo}->{director} =~ s/, $//;
+ for my $category (@{$xml->{movies}->{movie}->{categories}->{category}})
+ {
+ push @{$self->{curInfo}->{genre}}, [ $category->{name} ]
+ if ($category->{type} eq 'genre');
+ }
+ for my $image (@{$xml->{movies}->{movie}->{images}->{image}})
+ {
+ if ($image->{type} eq "poster")
+ {
+ # Fetch either the big original pic, or just the small thumbnail pic
+ if ( (($self->{bigPics}) && ($image->{size} eq "original"))
+ || (!($self->{bigPics}) && ($image->{size} eq "thumb")))
+ {
+ if (!$self->{curInfo}->{image})
+ {
+ $self->{curInfo}->{image} = $image->{url};
+ }
+ }
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ return $self;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ if (!$url)
+ {
+ # If we're not passed a url, return a hint so that gcstar knows what type
+ # of addresses this plugin handles
+ $url = "http://www.themoviedb.org";
+ }
+ elsif (index($url, "api") < 0)
+ {
+ # Url isn't for the movie db api, so we need to find the movie id
+ # and return a url corresponding to the api page for this movie
+ my $found = index(reverse($url), "/");
+ if ($found >= 0)
+ {
+ my $id = substr(reverse($url), 0, $found);
+ $url =
+"http://api.themoviedb.org/2.1/Movie.getInfo/".$self->siteLanguage()."/xml/9fc8c3894a459cac8c75e3284b712dfc/"
+ . reverse($id);
+ }
+ }
+ return $url;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return
+"http://api.themoviedb.org/2.1/Movie.search/".$self->siteLanguage()."/xml/9fc8c3894a459cac8c75e3284b712dfc/$word";
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ # Make sure the url is for the api, not the main movie page
+ return $self->getItemUrl($url);
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'en';
+ }
+
+ sub getName
+ {
+ return "The Movie DB";
+ }
+
+ sub getAuthor
+ {
+ return 'Zombiepig';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+ sub getNotConverted
+ {
+ my $self = shift;
+ return [];
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCThemoviedbDE.pm b/lib/gcstar/GCPlugins/GCfilms/GCThemoviedbDE.pm
new file mode 100644
index 0000000..bc55111
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCThemoviedbDE.pm
@@ -0,0 +1,56 @@
+package GCPlugins::GCfilms::GCthemoviedbDE;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCThemoviedb;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginThemoviedbDE;
+
+ use base qw(GCPlugins::GCfilms::GCPluginThemoviedb);
+ use XML::Simple;
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'de';
+ }
+
+ sub getName
+ {
+ return "The Movie DB (DE)";
+ }
+
+ sub getLang
+ {
+ return 'DE';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCThemoviedbES.pm b/lib/gcstar/GCPlugins/GCfilms/GCThemoviedbES.pm
new file mode 100644
index 0000000..77dc03a
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCThemoviedbES.pm
@@ -0,0 +1,56 @@
+package GCPlugins::GCfilms::GCthemoviedbES;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCThemoviedb;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginThemoviedbES;
+
+ use base qw(GCPlugins::GCfilms::GCPluginThemoviedb);
+ use XML::Simple;
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'es';
+ }
+
+ sub getName
+ {
+ return "The Movie DB (ES)";
+ }
+
+ sub getLang
+ {
+ return 'ES';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCThemoviedbFR.pm b/lib/gcstar/GCPlugins/GCfilms/GCThemoviedbFR.pm
new file mode 100644
index 0000000..624b64f
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCThemoviedbFR.pm
@@ -0,0 +1,56 @@
+package GCPlugins::GCfilms::GCthemoviedbFR;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCThemoviedb;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginThemoviedbFR;
+
+ use base qw(GCPlugins::GCfilms::GCPluginThemoviedb);
+ use XML::Simple;
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'fr';
+ }
+
+ sub getName
+ {
+ return "The Movie DB (FR)";
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCfilmsAmazonCommon.pm b/lib/gcstar/GCPlugins/GCfilms/GCfilmsAmazonCommon.pm
new file mode 100644
index 0000000..a7178fa
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCfilmsAmazonCommon.pm
@@ -0,0 +1,59 @@
+package GCPlugins::GCfilms::GCfilmsAmazonCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+use GCPlugins::GCstar::GCAmazonCommon;
+
+{
+ package GCPlugins::GCfilms::GCfilmsAmazonPluginsBase;
+
+ use base ('GCPlugins::GCfilms::GCfilmsPluginsBase', 'GCPlugins::GCstar::GCPluginAmazonCommon');
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{codeField} = '';
+ $self->{searchType} = 'dvd';
+
+ return $self;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['title'];
+ }
+
+ sub getEanField
+ {
+ return 'title';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCfilmsCommon.pm b/lib/gcstar/GCPlugins/GCfilms/GCfilmsCommon.pm
new file mode 100644
index 0000000..d67952f
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCfilmsCommon.pm
@@ -0,0 +1,70 @@
+package GCPlugins::GCfilms::GCfilmsCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+our $MAX_ACTORS = 30;
+our $MAX_DIRECTORS = 4;
+
+use GCPlugins::GCPluginsBase;
+
+{
+
+ package GCPlugins::GCfilms::GCfilmsPluginsBase;
+
+ use base qw(GCPluginParser);
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+ return $self;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['title'];
+ }
+
+ sub loadUrl
+ {
+ my ($self, $url) = @_;
+
+ $self->{actorsCounter} = 0;
+ $self->{directorCounter} = 0;
+ $self->SUPER::loadUrl($url);
+
+ if (!$self->{curInfo}->{title} && $self->{curInfo}->{original})
+ {
+ $self->{curInfo}->{title} = $self->{curInfo}->{original};
+ $self->{curInfo}->{original} = '';
+ }
+ return $self->{curInfo};
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCAlapage.pm b/lib/gcstar/GCPlugins/GCgames/GCAlapage.pm
new file mode 100644
index 0000000..0d21a94
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCAlapage.pm
@@ -0,0 +1,262 @@
+package GCPlugins::GCgames::GCAlapage;
+
+###################################################
+#
+# Copyright 2005-2011 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginAlapage;
+
+ use base 'GCPlugins::GCgames::GCgamesPluginsBase';
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'div') && ($attr->{class} eq 'infosProduit'))
+ {
+ $self->{itemIdx}++;
+ $self->{isGame} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($self->{isGame}))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $attr->{title};
+ $self->{isGame} = 0 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'liensAriane') && ($self->{isGame}) && ($self->{itemsList}[$self->{itemIdx}]->{platform} eq ''))
+ {
+ $self->{isPlatform} = 1 ;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+
+ if (($tagname eq 'h1') && ($attr->{id} eq 'zm_name_description'))
+ {
+ $self->{isName} = 1 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{id} eq 'zm_description_long'))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{rel} eq 'images nocount') && ($self->{bigPics}))
+ {
+ $self->{curInfo}->{boxpic} = $attr->{href_img} ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{id} eq 'zm_main_image') && !($self->{bigPics}))
+ {
+ $self->{curInfo}->{boxpic} = $attr->{src} ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isPlatform})
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+
+ $origtext =~ s/Sony //i;
+ $origtext =~ s/Jeux PC/PC/i;
+
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $origtext;
+ $self->{Save_plateforme} = $self->{itemsList}[$self->{itemIdx}]->{platform};
+ $self->{isPlatform} = 0;
+
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ if ($self->{isName})
+ {
+ $self->{curInfo}->{name} = $origtext;
+ $self->{curInfo}->{platform} = $self->{Save_plateforme};
+ $self->{isName} = 0 ;
+
+ if ($self->{ean} ne '')
+ {
+ $self->{curInfo}->{ean} = $self->{ean};
+ }
+
+ }
+ elsif ($self->{isDescription} eq 1)
+ {
+ # Enleve les blancs dans le texte
+ $origtext =~ s/ / /g;
+ $self->{curInfo}->{description} = $origtext;
+ $self->{isDescription} = 0 ;
+ }
+
+ }
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+
+ return ;
+
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 1,
+ released => 0,
+ genre => 0
+ };
+
+ $self->{isName} = 0;
+ $self->{isGame} = 0;
+ $self->{isPlatform} = 0;
+ $self->{Save_plateforme} = '';
+ $self->{isDescription} = 0;
+ $self->{ean} = '';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s|<br>||gi;
+ $html =~ s|<br />||gi;
+
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#156;|oe|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+ }
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'ean')
+ {
+ $self->{ean} = $word;
+ }
+ else
+ {
+ $self->{ean} = '';
+ }
+
+ return 'http://search.alapage.com/search?a=8584451-0-0&s='.$word;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return 'Alapage';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ #return "UTF-8";
+ return "ISO-8859-15";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['ean', 'name'];
+ }
+
+ sub getDefaultPictureSuffix
+ {
+ return '.jpg';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCAmazon.pm b/lib/gcstar/GCPlugins/GCgames/GCAmazon.pm
new file mode 100644
index 0000000..36b7890
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCAmazon.pm
@@ -0,0 +1,115 @@
+package GCPlugins::GCgames::GCAmazon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesAmazonCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginAmazon;
+
+ use base 'GCPlugins::GCgames::GCgamesAmazonPluginsBase';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{suffix} = 'com';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s/>Product Description</><tpfdescription><\/tpfdescription></;
+ # Le descriptif pouvant contenir des balises html je le repere maintenant
+ my $found = index($html,"<tpfdescription>");
+ if ( $found >= 0 )
+ {
+ my $html2 = substr($html, $found,length($html)- $found);
+
+ $html2 =~ s|</li>||gi;
+ $html2 =~ s|<p>|\n\n|gi;
+ $html2 =~ s|</p>||gi;
+ $html2 =~ s|<ul>|\n|gi;
+ $html2 =~ s|</ul>|\n\n|gi;
+ $html2 =~ s|<strong>||gi;
+ $html2 =~ s|</strong>||gi;
+ $html2 =~ s|<em>||gi;
+ $html2 =~ s|</em>||gi;
+
+ $html = substr($html, 0, $found) . $html2 ;
+ }
+
+ $html =~ s/Release Date&nbsp;:</<tpfdateparution></gi;
+ $html =~ s/Release Date:</<tpfdateparution></gi;
+ $html =~ s/<b>Platform:<\/b> &nbsp;</<tpfplateforme><\/tpfplateforme></gi;
+ $html =~ s/<b>Platform:<\/b>/<tpfplateforme><\/tpfplateforme>/gi;
+ $html =~ s/registerImage\("original_image",/<\/script><tpfcouverture src=/gi;
+ $html =~ s/registerImage\("alt_image_1",/<\/script><tpfscreenshot1 src=/gi;
+ $html =~ s/registerImage\("alt_image_2",/<\/script><tpfscreenshot2 src=/gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<li>|\n*|gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#156;|oe|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ }
+ return $html;
+ }
+
+ sub getName
+ {
+ return 'Amazon (US)';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCAmazonCA.pm b/lib/gcstar/GCPlugins/GCgames/GCAmazonCA.pm
new file mode 100644
index 0000000..a54c4ef
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCAmazonCA.pm
@@ -0,0 +1,115 @@
+package GCPlugins::GCgames::GCAmazonCA;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesAmazonCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginAmazonCA;
+
+ use base 'GCPlugins::GCgames::GCgamesAmazonPluginsBase';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{suffix} = 'ca';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s/>Product Description</><tpfdescription><\/tpfdescription></;
+ # Le descriptif pouvant contenir des balises html je le repere maintenant
+ my $found = index($html,"<tpfdescription>");
+ if ( $found >= 0 )
+ {
+ my $html2 = substr($html, $found,length($html)- $found);
+
+ $html2 =~ s|</li>||gi;
+ $html2 =~ s|<p>|\n\n|gi;
+ $html2 =~ s|</p>||gi;
+ $html2 =~ s|<ul>|\n|gi;
+ $html2 =~ s|</ul>|\n\n|gi;
+ $html2 =~ s|<strong>||gi;
+ $html2 =~ s|</strong>||gi;
+ $html2 =~ s|<em>||gi;
+ $html2 =~ s|</em>||gi;
+
+ $html = substr($html, 0, $found) . $html2 ;
+ }
+
+ $html =~ s/Release Date&nbsp;:</<tpfdateparution></gi;
+ $html =~ s/Release Date:</<tpfdateparution></gi;
+ $html =~ s/<b>Platform:<\/b> &nbsp;</<tpfplateforme><\/tpfplateforme></gi;
+ $html =~ s/<b>Platform:<\/b>/<tpfplateforme><\/tpfplateforme>/gi;
+ $html =~ s/registerImage\("original_image",/<\/script><tpfcouverture src=/gi;
+ $html =~ s/registerImage\("alt_image_1",/<\/script><tpfscreenshot1 src=/gi;
+ $html =~ s/registerImage\("alt_image_2",/<\/script><tpfscreenshot2 src=/gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<li>|\n*|gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#156;|oe|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ }
+ return $html;
+ }
+
+ sub getName
+ {
+ return 'Amazon (CA)';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCAmazonDE.pm b/lib/gcstar/GCPlugins/GCgames/GCAmazonDE.pm
new file mode 100644
index 0000000..1dbc106
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCAmazonDE.pm
@@ -0,0 +1,114 @@
+package GCPlugins::GCgames::GCAmazonDE;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesAmazonCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginAmazonDE;
+
+ use base 'GCPlugins::GCgames::GCgamesAmazonPluginsBase';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{suffix} = 'de';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s/>Produktbeschreibungen</><tpfdescription><\/tpfdescription></;
+ # Le descriptif pouvant contenir des balises html je le repere maintenant
+ my $found = index($html,"<tpfdescription>");
+ if ( $found >= 0 )
+ {
+ my $html2 = substr($html, $found,length($html)- $found);
+
+ $html2 =~ s|</li>||gi;
+ $html2 =~ s|<p>|\n\n|gi;
+ $html2 =~ s|</p>||gi;
+ $html2 =~ s|<ul>|\n|gi;
+ $html2 =~ s|</ul>|\n\n|gi;
+ $html2 =~ s|<strong>||gi;
+ $html2 =~ s|</strong>||gi;
+ $html2 =~ s|<em>||gi;
+ $html2 =~ s|</em>||gi;
+
+ $html = substr($html, 0, $found) . $html2 ;
+ }
+
+ $html =~ s/Erscheinungsdatum&nbsp;:</<tpfdateparution></gi;
+ $html =~ s/Erscheinungsdatum:</<tpfdateparution></gi;
+ $html =~ s/<b>Plattform:<\/b> &nbsp;</<tpfplateforme><\/tpfplateforme></gi;
+ $html =~ s/<b>Plattform:<\/b>/<tpfplateforme><\/tpfplateforme>/gi;
+ $html =~ s/registerImage\("original_image",/<\/script><tpfcouverture src=/gi;
+ $html =~ s/registerImage\("alt_image_1",/<\/script><tpfscreenshot1 src=/gi;
+ $html =~ s/registerImage\("alt_image_2",/<\/script><tpfscreenshot2 src=/gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<li>|*|gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ }
+ return $html;
+ }
+
+ sub getName
+ {
+ return 'Amazon (DE)';
+ }
+
+ sub getLang
+ {
+ return 'DE';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCAmazonFR.pm b/lib/gcstar/GCPlugins/GCgames/GCAmazonFR.pm
new file mode 100644
index 0000000..1bceb23
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCAmazonFR.pm
@@ -0,0 +1,118 @@
+package GCPlugins::GCgames::GCAmazonFR;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesAmazonCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginAmazonFR;
+
+ use base 'GCPlugins::GCgames::GCgamesAmazonPluginsBase';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{suffix} = 'fr';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s/>Description du produit</><tpfdescription><\/tpfdescription></;
+ $html =~ s/>Descriptions du produit</><tpfdescription><\/tpfdescription></;
+ # Le descriptif pouvant contenir des balises html je le repere maintenant
+ my $found = index($html,"<tpfdescription>");
+ if ( $found >= 0 )
+ {
+ my $html2 = substr($html, $found,length($html)- $found);
+
+ $html2 =~ s|</li>||gi;
+ $html2 =~ s|<p>|\n\n|gi;
+ $html2 =~ s|</p>||gi;
+ $html2 =~ s|<ul>|\n|gi;
+ $html2 =~ s|</ul>|\n\n|gi;
+ $html2 =~ s|<strong>||gi;
+ $html2 =~ s|</strong>||gi;
+ $html2 =~ s|<em>||gi;
+ $html2 =~ s|</em>||gi;
+
+ $html = substr($html, 0, $found) . $html2 ;
+ }
+
+ $html =~ s/Date de parution&nbsp;:</<tpfdateparution></gi;
+ $html =~ s/Date de parution:</<tpfdateparution></gi;
+ $html =~ s/<b>Plate-forme:<\/b> &nbsp;</<tpfplateforme><\/tpfplateforme></gi;
+ $html =~ s/<b>Plate-forme:<\/b>/<tpfplateforme><\/tpfplateforme>/gi;
+ $html =~ s/registerImage\("original_image",/<\/script><tpfcouverture src=/gi;
+ $html =~ s/registerImage\("alt_image_1",/<\/script><tpfscreenshot1 src=/gi;
+ $html =~ s/registerImage\("alt_image_2",/<\/script><tpfscreenshot2 src=/gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<li>|*|gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#156;|oe|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+ # Bug sur Shadow of Memories pour PS2
+ $html =~ s|Actio\)n|Action|gi;
+
+ }
+ return $html;
+ }
+
+ sub getName
+ {
+ return 'Amazon (FR)';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCAmazonJP.pm b/lib/gcstar/GCPlugins/GCgames/GCAmazonJP.pm
new file mode 100644
index 0000000..80824ec
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCAmazonJP.pm
@@ -0,0 +1,120 @@
+package GCPlugins::GCgames::GCAmazonJP;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesAmazonCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginAmazonJP;
+
+ use base 'GCPlugins::GCgames::GCgamesAmazonPluginsBase';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{suffix} = 'co.jp';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s/>商品の説明</><tpfdescription><\/tpfdescription></;
+ # Le descriptif pouvant contenir des balises html je le repere maintenant
+ my $found = index($html,"<tpfdescription>");
+ if ( $found >= 0 )
+ {
+ my $html2 = substr($html, $found,length($html)- $found);
+
+ $html2 =~ s|</li>||gi;
+ $html2 =~ s|<p>|\n\n|gi;
+ $html2 =~ s|</p>||gi;
+ $html2 =~ s|<ul>|\n|gi;
+ $html2 =~ s|</ul>|\n\n|gi;
+ $html2 =~ s|<strong>||gi;
+ $html2 =~ s|</strong>||gi;
+ $html2 =~ s|<em>||gi;
+ $html2 =~ s|</em>||gi;
+
+ $html = substr($html, 0, $found) . $html2 ;
+ }
+
+ $html =~ s/発売日&nbsp;:</<tpfdateparution></gi;
+ $html =~ s/発売日:</<tpfdateparution></gi;
+ $html =~ s/<b>プラットフォーム:<\/b> &nbsp;</<tpfplateforme><\/tpfplateforme></gi;
+ $html =~ s/<b>プラットフォーム:<\/b>/<tpfplateforme><\/tpfplateforme>/gi;
+ $html =~ s/registerImage\("original_image",/<\/script><tpfcouverture src=/gi;
+ $html =~ s/registerImage\("alt_image_1",/<\/script><tpfscreenshot1 src=/gi;
+ $html =~ s/registerImage\("alt_image_2",/<\/script><tpfscreenshot2 src=/gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<li>|*|gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ }
+ return $html;
+ }
+
+ sub getName
+ {
+ return 'Amazon (JP)';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "SHIFT_JIS";
+ }
+
+ sub getLang
+ {
+ return 'JP';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCAmazonUK.pm b/lib/gcstar/GCPlugins/GCgames/GCAmazonUK.pm
new file mode 100644
index 0000000..5108e8c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCAmazonUK.pm
@@ -0,0 +1,115 @@
+package GCPlugins::GCgames::GCAmazonUK;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesAmazonCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginAmazonUK;
+
+ use base 'GCPlugins::GCgames::GCgamesAmazonPluginsBase';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{suffix} = 'co.uk';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s/>Product Description</><tpfdescription><\/tpfdescription></;
+ $html =~ s/>Reviews</><tpfdescription><\/tpfdescription></;
+ # Le descriptif pouvant contenir des balises html je le repere maintenant
+ my $found = index($html,"<tpfdescription>");
+ if ( $found >= 0 )
+ {
+ my $html2 = substr($html, $found,length($html)- $found);
+
+ $html2 =~ s|</li>||gi;
+ $html2 =~ s|<p>|\n\n|gi;
+ $html2 =~ s|</p>||gi;
+ $html2 =~ s|<ul>|\n|gi;
+ $html2 =~ s|</ul>|\n\n|gi;
+ $html2 =~ s|<strong>||gi;
+ $html2 =~ s|</strong>||gi;
+ $html2 =~ s|<em>||gi;
+ $html2 =~ s|</em>||gi;
+
+ $html = substr($html, 0, $found) . $html2 ;
+ }
+
+ $html =~ s/Release Date&nbsp;:</<tpfdateparution></gi;
+ $html =~ s/Release Date:</<tpfdateparution></gi;
+ $html =~ s/<b>Platform:<\/b> &nbsp;</<tpfplateforme><\/tpfplateforme></gi;
+ $html =~ s/<b>Platform:<\/b>/<tpfplateforme><\/tpfplateforme>/gi;
+ $html =~ s/registerImage\("original_image",/<\/script><tpfcouverture src=/gi;
+ $html =~ s/registerImage\("alt_image_1",/<\/script><tpfscreenshot1 src=/gi;
+ $html =~ s/registerImage\("alt_image_2",/<\/script><tpfscreenshot2 src=/gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<li>|*|gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ }
+ return $html;
+ }
+
+ sub getName
+ {
+ return 'Amazon (UK)';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCDicoDuNet.pm b/lib/gcstar/GCPlugins/GCgames/GCDicoDuNet.pm
new file mode 100644
index 0000000..fd130cf
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCDicoDuNet.pm
@@ -0,0 +1,291 @@
+package GCPlugins::GCgames::GCDicoDuNet;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginDicoDuNet;
+
+ use base 'GCPlugins::GCgames::GCgamesPluginsBase';
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'div') && ($attr->{class} eq 'cat_produit'))
+ {
+ $self->{isGame} = 1 ;
+ $self->{isUrl} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($self->{isUrl}) && ($self->{isGame}))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isUrl} = 0 ;
+ }
+ elsif (($tagname eq 'strong') && ($self->{isGame}))
+ {
+ $self->{isName} = 1 ;
+ $self->{isGame} = 0 ;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+
+ if (($tagname eq 'h3') && ($attr->{class} eq 'produits'))
+ {
+ $self->{isGame} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($self->{isGame} eq 1) )
+ {
+ $self->{isName} = 1 ;
+ $self->{isGame} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ($self->{isGame} eq 2))
+ {
+ $self->{isEditor} = 1 ;
+ $self->{isGame} = 0 ;
+ }
+ elsif ($tagname eq 'table')
+ {
+ $self->{isGame} = 0 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{id} eq 'vous_etes_ici'))
+ {
+ $self->{isPlatform} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} ne 'http://www.dicodunet.com/jeux-video/') && ($self->{isPlatform}))
+ {
+ $self->{isPlatform} = 2 ;
+ }
+ elsif (($tagname eq 'a') && (index($attr->{href},"www.dicodunet.com/jeux-video/img/") >= 0) && ($self->{curInfo}->{boxpic} eq ''))
+ {
+ my $html = $self->loadPage($attr->{href}, 0, 1);
+ my $found = index($html,"<h3 class=\"produits\">");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('<h3 class="produits">'),length($html)- $found -length('<h3 class="produits">'));
+
+ my $found = index($html,"<img src=\"");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('<img src="'),length($html)- $found -length('<img src="'));
+ $html = substr($html, 0,index($html,"\""));
+
+ $self->{curInfo}->{boxpic} = $html;
+ }
+ }
+
+ }
+ elsif ($tagname eq 'tpfdateparution')
+ {
+ $self->{isDate} = 1 ;
+ }
+ elsif ($tagname eq 'tpfean')
+ {
+ $self->{isEan} = 1 ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isName})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $origtext;
+ $self->{isName} = 0;
+
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ if ($self->{isName})
+ {
+ $self->{curInfo}->{name} = $origtext;
+ $self->{isName} = 0 ;
+ }
+ elsif ($self->{isEditor})
+ {
+ $self->{curInfo}->{editor} = $origtext;
+ $self->{isEditor} = 0 ;
+ }
+ elsif ($self->{isPlatform} eq 2)
+ {
+ $origtext =~ s/PlayStation 2/Playstation 2/i;
+ $origtext =~ s/Jeux PC/PC/i;
+ $origtext =~ s/Jeux Mac/MAC/i;
+
+ if (($self->{curInfo}->{platform} eq '') && ($origtext ne ''))
+ {
+ $self->{curInfo}->{platform} = $origtext;
+ }
+ elsif ($origtext ne '')
+ {
+ $self->{curInfo}->{platform} .= ', ';
+ $self->{curInfo}->{platform} .= $origtext;
+ }
+ $self->{isPlatform} = 0;
+ }
+ elsif ($self->{isDate})
+ {
+ $self->{curInfo}->{released} = $origtext;
+ $self->{curInfo}->{released} =~ s|([0-9]*)-([0-9]*)-([0-9]*)|$3.'/'.$2.'/'.$1|e;
+ $self->{isDate} = 0 ;
+ }
+ elsif ($self->{isEan})
+ {
+ $self->{curInfo}->{ean} = $origtext;
+ $self->{isEan} = 0 ;
+ }
+
+ }
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+
+ return ;
+
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 0,
+ genre => 0,
+ released => 0
+ };
+
+ $self->{isName} = 0;
+ $self->{isGame} = 0;
+ $self->{isUrl} = 0;
+ $self->{isPlatform} = 0;
+ $self->{isEditor} = 0;
+ $self->{isDate} = 0;
+ $self->{isEan} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ my $found = index($html,"class=\"produits_box\"");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, 0, $found);
+ }
+
+ $html =~ s/Version sortie le /<tpfdateparution>/gi;
+ $html =~ s/Code EAN : /<tpfean>/gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ }
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return ('http://www.dicodunet.com/jeux-video/recherche.php', ["q" => "$word"] );
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url;
+ return 'http://www.dicodunet.com/';
+ }
+
+ sub getName
+ {
+ return 'DicoDuNet';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ #return "UTF-8";
+ return "ISO-8859-15";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['name'];
+ }
+}
+
+1;
+
diff --git a/lib/gcstar/GCPlugins/GCgames/GCGameSpot.pm b/lib/gcstar/GCPlugins/GCgames/GCGameSpot.pm
new file mode 100644
index 0000000..c5870b4
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCGameSpot.pm
@@ -0,0 +1,490 @@
+package GCPlugins::GCgames::GCGameSpot;
+
+###################################################
+#
+# Copyright 2005-2011 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginGameSpot;
+
+ use base 'GCPlugins::GCgames::GCgamesPluginsBase';
+ use Text::Wrap;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'div')
+ {
+ $self->{isGame} = 1
+ if $attr->{class} =~ /result_title/;
+ }
+ elsif ($tagname eq 'tpfdatetpf')
+ {
+ $self->{isDate} = 1;
+ }
+ elsif (($tagname eq 'a') && ($self->{isGame}))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isName} = 1;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ if (($tagname eq 'h2') && ($attr->{class} eq 'module_title'))
+ {
+ $self->{isSection} = 1;
+ }
+ elsif (($tagname eq 'th') && ($attr->{scope} eq 'row') && ($attr->{class} eq 'code') && ($self->{section} ne ''))
+ {
+ $self->{isCheat} = 1;
+ }
+ elsif (($tagname eq 'td') && ($attr->{class} eq 'effect') && ($self->{section} ne ''))
+ {
+ $self->{isDesc} = 1;
+ }
+ elsif (($tagname eq 'h3') && ($attr->{class} eq 'cheatCodeTitle') && ($self->{section} eq 'Secrets'))
+ {
+ $self->{curInfo}->{secrets} .= "\n" if $self->{curInfo}->{secrets};
+ }
+ elsif ($tagname eq 'tpfdebuttpf')
+ {
+ $self->{section} = 'Secrets';
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'head'))
+ {
+ $self->{section} = '';
+ }
+ elsif ($tagname eq 'head')
+ {
+ $self->{urlTips} = '';
+ }
+ }
+ else
+ {
+ if ($tagname eq 'img')
+ {
+ $self->{curInfo}->{boxpic} = ' '
+ if $attr->{src} =~ /no_preview/;
+ if ((! $self->{curInfo}->{boxpic}) && ($attr->{src} =~ /[^xo]boxs[^c]/))
+ {
+ $self->{curInfo}->{boxpic} = $attr->{src};
+ }
+ if ($attr->{src} =~ /thumb/)
+ {
+ my $pic = $attr->{src};
+ $pic =~ s/thumb00([0-9])/screen00$1/;
+ if ($1 && ($1 <= 2))
+ {
+ $self->{curInfo}->{'screenshot'.$1} = $pic
+ if ! $self->{curInfo}->{'screenshot'.$1};
+ }
+ }
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'boxshot'))
+ {
+ $self->{isBox} = 1;
+ }
+ elsif (($tagname eq 'a') && ($self->{isBox} eq 1))
+ {
+ my $html = $self->loadPage($self->getItemUrl($attr->{href}), 0, 1);
+ my $found = index($html,"id=\"main_image\" src=\"");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('id="main_image" src="'),length($html)- $found -length('id="main_image" src="'));
+
+ my @array = split(/"/,$html);
+ #"
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{boxpic} = $array[0];
+ }
+ $self->{curInfo}->{backpic} = $array[0];
+ $self->{curInfo}->{backpic} =~ s/_front/_back/;
+ }
+ $self->{isBox} = 0;
+ }
+ elsif (($tagname eq 'h1') && ($attr->{class} eq 'productPageTitle'))
+ {
+ $self->{isName} = 1 if ! $self->{curInfo}->{name};
+ }
+ elsif (($tagname eq 'meta') && ($attr->{name} eq 'description'))
+ {
+ $self->{curInfo}->{description} = $attr->{content};
+ }
+ elsif (($tagname eq 'li') && ($attr->{class} =~ /activeFilter/))
+ {
+ $self->{curInfo}->{exclusive} = 0;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'reviewer'))
+ {
+ $self->{isRating} = 1;
+ }
+ elsif (($tagname eq 'a') && ($self->{isRating} eq 1))
+ {
+ $self->{isRating} = 2;
+ }
+ elsif (($tagname eq 'li') && ($attr->{class} eq 'moreStat play_info number_of_players'))
+ {
+ $self->{isPlayers} = 1;
+ }
+ elsif (($tagname eq 'p') && ($self->{isPlayers} eq 1))
+ {
+ $self->{isPlayers} = 2;
+ }
+ elsif (($tagname eq 'li') && ($attr->{class} eq 'publisher'))
+ {
+ $self->{isEditor} = 1;
+ }
+ elsif (($tagname eq 'a') && ($self->{isEditor} eq 1))
+ {
+ $self->{isEditor} = 2;
+ }
+ elsif (($tagname eq 'li') && ($attr->{class} eq 'developer'))
+ {
+ $self->{isDeveloper} = 1;
+ }
+ elsif (($tagname eq 'a') && ($self->{isDeveloper} eq 1))
+ {
+ $self->{isDeveloper} = 2;
+ }
+ elsif (($tagname eq 'li') && ($attr->{class} eq 'genre'))
+ {
+ $self->{isGenre} = 1;
+ }
+ elsif (($tagname eq 'a') && ($self->{isGenre}))
+ {
+ $self->{curInfo}->{genre} = $attr->{title};
+ $self->{isGenre} = 0;
+ }
+ elsif (($tagname eq 'li') && ($attr->{class} eq 'date'))
+ {
+ $self->{isReleased} = 1;
+ }
+ elsif (($tagname eq 'a') && ($self->{isReleased} eq 1))
+ {
+ $self->{isReleased} = 2;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ /\/cheats\//) && ($attr->{class} eq 'navItemAction'))
+ {
+ $self->{urlTips} = $attr->{href};
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ if ($self->{parsingList})
+ {
+ $self->{isGame} = 0
+ if ($tagname eq 'div');
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isName})
+ {
+ $origtext =~ /^(.*?)\s*\((.*?)\)\s*$/;
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $1;
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $2;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{itemsList}[$self->{itemIdx}]->{url} . 'tpfplatformtpf' . $self->{itemsList}[$self->{itemIdx}]->{platform};
+ $self->{isName} = 0;
+ }
+ elsif ($self->{isDate})
+ {
+ $origtext =~ /^\s*Release Date:\s*(.*?)\s*$/ms;
+ $self->{itemsList}[$self->{itemIdx}]->{released} = $1;
+ $self->{isDate} = 0;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ if (($self->{isSection} eq 1) && $self->{inside}->{h2})
+ {
+ $self->{section} = 'Codes' if $origtext =~ /Cheat Codes$/;
+ $self->{section} = 'Unlockables' if $origtext =~ /Unlockables$/;
+ $self->{section} = 'Secrets' if $origtext =~ /Secrets$/;
+ $self->{section} = 'Secrets' if $origtext =~ /Easter Eggs$/;
+ $self->{isSection} = 0;
+ }
+ elsif (($self->{section} eq 'Codes') || ($self->{section} eq 'Unlockables'))
+ {
+ $origtext =~ s/^\s*//;
+ $origtext =~ s/\s*$//;
+ $Text::Wrap::columns = 80;
+ $origtext = Text::Wrap::wrap('', '', $origtext);
+
+ if ($self->{isCheat})
+ {
+ if ($self->{section} eq 'Codes')
+ {
+ $self->{tmpCheatLine} = [];
+ push @{$self->{tmpCheatLine}}, $origtext;
+ }
+ else
+ {
+ $self->{tmpCheatLine} = [];
+ ${$self->{tmpCheatLine}}[1] = $origtext;
+ }
+ $self->{isCheat} = 0;
+ }
+ elsif ($self->{isDesc})
+ {
+ if ($self->{section} eq 'Codes')
+ {
+ push @{$self->{tmpCheatLine}}, $origtext;
+ push @{$self->{curInfo}->{code}}, $self->{tmpCheatLine};
+ $self->{tmpCheatLine} = [];
+ }
+ else
+ {
+ ${$self->{tmpCheatLine}}[0] = $origtext;
+ push @{$self->{curInfo}->{unlockable}}, $self->{tmpCheatLine};
+ $self->{tmpCheatLine} = [];
+ }
+ $self->{isDesc} = 0;
+ }
+ }
+ elsif ($self->{section} eq 'Secrets')
+ {
+ $origtext =~ s/^\s*//;
+ $origtext =~ s/\s*$//;
+ return if !$origtext;
+ $self->{curInfo}->{secrets} .= "\n" if $self->{curInfo}->{secrets};
+ $self->{curInfo}->{secrets} .= $origtext;
+ }
+ }
+ else
+ {
+ if ($self->{isName})
+ {
+ $origtext =~ s/\n//g;
+ $self->{curInfo}->{name} = $origtext;
+ $self->{curInfo}->{platform} = $self->{url_plateforme};
+ $self->{curInfo}->{exclusive} = 1;
+ $self->{isName} = 0;
+ }
+ elsif ($self->{isRating} eq 2)
+ {
+ $self->{curInfo}->{ratingpress} = $origtext;
+ $self->{isRating} = 0;
+ }
+ else
+ {
+ $origtext =~ s/^\s*//;
+ $origtext =~ s/\s*$//;
+ return if !$origtext;
+ if ($self->{isReleased} eq 2)
+ {
+ $origtext =~ s/ .$//;
+ $self->{curInfo}->{released} = $origtext;
+ $self->{isReleased} = 0;
+ }
+ elsif ($self->{isEditor} eq 2)
+ {
+ $self->{curInfo}->{editor} = $origtext;
+ $self->{isEditor} = 0;
+ }
+ elsif ($self->{isDeveloper} eq 2)
+ {
+ $self->{curInfo}->{developer} = $origtext;
+ $self->{isDeveloper} = 0;
+ }
+ elsif ($self->{isPlayers} eq 2)
+ {
+ $origtext =~ s/(Players?)?\s*\(.*?$//;
+ $self->{curInfo}->{players} = $origtext;
+ $self->{isPlayers} = 0;
+ }
+ }
+ }
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+ return 'http://www.gamespot.com' .$self->{urlTips};
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 1,
+ released => 1,
+ };
+
+ $self->{isName} = 0;
+ $self->{isGame} = 0;
+ $self->{isDate} = 0;
+ $self->{isCheat} = 0;
+ $self->{isDesc} = 0;
+ $self->{isTip} = 0;
+ $self->{isRating} = 0;
+ $self->{section} = '';
+ $self->{isSection} = 0;
+ $self->{isDeveloper} = 0;
+ $self->{isGenre} = 0;
+ $self->{isEditor} = 0;
+ $self->{isReleased} = 0;
+ $self->{isPlayers} = 0;
+ $self->{isBox} = 0;
+ $self->{isExclu} = 0;
+ $self->{url_plateforme} = '';
+ $self->{urlTips} = "";
+ $self->{SaveUrl} = "";
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingTips})
+ {
+ $html =~ s|<b>(.*?)</b>|$1|g;
+ $html =~ s|<i>(.*?)</i>|$1|g;
+## It takes too much time
+# $html =~ s|<li class="guideAct"><a href="(.+)">Go to Online Walkthrough|'<tpfdebuttpf>' . $self->RecupSolution($1) . '<tpffintpf>'|ge;
+ }
+ elsif ($self->{parsingList})
+ {
+ $html =~ s|Release Date|<tpfdatetpf>Release Date|g;
+ }
+ else
+ {
+ my $found = index($html,"Similar Games");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, 0, $found);
+ }
+ }
+
+ return $html;
+ }
+
+ sub RecupSolution
+ {
+ my ($self, $url) = @_;
+
+ my $html = $self->loadPage($url);
+
+ my $found = index($html,"<h2>");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found,length($html)- $found);
+ }
+ else
+ {
+ $found = index($html,"<span class=\"author\">");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found,length($html)- $found);
+ }
+ }
+
+ $html = substr($html, 0, index($html, " rel=\"next\">"));
+
+ $html =~ s|<a class="next" href="/gameguides.html"||ge;
+ $html =~ s|<a class="next" href="(.+)"|$self->RecupSolution('http://www.gamespot.com'.$1)|ge;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ #return 'http://www.gamespot.com/search.html?qs='.$word.'&sub=g&stype=11&type=11';
+ return 'http://www.gamespot.com/pages/search/solr_search_ajax.php?q='.$word.'&type=game&offset=0&tags_only=false&sort=false';
+ #return 'http://www.gamespot.com/search.html?qs=' .$word. '&tag=masthead%3Bsearch';
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ my $found = index($url,"tpfplatformtpf");
+ if ( $found >= 0 )
+ {
+ $self->{url_plateforme} = substr($url, $found +length('tpfplatformtpf'),length($url)- $found -length('tpfplatformtpf'));
+ $url = substr($url, 0,$found);
+ }
+
+ return 'http://www.gamespot.com' . $url
+ if $url !~ /gamespot\.com/;
+ return $url if $url;
+ return 'http://www.gamespot.com';
+ }
+
+ sub getName
+ {
+ return 'GameSpot';
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+ sub isPreferred
+ {
+ return 1;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCJeuxVideoCom.pm b/lib/gcstar/GCPlugins/GCgames/GCJeuxVideoCom.pm
new file mode 100644
index 0000000..560a582
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCJeuxVideoCom.pm
@@ -0,0 +1,447 @@
+package GCPlugins::GCgames::GCJeuxVideoCom;
+
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginJeuxVideoCom;
+
+ use base 'GCPlugins::GCgames::GCgamesPluginsBase';
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+ return if $self->{parsingEnded};
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'div') && (($attr->{id} eq 'new_mc') || ($attr->{id} eq 'old_mc')))
+ {
+ $self->{inResults} = 1;
+ }
+ elsif ($self->{inResults})
+ {
+ if ($tagname eq 'img')
+ {
+ $self->{currentPlatform} = $attr->{alt};
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ /^http/))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $self->{currentPlatform};
+ $self->{isGame} = 1;
+ }
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ if ($tagname eq 'tpfdebuttpf')
+ {
+ $self->{isTip} = 1;
+ }
+ elsif ( ($tagname eq 'h3') && ($attr->{class} eq 'titre_bloc') && ($self->{isTip} ne 4))
+ {
+ $self->{isTip} = 2;
+ }
+ elsif ( (($tagname eq 'h3') || ($tagname eq 'h4') || ($tagname eq 'h5') ) && ($self->{isTip} ne 3) && ($self->{isTip} ne 4))
+ {
+ $self->{isTip} = 2;
+ }
+ elsif ( ($tagname eq 'p') && ($self->{isTip} ne 3) && ($self->{isTip} ne 4))
+ {
+ $self->{isTip} = 1;
+ }
+ elsif ($tagname eq 'tpfstopsolution')
+ {
+ $self->{isTip} = 4;
+ }
+ elsif ($tagname eq 'tpffintpf')
+ {
+ $self->{isTip} = 3;
+ }
+ elsif ($tagname eq 'head')
+ {
+ $self->{isTip} = 0;
+ $self->{urlTips} = '';
+ }
+
+ }
+ else
+ {
+ if (($tagname eq 'meta') && ($attr->{property} eq 'og:image'))
+ {
+ my $cover = $attr->{content};
+ $cover =~ s|(http://[^/]*)/([^i])|$1/images/$2|;
+ if ($self->{bigPics})
+ {
+ $cover =~ s/-p(-|\.)/-g$1/;
+ $cover =~ s/t(\.jpg)/$1/;
+ }
+ my $back = $cover;
+ if (!($back =~ s/-avant(-|\.)/-arriere$1/))
+ {
+ $back =~ s/f(t?\.jpg)/r$1/;
+ }
+ $self->{curInfo}->{boxpic} = $cover;
+ $self->{curInfo}->{backpic} = $back;
+ }
+ elsif (($tagname eq 'li') && ($attr->{class} eq 'note_redac'))
+ {
+ $self->{is} = 'ratingpress';
+ }
+ elsif ( ($tagname eq 'div') && ($attr->{class} eq 'series_images') )
+ {
+ $self->{inScreenshots} = 1;
+ }
+ elsif ( ($tagname eq 'img') && ($self->{inScreenshots}) )
+ {
+ if (! $self->{curInfo}->{screenshot1})
+ {
+ $self->{curInfo}->{screenshot1} = $attr->{src};
+ $self->{curInfo}->{screenshot1} =~ s/.gif/.jpg/;
+ $self->{curInfo}->{screenshot1} =~ s/_m\.jpg/\.jpg/;
+ }
+ elsif (! $self->{curInfo}->{screenshot2})
+ {
+ $self->{curInfo}->{screenshot2} = $attr->{src};
+ $self->{curInfo}->{screenshot2} =~ s/.gif/.jpg/;
+ $self->{curInfo}->{screenshot2} =~ s/_m\.jpg/\.jpg/;
+ $self->{isScreen} = 0;
+ }
+ }
+ elsif (($attr->{href} =~ m^/(etajvhtm|cheats)/^) && ! ($self->{urlTips}))
+ {
+ $self->{urlTips} = $attr->{href};
+ }
+ elsif (($attr->{href} =~ m/test.htm/) && ! ($self->{curInfo}->{players}))
+ {
+ my $html = $self->loadPage($attr->{href});
+
+ my $found = index($html,"<li><strong>Multijoueurs :</strong>");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('<li><strong>Multijoueurs :</strong>'),length($html)- $found -length('<li><strong>Multijoueurs :</strong>'));
+ $self->{curInfo}->{players} = substr($html, 0, index($html, "<"));
+
+ # Enleve les blancs en debut de chaine
+ $self->{curInfo}->{players} =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $self->{curInfo}->{players} =~ s/\s+$//;
+
+ $self->{curInfo}->{players} =~ s/-/1/;
+ $self->{curInfo}->{players} =~ s/non/1/i;
+ $self->{curInfo}->{players} =~ s/oui/Multijoueurs/i;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ return if $self->{parsingEnded};
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'div')
+ {
+ $self->{inResults} = 0;
+ }
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if $self->{parsingEnded};
+ if ($self->{parsingList})
+ {
+ if ($self->{isGame})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $origtext;
+ $self->{isGame} = 0;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+ if ($self->{isTip} eq 2)
+ {
+ $self->{curInfo}->{secrets} .= "\n\n" if $self->{curInfo}->{secrets};
+ $self->{curInfo}->{secrets} .= $origtext;
+ $self->{isTip} = 0;
+ }
+ elsif ($self->{isTip} eq 1)
+ {
+ chomp($origtext);
+ if ( ($self->{curInfo}->{secrets}) && ($origtext ne "") )
+ {
+ $self->{curInfo}->{secrets} .= "\n"
+ }
+ $self->{curInfo}->{secrets} .= $origtext;
+ $self->{isTip} = 0;
+ }
+ }
+ else
+ {
+ if ($self->{inside}->{h1})
+ {
+ if ($self->{inside}->{a})
+ {
+ $self->{curInfo}->{name} = $origtext;
+ $self->{curInfo}->{exclusive} = 1;
+ }
+ elsif ($self->{inside}->{span})
+ {
+ if ($origtext !~ /^Fiche /)
+ {
+ $origtext =~ s/^\s*-?\s*//;
+ $self->{curInfo}->{platform} = $origtext;
+ }
+ }
+ }
+ elsif ($self->{inside}->{strong})
+ {
+ $self->{is} = 'released' if ($origtext =~ /Sortie :/) || ($origtext =~ /Sortie France :/);
+ $self->{is} = 'genre' if $origtext =~ /Type :/;
+ $self->{is} = 'description' if $origtext =~ /Descriptif :/;
+ $self->{is} = 'editor' if $origtext =~ /Editeur :/;
+ $self->{is} = 'developer' if $origtext =~ /D.*?veloppeur :/;
+ $self->{is} = 'players' if $origtext =~ /Multijoueurs :/;
+ $self->{curInfo}->{exclusive} = 0 if $origtext =~ /Existe aussi sur :/;
+ }
+ elsif ($self->{is})
+ {
+ $origtext =~ s/^\s*//;
+ $origtext =~ s/\n$//;
+ if ($origtext)
+ {
+ if ($self->{is} eq 'players')
+ {
+ $origtext =~ s/-/1/;
+ $origtext =~ s/non/1/i;
+ $origtext =~ s/oui/Multijoueurs/i;
+ }
+ if ($self->{is} eq 'ratingpress')
+ {
+ $origtext =~ m|(\d*)/20|;
+ $origtext = int($1 / 2);
+ }
+ $self->{curInfo}->{$self->{is}} = $origtext;
+ $self->{is} = '';
+ }
+ }
+ }
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+ return $self->{urlTips};
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 1
+ };
+
+ $self->{isTip} = 0;
+ $self->{urlTips} = "";
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ if ($self->{parsingList})
+ {
+ $self->{parsingEnded} = 0;
+ $self->{inResults} = 0;
+ $self->{isGame} = 0;
+ }
+ elsif ($self->{parsingTips})
+ {
+ $html =~ s|<h4 class="lien_base"><a href="(.+)">Les astuces d|$self->RecupTips($1)|ge;
+ $html =~ s|<h4 class="lien_base"><a href="(.+)">La solution d|$self->RecupSolution($1)|ge;
+ $html =~ s|<h5><a href="(.+)">||gi;
+ $html =~ s|<h3 class="titre_bloc"><span>Plus d'infos</span></h3>|<tpfstopsolution>|gi;
+ $html =~ s|<div id="boxes_v">|<tpffintpf>|gi;
+ $html =~ s|<p class="lien_base">|<tpffintpf>|gi;
+ $html =~ s|<div class="player_article">|<tpffintpf>|gi;
+ $html =~ s|</object>|<tpfdebuttpf>|gi;
+ $html =~ s|<p class="title_bar">|<tpffintpf>|gi;
+ $html =~ s|<div class="bloc3" id="astuces_ajout"><h3 class="titre_bloc">|<tpffintpf>|gi;
+ $html =~ s|<br />|<p>|gi;
+ $html =~ s|<kbd>|<p>|gi;
+ $html =~ s|</kbd>||gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<span>||gi;
+ $html =~ s|<img src="../pics/psx/cercle.gif"\s*(alt="CERCLE")?\s*/>|Cercle|gi;
+ $html =~ s|<img src="../pics/psx/croix.gif"\s*(alt="CROIX")?\s*/>|Croix|gi;
+ $html =~ s|<img src="../pics/psx/carre.gif"\s*(alt="CARRE")?\s*/>|Carr.|gi;
+ $html =~ s|<img src="../pics/psx/triangle.gif"\s*(alt="TRIANGLE")?\s*/>|Triangle|gi;
+ $html =~ s|<img src="http://image.jeuxvideo.com/pics/btajv/psx/cercle.gif"\s*(alt="CERCLE")?\s*/>|Cercle|gi;
+ $html =~ s|<img src="http://image.jeuxvideo.com/pics/btajv/psx/croix.gif"\s*(alt="CROIX")?\s*/>|Croix|gi;
+ $html =~ s|<img src="http://image.jeuxvideo.com/pics/btajv/psx/carre.gif"\s*(alt="CARRE")?\s*/>|Carr.|gi;
+ $html =~ s|<img src="http://image.jeuxvideo.com/pics/btajv/psx/triangle.gif"\s*(alt="TRIANGLE")?\s*/>|Triangle|gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#156;|oe|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+ }
+ else
+ {
+ $self->{is} = '';
+ $self->{inScreenshots} = 0;
+ }
+ return $html;
+ }
+
+ sub RecupTips
+ {
+ my ($self, $url) = @_;
+
+ my $html = $self->loadPage($url);
+ my $savenexturl = '';
+
+ my $found = index($html,"<p class=\"astuces_suiv\"> <a href=\"");
+ if ( $found >= 0 )
+ {
+ $savenexturl = substr($html, $found +length('<p class="astuces_suiv"> <a href="'),length($html)- $found -length('<p class="astuces_suiv"> <a href="'));
+ $savenexturl = substr($savenexturl, 0, index($savenexturl, "\""));
+ }
+
+ $found = index($html,"<div id=\"astuce_detail\" class=\"astuce\">");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('<div id="astuce_detail" class="astuce">'),length($html)- $found -length('<div id="astuce_detail" class="astuce">'));
+ $html = substr($html, 0, index($html, "<div id=\"barre_outils_v2\">"));
+ if ( $savenexturl ne "" )
+ {
+ $html .= $self->RecupTips($savenexturl);
+ }
+ }
+ else
+ {
+ $html = '';
+ }
+ return "<tpfdebuttpf>" . $html . "<tpffintpf>";
+ }
+
+ sub RecupSolution
+ {
+ my ($self, $url) = @_;
+
+ my $html = $self->loadPage($url);
+ my $savenexturl = '';
+
+ my $found = index($html,"<p class=\"astuces_suiv\"><a href=\"");
+ if ( $found >= 0 )
+ {
+ $savenexturl = substr($html, $found +length('<p class="astuces_suiv"><a href="'),length($html)- $found -length('<p class="astuces_suiv"><a href="'));
+ $savenexturl = substr($savenexturl, 0, index($savenexturl, "\""));
+ }
+
+ $found = index($html,"<div id=\"astuce_detail\" class=\"soluce\">");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('<div id="astuce_detail" class="soluce">'),length($html)- $found -length('<div id="astuce_detail" class="soluce">'));
+ $html = substr($html, 0, index($html, "<div id=\"barre_outils_v2\">"));
+ if ( $savenexturl ne "" )
+ {
+ $html .= $self->RecupSolution($savenexturl);
+ }
+ }
+ else
+ {
+ $html = '';
+ }
+ return "<tpfdebuttpf>" . $html . "<tpffintpf>";
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ $word =~ s/\+/ /g;
+ return 'http://www.jeuxvideo.com/recherche/jeux/'.$word.'.htm';
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.jeuxvideo.com/';
+ }
+
+ sub getName
+ {
+ return 'jeuxvideo.com';
+ }
+
+ sub getAuthor
+ {
+ return 'Tian & TPF';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+ sub isPreferred
+ {
+ return 1;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCJeuxVideoFr.pm b/lib/gcstar/GCPlugins/GCgames/GCJeuxVideoFr.pm
new file mode 100644
index 0000000..bec266f
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCJeuxVideoFr.pm
@@ -0,0 +1,425 @@
+package GCPlugins::GCgames::GCJeuxVideoFr;
+
+###################################################
+#
+# Copyright 2005-2011 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginJeuxVideoFr;
+
+ use base 'GCPlugins::GCgames::GCgamesPluginsBase';
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'div')
+ {
+ $self->{isGame} = 1
+ if $attr->{class} eq "jeuDesc";
+ }
+ if ($self->{isGame})
+ {
+ if ($tagname eq 'a')
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $attr->{title};
+ }
+ elsif ( ($tagname eq 'span') & ($attr->{class} eq "bleu2"))
+ {
+ $self->{isPlatform} = 1;
+ }
+ elsif ( ($tagname eq 'span') & ($attr->{class} eq "bleu6"))
+ {
+ $self->{isGenre} = 1;
+ }
+ elsif ( ($tagname eq 'p') & ($attr->{class} eq "jeuNote"))
+ {
+ $self->{isGame} = 0;
+ $self->{isEnd} = 1;
+ }
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ if ( ($tagname eq 'input') && ($attr->{id} eq 'titreJeu'))
+ {
+ $self->{curInfo}->{name} = $attr->{value};
+ $self->{curInfo}->{platform} = $self->{url_plateforme};
+
+ my $html = $self->loadPage( $self->{url_screenshot} );
+
+ my $found = index($html,"div class=\"image_slideshow\">");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{screenshot1} = substr($html, $found +length('div class="image_slideshow">'),length($html)- $found -length('div class="image_slideshow">'));
+ $found = index($self->{curInfo}->{screenshot1},"<a href=\"");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{screenshot1} = substr($self->{curInfo}->{screenshot1}, $found +length('<a href="'),length($self->{curInfo}->{screenshot1})- $found -length('<a href="'));
+ $self->{curInfo}->{screenshot1} = substr($self->{curInfo}->{screenshot1}, 0,index($self->{curInfo}->{screenshot1},"\""));
+ $found = index($html,"\"imageNumberTotal\"");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{screenshot2} = substr($html, $found +length('"imageNumberTotal"'),length($html)- $found -length('"imageNumberTotal"'));
+ $found = index($self->{curInfo}->{screenshot2},"href=\"");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{screenshot2} = substr($self->{curInfo}->{screenshot2}, $found +length('href="'),length($self->{curInfo}->{screenshot2})- $found -length('href="'));
+ $self->{curInfo}->{screenshot2} = 'http://www.jeuxvideo.fr/' . substr($self->{curInfo}->{screenshot2}, 0,index($self->{curInfo}->{screenshot2},"\""));
+
+ $html = $self->loadPage( $self->{curInfo}->{screenshot2} );
+ $found = index($html,"div class=\"image_slideshow\">");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{screenshot2} = substr($html, $found +length('div class="image_slideshow">'),length($html)- $found -length('div class="image_slideshow">'));
+ $found = index($self->{curInfo}->{screenshot2},"<a href=\"");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{screenshot2} = substr($self->{curInfo}->{screenshot2}, $found +length('<a href="'),length($self->{curInfo}->{screenshot2})- $found -length('<a href="'));
+ $self->{curInfo}->{screenshot2} = substr($self->{curInfo}->{screenshot2}, 0,index($self->{curInfo}->{screenshot2},"\""));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'clearer spacer10'))
+ {
+ $self->{isInfo} = 0;
+ $self->{is} = '';
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'listing_apropos'))
+ {
+ $self->{isInfo} = 1;
+ }
+ elsif (($self->{isInfo} eq '1') && ($tagname eq 'span') && ($attr->{class} eq 'strong'))
+ {
+ $self->{isInfo} = 2;
+ }
+ elsif (($self->{is}) && ($tagname eq 'span') && ($attr->{class} eq 'noir'))
+ {
+ $self->{isInfo} = 3;
+ }
+ elsif (($self->{is}) && ($tagname eq 'div') && ($attr->{class} eq 'clearer'))
+ {
+ $self->{isInfo} = 1;
+ $self->{is} = '';
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'note-jeux orange1') && ($attr->{property} eq 'v:rating'))
+ {
+ $self->{isNote} = 1;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'contentCommentaire'))
+ {
+ $self->{isDesc} = 1;
+ }
+ elsif (($self->{isDesc}) && ($tagname eq 'div') && ($attr->{class} eq 'clearer'))
+ {
+ $self->{isDesc} = 0;
+ }
+ elsif ( ($tagname eq 'img') && ($attr->{class} eq 'imgJeu') && !($attr->{src} =~ /blank/i))
+ {
+ $self->{curInfo}->{boxpic} = $attr->{src};
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ if ($self->{parsingList})
+ {
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+
+ if ($self->{isGenre})
+ {
+ if ($self->{itemsList}[$self->{itemIdx}]->{genre} eq '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{genre} = $origtext;
+ $self->{isGenre} = 0;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{genre} = $self->{itemsList}[$self->{itemIdx}]->{genre} . ' - ' . $origtext;
+ $self->{isGenre} = 0;
+ }
+ }
+ elsif ($self->{isPlatform})
+ {
+ $origtext =~ s/\|//gi;
+ if ($self->{itemsList}[$self->{itemIdx}]->{platform} eq '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $origtext;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{platform} .= ', ';
+ $self->{itemsList}[$self->{itemIdx}]->{platform} .= $origtext;
+ }
+ $self->{isPlatform} = 0;
+ }
+ elsif ($self->{isEnd})
+ {
+ my @array = split(/,/,$self->{itemsList}[$self->{itemIdx}]->{platform});
+ my $element;
+
+ my $SaveName = $self->{itemsList}[$self->{itemIdx}]->{name};
+ my $SaveUrl = $self->{itemsList}[$self->{itemIdx}]->{url};
+ my $SaveGenre = $self->{itemsList}[$self->{itemIdx}]->{genre};
+ $self->{itemIdx}--;
+
+ foreach $element (@array)
+ {
+ # Enleve les blancs en debut de chaine
+ $element =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $element =~ s/\s+$//;
+
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $SaveName;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $SaveUrl . 'tpfplatformtpf' . $element;
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $element;
+ $self->{itemsList}[$self->{itemIdx}]->{genre} = $SaveGenre;
+ }
+ $self->{isEnd} = 0;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ if ($self->{isInfo} eq 2)
+ {
+ $self->{is} = 'genre' if $origtext =~ /Genre :/;
+ $self->{is} = 'editor' if $origtext =~ /Editeur :/;
+ $self->{is} = 'developer' if $origtext =~ /D.veloppeur :/;
+ $self->{is} = 'players' if $origtext =~ /Nb joueurs :/;
+ $self->{is} = 'released' if $origtext =~ /Sortie :/;
+ $self->{is} = 'exclusive' if $origtext =~ /Plateformes :/;
+ }
+ elsif ($self->{isInfo} eq 3)
+ {
+ # Enleve le caractere | qui separe les champs
+ $origtext =~ s/\|//gi;
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+ if ($origtext)
+ {
+ if ($self->{is} eq 'players')
+ {
+ $origtext =~ s/Exclusivement Solo/1/i;
+ $origtext =~ s/\s*joueurs?//i;
+ }
+
+ if ($self->{curInfo}->{$self->{is}} eq '')
+ {
+ if ($self->{is} eq 'exclusive')
+ {
+ $self->{curInfo}->{$self->{is}} = 'true';
+ if ($origtext =~ /$self->{curInfo}->{platform}/i)
+ {
+ $self->{curInfo}->{platform} = $origtext;
+ }
+ }
+ else
+ {
+ $self->{curInfo}->{$self->{is}} = $origtext;
+ }
+ }
+ else
+ {
+ if ($self->{is} eq 'exclusive')
+ {
+ $self->{curInfo}->{$self->{is}} = 'false';
+ if ($origtext =~ /$self->{curInfo}->{platform}/i)
+ {
+ $self->{curInfo}->{platform} = $origtext;
+ }
+ }
+ else
+ {
+ $self->{curInfo}->{$self->{is}} = $self->{curInfo}->{$self->{is}} . ', ' . $origtext;
+ }
+ }
+
+ }
+ }
+ elsif ($self->{isNote} eq 1)
+ {
+ $self->{curInfo}->{ratingpress} = $origtext;
+ $self->{isNote} = 0;
+ }
+ elsif ($self->{isDesc} eq 1)
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+ $self->{curInfo}->{description} .= $origtext;
+ }
+ }
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+
+ return $self->{url_tips};
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 1,
+ released => 0,
+ genre => 1
+ };
+
+ $self->{isGame} = 0;
+ $self->{isPlatform} = 0;
+ $self->{isGenre} = 0;
+ $self->{isEnd} = 0;
+ $self->{isInfo} = 0;
+ $self->{isNote} = 0;
+ $self->{isDesc} = 0;
+ $self->{isTip} = 0;
+ $self->{url_plateforme} = '';
+ $self->{url_screenshot} = '';
+ $self->{url_tips} = '';
+ $self->{is} = '';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return 'http://www.jeuxvideo.fr/r/'.$word.'/';
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ my $found = index($url,"tpfplatformtpf");
+ if ( $found >= 0 )
+ {
+ $self->{url_plateforme} = substr($url, $found +length('tpfplatformtpf'),length($url)- $found -length('tpfplatformtpf'));
+ $url = substr($url, 0,$found);
+ }
+
+ $self->{url_screenshot} = 'http://www.jeuxvideo.fr' . $url . 'image-photo/';
+ $self->{url_tips} = 'http://www.jeuxvideo.fr' . $url . 'astuce-code/';
+
+ return 'http://www.jeuxvideo.fr' . $url;
+ }
+
+ sub getName
+ {
+ return 'jeuxvideo.fr';
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCLudus.pm b/lib/gcstar/GCPlugins/GCgames/GCLudus.pm
new file mode 100644
index 0000000..42b42a7
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCLudus.pm
@@ -0,0 +1,367 @@
+package GCPlugins::GCgames::GCLudus;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginLudus;
+
+ use base 'GCPlugins::GCgames::GCgamesPluginsBase';
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'span') && ( $attr->{class} eq 'titolini' ))
+ {
+ $self->{isGame} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($self->{isGame}))
+ {
+ $self->{isGame} = 0 ;
+ $self->{isInfo} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ($self->{isGame}))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.ludus.it/" . $attr->{href};
+ $self->{isName} = 1 ;
+ $self->{isInfo} = 1 ;
+ }
+ elsif (($tagname eq 'td') && ( $attr->{class} eq 'trat2' ) && ($self->{isInfo} eq '1'))
+ {
+ # le deuxieme champs est le type de donnees
+ $self->{isInfo} = 2 ;
+ }
+ elsif (($tagname eq 'td') && ( $attr->{class} eq 'trat2' ) && ($self->{isInfo} eq '2'))
+ {
+ # le troisieme champs est la plateforme
+ $self->{isPlatform} = 1 ;
+ $self->{isInfo} = 3 ;
+ }
+ elsif (($tagname eq 'td') && ( $attr->{class} eq 'trat2' ) && ($self->{isInfo} eq '3'))
+ {
+ # le quatrieme champs est la date de sortie
+ $self->{isDate} = 1 ;
+ $self->{isInfo} = 0 ;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ if (($tagname eq 'td') && ($attr->{colspan} eq '2') && ($attr->{class} eq 'titoli2'))
+ {
+ $self->{isName} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'testo4'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif ($self->{isPlatform} eq 1)
+ {
+ $self->{isPlatform} = 2 ;
+ }
+ elsif ($self->{isEditor} eq 1)
+ {
+ $self->{isEditor} = 2 ;
+ }
+ elsif ($self->{isDeveloper} eq 1)
+ {
+ $self->{isDeveloper} = 2 ;
+ }
+ elsif ($self->{isGenre} eq 1)
+ {
+ $self->{isGenre} = 2 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'testo') && ($attr->{align} eq ''))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif (($tagname eq 'tpfsautdeligne') && ($self->{isDescription}))
+ {
+ $self->{curInfo}->{description} .= "\n";
+ }
+ elsif (($tagname eq 'table') && ($self->{isDescription}))
+ {
+ $self->{isDescription} = 0 ;
+ }
+ elsif ( ($tagname eq 'a') && (index($attr->{onclick},"adafl=win") >= 0) && ($self->{curInfo}->{screenshot1} eq '') && ($self->{curInfo}->{screenshot2} eq ''))
+ {
+ $self->{isScreen} = 1;
+ }
+ elsif ( ($tagname eq 'img') && ($self->{isScreen}) )
+ {
+ if ($self->{curInfo}->{screenshot1} eq '')
+ {
+ $self->{curInfo}->{screenshot1} = $attr->{src};
+ $self->{curInfo}->{screenshot1} =~ s|//|http://www.ludus.it/|;
+ my $found = index(reverse($self->{curInfo}->{screenshot1}),"/");
+ if ( $found >= 0 )
+ {
+ my $tempscreen = substr(reverse($self->{curInfo}->{screenshot1}), $found +length('/'),length($self->{curInfo}->{screenshot1})- $found -length('/'));
+ my $tempscreen2 = substr(reverse($self->{curInfo}->{screenshot1}), 0, $found);
+ $tempscreen2 = "/immagini_grandi/" . reverse($tempscreen2);
+ $self->{curInfo}->{screenshot1} = reverse($tempscreen) . $tempscreen2;
+ }
+ }
+ elsif ($self->{curInfo}->{screenshot2} eq '')
+ {
+ $self->{curInfo}->{screenshot2} = $attr->{src};
+ $self->{curInfo}->{screenshot2} =~ s|//|http://www.ludus.it/|;
+ my $found = index(reverse($self->{curInfo}->{screenshot2}),"/");
+ if ( $found >= 0 )
+ {
+ my $tempscreen = substr(reverse($self->{curInfo}->{screenshot2}), $found +length('/'),length($self->{curInfo}->{screenshot2})- $found -length('/'));
+ my $tempscreen2 = substr(reverse($self->{curInfo}->{screenshot2}), 0, $found);
+ $tempscreen2 = "/immagini_grandi/" . reverse($tempscreen2);
+ $self->{curInfo}->{screenshot2} = reverse($tempscreen) . $tempscreen2;
+ }
+ $self->{isScreen} = 0;
+ }
+ }
+ elsif (($tagname eq 'a') && (index($attr->{href},"post_form") >= 0))
+ {
+ $self->{curInfo}->{boxpic} = $attr->{href};
+ $self->{curInfo}->{boxpic} =~ s|/LINGUA/IT||;
+ my $found = index(reverse($self->{curInfo}->{boxpic}),"/");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{boxpic} = substr(reverse($self->{curInfo}->{boxpic}), 0, $found);
+ $self->{curInfo}->{boxpic} = "http://www.ludus.it/copertine/giochi/" . reverse($self->{curInfo}->{boxpic}) . ".jpg";
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+ if ($self->{isName})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $origtext;
+ $self->{isName} = 0;
+ }
+ elsif ($self->{isDate})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{released} = $origtext;
+ $self->{isDate} = 0;
+ }
+ elsif ($self->{isPlatform})
+ {
+ $origtext =~ s/Pc/PC/;
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $origtext;
+ $self->{isPlatform} = 0;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ if ($self->{isName})
+ {
+ my $found = index(reverse($origtext),"-");
+ if ( $found >= 0 )
+ {
+ $origtext = substr(reverse($origtext), $found +length('-'),length($origtext)- $found -length('-'));
+ $origtext = reverse($origtext);
+ }
+ $self->{curInfo}->{name} = $origtext;
+ $self->{curInfo}->{released} = $self->{itemsList}[$self->{wantedIdx}]->{released};
+ $self->{isName} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isPlatform} = 1 if ($origtext =~ m/Piattaforma:/i);
+ $self->{isEditor} = 1 if ($origtext =~ m/Software House:/i);
+ $self->{isDeveloper} = 1 if ($origtext =~ m/Sviluppatore:/i);
+ $self->{isGenre} = 1 if ($origtext =~ m/Genere:/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isGenre} eq 2)
+ {
+ my @array = split(/\//,$origtext);
+ my $element;
+ foreach $element (@array)
+ {
+ # Enleve les blancs en debut de chaine
+ $element =~ s/^\s+//;
+ $self->{curInfo}->{genre} .= $element;
+ $self->{curInfo}->{genre} .= ",";
+ }
+ $self->{isGenre} = 0;
+ }
+ elsif ($self->{isDeveloper} eq 2)
+ {
+ $self->{curInfo}->{developer} = $origtext;
+ $self->{isDeveloper} = 0 ;
+ }
+ elsif ($self->{isEditor} eq 2)
+ {
+ $self->{curInfo}->{editor} = $origtext;
+ $self->{isEditor} = 0 ;
+ }
+ elsif ($self->{isPlatform} eq 2)
+ {
+ $origtext =~ s/Pc/PC/;
+ $self->{curInfo}->{platform} = $origtext;
+ $self->{isPlatform} = 0;
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ }
+ }
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+
+ return ;
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 1,
+ genre => 0,
+ released => 1
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isName} = 0;
+ $self->{isGame} = 0;
+ $self->{isPlatform} = 0 ;
+ $self->{isAnalyse} = 0;
+ $self->{isEditor} = 0;
+ $self->{isDeveloper} = 0;
+ $self->{isDate} = 0;
+ $self->{isGenre} = 0;
+ $self->{isScreen} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|<tpfsautdeligne>|gi;
+ $html =~ s|<br />|<tpfsautdeligne>|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ }
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ $word =~ s/\+/ /g;
+ return ('http://www.ludus.it/code/lista_alfabetica_giochi/LINGUA/IT', ["categoria" => "2", "SEARCH_STRING" => "$word"] );
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return 'Ludus';
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'IT';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['name'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCMobyGames.pm b/lib/gcstar/GCPlugins/GCgames/GCMobyGames.pm
new file mode 100644
index 0000000..c6650c3
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCMobyGames.pm
@@ -0,0 +1,541 @@
+package GCPlugins::GCgames::GCMobyGames;
+
+###################################################
+#
+# Copyright 2005-2011 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginMobyGames;
+
+ use base 'GCPlugins::GCgames::GCgamesPluginsBase';
+ use HTML::Entities;
+
+ sub extractTips
+ {
+ my ($self, $html_ini) = @_;
+ my $answer = "";
+ my @tmpAnswer = ();
+ my $html = $self->loadPage($html_ini, 0, 1);
+ $html =~ s|<pre>||gi;
+ $html =~ s|</pre>||gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ my $found = index($html,"class=\"sbL sbB sbT\">");
+ if ( $found >= 0 )
+ {
+ $answer = substr($html, $found + length("class=\"sbL sbB sbT\">"),length($html)- $found -length("class=\"sbL sbB sbT\">") );
+ $answer = substr($answer, 0, index($answer,"</td><td align="));
+
+ $tmpAnswer[0] = decode_entities($answer);
+
+ $found = index($html,"class=\"sbR sbL sbB\"><p>");
+ if ( $found >= 0 )
+ {
+ my $html2 = substr($html, $found + length("class=\"sbR sbL sbB\"><p>"),length($html)- $found -length("class=\"sbR sbL sbB\"><p>") );
+ $html2 = substr($html2, 0, index($html2,"</p>"));
+ $html2 =~ s/<br>/\n/gi;
+ $html2 =~ s|<p>|\n|gi;
+ $html2 =~ s|</p>||gi;
+
+ $tmpAnswer[1] = decode_entities($html2);
+ }
+
+ }
+
+ return @tmpAnswer;
+ }
+
+ sub extractPlayer
+ {
+ my ($self, $html_ini, $word) = @_;
+ my $html = 0;
+ my $found = index($html_ini,$word);
+ if ( $found >= 0 )
+ {
+ $html = substr($html_ini, $found + length($word),length($html_ini)- $found -length($word) );
+ $html = substr($html,0, index($html,"</a>") );
+ $html = reverse($html);
+ $html = substr($html,0, index($html,">") );
+ $html = reverse($html);
+ $html =~ s/&nbsp;/ /g;
+ $html =~ s/1 Player/1/;
+ }
+ return $html;
+ }
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingList})
+ {
+ if ( !$self->{insideSearchImage}
+ && ($tagname eq 'a')
+ && ( substr($attr->{href},0,6) eq '/game/' ) )
+ {
+ # Test if there is a platform name in it
+ # (i.e. if we can find a second slash after game/ )
+ if ($attr->{href} =~ m|/game/[^/]*/|)
+ {
+ if ($self->{currentName})
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = 'http://www.mobygames.com'.$attr->{href}.'';
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $self->{currentName};
+ $self->{isPlatform} = 1;
+ }
+ else
+ {
+ # This is a game we want to add
+ $self->{isGame} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = 'http://www.mobygames.com'.$attr->{href}.'';
+ $self->{isName} = 1 ;
+ }
+ }
+ else
+ {
+ # We will need the name later
+ $self->{isGameName} = 1;
+ }
+ }
+ elsif ( ($tagname eq 'a') && ( substr($attr->{href},0,7) eq '/search' ) )
+ {
+ $self->{isGame} = 0;
+ }
+ elsif ($tagname eq 'div')
+ {
+ if ($attr->{class} eq 'searchResult')
+ {
+ $self->{currentName} = '';
+ }
+ elsif ($attr->{class} eq 'searchImage')
+ {
+ $self->{insideSearchImage} = 1;
+ }
+ }
+ elsif ($tagname eq 'em')
+ {
+ $self->{isDate} = 1;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ if (($tagname eq 'table') && ($attr->{summary} eq 'List of Tips and Tricks'))
+ {
+ $self->{isSectionTips} = 2;
+ }
+ elsif ( ($tagname eq 'b') && ($self->{isSectionTips} eq '2') )
+ {
+ $self->{isSectionTips} = 1;
+ }
+ elsif ( ($tagname eq 'tr') && (($attr->{class} eq 'mb1') || ($attr->{class} eq 'mb2')) )
+ {
+ $self->{isTip} = 1 if ($self->{isTip} eq 2);
+ $self->{isCode} = 1 if ($self->{isCode} eq 2);
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isTip} eq 1))
+ {
+ my @tips = $self->extractTips('http://www.mobygames.com'.$attr->{href}.'');
+ if ($tips[0] =~ m/unlock/i)
+ {
+ $Text::Wrap::columns = 80;
+ $tips[1] = Text::Wrap::wrap('', '', $tips[1]);
+ #$self->{tmpCheatLine} = [];
+ #push @{$self->{tmpCheatLine}}, @tips;
+ push @{$self->{curInfo}->{unlockable}}, \@tips;
+ }
+ else
+ {
+ my $answer = $tips[0];
+ $answer .= "\n";
+ $answer .= $tips[1];
+ if ( ($self->{curInfo}->{secrets}) && ($answer ne "") )
+ {
+ $self->{curInfo}->{secrets} .= "\n\n\n"
+ }
+ $self->{curInfo}->{secrets} .= $answer;
+ }
+ $self->{isTip} = 2;
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isCode} eq 1))
+ {
+ my @tips = $self->extractTips('http://www.mobygames.com'.$attr->{href}.'');
+ @tips = reverse(@tips);
+ $Text::Wrap::columns = 80;
+ $tips[1] = Text::Wrap::wrap('', '', $tips[1]);
+ #$self->{tmpCheatLine} = [];
+ #push @{$self->{tmpCheatLine}}, @tips;
+ push @{$self->{curInfo}->{code}}, \@tips;
+
+ $self->{isCode} = 2;
+
+ }
+ elsif ($tagname eq 'br')
+ {
+ $self->{isTip} = 3;
+ $self->{isCode} = 3;
+ $self->{isSectionTips} = 0;
+ }
+ elsif ($tagname eq 'head')
+ {
+ $self->{isTip} = 0;
+ $self->{isCode} = 0;
+ $self->{isSectionTips} = 0;
+ }
+
+ }
+ else
+ {
+
+ if ($tagname eq 'div')
+ {
+ for ($attr->{id})
+ {
+ /^gameTitle$/ && ($self->{isName} = 1, last);
+ /^gamePlatform/ && ($self->{isPlatform} = 1, last);
+ #/^coreGameCover/ && ($self->{isBox} = 1, last);
+ /^coreGameRelease/ && ($self->{isEditor} = 1, last);
+ }
+
+ if ($attr->{class} =~ m/scoreBoxBig/)
+ {
+ $self->{isRating} = 1;
+ }
+
+ if ($self->{curInfo}->{genre})
+ {
+ $self->{isGenre} = 0;
+ }
+
+ $self->{isDescription} = 0;
+
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isName}) )
+ {
+ $self->{is} = 'name';
+ $self->{curInfo}->{exclusive} = 1;
+ $self->{isName} = 0;
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isPlatform}) )
+ {
+ $self->{is} = 'platform';
+ $self->{isPlatform} = 0;
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isEditor}) )
+ {
+ $self->{is} = 'editor';
+ $self->{isEditor} = 0;
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isDeveloper}) )
+ {
+ $self->{is} = 'developer';
+ $self->{isDeveloper} = 0;
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isDate}) )
+ {
+ $self->{is} = 'released';
+ $self->{isDate} = 0;
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isGenre}) )
+ {
+ $self->{is} = 'genre';
+ }
+ elsif ($tagname eq 'img')
+ {
+ if ($attr->{src} =~ m|covers/small|)
+ {
+ $attr->{src} =~ s|/small/|/large/|
+ if $self->{bigPics};
+ $self->{curInfo}->{boxpic} = $attr->{src};
+ # From here we try to get back cover
+ my $covers = $self->loadPage($self->{rootUrl}.'/cover-art', 0, 1);
+ $covers =~ m|<img alt=".*?Back Cover".*?src="([^"]*)"|;
+ $self->{curInfo}->{backpic} = $1;
+ $self->{curInfo}->{backpic} =~ s|/small/|/large/|
+ if $self->{bigPics};
+ }
+ }
+ elsif ($tagname eq 'html')
+ {
+ my $html = $self->loadPage($self->{curInfo}->{$self->{urlField}}.'/techinfo', 0, 1);
+ my $player_offline = $self->extractPlayer($html, "Number&nbsp;of Players: Offline" );
+ my $player_online = $self->extractPlayer($html, "Number&nbsp;of Players: Online" );
+ my $player_total = $self->extractPlayer($html, "Number&nbsp;of Players Supported" );
+
+ if ($player_total)
+ {
+ $self->{curInfo}->{players} = $player_total;
+ }
+ else
+ {
+ if ($player_offline)
+ {
+ $self->{curInfo}->{players} = 'Offline: '.$player_offline;
+ }
+ if ($player_online)
+ {
+ if ( $self->{curInfo}->{players} )
+ {
+ $self->{curInfo}->{players} .= '; Online: '.$player_online;
+ }
+ else
+ {
+ $self->{curInfo}->{players} = 'Online: '.$player_online;
+ }
+ }
+ }
+
+ $html = $self->loadPage($self->{curInfo}->{$self->{urlField}}.'/screenshots', 0, 1);
+ my $screen = 1;
+ while ($html =~ m|src="(/images/shots/[^"]*?)"|g)
+ {
+ $self->{curInfo}->{'screenshot'.$screen} = 'http://www.mobygames.com' . $1;
+ $self->{curInfo}->{'screenshot'.$screen} =~ s|/images/shots/s/|/images/shots/l/|
+ if $self->{bigPics};
+ $screen++;
+ last if $screen > 2;
+ }
+ }
+ elsif ( ($tagname eq 'br') && ($self->{isDescription}) )
+ {
+ $self->{curInfo}->{description} .= "\n";
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ if ($self->{parsingList} && ($tagname eq 'div'))
+ {
+ $self->{insideSearchImage} = 0;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isName})
+ {
+ #$self->{itemsList}[$self->{itemIdx}]->{name} = $origtext;
+ if ($origtext !~ /^Game:/)
+ {
+ if (!$self->{currentName})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $origtext;
+ }
+ $self->{isName} = 0;
+ }
+ }
+ elsif ($self->{isPlatform})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $origtext;
+ $self->{isPlatform} = 0;
+ }
+ elsif ($self->{isGameName})
+ {
+ $self->{currentName} = $origtext;
+ $self->{isGameName} = 0;
+ }
+ elsif ($self->{isDate})
+ {
+ # <em> tags enclose both dates and the 'a.k.a.' text, so make sure we
+ # ignore the aka ones
+ if ($origtext !~ /^a\.k\.a\./)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{released} = $origtext;
+ if (! $self->{itemsList}[$self->{itemIdx}]->{platform})
+ {
+ $self->{previous} =~ s/[\s\(]*$//g;
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $self->{previous};
+ }
+ }
+ $self->{isDate} = 0;
+ }
+ $self->{previous} = $origtext;
+ }
+ elsif ($self->{parsingTips})
+ {
+ if ($self->{isSectionTips} eq 1)
+ {
+ if ($origtext =~ m/General Hints\/Tips/i)
+ {
+ $self->{isTip} = 2;
+ $self->{isCode} = 0;
+ }
+ elsif ($origtext =~ m/Cheats\/Codes/i)
+ {
+ $self->{isTip} = 0;
+ $self->{isCode} = 2;
+ }
+ $self->{isSectionTips} = 2;
+ }
+ }
+ else
+ {
+ if ($self->{is})
+ {
+ $origtext =~ s/^\s*//;
+
+ if ($self->{is} eq 'platform')
+ {
+ $self->{curInfo}->{$self->{is}} = $origtext;
+ $self->{curInfo}->{platform} =~ s/DOS/PC/;
+ $self->{curInfo}->{platform} =~ s/Windows/PC/;
+ }
+ elsif ($self->{is} eq 'genre')
+ {
+ push @{$self->{curInfo}->{genre}}, [ $origtext ];
+ }
+ else
+ {
+ $self->{curInfo}->{$self->{is}} = $origtext;
+ }
+
+ $self->{is} = '';
+ }
+ elsif ($self->{isRating})
+ {
+ $self->{curInfo}->{ratingpress} = int($origtext/10+0.5);
+ $self->{isRating} = 0;
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ }
+ elsif ($origtext eq 'Developed by')
+ {
+ $self->{isDeveloper} = 1
+ }
+ elsif ( ($origtext eq 'Also For') || (($origtext eq 'Platforms')))
+ {
+ $self->{curInfo}->{exclusive} = 0;
+ }
+ elsif ($origtext eq 'Released')
+ {
+ $self->{isDate} = 1
+ }
+ elsif ($origtext eq 'Genre')
+ {
+ $self->{isGenre} = 1
+ }
+ elsif ($origtext eq 'Description')
+ {
+ $self->{isDescription} = 1
+ }
+ }
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+ my $url = $self->{curInfo}->{$self->{urlField}}.'/hints';
+ $url =~ s/##MobyGames//;
+ return $url;
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 1,
+ released => 1
+ };
+
+ $self->{isName} = 0;
+ $self->{isGame} = 0;
+ $self->{isGameName} = 0;
+ $self->{isPlatform} = 0;
+ $self->{isEditor} = 0;
+ $self->{isDeveloper} = 0;
+ $self->{isDate} = 0;
+ $self->{isGenre} = 0;
+ $self->{isDescription} = 0;
+ $self->{isBox} = 0;
+ $self->{isSectionTips} = 0;
+ $self->{isTip} = 0;
+ $self->{isCode} = 0;
+ $self->{is} = '';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ $self->{rootUrl} = $self->{loadedUrl};
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return 'http://www.mobygames.com/search/quick?q='.$word.'&p=-1&search=Go&sFilter=1&sG=on';
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.mobygames.com/';
+ }
+
+ sub getName
+ {
+ return 'MobyGames';
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCNextGame.pm b/lib/gcstar/GCPlugins/GCgames/GCNextGame.pm
new file mode 100644
index 0000000..b884b54
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCNextGame.pm
@@ -0,0 +1,480 @@
+package GCPlugins::GCgames::GCNextGame;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginNextGame;
+
+ use base 'GCPlugins::GCgames::GCgamesPluginsBase';
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isGenre} eq '1')
+ {
+ $self->{isGenre} = 2 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'box_searchresult'))
+ {
+ $self->{isGame} = 1 ;
+ $self->{itemIdx}++;
+ }
+ elsif (($tagname eq 'ul') && ($attr->{class} eq 'platforms'))
+ {
+ $self->{isPlatform} = 1 ;
+ }
+ elsif (($tagname eq 'li') && ($self->{isPlatform} eq 1))
+ {
+ $self->{isPlatform} = 2 ;
+ }
+ elsif (($tagname eq 'hr') && ($attr->{class} eq 'clear'))
+ {
+ $self->{isPlatform} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{class} eq 'blu'))
+ {
+ return if $self->{alreadyRetrieved}->{$attr->{href}};
+ $self->{alreadyRetrieved}->{$attr->{href}} = 1;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isName} = 1 ;
+ }
+ elsif (($tagname eq 'dt') && ($self->{isGame} eq '1'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+
+ if ($self->{isDeveloper} eq 1)
+ {
+ $self->{isDeveloper} = 2;
+ }
+ elsif ($self->{isGenre} eq 1)
+ {
+ $self->{isGenre} = 2;
+ }
+ elsif ($self->{isEditor} eq 1)
+ {
+ $self->{isEditor} = 2 ;
+ }
+ elsif ($self->{isDate} eq 1)
+ {
+ $self->{isDate} = 2 ;
+ }
+ elsif ($self->{isPlayer} eq 1)
+ {
+ $self->{isPlayer} = 2;
+ }
+ elsif ($self->{isPlatform} eq 1)
+ {
+ $self->{isPlatform} = 2;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'box_liquid'))
+ {
+ $self->{isDescription} = 0 ;
+ }
+ elsif ($tagname eq 'head')
+ {
+ $self->{isDescription} = 0 ;
+ }
+ elsif (($tagname eq 'h1') && ($attr->{class} eq 'blu'))
+ {
+ $self->{isName} = 1 ;
+ }
+ elsif (($tagname eq 'hr') && ($attr->{class} eq 'clear'))
+ {
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif (($tagname eq 'dl') && ($attr->{class} eq 'datasheet_column'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'dt') && ($self->{isAnalyse} eq '1'))
+ {
+ $self->{isAnalyse} = 2 ;
+ }
+ elsif (($tagname eq 'td') && ($attr->{class} eq 'active current'))
+ {
+ $self->{isPlatform} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{id} eq 'datasheet_packshot'))
+ {
+ $self->{curInfo}->{boxpic} = $attr->{src};
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{boxpic} =~ s|.T160.|.|gi;
+ }
+ }
+ elsif ( ($tagname eq 'img') && ($attr->{class} eq 'thumb') )
+ {
+ if ($self->{curInfo}->{screenshot1} eq '')
+ {
+ $self->{curInfo}->{screenshot1} = $attr->{src};
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{screenshot1} =~ s|.T200.|.|gi;
+ }
+ }
+ elsif ($self->{curInfo}->{screenshot2} eq '')
+ {
+ $self->{curInfo}->{screenshot2} = $attr->{src};
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{screenshot2} =~ s|.T200.|.|gi;
+ }
+ }
+ }
+ elsif (($tagname eq 'a') && ($attr->{name} eq 'REVIEW'))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif (($tagname eq 'ul') && ($attr->{class} eq 'platforms') && ($self->{isDescription} eq 1))
+ {
+ $self->{isDescription} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{class} eq 'blu') && ($self->{isDescription} eq 3))
+ {
+ my $html = $self->loadPage( $attr->{href}, 0, 1 );
+ $html =~ s|&amp;|&|gi;
+ my $found = index($html,"<div class=\"testo edit_inline_box\" id=\"id_text\">");
+ if ( $found >= 0 )
+ {
+ $html = "<>" . substr($html, $found +length('<div class="testo edit_inline_box" id="id_text">'),length($html)- $found -length('<div class="testo edit_inline_box" id="id_text">'));
+
+ $found = index($html,"<div class=\"byline\">");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, 0, $found);
+ }
+
+ my @array = split(/</,$html);
+ my $element;
+
+ foreach $element (@array)
+ {
+ $found = index($element,">");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{description} .= substr($element, $found +length('>'),length($element)- $found -length('>'));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isName})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $origtext;
+ $self->{isName} = 0;
+ }
+ elsif ($self->{isPlatform} eq 2)
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+
+ if (($self->{itemsList}[$self->{itemIdx}]->{platform} eq '') && ($origtext ne ''))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $origtext;
+ }
+ elsif ($origtext ne '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{platform} .= ', ';
+ $self->{itemsList}[$self->{itemIdx}]->{platform} .= $origtext;
+ }
+
+ $self->{isPlatform} = 1 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isGenre} = 1 if ($origtext =~ m/Genere/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isGenre} eq 2)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{genre} = $origtext;
+
+ my @array = split(/,/,$self->{itemsList}[$self->{itemIdx}]->{platform});
+ my $element;
+
+ my $SaveName = $self->{itemsList}[$self->{itemIdx}]->{name};
+ my $SaveUrl = $self->{itemsList}[$self->{itemIdx}]->{url};
+ my $SaveGenre = $self->{itemsList}[$self->{itemIdx}]->{genre};
+ $self->{itemIdx}--;
+
+ if ($SaveName ne "")
+ {
+ foreach $element (@array)
+ {
+ # Enleve les blancs en debut de chaine
+ $element =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $element =~ s/\s+$//;
+
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $SaveName;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $SaveUrl . $element .'/';
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $element;
+ $self->{itemsList}[$self->{itemIdx}]->{genre} = $SaveGenre;
+ }
+ }
+ else
+ {
+ $self->{itemIdx}++;
+ delete $self->{itemsList}[$self->{itemIdx}];
+ $self->{itemIdx}--;
+ }
+
+ $self->{isGenre} = 0;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ if ($self->{isName})
+ {
+ $self->{curInfo}->{name} = $origtext;
+ $self->{isName} = 0 ;
+
+ if ($self->{ean} ne '')
+ {
+ $self->{curInfo}->{ean} = $self->{ean};
+ }
+
+ }
+ elsif ($self->{isPlatform} eq 2)
+ {
+ $self->{curInfo}->{platform} = $origtext;
+ $self->{isPlatform} = 0;
+ }
+ elsif ($self->{isAnalyse} eq 2)
+ {
+ $self->{isEditor} = 1 if ($origtext =~ m/Produttore/i);
+ $self->{isDeveloper} = 1 if ($origtext =~ m/Sviluppatore/i);
+ $self->{isGenre} = 1 if ($origtext =~ m/Genere/i);
+ $self->{isDate} = 1 if ($origtext =~ m/Disponibile/i);
+ $self->{isPlayer} = 1 if ($origtext =~ m/Giocatori/i);
+
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif ($self->{isDeveloper} eq 2)
+ {
+ $self->{curInfo}->{developer} = $origtext;
+ $self->{isDeveloper} = 0;
+ }
+ elsif ($self->{isGenre} eq 2)
+ {
+ $self->{curInfo}->{genre} = $origtext;
+ $self->{isGenre} = 0;
+ }
+ elsif ($self->{isEditor} eq 2)
+ {
+ $self->{curInfo}->{editor} = $origtext;
+ $self->{isEditor} = 0 ;
+ }
+ elsif ($self->{isDate} eq 2)
+ {
+ $self->{curInfo}->{released} = $origtext;
+ $self->{isDate} = 0 ;
+ }
+ elsif ($self->{isPlayer} eq 2)
+ {
+ $self->{curInfo}->{players} = $origtext;
+ $self->{isPlayer} = 0 ;
+ }
+ elsif ($self->{isDescription} eq 2)
+ {
+ if ($origtext =~ m/$self->{curInfo}->{platform}/i)
+ {
+ $self->{isDescription} = 3;
+ }
+ else
+ {
+ $self->{isDescription} = 1;
+ }
+ }
+
+ }
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+
+ return ;
+
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 1,
+ genre => 1,
+ released => 0
+ };
+
+ $self->{isName} = 0;
+ $self->{isGame} = 0;
+ $self->{isPlatform} = 0;
+ $self->{isAnalyse} = 0 ;
+ $self->{isGenre} = 0;
+ $self->{isEditor} = 0;
+ $self->{isDeveloper} = 0;
+ $self->{isDate} = 0;
+ $self->{isPlayer} = 0;
+ $self->{isDescription} = 0;
+ $self->{ean} = '';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s|</li><li>|<ul class="platforms">|gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#156;|oe|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+ }
+ $self->{alreadyRetrieved} = {};
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'ean')
+ {
+ $self->{ean} = $word;
+ }
+ else
+ {
+ $self->{ean} = '';
+ }
+
+ return 'http://next.videogame.it/magazine/review/?name='.$word;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://next.videogame.it/';
+ }
+
+ sub getName
+ {
+ return 'NextGame';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-1";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'IT';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['name'];
+ }
+
+ sub getDefaultPictureSuffix
+ {
+ return '.jpg';
+ }
+}
+
+1;
+
diff --git a/lib/gcstar/GCPlugins/GCgames/GCTheLegacy.pm b/lib/gcstar/GCPlugins/GCgames/GCTheLegacy.pm
new file mode 100644
index 0000000..c0759a4
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCTheLegacy.pm
@@ -0,0 +1,316 @@
+package GCPlugins::GCgames::GCTheLegacy;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginTheLegacy;
+
+ use base 'GCPlugins::GCgames::GCgamesPluginsBase';
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'a') && ( $attr->{class} eq 'aa' ))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.thelegacy.de/Museum/" . $attr->{href};
+ $self->{isName} = 1 ;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ if (($tagname eq 'div') && ($attr->{style} eq 'font-size:14pt; color:#990000; padding-top:0.5em;'))
+ {
+ $self->{isName} = 1 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'description') && ($self->{curInfo}->{platform} eq ''))
+ {
+ $self->{isPlatform} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{target} eq 'ListGames') && ($attr->{class} eq 'a') && ($attr->{style} eq ''))
+ {
+ $self->{isGenre} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{src} =~ m|/pics/cover/Thumb|i))
+ {
+ $self->{curInfo}->{boxpic} = "http://www.thelegacy.de" . $attr->{src};
+ }
+ elsif (($tagname eq 'img') && ($attr->{src} =~ m|/pics/backcover/Thumb|i))
+ {
+ $self->{curInfo}->{backpic} = "http://www.thelegacy.de" . $attr->{src};
+ }
+ elsif (($tagname eq 'img') && ($attr->{src} =~ m|/pics/screen|i))
+ {
+ if ($self->{curInfo}->{screenshot1} eq '')
+ {
+ $self->{curInfo}->{screenshot1} = "http://www.thelegacy.de" . $attr->{src};
+ }
+ elsif ($self->{curInfo}->{screenshot2} eq '')
+ {
+ $self->{curInfo}->{screenshot2} = "http://www.thelegacy.de" . $attr->{src};
+ }
+ }
+ elsif ( (($tagname eq 'span') ||($tagname eq 'div')) && ($attr->{class} eq 'category'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($self->{isEditor} eq 1) && ($tagname eq 'a') && ($attr->{target} eq 'ListGames') && ($attr->{class} eq 'aa') && ($self->{curInfo}->{editor} eq ''))
+ {
+ $self->{isEditor} = 2 ;
+ }
+ elsif (($self->{isDeveloper} eq 1) && ($tagname eq 'a') && ($attr->{target} eq 'ListGames') && ($attr->{class} eq 'aa') && ($self->{curInfo}->{developer} eq ''))
+ {
+ $self->{isDeveloper} = 2 ;
+ }
+ elsif (($self->{isDate} eq 1) && ($tagname eq 'div') && ($attr->{class} eq 'description') && ($self->{curInfo}->{released} eq ''))
+ {
+ $self->{isDate} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{name} =~ m|review_|i))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif (($self->{isDescription} eq 1) && ($tagname eq 'a') && ($attr->{class} eq 'aa'))
+ {
+ $self->{isDescription} = 2 ;
+ }
+ elsif (($tagname eq 'span') && ( $attr->{id} =~ m|review_|i) && ( $attr->{id} =~ m|_less|i))
+ {
+ $self->{isDescription} = 0 ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+ if ($self->{isName})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $origtext;
+ $self->{isName} = 0;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+ if ($self->{isName})
+ {
+ $self->{curInfo}->{name} = $origtext;
+ $self->{isName} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isDate} = 0;
+ $self->{isDeveloper} = 0;
+ $self->{isEditor} = 0;
+
+ $self->{isDate} = 1 if ($origtext =~ m/ffentlichung/i);
+ $self->{isDate} = 1 if ($origtext =~ m/Publishing/i);
+ $self->{isDeveloper} = 1 if ($origtext =~ m/Entwickler/i);
+ $self->{isDeveloper} = 1 if ($origtext =~ m/developer/i);
+ $self->{isEditor} = 1 if ($origtext =~ m/Publisher/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isDate} eq 2)
+ {
+ $origtext =~ s/://;
+ $self->{curInfo}->{released} = $origtext;
+ $self->{isDate} = 0 ;
+ }
+ elsif ($self->{isGenre})
+ {
+ $self->{curInfo}->{genre} .= $origtext;
+ $self->{curInfo}->{genre} .= ",";
+ $self->{isGenre} = 0;
+ }
+ elsif ($self->{isDeveloper} eq 2)
+ {
+ $self->{curInfo}->{developer} = $origtext;
+ $self->{isDeveloper} = 0 ;
+ }
+ elsif ($self->{isEditor} eq 2)
+ {
+ $self->{curInfo}->{editor} = $origtext;
+ $self->{isEditor} = 0 ;
+ }
+ elsif ($self->{isPlatform})
+ {
+ $origtext =~ s/PC \(Windows\)/PC/;
+ my @array = split(/-/,$origtext);
+ $self->{curInfo}->{platform} = $array[0];
+ # Enleve les blancs en fin de chaine
+ $self->{curInfo}->{platform} =~ s/\s+$//;
+ $self->{isPlatform} = 0;
+ }
+ elsif ($self->{isDescription} eq 1)
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ }
+ elsif ($self->{isDescription} eq 2)
+ {
+ $self->{isDescription} = 1;
+ }
+ }
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+
+ return ;
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 0,
+ genre => 0,
+ released => 0
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isName} = 0;
+ $self->{isPlatform} = 0 ;
+ $self->{isAnalyse} = 0;
+ $self->{isEditor} = 0;
+ $self->{isDeveloper} = 0;
+ $self->{isDate} = 0;
+ $self->{isGenre} = 0;
+ $self->{isDescription} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#156;|oe|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+ }
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.thelegacy.de/Museum/SQLlist_games.php3?logicalSearchConnection[]=AND&SearchValue=" . $word. "&searchEntity=TITLE&Review=&Forum=&type=&changed=&TopTen=&titel_id=&game_id=&titel=&first_letter=&misc=yes&quick=yes";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return 'TheLegacy';
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'DE';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-15";
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['name'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCgamesAmazonCommon.pm b/lib/gcstar/GCPlugins/GCgames/GCgamesAmazonCommon.pm
new file mode 100644
index 0000000..ce3b52c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCgamesAmazonCommon.pm
@@ -0,0 +1,314 @@
+package GCPlugins::GCgames::GCgamesAmazonCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+use GCPlugins::GCstar::GCAmazonCommon;
+
+{
+ package GCPlugins::GCgames::GCgamesAmazonPluginsBase;
+
+ use base ('GCPlugins::GCgames::GCgamesPluginsBase', 'GCPlugins::GCstar::GCPluginAmazonCommon');
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ( ($tagname eq 'div') && ($attr->{class} eq 'buying') && ($self->{isGame} ne 2) )
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{loadedUrl};
+ $self->{isGame} = 2 ;
+ }
+ elsif ( ($tagname eq 'h1') && ($attr->{class} eq 'headerblocktitle') && ($self->{isGame} ne 2) )
+ {
+ $self->{isGame} = 1 ;
+ $self->{isUrl} = 1 ;
+ }
+ elsif ( ($tagname eq 'td') && ($attr->{class} eq 'imageColumn') && ($self->{isGame} ne 2) )
+ {
+ $self->{isGame} = 1 ;
+ $self->{isUrl} = 1 ;
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isGame} eq 1) && ($self->{isUrl}) )
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isUrl} = 0 ;
+ }
+ elsif ( ($tagname eq 'span') && ($attr->{class} eq 'srTitle') && ($self->{isGame} eq 1) )
+ {
+ $self->{isName} = 1 ;
+ }
+ elsif ( ($tagname eq 'span') && ($attr->{class} eq 'binding') && ($self->{isGame} eq 1) )
+ {
+ $self->{isPlatform} = 1 ;
+ }
+ elsif ( ($tagname eq 'span') && ($attr->{class} eq 'avail') )
+ {
+ $self->{isGame} = 0 ;
+ }
+ elsif ( ($tagname eq 'div') && ($attr->{class} eq 'usedPrice') )
+ {
+ $self->{isGame} = 0 ;
+ }
+ elsif ( ($tagname eq 'input') && ($attr->{name} eq 'sdp-sai-asin') )
+ {
+ $self->{isCodeEAN} = 1 ;
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isCodeEAN}))
+ {
+ $self->{SaveUrl} = $attr->{href};
+ $self->{isCodeEAN} = 0 ;
+ }
+ elsif ( ($tagname eq 'b') && ($attr->{class} eq 'sans') )
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{SaveUrl};
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+
+ if ( ($tagname eq 'meta') && ($attr->{name} eq 'keywords') )
+ {
+ my ($name, $editor, @genre) = split(/,/,$attr->{content});
+ $self->{curInfo}->{name} = $name;
+ $self->{curInfo}->{editor} = $editor;
+ my $element;
+ foreach $element (@genre)
+ {
+ $element =~ s/^\s+//;
+ if ( !($element =~ m/console/i) && !($element =~ m/cartouche/i) && !($element =~ m/video games/i) && !($element =~ /([0-9])/))
+ {
+ $self->{curInfo}->{genre} .= $element;
+ $self->{curInfo}->{genre} .= ",";
+ }
+ }
+
+ # Sur Amazon.com et amazon.co.jp je n ai pas reussi a trouver un critere pertinent pour la recherche des genres
+ if (($self->{suffix} eq 'com') || ($self->{suffix} eq 'co.jp') )
+ {
+ $self->{curInfo}->{genre} = '';
+ }
+
+ if ($self->{ean} ne '')
+ {
+ $self->{curInfo}->{ean} = $self->{ean};
+ }
+ }
+ elsif ($tagname eq 'tpfdateparution')
+ {
+ $self->{isDate} = 1 ;
+ }
+ elsif ($tagname eq 'tpfplateforme')
+ {
+ $self->{isPlatform} = 1 ;
+ }
+ elsif ($tagname eq 'tpfcouverture')
+ {
+ $self->{curInfo}->{boxpic} = $self->extractImage($attr);
+ }
+ elsif ($tagname eq 'tpfscreenshot1')
+ {
+ $self->{curInfo}->{screenshot1} = $self->extractImage($attr);
+ }
+ elsif ($tagname eq 'tpfscreenshot2')
+ {
+ $self->{curInfo}->{screenshot2} = $self->extractImage($attr);
+ }
+ elsif (($tagname eq 'tpfdescription') )
+ {
+ $self->{isDesc} = 1;
+ }
+ elsif ( ($tagname eq 'div') && ($attr->{class} eq 'bucket') && ($self->{isDesc} eq 1))
+ {
+ $self->{isDesc} = 0;
+ }
+
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isPlatform})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $self->transformPlatform($origtext);
+ $self->{isPlatform} = 0;
+ }
+ elsif ($self->{isName})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $origtext;
+ $self->{isName} = 0;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+
+ if ($self->{isDate})
+ {
+ $self->{curInfo}->{released} = $origtext;
+ $self->{isDate} = 0;
+ }
+ elsif ($self->{isPlatform})
+ {
+ if ($origtext ne '' )
+ {
+ $self->{curInfo}->{platform} = $self->transformPlatform($origtext);
+ $self->{isPlatform} = 0;
+ }
+ }
+ elsif (($self->{isDesc}) && ($origtext ne ""))
+ {
+ $self->{curInfo}->{description} .= $origtext ."\n";
+ }
+ }
+ }
+
+ sub transformPlatform
+ {
+ my ($self, $platform) = @_;
+
+ $platform =~ s/^([\w ]*)\W{2}.*$/$1/ms;
+ $platform =~ s/SONY //i;
+ if ($platform =~ m/windows/i)
+ {
+ $platform = 'PC';
+ }
+ return $platform;
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+
+ return;
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 1
+ };
+
+ $self->{isCodeEAN} = 0;
+ $self->{SaveUrl} = '';
+ $self->{isName} = 0;
+ $self->{isGame} = 0;
+ $self->{isUrl} = 0;
+ $self->{isPlatform} = 0;
+ $self->{isDate} = 0;
+ $self->{isDesc} = 0;
+ $self->{ean} = '';
+
+ return $self;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'ean')
+ {
+ $self->{ean} = $word;
+ return "http://s1.amazon." . $self->{suffix} . "/exec/varzea/sdp/sai-condition/" . $word;
+ }
+ else
+ {
+ $self->{ean} = '';
+ }
+
+ return 'http://www.amazon.' . $self->{suffix} . '/gp/search/?redirect=true&search-alias=videogames&keywords=' .$word;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.amazon.' . $self->{suffix};
+ }
+
+ sub getName
+ {
+ return 'Amazon';
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['ean', 'name'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCgamesCommon.pm b/lib/gcstar/GCPlugins/GCgames/GCgamesCommon.pm
new file mode 100644
index 0000000..9403652
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCgamesCommon.pm
@@ -0,0 +1,87 @@
+package GCPlugins::GCgames::GCgamesCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+our $MAX_ACTORS = 6;
+our $MAX_DIRECTORS = 4;
+
+use GCPlugins::GCPluginsBase;
+
+{
+ package GCPlugins::GCgames::GCgamesPluginsBase;
+
+ use base qw(GCPluginParser);
+ use HTML::Entities;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['name'];
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+
+ return '';
+ }
+
+ sub getTips
+ {
+ my $self = shift;
+ my $url = $self->getTipsUrl;
+ if ($url)
+ {
+ $self->{parsingTips} = 1;
+ my $html = $self->loadPage($url, 0, 1);
+ $html = $self->preProcess($html);
+ decode_entities($html);
+ $self->{inside} = undef;
+ $self->parse($html);
+ $self->{parsingTips} = 0;
+ }
+ }
+
+ sub getItemInfo
+ {
+ my $self = shift;
+
+ $self->SUPER::getItemInfo;
+ $self->getTips;
+
+ return $self->{curInfo};
+ }
+
+}
+
+1; \ No newline at end of file
diff --git a/lib/gcstar/GCPlugins/GCmusics/GCDiscogs.pm b/lib/gcstar/GCPlugins/GCmusics/GCDiscogs.pm
new file mode 100644
index 0000000..c6e0c87
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCmusics/GCDiscogs.pm
@@ -0,0 +1,333 @@
+package GCPlugins::GCmusics::GCDiscogs;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCmusics::GCmusicsCommon;
+
+{
+ package GCPlugins::GCmusics::GCPluginDiscogs;
+
+ use base 'GCPlugins::GCmusics::GCmusicsPluginsBase';
+ use XML::Simple;
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if $page =~ /^<!DOCTYPE html/;
+ my $xml;
+ my $xs = XML::Simple->new;
+ my $key = $self->{searchField};
+ if ($self->{parsingList})
+ {
+ if ( $key eq 'artist' )
+ {
+ $xml = $xs->XMLin($page);
+ my $artist = $xml -> {'artist'} -> {'name'};
+ my $release;
+ foreach $release ( keys( %{ $xml -> {'artist'} -> {'releases'} -> {'release'} } ) )
+ {
+ $self->{itemIdx}++;
+ my $title = $xml -> {'artist'} -> {'releases'} -> {'release'} -> {$release} -> {'title'};
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://api.discogs.com/release/".$release."?f=xml&api_key=e8f5ae8ba2";
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $title;
+ # Enleve les blancs en debut de chaine
+ $self->{itemsList}[$self->{itemIdx}]->{title} =~ s/^\s+//;
+
+ $self->{itemsList}[$self->{itemIdx}]->{artist} = $artist;
+ # Enleve les blancs en fin de chaine
+ $self->{itemsList}[$self->{itemIdx}]->{artist} =~ s/\s+$//;
+ }
+ }
+ elsif ( $key eq 'label' )
+ {
+ $xml = $xs->XMLin($page);
+ my $release;
+ foreach $release ( keys( %{ $xml -> {'label'} -> {'releases'} -> {'release'} } ) )
+ {
+ $self->{itemIdx}++;
+ my $title = $xml -> {'label'} -> {'releases'} -> {'release'} -> {$release} -> {'title'};
+ my $artist = $xml -> {'label'} -> {'releases'} -> {'release'} -> {$release} -> {'artist'};
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://api.discogs.com/release/".$release."?f=xml&api_key=e8f5ae8ba2";
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $title;
+ # Enleve les blancs en debut de chaine
+ $self->{itemsList}[$self->{itemIdx}]->{title} =~ s/^\s+//;
+
+ $self->{itemsList}[$self->{itemIdx}]->{artist} = $artist;
+ # Enleve les blancs en fin de chaine
+ $self->{itemsList}[$self->{itemIdx}]->{artist} =~ s/\s+$//;
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin($page,
+ ForceArray => ['result', 'event'],
+ KeyAttr => {'release' => ''});
+ my $release;
+ foreach $release ( @{ $xml->{'searchresults'}->{result} } )
+ {
+ if ($release->{type} eq 'release')
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $release->{uri};
+ $self->{itemsList}[$self->{itemIdx}]->{release} = $release->{summary};
+
+ my $found = index($release->{title},"-");
+ if ( $found >= 0 )
+ {
+
+ $self->{itemsList}[$self->{itemIdx}]->{title} = substr($release->{title}, $found +length('-'),length($release->{title})- $found -length('-'));
+ # Enleve les blancs en debut de chaine
+ $self->{itemsList}[$self->{itemIdx}]->{title} =~ s/^\s+//;
+
+ $self->{itemsList}[$self->{itemIdx}]->{artist} = substr($release->{title}, 0, $found);
+ # Enleve les blancs en fin de chaine
+ $self->{itemsList}[$self->{itemIdx}]->{artist} =~ s/\s+$//;
+
+ # Clean up release summary
+ my $tmpTitle = $release->{title};
+ $tmpTitle =~ s/\- //;
+
+ # Unsure about this line, seems to not be required anymore, and is breaking parsing
+ # of search results. EG - searching for "raw animals"
+ # $self->{itemsList}[$self->{itemIdx}]->{release} =~ s/^$tmpTitle //;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $release->{title};
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin($page,
+ ForceArray => ['track', 'artist', 'image', 'label', 'genre', 'format'],
+ KeyAttr => {'track' => ''});
+ $self->{curInfo}->{title} = $xml->{release}->{title};
+ $self->{curInfo}->{artist} = '';
+ for my $art (@{$xml->{release}->{artists}->{artist}})
+ {
+ $self->{curInfo}->{artist} .= $art->{name}.', ';
+ }
+ $self->{curInfo}->{artist} =~ s/, $//;
+ $self->{curInfo}->{producer} = '';
+ $self->{curInfo}->{composer} = '';
+ for my $rel (@{$xml->{release}->{extraartists}->{artist}})
+ {
+ $self->{curInfo}->{producer} .= $rel->{name}.', '
+ if $rel->{role} eq 'Producer';
+ $self->{curInfo}->{composer} .= $rel->{name}.', '
+ if (($rel->{role} eq 'Composed By') || ($rel->{role} eq 'Score') || ($rel->{role} eq 'Songwriter') || ($rel->{role} eq 'Written-By'));
+ }
+ $self->{curInfo}->{producer} =~ s/, $//;
+ $self->{curInfo}->{composer} =~ s/, $//;
+ $self->{curInfo}->{release} = $xml->{release}->{released};
+ for my $track(@{$xml->{release}->{'tracklist'}->{track}})
+ {
+ my $duree = $track->{duration};
+ $duree =~ /([0-9]+):([0-9]+)/;
+ my $duree2 = int($1*60 + $2);
+ my $position = "";
+ # Sometimes the position is missing, which causes it to be an array
+ if (!ref($track->{position}))
+ {
+ $position = $track->{position};
+ }
+ $self->addTrack($track->{title}, $duree2, $position);
+ }
+ $self->{curInfo}->{tracks} = $self->getTracks;
+ $self->{curInfo}->{running} = $self->getTotalTime;
+ for my $cover(@{$xml->{release}->{images}->{image}})
+ {
+ if ($self->{curInfo}->{cover} eq '')
+ {
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{cover} = $cover->{uri};
+ }
+ else
+ {
+ $self->{curInfo}->{cover} = $cover->{uri};
+ # Change to small res cover
+ $self->{curInfo}->{cover} =~ s/image\/R-/image\/R-150-/;
+ }
+ }
+
+ }
+ $self->{curInfo}->{label} = '';
+ for my $label (@{$xml->{release}->{labels}->{label}})
+ {
+ $self->{curInfo}->{label} .= $label->{name}.', ';
+ }
+ $self->{curInfo}->{label} =~ s/, $//;
+ $self->{curInfo}->{genre} = '';
+ for my $genre (@{$xml->{release}->{genres}->{genre}})
+ {
+ $self->{curInfo}->{genre} .= $genre.',';
+ }
+ $self->{curInfo}->{genre} =~ s/,$//;
+ $self->{curInfo}->{origin} = $xml->{release}->{country};
+ $self->{curInfo}->{origin} =~ s/,$//;
+ for my $format(@{$xml->{release}->{formats}->{format}})
+ {
+ if ( $self->{curInfo}->{format} eq '')
+ {
+ $self->{curInfo}->{format} = $format->{name};
+ $self->{curInfo}->{format} =~ s/,$//;
+ }
+ }
+ $self->{curInfo}->{web} = 'http://www.discogs.com/release/' . $xml->{release}->{id};
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ artist => 1,
+ release => 1
+ };
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ my $key = $self->{searchField};
+ my $url;
+ if ( $key eq 'title' )
+ {
+ $url = "http://api.discogs.com/search?type=all&q=". $word ."&f=xml&api_key=e8f5ae8ba2";
+ }
+ elsif ( $key eq 'artist' )
+ {
+ $url = "http://api.discogs.com/". $key ."/". $word ."?f=xml&api_key=e8f5ae8ba2";
+ }
+ elsif ( $key eq 'label' )
+ {
+ $url = "http://api.discogs.com/". $key ."/". $word ."?f=xml&api_key=e8f5ae8ba2";
+ }
+
+ return $url;
+# return "http://api.discogs.com/search?type=all&q=". $word ."&f=xml&api_key=e8f5ae8ba2";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ if (!$url)
+ {
+ # If we're not passed a url, return a hint so that gcstar knows what type
+ # of addresses this plugin handles
+ $url = "http://www.discogs.com";
+ }
+ elsif (index($url,"api_key") < 0)
+ {
+ # Url isn't for the discogs api, so we need to find the release id
+ # and return a url corresponding to the api page for this release
+ $url =~ /release\/([0-9]+)/;
+ my $id = $1;
+ $url = "http://api.discogs.com/release/". $id ."?f=xml&api_key=e8f5ae8ba2";
+ }
+ return $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $self->getItemUrl($url);
+ }
+
+ sub getName
+ {
+ return 'Discogs';
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+ sub getNotConverted
+ {
+ my $self = shift;
+ return [];
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['title', 'artist', 'label'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCmusics/GCDoubanmusic.pm b/lib/gcstar/GCPlugins/GCmusics/GCDoubanmusic.pm
new file mode 100644
index 0000000..b2d7873
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCmusics/GCDoubanmusic.pm
@@ -0,0 +1,238 @@
+package GCPlugins::GCmusics::GCDoubanmusic;
+
+###################################################
+#
+# Copyright 2005-2010 Bai Wensimi
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCmusics::GCmusicsCommon;
+
+{
+ package GCPlugins::GCmusics::GCPluginDoubanmusic;
+
+ use base qw(GCPlugins::GCmusics::GCmusicsPluginsBase);
+ use XML::Simple;
+ use Encode;
+ use LWP::Simple qw($ua);
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if (($page =~ /^bad isbn/) & ($page =~ /^The/));
+ my $xml;
+ my $xs = XML::Simple->new;
+
+ if ($self->{parsingList})
+ {
+ if ($page =~ /feed>$/)
+ {
+ $xml = $xs->XMLin(
+ $page,
+ forceArray=>['author'],
+ KeyAttr => ['']
+ );
+ foreach my $ItemMusic ( @{$xml->{'entry'}}){
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{'url'} = $ItemMusic->{'id'};
+ $self->{itemsList}[ $self->{itemIdx} ]->{'title'} = $ItemMusic->{'title'};
+ foreach my $tmp_author (@{$ItemMusic->{'author'}}){
+ {($self->{itemsList}[ $self->{itemIdx} ]->{'artist'} ne '' ) and $self->{itemsList}[ $self->{itemIdx} ]->{'artist'}.=',';}
+ $self->{itemsList}[ $self->{itemIdx} ]->{'artist'}.=$tmp_author->{'name'};
+ }
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin(
+ $page,
+ forceArray=>['author'],
+ KeyAttr => ['']
+ );
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{'url'} = $xml->{'id'};
+ $self->{itemsList}[ $self->{itemIdx} ]->{'title'} = $xml->{'title'};
+ foreach my $tmp_author (@{$xml->{'author'}}){
+ $self->{itemsList}[ $self->{itemIdx} ]->{'artist'}.=$tmp_author->{'name'};
+ $self->{itemsList}[ $self->{itemIdx} ]->{'artist'}.=',';
+ }
+ }
+ }
+ else
+ {
+ $xml =$xs->XMLin($page,
+ ForceArray => [ 'author' ],
+ KeyAttr => {'db:tag'=>'name','link'=>'rel'});
+ foreach my $tmp_author (@{$xml->{'author'}}){
+ {($self->{curInfo}->{artist} ne '' ) and $self->{curInfo}->{artist}.=','; }
+ $self->{curInfo}->{artist}.=$tmp_author->{'name'};
+ }
+ $self->{curInfo}->{title}=$xml->{'title'};
+ $self->{curInfo}->{web}=$xml->{'link'}->{'alternate'}->{'href'};
+ foreach my $check(@{$xml->{'db:attribute'}}){
+ my $db_attr=$check->{'name'};
+ SWITCH: {
+ $db_attr eq 'publisher' and $self->{curInfo}->{producer}=$check->{'content'} ,last;
+ $db_attr eq 'pubdate' and $self->{curInfo}->{release}=$check->{'content'} ,last;
+ $db_attr eq 'ean' and $self->{curInfo}->{unique}=$check->{'content'} ,last;
+ $db_attr eq 'media' and $self->{curInfo}->{format}=$check->{'content'} ,last;
+ if ($db_attr eq 'tracks') { my @chains = split(/(?=\d+\.)/, $check->{'content'});
+ foreach my $track ( @chains ){
+ my $num=$track;my $name=$track;
+ $num=~ s/(^\d+).*/$1/;
+ $num=~ s/\n//g;
+ $name =~ s/^\d+\.(.*)/$1/;
+ $name=~s/\n//g;
+ $num=encode("utf8",$num);
+ $name=encode("utf8",$name);
+ $self->addTrack($name,0,$num);
+ }
+ last SWITCH;}
+ ;
+ }
+ }
+ $self->{curInfo}->{tracks} = $self->getTracks;
+ my $tmp_image=$xml->{'link'}->{'image'}->{'href'};
+ $tmp_image =~ s/spic/lpic/;
+ $self->{curInfo}->{cover}=$tmp_image;
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ artist => 1,
+ publication => 0,
+ };
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://api.douban.com/music/subjects?q=" .$word;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ # Make sure the url is for the api, not the main movie page
+ return $self->getItemUrl($url);
+ }
+
+ sub getNumberPasses
+ {
+ return 1;
+ }
+
+ sub getName
+ {
+ return "豆瓣";
+ }
+
+
+ sub testURL
+ {
+ my ($self, $url) = @_;
+ $url =~ /[\?&]lid=([0-9]+)*/;
+ my $id = $1;
+ return ($id == $self->siteLanguageCode());
+ }
+
+ sub getReturnedFields
+ {
+ my $self = shift;
+
+ $self->{hasField} = {
+ title => 1,
+ artist => 1,
+ };
+ }
+
+ sub getAuthor
+ {
+ return 'BW';
+ }
+
+ sub getLang
+ {
+ return 'ZH';
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "UTF-8";
+ }
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'ZH';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCmusics/GCMusicBrainz.pm b/lib/gcstar/GCPlugins/GCmusics/GCMusicBrainz.pm
new file mode 100644
index 0000000..f91027f
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCmusics/GCMusicBrainz.pm
@@ -0,0 +1,309 @@
+package GCPlugins::GCmusics::GCMusicBrainz;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCmusics::GCmusicsCommon;
+
+{
+ package GCPlugins::GCmusics::GCPluginMusicBrainz;
+
+ use base 'GCPlugins::GCmusics::GCmusicsPluginsBase';
+ use XML::Simple;
+ use Locale::Country;
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ my $xml;
+ my $xs = XML::Simple->new;
+ if ($self->{parsingList})
+ {
+ $xml = $xs->XMLin($page,
+ ForceArray => ['release', 'event'],
+ KeyAttr => {'release' => ''});
+ my $release;
+ foreach $release ( @{ $xml->{'release-list'}->{release} } )
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = 'http://musicbrainz.org/album/'.$release->{id}.'.html';
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $release->{title};
+ $self->{itemsList}[$self->{itemIdx}]->{artist} = $release->{artist}->{name};
+
+ my $releaseDate='9999-12-31';
+ for my $releaseEvent (@{$release->{'release-event-list'}->{event}})
+ {
+ if ($releaseEvent->{date} lt $releaseDate)
+ {
+ # Find the earliest release event
+ $releaseDate = $releaseEvent->{date};
+ }
+ }
+
+ $self->{itemsList}[$self->{itemIdx}]->{release} = $releaseDate
+ if $releaseDate ne '9999-12-31';
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin($page,
+ ForceArray => ['track', 'event', 'relation', 'relation-list','tag'],
+ KeyAttr => {'track' => ''});
+ $self->{curInfo}->{title} = $xml->{release}->{title};
+ $self->{curInfo}->{web} = 'http://musicbrainz.org/release/'.$xml->{release}->{id}.'.html';
+ $self->{curInfo}->{artist} = $xml->{release}->{artist}->{name};
+ $self->{curInfo}->{ratingpress} = int($xml->{release}->{rating}->{content}) * 2;
+ $self->{curInfo}->{producer} = '';
+ $self->{curInfo}->{composer} = '';
+
+ # Step through the relations
+ for my $relation (@{$xml->{release}->{'relation-list'}})
+ {
+ if ($relation->{'target-type'} eq 'Artist')
+ {
+ # Artist type relations
+ for my $rel (@{$relation->{relation}})
+ {
+ # Search for producer or composer relations
+ $self->{curInfo}->{producer} .= $rel->{artist}->{name}.', '
+ if $rel->{type} eq 'Producer';
+ $self->{curInfo}->{composer} .= $rel->{artist}->{name}.', '
+ if $rel->{type} eq 'Composer';
+ }
+ }
+ elsif ($relation->{'target-type'} eq 'Url')
+ {
+ # Look for url type relations. Currently only jamendo works, but we should also cover the archive.org
+ # relations
+ for my $rel (@{$relation->{relation}})
+ {
+ # Alternate cover art sites
+ if (($rel->{target} =~ m/jamendo.com/) && (!$self->{curInfo}->{cover}))
+ {
+ # Cover art should be on jamendo
+ $rel->{target} =~ /\/([0-9]+)$/;
+ my $id = $1;
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{cover} = "http://img.jamendo.com/albums/$id/covers/1.0.jpg";
+ }
+ else
+ {
+ $self->{curInfo}->{cover} = "http://img.jamendo.com/albums/$id/covers/1.200.jpg";
+ }
+ }
+ }
+ }
+ }
+
+ $self->{curInfo}->{producer} =~ s/, $//;
+ $self->{curInfo}->{composer} =~ s/, $//;
+
+ my $releaseDate;
+ my $releaseLabel;
+ my $releaseCountry;
+ my $releaseFormat;
+ my $releaseDateFromCompare='9999-12-12';
+ for my $releaseEvent (@{$xml->{release}->{'release-event-list'}->{event}})
+ {
+ my $releaseDateToCompare;
+ # Check if musicbrainz only has the year, if so, set things up so we'll prefer
+ # releases with the month & day over year-only releases
+ if (length($releaseEvent->{date}) == 4)
+ {
+ $releaseDateToCompare = $releaseEvent->{date}."-12-31";
+ }
+ else
+ {
+ $releaseDateToCompare = $releaseEvent->{date};
+ }
+
+ if (($releaseDateToCompare lt $releaseDateFromCompare) ||
+ (($releaseDateToCompare eq $releaseDateFromCompare) &&
+ (($releaseEvent->{country} eq 'US') || ($releaseEvent->{country} eq 'GB'))))
+ {
+ # Find the earliest release event, which has a month & day
+ # Big call, but we're probably more correct choosing a US or UK release if there's two
+ # release events with the same date, so prioritise them
+ $releaseDate = $releaseEvent->{date};
+ $releaseLabel = $releaseEvent->{label}->{name}
+ if $releaseEvent->{label};
+ $releaseCountry = code2country($releaseEvent->{country});
+ $releaseFormat = $releaseEvent->{format};
+ $releaseDateFromCompare = $releaseDateToCompare;
+ }
+ }
+
+ $self->{curInfo}->{release} = $releaseDate;
+ $self->{curInfo}->{label} = $releaseLabel;
+ $self->{curInfo}->{origin} = $releaseCountry;
+ $self->{curInfo}->{format} = $releaseFormat;
+
+ for my $track(@{$xml->{release}->{'track-list'}->{track}})
+ {
+ $self->addTrack($track->{title}, $track->{duration} / 1000);
+ }
+ $self->{curInfo}->{tracks} = $self->getTracks;
+ $self->{curInfo}->{running} = $self->getTotalTime;
+
+ for my $genre(@{$xml->{release}->{'tag-list'}->{tag}})
+ {
+ # Capitalize first letter of each word
+ $genre->{content} =~ s/\b(\w+)\b/ucfirst($1)/ge;
+ # Only add genres if they have more then 1 vote, strips out a lot of
+ # weird/wrong tags
+ push @{$self->{curInfo}->{genre}}, [$genre->{content}]
+ if ($genre->{count} > 1);
+ }
+
+ # If amazon artwork exists, use it
+ if (($xml->{release}->{asin}) && (!$self->{curInfo}->{cover}))
+ {
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{cover} = 'http://images.amazon.com/images/P/'.$xml->{release}->{asin}.'.01.LZZZZZZZ.jpg'
+ }
+ else
+ {
+ $self->{curInfo}->{cover} = 'http://images.amazon.com/images/P/'.$xml->{release}->{asin}.'.01.MZZZZZZZ.jpg'
+ }
+ }
+ }
+ }
+
+ sub convertDate
+ {
+ my ($self, $date) = @_;
+ $date =~ /([0-9]{4})-?([0-9]{2})?-?([0-9]{2})?/;
+ return $3 .($3 ? '/' : '').$2.($2 ? '/' : '').$1;
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ artist => 1,
+ release => 1,
+ tracks => 1
+ };
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ my $key = ($self->{searchField} eq 'artist') ? 'artist' : 'title';
+ return "http://musicbrainz.org/ws/1/release/?type=xml&$key=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url;
+ return "http://musicbrainz.org/";
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ $url =~ s|http://musicbrainz.org/album/(.*?)\.html|http://musicbrainz.org/ws/1/release/$1?type=xml&inc=artist+tracks+release-events+artist-rels+url-rels+ratings+labels+tags|;
+ $url =~ s|http://musicbrainz.org/release/(.*?)\.html|http://musicbrainz.org/ws/1/release/$1?type=xml&inc=artist+tracks+release-events+artist-rels+url-rels+ratings+labels+tags|;
+ return $url;
+ }
+
+ sub getName
+ {
+ return 'MusicBrainz';
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+ sub getNotConverted
+ {
+ my $self = shift;
+ return [];
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['title', 'artist'];
+ }
+
+ sub isPreferred
+ {
+ # Return status of 2 means plugin is default regardless of user's language
+ return 2;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCmusics/GCmusicsCommon.pm b/lib/gcstar/GCPlugins/GCmusics/GCmusicsCommon.pm
new file mode 100644
index 0000000..186662c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCmusics/GCmusicsCommon.pm
@@ -0,0 +1,62 @@
+package GCPlugins::GCmusics::GCmusicsCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCPluginsBase;
+use GCExtract::GCExtractMusics;
+
+{
+ package GCPlugins::GCmusics::GCmusicsPluginsBase;
+
+ use base ('GCPluginParser', 'GCExtract::GCmusicsExtracter');
+ #use base ('GCPluginParser');
+ use HTML::Entities;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['title'];
+ }
+
+ sub loadUrl
+ {
+ my ($self, $url) = @_;
+
+ $self->resetTracks;
+ $self->SUPER::loadUrl($url);
+ return $self->{curInfo};
+ }
+
+}
+
+1; \ No newline at end of file
diff --git a/lib/gcstar/GCPlugins/GCstar/GCAmazonCommon.pm b/lib/gcstar/GCPlugins/GCstar/GCAmazonCommon.pm
new file mode 100644
index 0000000..a9ecd80
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCstar/GCAmazonCommon.pm
@@ -0,0 +1,132 @@
+package GCPlugins::GCstar::GCAmazonCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCPluginsBase;
+
+{
+ package GCPlugins::GCstar::GCPluginAmazonCommon;
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+ return 0 if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if (
+ (($self->{inside}->{b})
+ || ($self->{inside}->{span})
+ || ($self->{inside}->{label}))
+ )
+ {
+ my $suffix = $self->{suffix};
+ if ((($suffix =~ /^co/) && ($origtext =~ /Sort by/))
+ || (($suffix eq 'fr' ) && ($origtext =~ /Trier par/))
+ || (($suffix eq 'de' ) && ($origtext =~ /Sortieren nach/)))
+ {
+ $self->{beginParsing} = 1;
+ return 1;
+ }
+ }
+ }
+
+ return 0;
+ }
+
+ sub extractImage
+ {
+ my ($self, $attr) = @_;
+ my $url = $attr->{src};
+ return 'http://images.amazon.com/images/'.$1.'/'.$2.$3.'MZZZZZZZ.'.$5
+ if ($url =~ m%^http://.*?images[.-]amazon\.com/images/(P)/([A-Z0-9]*)(\.[0-9]+\.)?[-A-Za-z0-9_.,]*?ZZZZZZZ(.*?)\.(jpg|gif)%);
+ return 'http://images.amazon.com/images/'.$1.'/'.$2.'.'.$3
+ if ($url =~ m%^http://.*?images[.-]amazon\.com/images/(I|G)/([-\%A-Z0-9a-z+]*)\._.*?_\.(jpg|gif)%);
+ if ($attr->{id} eq 'prodImage')
+ {
+ $url =~ s/_AA[0-9]*_//;
+ return $url;
+ }
+ return '';
+ }
+
+ sub isEAN
+ {
+ my ($self, $value) = @_;
+
+ my $l = length($value);
+ return 1
+ if ($l == 8)
+ || ($l == 13)
+ || ($l == 15)
+ || ($l == 18);
+ return 0;
+ }
+
+ sub isItemUrl
+ {
+ my ($self, $url) = @_;
+ return $1
+ if (($url =~ m|/dp/[A-Z0-9]*/sr=([0-3]-[0-9]*)/qid=[0-9]*|)
+ || ($url =~ m|/dp/[A-Z0-9]*/ref=(?:sr\|pd)_([a-z0-9_]*)/[0-9]*|)
+ || ($url =~ m|/dp/[A-Z0-9]*/ref=(?:sr\|pd)_([a-z0-9_]*)/[0-9]*|));
+ return undef;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://www.amazon.".$self->{suffix}."/gp/search/?redirect=true&search-alias=".$self->{searchType}."&keywords=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url;
+ return 'http://www.amazon.'.$self->{suffix};
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ if ($self->{parsingList})
+ {
+ $html =~ s|<span\s+class="srTitle">([^<]*)</span>|<srTitle>$1</srTitle>|gim;
+ $html =~ s|<td class="otherEditions">.*?</td>||gim;
+ }
+ else
+ {
+ $html =~ s|<a\s*href="/exec/obidos/ASIN/[0-9/\${}]*">([^<]*)</a>|$1|gim;
+ }
+ return $html;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCSplash.pm b/lib/gcstar/GCSplash.pm
new file mode 100644
index 0000000..27c0a27
--- /dev/null
+++ b/lib/gcstar/GCSplash.pm
@@ -0,0 +1,241 @@
+package GCSplash;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use Gtk2;
+
+{
+ package GCSplashWindow;
+ use GCUtils;
+ use base "Gtk2::Window";
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{parent} = shift;
+ $self->{version} = shift;
+
+ $self->{splashImage} = $self->{parent}->{logosDir}.'splash.png';
+
+ $self->set_decorated(0);
+ $self->set_resizable(0);
+ $self->set_transient_for($self->{parent});
+ $self->set_destroy_with_parent(1);
+ $self->set_modal(1);
+ $self->set_skip_taskbar_hint(1);
+
+ #$self->set_position('center-always');
+ $self->set_keep_above(1);
+
+ $self->{title} = new Gtk2::Label;
+ $self->{title}->set_markup('<span size="xx-large" weight="bold" color="#1c86ee">GCstar</span>');
+ $self->{label} = new Gtk2::Label('test');
+
+ $self->{vbox} = new Gtk2::VBox(0,0);
+
+ $self->{progress} = new Gtk2::ProgressBar;
+ $self->{progress}->set_size_request(240,-1);
+
+ my $color_fg = Gtk2::Gdk::Color->parse('#1c86ee');
+ my $color_progress_bg = Gtk2::Gdk::Color->parse('#ffffff');
+ my $color_progress_fg = Gtk2::Gdk::Color->parse('#1c86ee');
+ my $color_progress_text = Gtk2::Gdk::Color->parse('#cdad00');
+
+ $self->{label}->modify_fg('normal', $color_fg);
+ $self->{progress}->modify_bg('normal', $color_progress_bg);
+ $self->{progress}->modify_bg('active', $color_progress_fg);
+ $self->{progress}->modify_bg('prelight', $color_progress_fg);
+
+ my $eventbox = Gtk2::EventBox->new();
+ my $img = Gtk2::Image->new_from_pixmap (undef, undef);
+ my $inbox = new Gtk2::Fixed;
+ $eventbox->add($inbox);
+ $inbox->put($img,0,0);
+ $inbox->put($self->{title},0,110);
+ $inbox->put($self->{label},0,145);
+ $inbox->put($self->{progress},30,170);
+ $self->{vbox}->pack_start($eventbox,0,0,0);
+
+ $self->add($self->{vbox});
+ my $drawing_area = Gtk2::DrawingArea->new;
+ $self->{vbox}->pack_start($drawing_area,0,0,0);
+ $drawing_area->realize;
+
+ my ($pango_w, $pango_h) = (300,200);
+ my $pixmap = Gtk2::Gdk::Pixmap->new ($drawing_area->window,
+ $pango_w,
+ $pango_h,
+ -1);
+
+ my $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($self->{splashImage});
+ my ($pm, $m) = $pixbuf->render_pixmap_and_mask(255);
+ $img->set_from_pixmap($pm, $m);
+ $self->shape_combine_mask ($m, 0, 0) if $m;
+ $self->set_position('center');
+ $self->{vbox}->show_all;
+ $self->show;
+ $self->{title}->set_size_request(300,-1);
+ $self->{label}->set_size_request(300,-1);
+
+ return $self;
+ }
+
+ sub init
+ {
+ my $self = shift;
+
+ if ($self->{phase} == 0)
+ {
+ $self->setLabel($self->{parent}->{lang}->{SplashInit});
+ $self->{phase} = 1;
+ }
+ elsif ($self->{phase} == 1)
+ {
+ $self->setProgress(0.0);
+ $self->{parent}->init($self);
+ $self->setProgress(0.1);
+ $self->{phase} = 2;
+ $self->setLabel($self->{parent}->{lang}->{SplashLoad});
+ }
+ elsif ($self->{phase} == 2)
+ {
+ $self->{parent}->loadPrevious($self);
+ $self->setProgress(0.7);
+# $self->{parent}->setSensitive(1);
+ $self->{phase} = 3;
+ $self->setLabel($self->{parent}->{lang}->{SplashSort});
+ }
+ elsif ($self->{phase} == 3)
+ {
+ $self->{parent}->initEnd;
+ $self->setProgress(1.0);
+ $self->{parent}->setSensitive(1);
+ $self->{phase} = 4;
+ $self->setLabel($self->{parent}->{lang}->{SplashDone});
+ }
+ else
+ {
+ $self->hide;
+ $self->{parent}->{initializing} = 0;
+ Glib::Timeout->add(700 ,\&destroyMe, $self);
+ return 0;
+ }
+ Glib::Timeout->add(100 ,\&init, $self);
+
+ return 0;
+ }
+
+ sub setLabel
+ {
+ my ($self, $text) = @_;
+ #$text =~ s|^(.)|<span size="x-large" color="#cdad00">$1</span>|;
+ $self->{label}->set_markup('<b>'.$text.'</b>');
+ }
+
+ sub setItemsTotal
+ {
+ my ($self, $total) = @_;
+ $self->{step} = GCUtils::round($total / 7);
+ $self->{step} = 1 if $self->{step} < 1;
+ $self->{total} = $total;
+ }
+
+ sub setProgressForItemsLoad
+ {
+ my ($self, $current) = @_;
+ if (! $self->{total})
+ {
+ $self->{progress}->set_fraction(0.2);
+ }
+ else
+ {
+ return if ($current % $self->{step});
+ $self->setLabel($self->{parent}->{lang}->{SplashLoad}." <span color='#cdad00'>($current/".$self->{total}.')</span>');
+ $self->{progress}->set_fraction(0.1 + (($current / $self->{total}) * 0.3));
+ }
+ GCUtils::updateUI;
+ }
+
+ sub setProgressForItemsDisplay
+ {
+ my ($self, $current) = @_;
+ if (! $self->{total})
+ {
+ $self->{progress}->set_fraction(0.6);
+ }
+ else
+ {
+ return if ($current % $self->{step});
+ $self->setLabel($self->{parent}->{lang}->{SplashDisplay}." <span color='#cdad00'>($current/".$self->{total}.')</span>');
+ $self->{progress}->set_fraction(0.4 + (($current / $self->{total}) * 0.3));
+ }
+ GCUtils::updateUI;
+ }
+
+ sub setProgressForItemsSort
+ {
+ my ($self, $current) = @_;
+ if (! $self->{total})
+ {
+ $self->{progress}->set_fraction(0.8);
+ }
+ else
+ {
+ return if ($current % $self->{step});
+ $self->setLabel($self->{parent}->{lang}->{SplashSort}." <span color='#cdad00'>($current/".$self->{total}.')</span>');
+ $self->{progress}->set_fraction(0.7 + (($current / $self->{total}) * 0.2));
+ }
+ GCUtils::updateUI;
+ }
+
+ sub setProgress
+ {
+ my ($self, $current) = @_;
+ $self->{progress}->set_fraction($current);
+ GCUtils::updateUI;
+ }
+
+ sub destroyMe
+ {
+ my $self = shift;
+
+ $self->destroy;
+ return 0;
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show_all;
+ $self->{phase} = 0;
+ Glib::Timeout->add(10 ,\&init, $self);
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCStats.pm b/lib/gcstar/GCStats.pm
new file mode 100644
index 0000000..439c6d1
--- /dev/null
+++ b/lib/gcstar/GCStats.pm
@@ -0,0 +1,464 @@
+package GCStats;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+use utf8;
+use Gtk2;
+
+use strict;
+
+our $statisticsActivated;
+BEGIN {
+ $statisticsActivated = 1;
+ # Trick for depencies checker. Don't remove these commented lines.
+ #eval 'use GD';
+ #eval 'use GD::Graph::bars';
+ #eval 'use GD::Graph::pie';
+ #eval 'use GD::Graph::area';
+ #eval 'use GD::Text';
+ #eval 'use Date::Calc';
+ foreach my $module (qw/GD GD::Graph::bars GD::Graph::pie GD::Graph::area GD::Text Date::Calc/)
+ {
+ eval "use $module";
+ if ($@)
+ {
+ $statisticsActivated = 0;
+ last;
+ }
+ }
+}
+
+{
+ package GCStatsImageGenerator;
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {parent => $parent};
+ bless ($self, $class);
+
+ GD::Text->font_path($ENV{GCS_SHARE_DIR}.'/fonts');
+
+ return $self;
+ }
+
+ sub setData
+ {
+ my ($self, $items, $sort, $type, $useNumbers) = @_;
+ my %stats;
+ foreach my $item(@$items)
+ {
+ if (ref($item) eq 'ARRAY')
+ {
+ $stats{$_}++ foreach (@$item);
+ }
+ else
+ {
+ $stats{$item}++;
+ }
+ }
+ my (@val1, @val2);
+ my @sortedKeys;
+ if ($sort)
+ {
+ @sortedKeys = sort {$stats{$a} <=> $stats{$b}} keys %stats;
+ }
+ else
+ {
+ # TODO This sort should be more complicated, depending on the type of field
+ @sortedKeys = sort {$a cmp $b} keys %stats;
+ }
+ my $val;
+ foreach my $key(@sortedKeys)
+ {
+ $val = $key;
+ $val .= ' ('.$stats{$key}.')' if $useNumbers;
+ push @val1, $val;
+ push @val2, $stats{$key};
+ }
+ $self->{data} = [\@val1, \@val2];
+ }
+
+ sub generate
+ {
+ my ($self, %options) = @_;
+ my $graph;
+
+ # Plot the graph twice as large as desired, so we can resample it down later, and eliminate
+ # the jagged lines caused by GD::Graph's lack of anti-aliasing
+ my $scaledWidth = $options{width} * 2;
+ my $scaledHeight = $options{height} * 2;
+ my $scaledFontSize = $options{fontSize} * 2;
+
+ if ($options{type} eq 'bars')
+ {
+ $graph = GD::Graph::bars->new($scaledWidth, $scaledHeight);
+ $graph->set(
+ x_labels_vertical => 1,
+ );
+ $graph->set_x_label_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_y_label_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_x_axis_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_y_axis_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_legend_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_values_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ }
+ elsif ($options{type} eq 'area')
+ {
+ $graph = GD::Graph::area->new($scaledWidth, $scaledHeight);
+ $graph->set(
+ x_labels_vertical => 1,
+ );
+ $graph->set_x_label_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_y_label_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_x_axis_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_y_axis_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_legend_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_values_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ }
+ elsif ($options{type} eq 'history')
+ {
+ $graph = GD::Graph::area->new($scaledWidth, $scaledHeight);
+ $graph->set_x_label_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_y_label_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_x_axis_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_y_axis_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_legend_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_values_font('LiberationSans-Regular.ttf', $scaledFontSize);
+
+ # Modify data to accumulate
+ if ($options{accumulate})
+ {
+ my $prev = 0;
+ foreach (@{$self->{data}->[1]})
+ {
+ $_ += $prev;
+ $prev = $_;
+ }
+ }
+ # Transform dates into numbers of days
+ # Reference is the 1st one as they are ordered
+ # Or the 2nd one if there are items without value
+ my @refDate;
+ if ($self->{data}->[0]->[0])
+ {
+ @refDate = split m|/|, $self->{data}->[0]->[0];
+ }
+ else
+ {
+ @refDate = split m|/|, $self->{data}->[0]->[1];
+ # We consider items without value as being the day before
+ @refDate = Date::Calc::Add_Delta_Days(@refDate, -1);
+ $self->{data}->[0]->[0] = sprintf('%d/%02d/%02d', @refDate);
+ }
+ my $prev = -1;
+ my @newDates;
+ my $dateFormat = $self->{parent}->{options}->dateFormat;
+ foreach my $date(@{$self->{data}->[0]})
+ {
+ push @newDates, GCUtils::timeToStr(GCPreProcess::restoreDate($date), $dateFormat);
+ if (!$date)
+ {
+ $prev = 0;
+ next;
+ }
+ my @cmpDate = split m|/|, $date;
+ my $diff = Date::Calc::Delta_Days(@refDate, @cmpDate);
+ if ($diff > $prev + 1)
+ {
+ my @filler;
+ $#filler = $diff - $prev - 2;
+ if (!$options{accumulate})
+ {
+ @filler = map {''} @filler;
+ }
+ splice (@newDates, $prev + 1, 0, @filler);
+ splice (@{$self->{data}->[1]}, $prev + 1, 0, @filler);
+ }
+ $prev = $diff;
+ }
+ $self->{data}->[0] = \@newDates;
+ if (!$options{showAllDates})
+ {
+ for my $idx(0..$#newDates)
+ {
+ my @date = Date::Calc::Add_Delta_Days(@refDate, $idx);
+ my $value;
+ if ($date[2] == 1)
+ {
+ my $dateStr = sprintf('%d/%02d/%02d', @date);
+ $value = GCUtils::timeToStr(GCPreProcess::restoreDate($dateStr), $dateFormat);
+ }
+ else
+ {
+ if ($self->{data}->[1]->[$idx])
+ {
+ $value = '';
+ }
+ }
+ $self->{data}->[0]->[$idx] = $value;
+ }
+ }
+ $graph->set(
+ #x_label_skip => 5,
+ x_labels_vertical => 1,
+ show_values => 1,
+ );
+ }
+ else
+ {
+ $graph = GD::Graph::pie->new($scaledWidth, $scaledHeight);
+ $graph->set_value_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_label_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set('3d' => ($options{type} eq '3dpie'));
+ }
+ $graph->set_title_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set(
+ title => $options{title},
+ show_values => $options{showValues},
+ transparent => 0,
+ bgclr => '#ffffff',
+ dclrs => ['#ffdf33', '#1c86ee', '#cdad00', '#6c7b8b', '#ffb618'],
+ cycle_clrs => 1,
+ t_margin => 20,
+ b_margin => 20,
+ l_margin => 20,
+ r_margin => 20,
+ text_space => 20,
+ );
+
+ my $gd = $graph->plot($self->{data});
+
+ # Now, resample the graph down to the desired size, effectively anti-aliasing the sharp edges
+ my $aaImage = GD::Image->new($options{width}, $options{height}, 1);
+ $aaImage->copyResampled($gd, 0, 0, 0, 0, $options{width}, $options{height}, $scaledWidth, $scaledHeight);
+
+ return $aaImage->png;
+ }
+}
+
+{
+ package GCStatsDialog;
+ use base "Gtk2::Dialog";
+
+ use GCUtils;
+ use GCDialogs;
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent->{lang}->{MenuStatistics},
+ $parent,
+ [qw/destroy-with-parent/],
+ $parent->{lang}->{StatsGenerate} => 'apply',
+ 'gtk-save-as' => 'ok',
+ 'gtk-close' => 'close'
+ );
+ bless($self, $class);
+
+ $self->{parent} = $parent;
+ $self->{generator} = new GCStatsImageGenerator($parent);
+
+ $self->{choices} = [
+ {value => 'bars', displayed => $parent->{lang}->{StatsBars}},
+ {value => 'pie', displayed => $parent->{lang}->{StatsPie}},
+ {value => '3dpie', displayed => $parent->{lang}->{Stats3DPie}},
+ {value => 'area', displayed => $parent->{lang}->{StatsArea}},
+ {value => 'history', displayed => $parent->{lang}->{StatsHistory}},
+ ];
+ $self->{typeOption} = new GCMenuList($self->{choices}, 4);
+ $self->{typeOption}->setValue('3dpie');
+ my $typeLabel = new GCLabel($parent->{lang}->{StatsKindOfGraph});
+ $self->{fieldLabel} = new GCLabel($parent->{lang}->{StatsFieldToUse});
+ $self->{fieldOption} = new GCFieldSelector(0, undef, 1);
+ $self->{dateLabel} = new GCLabel($parent->{lang}->{StatsFieldDate});
+ $self->{dateOption} = new GCFieldSelector(0, undef, 1, 0, 0, 'date');
+ $self->{sortByNumberOption} = new GCCheckBox($parent->{lang}->{StatsSortByNumber});
+ $self->{sortByNumberOption}->setValue(0);
+ $self->{accumulateOption} = new GCCheckBox($parent->{lang}->{StatsAccumulate});
+ $self->{accumulateOption}->setValue(1);
+ $self->{useNumberOption} = new GCCheckBox($parent->{lang}->{StatsDisplayNumber});
+ $self->{useNumberOption}->setValue(0);
+
+ my $widthLabel = new GCLabel($parent->{lang}->{StatsWidth});
+ $self->{widthOption} = new GCCheckedText('0-9');
+ $self->{widthOption}->setValue(600);
+ my $heightLabel = new GCLabel($parent->{lang}->{StatsHeight});
+ $self->{heightOption} = new GCCheckedText('0-9');
+ $self->{heightOption}->setValue(600);
+ my $fontLabel = new GCLabel($parent->{lang}->{StatsFontSize});
+ $self->{fontOption} = new GCNumeric(12, 1, 100, 1);
+
+ $self->{typeOption}->signal_connect('changed' => sub {
+ $self->checkVisible;
+ });
+
+ my $table = new Gtk2::Table(3, 11, 0);
+ $table->set_row_spacings($GCUtils::margin);
+ $table->set_col_spacings($GCUtils::margin);
+ $table->set_border_width($GCUtils::halfMargin);
+
+ $table->attach($typeLabel, 0, 1, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{typeOption}, 1, 2, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($widthLabel, 3, 4, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{widthOption}, 4, 5, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($heightLabel, 6, 7, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{heightOption}, 7, 8, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($fontLabel, 9, 10, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{fontOption}, 10, 11, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{fieldLabel}, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{fieldOption}, 1, 2, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{dateLabel}, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{dateOption}, 1, 2, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{sortByNumberOption}, 3, 5, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{accumulateOption}, 3, 5, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{useNumberOption}, 6, 8, 1, 2, 'fill', 'fill', 0, 0);
+
+ $self->{image} = Gtk2::Image->new;
+
+ $self->vbox->pack_start($self->{image},1,1,0);
+ $self->vbox->pack_start($table,0,0,0);
+
+ ($self->action_area->get_children)[1]->set_sensitive(0);
+
+ return $self;
+ }
+
+ sub checkVisible
+ {
+ my $self = shift;
+ my $val = $self->{typeOption}->getValue;
+ if ($val eq 'history')
+ {
+ $self->{fieldLabel}->hide;
+ $self->{fieldOption}->hide;
+ $self->{dateLabel}->show_all;
+ $self->{dateOption}->show_all;
+ $self->{sortByNumberOption}->hide;
+ $self->{accumulateOption}->show_all;
+ }
+ else
+ {
+ $self->{fieldLabel}->show_all;
+ $self->{fieldOption}->show_all;
+ $self->{dateLabel}->hide;
+ $self->{dateOption}->hide;
+ $self->{sortByNumberOption}->show_all;
+ $self->{accumulateOption}->hide;
+ }
+ }
+
+ sub setData
+ {
+ my ($self, $model, $data, $title) = @_;
+ $self->{model} = $model;
+ $self->{data} = $data;
+ $self->{title} = $title;
+ $self->{fieldOption}->setModel($model);
+ $self->{fieldOption}->setValue('genre');
+ $self->{dateOption}->setModel($model);
+ $self->{dateOption}->setValue('added');
+ }
+
+ sub show
+ {
+ my ($self) = @_;
+
+ #$self->generatePicture;
+ $self->SUPER::show();
+ $self->show_all;
+ $self->checkVisible;
+ $self->set_position('center');
+ my $response = 'cancel';
+ while (!(($response eq 'close') || ($response eq 'delete-event')))
+ {
+ $response = $self->run;
+ $self->generatePicture if $response eq 'apply';
+ $self->save if $response eq 'ok';
+ }
+ $self->hide;
+ }
+
+ sub generatePicture
+ {
+ my $self = shift;
+
+ my $graphType = $self->{typeOption}->getValue;
+ my $sortField = ($graphType eq 'history')
+ ? $self->{dateOption}->getValue
+ : $self->{fieldOption}->getValue;
+ my $sortByNumber = $self->{sortByNumberOption}->getValue;
+ my $accumulate = $self->{accumulateOption}->getValue;
+ my $useNumber = ($graphType =~ /pie/) && $self->{useNumberOption}->getValue;
+ my $showValues = ($graphType !~ /pie/) && $self->{useNumberOption}->getValue;
+ my $width = $self->{widthOption}->getValue;
+ my $height = $self->{heightOption}->getValue;
+ my $fontSize = $self->{fontOption}->getValue;
+
+ my $type = $self->{parent}->{model}->{fieldsInfo}->{$sortField}->{type};
+ my @valuesList;
+ if ($type eq 'date')
+ {
+ @valuesList = map {GCPreProcess::reverseDate($_->{$sortField})} @{$self->{data}};
+ }
+ else
+ {
+ @valuesList = map {$self->{parent}->transformValue($_->{$sortField}, $sortField, 1)} @{$self->{data}};
+ }
+ $self->{generator}->setData(\@valuesList, $sortByNumber, $type, $useNumber);
+ #$self->{generator}->setData($self->{data}, $sortField);
+ my $png = $self->{generator}->generate(type => $graphType,
+ showValues => $showValues,
+ accumulate => $accumulate,
+ title => $self->{title},
+ width => $width,
+ height => $height,
+ fontSize => $fontSize,
+ showAllDates => 0);
+
+ my $loader = Gtk2::Gdk::PixbufLoader->new;
+ $loader->write($png);
+ $loader->close;
+ $self->{pixbuf} = $loader->get_pixbuf;
+ $self->{image}->set_from_pixbuf($self->{pixbuf});
+ ($self->action_area->get_children)[1]->set_sensitive(1);
+ }
+
+ sub save
+ {
+ my $self = shift;
+ my $fileDialog = new GCFileChooserDialog($self->{parent}->{lang}->{StatsSave}, $self, 'save', 1);
+ $fileDialog->set_pattern_filter(['PNG (.png)', '*.png']);
+ $fileDialog->set_filename($self->{filename});
+ my $response = $fileDialog->run;
+ if ($response eq 'ok')
+ {
+ $self->{filename} = $fileDialog->get_filename;
+ $self->{pixbuf}->save($self->{filename}, 'png');
+ }
+ $fileDialog->destroy;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCStyle.pm b/lib/gcstar/GCStyle.pm
new file mode 100644
index 0000000..f8cfb32
--- /dev/null
+++ b/lib/gcstar/GCStyle.pm
@@ -0,0 +1,67 @@
+{
+ package GCStyle;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+
+ use base 'Exporter';
+ our @EXPORT = qw(%styles @lists $defaultList @readOnlyStyles);
+
+ use File::Basename;
+ use GCUtils 'glob';
+
+ our %styles;
+ our @lists;
+ our $defaultList;
+ our @readOnlyStyles;
+
+ sub initStyles
+ {
+ foreach (glob $ENV{GCS_SHARE_DIR}.'/style/*')
+ {
+ my $style = basename($_);
+ next if $style eq 'CVS';
+ my %tmpStyle;
+ $tmpStyle{dir} = $_;
+ $tmpStyle{rcFile} = $tmpStyle{dir}.'/gtkrc';
+ $tmpStyle{name} = $style;
+ $styles{$style} = \%tmpStyle;
+ }
+ foreach (glob $ENV{GCS_SHARE_DIR}.'/list_bg/*')
+ {
+ my $bg = basename($_);
+ next if $bg eq 'CVS';
+ push @lists, $bg;
+ }
+ foreach (glob $ENV{GCS_SHARE_DIR}.'/panels/*')
+ {
+ my $style = basename($_);
+ next if $style eq 'CVS';
+ push @readOnlyStyles, $style;
+ }
+ $defaultList = 'Wood';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCUpdater.pm b/lib/gcstar/GCUpdater.pm
new file mode 100644
index 0000000..6b3f537
--- /dev/null
+++ b/lib/gcstar/GCUpdater.pm
@@ -0,0 +1,174 @@
+package GCUpdater;
+
+###################################################
+#
+# Copyright 2005 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use utf8;
+use strict;
+
+use LWP;
+
+my $BASE_URL = 'http://www.gcstar.org/update/';
+my $INDEX_FILE = 'list.php';
+
+{
+ package GCRealUpdater;
+
+ use File::Basename;
+ use File::Path;
+
+ sub abort
+ {
+ my ($self, $msg) = @_;
+ print "$msg\n";
+ exit 1;
+ }
+
+ sub getNextFile
+ {
+ my $self = shift;
+
+ return $self->{filesList}->[$self->{next}];
+ }
+
+ sub createBrowser
+ {
+ my ($self, $proxy) = @_;
+
+ $self->{browser} = LWP::UserAgent->new;
+ $self->{browser}->proxy(['http'], $proxy) if $proxy;
+ }
+
+ sub checkFile
+ {
+ my ($self, $file) = @_;
+
+ return 1 if $self->{toBeUpdated}->{all};
+ foreach ('plugins', 'import', 'export', 'lang', 'models', 'extract')
+ {
+ return 1 if ($self->{toBeUpdated}->{$_}) && ($file =~ /$_/i);
+ }
+ return 0;
+ }
+
+ sub updateNext
+ {
+ my $self = shift;
+
+ my $file = $self->{filesList}->[$self->{next}];
+ print "Saving in ",$self->{baseInstallation}.$file,"\n";
+ mkpath(dirname($self->{baseInstallation}.$file));
+ my $response = $self->{browser}->get($self->{baseUrl}.$file, ':content_file' => $self->{baseInstallation}.$file);
+ if (!$response->is_success)
+ {
+ print $response->message, "\n";
+ #print $self->{lang}->{UpdateFileNotFound},"\n";
+ }
+ $self->{next}++;
+ }
+
+ sub getIndex
+ {
+ my $self = shift;
+ my $response = $self->{browser}->get($self->{baseUrl}.$INDEX_FILE, ':content_file' => $self->{baseInstallation}.$INDEX_FILE);
+ $self->abort($self->{lang}->{UpdateNone}) if !$response->is_success;
+ open INDEX, $self->{baseInstallation}.$INDEX_FILE;
+ $self->{filesList} = [];
+ while (<INDEX>)
+ {
+ chomp;
+ push @{$self->{filesList}}, $_
+ if $self->checkFile($_);
+ }
+ close INDEX;
+ $self->{total} = scalar @{$self->{filesList}};
+ }
+
+ sub total
+ {
+ my $self = shift;
+ $self->getIndex if ( !defined $self->{total});
+ return $self->{total};
+ }
+
+ sub new
+ {
+ my ($proto, $lang, $baseDir, $toBeUpdated, $version) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {
+ lang => $lang,
+ baseUrl => $BASE_URL.$version.'/',
+ baseInstallation => $baseDir.'/',
+ toBeUpdated => $toBeUpdated
+ };
+ bless ($self, $class);
+ $self->abort($self->{lang}->{UpdateNoPermission}.$baseDir) if (! -w $baseDir);
+ $self->{next} = 0;
+ $self->{total} = undef;
+
+ return $self;
+ }
+}
+
+{
+ package GCTextUpdater;
+
+ sub new
+ {
+ my ($proto, $lang, $baseDir, $toBeUpdated, $noProxy, $version) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {
+ lang => $lang,
+ noProxy => $noProxy,
+ updater => GCRealUpdater->new($lang, $baseDir, $toBeUpdated, $version)
+ };
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub update
+ {
+ my $self = shift;
+
+ my $proxy;
+ if (!$self->{noProxy})
+ {
+ print $self->{lang}->{UpdateUseProxy};
+ $proxy = <STDIN>;
+ chomp $proxy;
+ }
+
+ $self->{updater}->createBrowser($proxy);
+
+ my $count = $self->{updater}->total;
+ print $self->{lang}->{UpdateNone},"\n" if !$count;
+ for (my $i = 0; $i < $count; $i++)
+ {
+ print $i+1," / $count : ",$self->{updater}->getNextFile,"\n";
+ $self->{updater}->updateNext;
+ }
+ }
+}
+
+
+
+1;
diff --git a/lib/gcstar/GCUtils.pm b/lib/gcstar/GCUtils.pm
new file mode 100644
index 0000000..cc0e0d9
--- /dev/null
+++ b/lib/gcstar/GCUtils.pm
@@ -0,0 +1,640 @@
+package GCUtils;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use Exporter;
+use Cwd 'abs_path';
+use Gtk2;
+
+use base 'Exporter';
+our @EXPORT_OK = qw(glob);
+
+our $margin = 12;
+our $halfMargin = $margin / 2;
+our $quarterMargin = $margin / 4;
+
+sub updateUI
+{
+ my $loopCount = 0;
+ my $nbEvent = Gtk2->events_pending;
+ while ($nbEvent && ($loopCount < 30))
+ {
+ Gtk2->main_iteration;
+ $loopCount++;
+ $nbEvent = Gtk2->events_pending;
+ }
+}
+
+sub printStack
+{
+ my $number = shift;
+ $number ||= 1;
+ my ($package, $filename, $line, $subroutine) = caller(1);
+ my $output = "$package::$subroutine";
+ my $frame = 2;
+ while (($number + 1) >= $frame)
+ {
+ ($package, $filename, $line, $subroutine) = caller($frame);
+ $output .= " from $package::$subroutine";
+ $frame++;
+ }
+ print "$output\n";
+}
+
+sub dumpList
+{
+ my ($list, @fields) = @_;
+ my $i = 0;
+ foreach my $item(@$list)
+ {
+ print $i, ': ';
+ print $item->{$_}, ", " foreach (@fields);
+ print "\n";
+ $i++;
+ }
+}
+
+sub formatOpenSaveError
+{
+ my ($lang, $filename, $error) = @_;
+
+ my $errorText = (exists $lang->{$error->[0]})
+ ? $lang->{$error->[0]}
+ : $error->[0];
+ return "$filename\n\n$errorText".($error->[1] ? "\n\n".$error->[1] : '');
+}
+
+sub glob
+{
+ my ($pattern) = @_;
+ $pattern = '"'.$pattern.'"' if $pattern =~ /[^\\] /;
+ return glob "$pattern";
+}
+
+sub pathToUnix
+{
+ my ($path, $canonical) = @_;
+ $path =~ s|\\|/|g if ($^O =~ /win32/i);
+ $path = abs_path($path) if $canonical;
+ return $path;
+}
+
+sub sizeToHuman
+{
+ my ($size, $sizesSymbols) = @_;
+
+ #my @prefixes = ('', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y');
+ my $i = 0;
+ while ((($size / 1024) > 1) && ($i < scalar @$sizesSymbols))
+ {
+ $size /= 1024;
+ $i++;
+ }
+ return sprintf("%.1f %s%s", $size, $sizesSymbols->[$i]);
+}
+
+sub getSafeFileName
+{
+ my $file = shift;
+
+ $file =~ s/[^-a-zA-Z0-9_.]/_/g;
+ return $file;
+}
+
+sub boolToText
+{
+ my $value = shift;
+
+ return $value ? 'true' : 'false';
+}
+
+sub listNameToNumber
+{
+ my $value = shift;
+
+ return 1 if $value =~ /single/;
+ return 2 if $value =~ /double/;
+ return 3 if $value =~ /triple/;
+ return 4 if $value =~ /quadruple/;
+ return 0;
+}
+
+sub encodeEntities
+{
+ my $value = shift;
+ $value =~ s/&/&amp;/g;
+ $value =~ s/</&lt;/g;
+ $value =~ s/>/&gt;/g;
+ $value =~ s/"/&quot;/g;
+ #"
+ return $value;
+}
+
+sub compactHistories
+{
+ my $histories;
+ foreach (keys %$histories)
+ {
+ my %allKeys;
+ @allKeys{@{$histories->{$_}}} = ();
+ my @unique = keys %allKeys;
+ $histories->{$_} = \@unique;
+ }
+}
+
+use HTML::Entities;
+# Strips readable text from RTF formatted strings
+sub RtfToString
+{
+ my ($rtfString) = @_;
+
+ my $str = $rtfString;
+
+ # First, decode any symbols present
+ $str = decode_entities($str);
+ # Strip leading {
+ $str =~ s/^\{//;
+ # Strip out all the formatting within {}'s
+ $str =~ s/\{(.)*;\}//gs;
+ # Strip trailing }
+ $str =~ s/\}$//;
+ # Get the text from "\'d5" type tags
+ $str =~ s/\\(.)d\d/$1/g;
+ # Strip out all the remaining formatting
+ $str =~ s/\\(\H)*[\s]//g;
+ # And any newlines, since they'll be randomly placed now
+ $str =~ s/\n//g;
+
+ return $str;
+}
+
+
+{
+ package GCPreProcess;
+
+ use Text::Wrap;
+
+ sub singleList
+ {
+ my $value = shift;
+ if (ref($value) eq 'ARRAY')
+ {
+ my $string = '';
+ foreach (@{$value})
+ {
+ $string .= $_->[0].', ';
+ }
+ $string =~ s/ \(\)//g;
+ $string =~ s/, $//;
+ return $string;
+ }
+ else
+ {
+ $value =~ s/,*$//;
+ $value =~ s/,([^ ])/, $1/g;
+ return $value;
+ }
+ }
+
+ sub doubleList
+ {
+ my $value = shift;
+ if (ref($value) eq 'ARRAY')
+ {
+ my $string = '';
+ foreach (@{$value})
+ {
+ my $val0 = (exists $_->[0]) ? $_->[0] : '';
+ my $val1 = '';
+ $val1 = '('.$_->[1].')' if defined ($_->[1]);
+ $string .= "$val0 $val1, ";
+ }
+ $string =~ s/ \(\)//g;
+ $string =~ s/, $//;
+ return $string;
+ }
+ else
+ {
+ $value =~ s/;/,/g if $value !~ /,/;
+ $value =~ s/;(.*?)(,|$)/ ($1)$2/g;
+ $value =~ s/,([^ ])/, $1/g;
+ $value =~ s/ \(\)//g;
+ $value =~ s/(, ?)*$//;
+ return $value;
+ }
+ }
+
+ sub otherList
+ {
+ my $value = shift;
+ if (ref($value) eq 'ARRAY')
+ {
+ my $string = '';
+ foreach my $line(@{$value})
+ {
+ $string .= $_.'|' foreach (@{$line});
+ $string .= ', ';
+ }
+ $string =~ s/, $//;
+ return $string;
+ }
+ else
+ {
+ $value =~ s/,([^ ])/, $1/g;
+ $value =~ s/(, ?)*$//;
+ return $value;
+ }
+ }
+
+ sub multipleList
+ {
+ my ($value, $number) = @_;
+
+ $number = GCUtils::listNameToNumber($number) if $number !~ /^[0-9]+$/;
+
+ return singleList($value) if $number == 1;
+ return doubleList($value) if $number == 2;
+ #We only return the first column of each line in a string
+ return otherList($value);
+ }
+
+ sub multipleListToArray
+ {
+ my $value = shift;
+ my @result;
+ if (ref($value) eq 'ARRAY')
+ {
+ foreach (@{$value})
+ {
+ push @result, $_->[0];
+ }
+ }
+ else
+ {
+ @result = split /,\s*/, $value;
+ }
+ return \@result;
+ }
+
+ sub wrapText
+ {
+ my ($widget, $text) = @_;
+ my $width = $widget->allocation->width;
+ $width -= 30;
+ (my $oneline = $text) =~ s/\n/ /gm;
+ my $layout = $widget->create_pango_layout($oneline);
+ my (undef, $rect) = $layout->get_pixel_extents;
+ my $textWidth = $rect->{width};
+ my $lines = $textWidth / $width;
+ $lines = 1 if $lines <= 0;
+ my $columns = length($text) / $lines;
+ use integer;
+ $Text::Wrap::columns = $columns - 5;
+ $Text::Wrap::columns = 1 if $Text::Wrap::columns <= 0;
+ no integer;
+ $text = Text::Wrap::wrap('', '', $text);
+ return $text;
+ }
+
+ # Useful to compare date
+ sub reverseDate
+ {
+ (my $date = shift) =~ s|([0-9]{2})/([0-9]{2})/([0-9]{4})|$3/$2/$1|;
+ return $date;
+ }
+
+ sub restoreDate
+ {
+ (my $date = shift) =~ s|([0-9]{4})/([0-9]{2})/([0-9]{2})|$3/$2/$1|;
+ return $date;
+ }
+
+ sub extractYear
+ {
+ my $date = shift;
+
+ return 0 if $date !~ /[0-9]{4}/;
+ (my $year = $date) =~ s/.*?(([0-9]{4})).*?/$1/;
+
+ return $year;
+ }
+
+ sub noNullNumber
+ {
+ my $num = shift;
+ return 0 if ($num eq '') || (! defined($num));
+ return $num;
+ }
+}
+
+sub round
+{
+ my $number = shift;
+ return int($number + .5);
+}
+
+sub urlDecode
+{
+ my $text = shift;
+ $text =~ tr/+/ /;
+ $text =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
+ return $text;
+}
+
+sub scaleMaxPixbuf
+{
+ my ($pixbuf, $maxWidth, $maxHeight, $forceScale, $quick) = @_;
+
+ my $algorithm = $quick ? 'nearest' : 'bilinear';
+
+ if ($forceScale)
+ {
+ $pixbuf = $pixbuf->scale_simple($maxWidth, $maxHeight, $algorithm);
+ }
+ else
+ {
+ my ($width, $height) = ($pixbuf->get_width, $pixbuf->get_height);
+ if (($height > $maxHeight) || ($width > $maxWidth))
+ {
+ my ($newWidth, $newHeight);
+ my $ratio = $height / $width;
+ if (($width) * ($maxHeight / $height) < $maxWidth)
+ {
+ $newHeight = $maxHeight;
+ $newWidth = $newHeight / $ratio;
+ }
+ else
+ {
+ $newWidth = $maxWidth;
+ $newHeight = $newWidth * $ratio;
+ }
+
+ $pixbuf = $pixbuf->scale_simple($newWidth, $newHeight, $algorithm);
+ }
+ }
+
+ return $pixbuf;
+}
+
+sub findPosition
+{
+ use locale;
+ my ($label, $menu) = @_;
+
+ my @children = $menu->get_children;
+ my $i = 0;
+ my $child;
+ foreach $child(@children)
+ {
+ return $i if (($i !=0) && ($child->child->get_label() gt $label));
+ $i++;
+ }
+ return $i;
+}
+
+sub inArray
+{
+ my $val = shift;
+
+ my $i = 0;
+ my $elem;
+ foreach $elem(@_)
+ {
+ if($val eq $elem)
+ {
+ return $i;
+ }
+ $i++;
+ }
+ return undef;
+}
+
+sub inArrayTest
+{
+ my $val = shift;
+ my $elem;
+ foreach $elem(@_)
+ {
+ return 1 if($val eq $elem);
+ }
+ return 0;
+}
+
+my $rc_style = Gtk2::RcStyle->new;
+
+sub setWidgetPixmap
+{
+ my ($widget, $imageFile) = @_;
+ $rc_style->bg_pixmap_name('normal', $imageFile);
+ $rc_style->bg_pixmap_name('insensitive', $imageFile);
+ $widget->modify_style($rc_style);
+
+# my $style = $widget->parent->get_style->copy;
+# $style->bg_pixmap('normal', $image);
+# $style->bg_pixmap('insensitive', $image);
+# $style->bg_pixmap('active', $image);
+# $style->bg_pixmap('prelight', $image);
+# $style->bg_pixmap('selected', $image);
+# $widget->parent->set_style($style);
+
+}
+
+use File::Basename;
+
+sub getDisplayedImage
+{
+ my ($displayedImage, $default, $file, $fileDir) = @_;
+
+ if (!File::Spec->file_name_is_absolute($displayedImage))
+ {
+ my $dir;
+ if ($file)
+ {
+ $dir = ($fileDir || dirname($file));
+ }
+ else
+ {
+ $dir = '.';
+ }
+ if (-f "$dir/$displayedImage")
+ {
+ $displayedImage = $dir.'/'.$displayedImage;
+ }
+ else
+ {
+ $displayedImage = $default unless (-e $displayedImage);
+ }
+ }
+ $displayedImage = $default if ! -f $displayedImage;
+
+ return GCUtils::pathToUnix($displayedImage);
+}
+
+use LWP::UserAgent;
+sub downloadFile
+{
+ my ($url, $dest, $settings) = @_;
+ my $browser = LWP::UserAgent->new;
+ $browser->proxy(['http'], $settings->{options}->proxy);
+ $browser->cookie_jar(HTTP::Cookies::Netscape->new(
+ 'file' => $settings->{options}->cookieJar));
+ $browser->agent($settings->{agent});
+ $browser->default_headers->referer($url);
+ $browser->get($url, ':content_file' => $dest);
+}
+
+use POSIX qw/strftime/;
+sub timeToStr
+{
+ my ($date, $format) = @_;
+ my @array=split("/", $date);
+ return $date if $#array != 2;
+ return strftime($format, 0, 0, 0, $array[0], $array[1]-1, $array[2]-1900);
+}
+
+sub TimePieceStrToTime
+{
+ my ($date, $format) = @_;
+ my $str;
+ eval {
+ my $t = Time::Piece->strptime($date, $format);
+ $str = sprintf('%02d/%02d/%4d', $t->mday, $t->mon, $t->year);
+ };
+ if ($@)
+ {
+ return $date;
+ }
+ return $str;
+}
+
+sub DateTimeFormatStrToTime
+{
+ my ($date, $format) = @_;
+ my $str;
+ eval {
+ my $dt = new DateTime::Format::Strptime(
+ pattern => $format,
+ locale => $ENV{LANG});
+ my $dt2 = $dt->parse_datetime($date);
+ $dt->pattern('%d/%m/%Y');
+ $str = $dt->format_datetime($dt2);
+ };
+ if ($@)
+ {
+ return $date;
+ }
+ return $str;
+}
+
+# Our custom natural sort function
+sub gccmp
+{
+ use locale;
+ my ($string1, $string2) = @_;
+
+ my $test1 = $string1;
+ my $test2 = $string2;
+
+ # Split strings into arrays by seperating strings from numbers
+ my $nb1 = ($test1 =~ s/(\d+)/\|$+\|/g);
+ my $nb2 = ($test2 =~ s/(\d+)/\|$+\|/g);
+
+ # If there are no numbers in the test strings, just directly compare
+ return $test1 cmp $test2
+ if ($nb1 == 0) || ($nb2 == 0);
+
+ my @test = split(/\|/,$test1);
+ my @test2 = split(/\|/,$test2);
+
+ # Compare each element in the strings
+ my $result = 0;
+ for (my $pass = 0; $pass < scalar @test; $pass++)
+ {
+ # Elements are the same, so keep searching
+ next if ($test[$pass] eq $test2[$pass]);
+
+ # If both elements are numbers, do a numerical compare
+ if (($test[$pass] =~ /\d+/) && ($test2[$pass] =~ /\d+/))
+ {
+ # Number test
+ $result = $test[$pass] <=> $test2[$pass];
+ }
+ else
+ {
+ # Test elements as strings
+ $result = lc($test[$pass]) cmp lc($test2[$pass]);
+ }
+ last;
+ }
+
+ return $result;
+}
+
+# Extended version of gccmp that also supports dates
+# Only useful for image mode as text mode handles that in a better way
+sub gccmpe
+{
+ my ($string1, $string2) = @_;
+
+ my $test1 = $string1;
+ my $test2 = $string2;
+
+ if (($test1 =~ m|([0-9]{2})/([0-9]{2})/([0-9]{4})|)
+ && ($test2 =~ m|([0-9]{2})/([0-9]{2})/([0-9]{4})|))
+ {
+ return (GCPreProcess::reverseDate($test1) cmp GCPreProcess::reverseDate($test2));
+ }
+ else
+ {
+ return gccmp($test1, $test2);
+ }
+}
+
+our $hasTimeConversion;
+BEGIN {
+ $hasTimeConversion = 1;
+ eval 'use DateTime::Format::Strptime qw/strptime/';
+ if (!$@)
+ {
+ *strToTime = \&DateTimeFormatStrToTime;
+ }
+ else
+ {
+ eval 'use Time::Piece';
+ if (!$@)
+ {
+ *strToTime = \&TimePieceStrToTime;
+ }
+ else
+ {
+ $hasTimeConversion = 0;
+ *strToTime = sub {return $_[0]};
+ *timeToStr = sub {return $_[0]};
+ }
+ }
+
+}
+
+
+1;
diff --git a/lib/gcstar/GCWidgets.pm b/lib/gcstar/GCWidgets.pm
new file mode 100644
index 0000000..f45c606
--- /dev/null
+++ b/lib/gcstar/GCWidgets.pm
@@ -0,0 +1,429 @@
+package GCWidgets;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use utf8;
+use strict;
+
+{
+ package GCRatingWidget;
+ use Gtk2;
+ use POSIX;
+ use Gtk2::Gdk::Keysyms;
+
+
+ use Glib::Object::Subclass
+ Gtk2::DrawingArea::,
+ signals => {
+ changed => {
+ method => 'do_rating_changed',
+ flags => [qw/run-first/],
+ return_type => undef, # void return
+ param_types => [], # instance and data are automatic
+ },
+ button_press_event => \&on_click,
+ button_release_event => \&on_release,
+ motion_notify_event => \&on_move,
+ leave_notify_event => \&on_leave,
+ size_request => \&do_size_request,
+ expose_event => \&on_expose,
+ focus_in_event => \&on_focus,
+ key_press_event => \&on_keypress
+ },
+ properties => [
+ Glib::ParamSpec->int (
+ 'maxStars', # name
+ 'Max Stars', # nickname
+ 'Maximum number of stars to show', #blurb
+ 0, # min
+ 100, # max
+ 10, # default
+ [qw/readable writable/] #flags
+ ),
+ Glib::ParamSpec->int (
+ 'rating', # name
+ 'Rating', # nickname
+ 'Current rating', #blurb
+ 0, # min
+ 100, # max
+ 0, # default
+ [qw/readable writable/] #flags
+ ),
+ Glib::ParamSpec->string (
+ 'direction', # name
+ 'Direction', # nickname
+ 'Direction of stars', #blurb
+ 'LTR', # default
+ [qw/readable writable/] #flags
+ ),
+ ];
+
+ use constant {
+ BORDER_WIDTH => 0,
+ };
+
+
+ sub INIT_INSTANCE {
+ my $self = shift;
+ $self->{maxStars} = 10;
+ $self->{rating} = 0;
+ $self->{direction} = 'LTR';
+
+ # Load into some pixbufs the graphics for the stars
+ $self->{pixbuf} = Gtk2::Gdk::Pixbuf->new_from_file($ENV{GCS_SHARE_DIR}.'/icons/star.png');
+ $self->{pixbufDark} = Gtk2::Gdk::Pixbuf->new_from_file($ENV{GCS_SHARE_DIR}.'/icons/stardark.png');
+ $self->{pixbufHover} = Gtk2::Gdk::Pixbuf->new_from_file($ENV{GCS_SHARE_DIR}.'/icons/star_hover.png');
+ $self->{pixbufDarkHover} = Gtk2::Gdk::Pixbuf->new_from_file($ENV{GCS_SHARE_DIR}.'/icons/stardark_hover.png');
+
+ # Grab width and height of pixbuf
+ $self->{pixbufWidth} = $self->{pixbuf}->get_width;
+ $self->{pixbufHeight} = $self->{pixbuf}->get_height;
+
+ # Allow focus
+ $self->can_focus(1);
+
+ $self->{tooltips} = Gtk2::Tooltips->new();
+
+ $self->add_events(['exposure-mask',
+ 'visibility-notify-mask',
+ 'button-press-mask',
+ 'button-motion-mask',
+ 'button-release-mask',
+ 'pointer-motion-mask',
+ 'leave-notify-mask',
+ 'key-press-mask',
+ 'enter-notify-mask']);
+ }
+
+ sub GET_PROPERTY
+ {
+ my ($self, $pspec) = @_;
+
+ if ($pspec->get_name eq 'rating')
+ {
+ return $self->{rating};
+ }
+ }
+
+ sub do_size_request
+ {
+ # Let gtk know how large we want the control to be
+ my ($self, $requisition) = @_;
+
+ $requisition->width(($self->{pixbufWidth} * $self->{maxStars}) + (BORDER_WIDTH * 2));
+ $requisition->height($self->{pixbufHeight});
+
+ # chain up to the parent class.
+ shift->signal_chain_from_overridden(@_);
+ }
+
+ sub convert_color_to_string
+ {
+ # Convert a gdk::color to an rrggbbaa hex
+ my ($color, $alpha) = @_;
+ my $color_string;
+
+ $color_string = sprintf("%.2X", floor($color->red /256))
+ . sprintf("%.2X", floor($color->green/256))
+ . sprintf("%.2X", floor($color->blue /256))
+ . sprintf("%.2X", $alpha);
+
+ return $color_string;
+ }
+
+ sub draw_stars
+ {
+ # Draw the stars on the control
+ my ($self, $coloredStars, $glowingStars) = @_;
+
+ # Make sure we don't try to draw the control before the background has been saved
+ if ( $self->{blankPixbuf} )
+ {
+
+ my $targetPixbuf = $self->{blankPixbuf}->copy;
+ my $starPixbuf;
+
+ # For each star, determine which pixbuf to use
+
+ for(my $count = 0; $count < $self->{maxStars}; $count++)
+ {
+ if ($count < $glowingStars)
+ {
+ $starPixbuf = ($count < $coloredStars) ? $self->{pixbufHover}
+ : $self->{pixbufDarkHover};
+ }
+ else
+ {
+ $starPixbuf = ($count < $coloredStars) ? $self->{pixbuf}
+ : $self->{pixbufDark};
+ }
+
+ # Put the star in the proper place
+ if ($self->{direction} eq 'LTR')
+ {
+ # Left to Right
+ $starPixbuf->composite($targetPixbuf,
+ (($count * $self->{pixbufWidth}) + BORDER_WIDTH), 0,
+ $self->{pixbufWidth} , $self->{pixbufHeight},
+ (($count * $self->{pixbufWidth}) + BORDER_WIDTH), 0,
+ 1, 1,
+ 'nearest', 255);
+ }
+ else
+ {
+ # Right to Left
+ $starPixbuf->composite($targetPixbuf,
+ $self->allocation->width - ((($count + 1) * $self->{pixbufWidth}) + BORDER_WIDTH), 0,
+ $self->{pixbufWidth} , $self->{pixbufHeight},
+ $self->allocation->width - ((($count + 1) * $self->{pixbufWidth}) + BORDER_WIDTH), 0,
+ 1, 1,
+ 'nearest', 255);
+ }
+ }
+
+ # Fill the drawable with our generated pixbuf of the stars
+ $self->realize;
+ my $windowgc = Gtk2::Gdk::GC->new($self->window);
+ $targetPixbuf->render_to_drawable($self->window,
+ $windowgc,
+ 0, 0, 0, 0,
+ $self->allocation->width,
+ $self->allocation->height,
+ 'normal', 0,0);
+ }
+ }
+
+ sub coordToNumberStars
+ {
+ # Translate an x-coordinate to how many stars it represents
+ my ($self, $x) = @_;
+
+ if ($self->{direction} ne 'LTR')
+ {
+ # Right to Left, easiest just to flip to coordinate over
+ $x = $self->allocation->width - $x;
+ }
+
+ if ($x < ($self->{pixbufWidth} / 3))
+ {
+ # We reserve the first 1/3 of a star to mean "no stars selected"
+ return 0;
+ }
+ else
+ {
+ my $value = ceil($x / $self->{pixbufWidth});
+ return ($value <= $self->{maxStars}) ? $value : $self->{maxStars};
+ }
+ }
+
+ sub on_expose
+ {
+ # Called when control is first drawn
+ my ($self, $event) = @_;
+
+ # Make a small (1x1) pixbuf of the empty control
+ $self->{blankPixbuf} = Gtk2::Gdk::Pixbuf->new('rgb', 1, 8,
+ 1,
+ 1);
+
+ # Now, grab the first tiny section of the empty region. We can't grab the whole
+ # thing, because it might not be visible, and it would get filled with random data
+ $self->{blankPixbuf}->get_from_drawable($self->window, $self->get_colormap(),
+ 0, 0, 0, 0,
+ 1,
+ 1);
+
+ # Now, resize this pixbuf to the full size of the control
+ $self->{blankPixbuf} = $self->{blankPixbuf}->scale_simple($self->allocation->width,
+ $self->allocation->height,
+ 'nearest');
+
+ # Draw the initial control
+ if ($self->has_focus)
+ {
+ # If control is initially focused, make sure we highlight selected stars
+ my $starsSelected;
+ $starsSelected = ($self->{rating} eq 0) ? 1
+ : $self->{rating};
+ $self->draw_stars($self->{rating}, $starsSelected);
+ }
+ else
+ {
+ $self->draw_stars($self->{rating}, 0);
+ }
+
+ return 0;
+ }
+
+ sub on_leave
+ {
+ # Called when mouse leaves the control, remove all highlighting
+ my ($self, $event) = @_;
+
+ if ($self->has_focus)
+ {
+ # If control is still focused, leave highlight on selected stars
+ my $starsSelected;
+ $starsSelected = ($self->{rating} eq 0) ? 1
+ : $self->{rating};
+ $self->draw_stars($self->{rating}, $starsSelected );
+ }
+ elsif ($event->mode() eq "normal")
+ {
+ # React to mouse leaving the control when control not focused, clear all highlights
+ $self->{starsGlowing} = 0;
+ $self->draw_stars($self->{rating}, 0);
+ }
+ }
+
+ sub on_click
+ {
+ # Called when mouse button pressed down, set rating
+ my ($self, $event) = @_;
+
+ my $starsSelected = $self->coordToNumberStars($event->x);
+
+ if ($starsSelected ne $self->{rating})
+ {
+ $self->{rating} = $starsSelected;
+ $self->{starsGlowing} = $starsSelected;
+ $self->draw_stars($self->{rating}, $self->{starsGlowing});
+ $self->signal_emit ("changed");
+ }
+
+ $self->grab_focus;
+ }
+
+ sub on_release
+ {
+ # Called when mouse button released, set rating
+ my ($self, $event) = @_;
+
+ my $starsSelected = $self->coordToNumberStars($event->x);
+
+ if ($starsSelected ne $self->{rating})
+ {
+ $self->{rating} = $starsSelected;
+ $self->{starsGlowing} = $starsSelected;
+ $self->draw_stars($self->{rating}, $self->{starsGlowing});
+ $self->signal_emit ("changed");
+ }
+ }
+
+ sub on_move
+ {
+ # Called when mouse moves on control, change star highlighting if needed
+ my ($self, $event) = @_;
+
+ my $starsSelected = $self->coordToNumberStars($event->x);
+
+ if ($starsSelected ne $self->{starsGlowing})
+ {
+ $self->{starsGlowing} = $starsSelected;
+ $self->draw_stars($self->{rating}, $self->{starsGlowing});
+ $self->createTooltip($self->{starsGlowing});
+ }
+ }
+
+ sub createTooltip
+ {
+ my ($self, $tipValue) = @_;
+
+ if ($self->{direction} eq 'LTR')
+ {
+ $self->{tooltips}->set_tip($self, $tipValue."/".$self->{maxStars});
+ }
+ else
+ {
+ # Hmmm - not sure if a / is the right symbol to use for rtl languages, perhaps it should be a \ ?
+ $self->{tooltips}->set_tip($self, $self->{maxStars}."/".$tipValue);
+ }
+ }
+
+ sub on_focus
+ {
+ # Called when control focused, change star highlighting
+ my ($self, $event) = @_;
+
+ if ($self->{rating} > 0)
+ {
+ $self->draw_stars($self->{rating}, $self->{rating});
+ }
+ else
+ {
+ # If no stars are filled in, we'll just highlight the first star to show control is focused
+ $self->draw_stars($self->{rating}, 1);
+ }
+
+ }
+
+ sub on_keypress
+ {
+ # Called when key pressed
+ my ($self, $event) = @_;
+
+ if ( ($event->keyval eq $Gtk2::Gdk::Keysyms{Right}) && ($self->{direction} eq 'LTR') ||
+ ($event->keyval eq $Gtk2::Gdk::Keysyms{Left}) && ($self->{direction} ne 'LTR') )
+ {
+ # Increase rating
+ $self->{rating}++ if $self->{rating} < $self->{maxStars};
+ $self->draw_stars($self->{rating}, $self->{rating});
+ $self->signal_emit ("changed");
+
+ # Cancel key propagation
+ return 1;
+ }
+ elsif ( ($event->keyval eq $Gtk2::Gdk::Keysyms{Left}) && ($self->{direction} eq 'LTR') ||
+ ($event->keyval eq $Gtk2::Gdk::Keysyms{Right}) && ($self->{direction} ne 'LTR') )
+ {
+ # Decrease rating
+ $self->{rating}-- if $self->{rating} > 0;
+ if ($self->{rating} > 0)
+ {
+ # If no stars are filled in, we'll just highlight the first star to show control is focused
+ $self->draw_stars($self->{rating}, $self->{rating});
+ }
+ else
+ {
+ $self->draw_stars($self->{rating}, 1);
+ }
+ $self->signal_emit ("changed");
+
+ # Cancel propagation
+ return 1;
+ }
+ }
+
+ sub set_rating
+ {
+ # Manual way of setting rating
+ my ($self, $rating) = @_;
+
+ $self->{rating} = $rating;
+ $self->draw_stars($self->{rating}, 0);
+ $self->signal_emit ('changed');
+ }
+}
+
+1;
+
diff --git a/man/gcstar.1 b/man/gcstar.1
new file mode 100644
index 0000000..bb0fa1b
--- /dev/null
+++ b/man/gcstar.1
@@ -0,0 +1,92 @@
+.TH GCSTAR 1 "17 August 2006" "GCstar" "Linux User's Manual"
+.SH NAME
+GCstar \- Personal collection manager
+.SH SYNOPSIS
+.B gcstar
+[\-u UPDATE-OPTIONS] [\-x EXECUTE-OPTIONS] [FILENAME]
+.SH DESCRIPTION
+.B GCstar
+is a Gtk2 program used to manage personal collections.
+.SH OPTIONS
+Without any option, it will open FILENAME if specified or the previously
+opened file. There are also two groups of options.
+
+.SS UPDATE-OPTIONS
+.TP
+.B "\-u, \-\-update"
+Tell GCstar to look for available updates
+.TP
+.B "\-a, \-\-all"
+Update all components
+.TP
+.B "\-c, \-\-collection"
+Update collection models
+.TP
+.B "\-w, \-\-website"
+Update plugins to download information
+.TP
+.B "\-i, \-\-import"
+Update plugins to import data
+.TP
+.B "\-e, \-\-export"
+Update plugins to export data
+.TP
+.B "\-l, \-\-lang"
+Update translations
+.TP
+.B "\-n, \-\-noproxy"
+Don't ask for a proxy
+.SS EXECUTE-OPTIONS
+.TP
+.B "\-x, \-\-execute"
+Enter non-interactive mode
+.TP
+.B "\-c, \-\-collection MODEL"
+Specify the collection type
+.TP
+.B "\-w, \-\-website PLUGIN"
+Specify the plugin to use to download information
+.TP
+.B "\-i, \-\-import PLUGIN"
+Specify the plugin to use to import a collection
+.TP
+.B "\-e, \-\-export PLUGIN"
+Specify the plugin to use to export the collection
+.TP
+.B "\-f, \-\-fields FILENAME"
+File containing fields list to use for import/export
+.TP
+.B "\-o, \-\-output FILENAME"
+Write output in FILENAME instead of standard output
+.TP
+.B "\-\-download TITLE"
+Search for the item with TITLE as name
+.TP
+.B "\-\-importprefs PREFERENCES"
+Preferences for the import plugin
+.TP
+.B "\-\-exportprefs PREFERENCES"
+Preferences for the export plugin
+.P
+.TP
+Preferences for import/export plugins are specified using this schema
+Key1=>Value1,Key2=>Value2
+.SH ENVIRONMENT
+.TP
+.B HOME
+Used to define following variables if needed
+.TP
+.B XDG_CONFIG_HOME
+Where configuration files should be stored. If not defined: $HOME/.config
+.TP
+.B XDG_DATA_HOME
+Where some data will be stored. If not defined: $HOME/.local/share
+.SH BUGS REPORTING
+To report bugs, please use this forum:
+.P
+http://forums.gcstar.org/viewforum.php?id=4
+.SH AUTHORS
+.TP
+Tian <tian@c-sait.net>
+.P
+http://www.gcstar.org/
diff --git a/packages/GCstar_Packaging_Policy.txt b/packages/GCstar_Packaging_Policy.txt
new file mode 100644
index 0000000..3e3ba41
--- /dev/null
+++ b/packages/GCstar_Packaging_Policy.txt
@@ -0,0 +1,33 @@
+****************************
+* GCstar PACKAGING POLICY *
+****************************
+
+-= 0. INTRODUCTION =-
+This file is intented to show distributors how we like GCstar to be included in distributions. This includes Description, Logo images, classification under menus, etc.
+
+-= 1. SHORT DESCRIPTION =-
+Manage your collections of movies, games, books, music and more
+
+-= 2. LONG DESCRIPTION =-
+GCstar is an application for managing your collections. It supports many types of collections, including movies, books, games, comics, stamps, coins, and many more. You can even create your own collection type for whatever unique thing it is that you collect! Detailed information on each item can be automatically retrieved from the internet and you can store additional data, such as the location or who you've lent it to. You may also search and filter your collections by many criteria.
+
+-= 3. LOGO ICON =-
+You can find icons under:
+PNG Version -> gcstar_src/share/gcstar/icons/gcstar_*.png (several sizes available)
+ICO Version -> gcstar_src/share/gcstar/icons/GCstar.ico
+
+-= 4. APPLICATIONS MENU CATEGORY =-
+Following freedesktop standards, GCstar should be located under the Office categories on menus.
+There's also the option to be under Databases, where there's no office section.
+
+FreeDesktop.org (GNOME/KDE/.desktop) -> Categories=Office;
+Debian (and related, debian/menu) -> section="Apps/Databases"
+
+
+
+-= ChangeLog =-
+
+2007-02-11 Christian Jodar <tian@gcstar.org>
+ * Adaptation to GCstar
+2005-08-27 19:21 Adolfo González Blázquez <agblazquez@telefonica.net>
+ * Initial release
diff --git a/packages/debian/changelog b/packages/debian/changelog
new file mode 100644
index 0000000..11e8c4d
--- /dev/null
+++ b/packages/debian/changelog
@@ -0,0 +1,5 @@
+gcstar (1.5.0-1ubuntu1) jaunty; urgency=low
+
+ * Initial release
+
+ -- Nyall <nyall@zombiepigs.net> Sun, 20 Sep 2009 10:27:40 -0300
diff --git a/packages/debian/compat b/packages/debian/compat
new file mode 100644
index 0000000..7f8f011
--- /dev/null
+++ b/packages/debian/compat
@@ -0,0 +1 @@
+7
diff --git a/packages/debian/control b/packages/debian/control
new file mode 100644
index 0000000..2085fb1
--- /dev/null
+++ b/packages/debian/control
@@ -0,0 +1,25 @@
+Source: gcstar
+Section: x11
+Priority: optional
+Maintainer: Alexander Wirt <formorer@debian.org>, Nyall <nyall@zombiepigs.net>
+Build-Depends-Indep: libgtk2-perl, libwww-perl, libxml-parser-perl, libxml-simple-perl, libmp3-tag-perl, libogg-vorbis-header-pureperl-perl
+Build-Depends: debhelper (>= 7), dpatch
+Standards-Version: 3.8.0
+Homepage: http://www.gcstar.org/
+
+Package: gcstar
+Architecture: all
+Depends: libgtk2-perl, libwww-perl, libarchive-tar-perl, libxml-simple-perl, libxml-parser-perl, libarchive-zip-perl, libmp3-tag-perl, libogg-vorbis-header-pureperl-perl, libgd-gd2-perl, libgd-graph-perl, libgd-text-perl, libdate-calc-perl, ${perl:Depends}
+Recommends: libgtk2-spell-perl, libdatetime-format-strptime-perl, libmp3-info-perl, libcddb-perl, libnet-freedb-perl
+Provides: gcfilms
+Replaces: gcfilms
+Conflicts: gcfilms (<= 6.4)
+Description: Manage your collections of movies, games, books, music and more
+ GCstar is an application for managing your collections. It supports
+ many types of collections, including movies, books, games, comics,
+ stamps, coins, and many more. You can even create your own
+ collection type for whatever unique thing it is that you collect!
+ Detailed information on each item can be automatically retrieved
+ from the internet and you can store additional data, such as the
+ location or who you've lent it to. You may also search and filter
+ your collections by many criteria.
diff --git a/packages/debian/copyright b/packages/debian/copyright
new file mode 100644
index 0000000..13dd2bf
--- /dev/null
+++ b/packages/debian/copyright
@@ -0,0 +1,26 @@
+This package was debianized by Alexander Wirt <formorer@debian.org> on
+Sat, 14 Okt 2006 10:26:18 +0200.
+
+It was downloaded from http://download.gna.org/gcstar/
+
+Copyright Holder: Tian tian@c-sait.net
+
+License:
+
+ This package 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 package is distributed in the hope that 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 package; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301, USA.
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.
diff --git a/packages/debian/dirs b/packages/debian/dirs
new file mode 100644
index 0000000..e772481
--- /dev/null
+++ b/packages/debian/dirs
@@ -0,0 +1 @@
+usr/bin
diff --git a/packages/debian/docs b/packages/debian/docs
new file mode 100644
index 0000000..e8d31ce
--- /dev/null
+++ b/packages/debian/docs
@@ -0,0 +1,3 @@
+README
+README.fr
+CHANGELOG.fr
diff --git a/packages/debian/gcstar.install b/packages/debian/gcstar.install
new file mode 100644
index 0000000..e16d720
--- /dev/null
+++ b/packages/debian/gcstar.install
@@ -0,0 +1,2 @@
+share/applications/gcstar.desktop /usr/share/applications/
+debian/gcstar_logo.xpm /usr/share/pixmaps/
diff --git a/packages/debian/gcstar_logo.xpm b/packages/debian/gcstar_logo.xpm
new file mode 100644
index 0000000..d11f79e
--- /dev/null
+++ b/packages/debian/gcstar_logo.xpm
@@ -0,0 +1,291 @@
+/* XPM */
+static char *gcstar_logo[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 253 2",
+" c #05101A",
+". c #195082",
+"X c #255683",
+"o c #2772B9",
+"O c #2872B9",
+"+ c #1A84EC",
+"@ c #1F89ED",
+"# c #2F85D5",
+"$ c #2A84DA",
+"% c #3884CC",
+"& c #3D88C8",
+"* c #3185D4",
+"= c #3189DD",
+"- c #388ED0",
+"; c #3B8EDF",
+": c #3D91CC",
+"> c #2385E2",
+", c #2087ED",
+"< c #238BED",
+"1 c #2887E1",
+"2 c #2C8AE1",
+"3 c #2A8DED",
+"4 c #2391ED",
+"5 c #2B91ED",
+"6 c #328EE6",
+"7 c #3293ED",
+"8 c #3399EE",
+"9 c #3E96E5",
+"0 c #3995EC",
+"q c #3B98E6",
+"w c #3C99ED",
+"e c #3799F0",
+"r c #3D9AF0",
+"t c #3FA0F1",
+"y c #4C86B8",
+"u c #5086B4",
+"i c #669D9E",
+"p c #738EA2",
+"a c #6DA09A",
+"s c #75A28D",
+"d c #71A298",
+"f c #60A0B6",
+"g c #4085C5",
+"h c #4389C9",
+"j c #4695CB",
+"k c #439ADF",
+"l c #4A9CDD",
+"z c #4095E2",
+"x c #459BE5",
+"c c #429CEC",
+"v c #4B9DE4",
+"b c #499EEA",
+"n c #409AF0",
+"m c #519DE1",
+"M c #509FE8",
+"N c #4EA0DE",
+"B c #55A2D3",
+"V c #51A0D9",
+"C c #5BA3D2",
+"Z c #5BA4DC",
+"A c #46A0ED",
+"S c #4CA1E4",
+"D c #4CA1EC",
+"F c #44A2F0",
+"G c #4BA3F0",
+"H c #52A1E3",
+"J c #53A5EC",
+"K c #5BA5E5",
+"L c #59A7EC",
+"P c #5EA9E5",
+"I c #5BA9EB",
+"U c #51A5F1",
+"Y c #56A9F2",
+"T c #59ACF2",
+"R c #62A7CC",
+"E c #60A7D3",
+"W c #61A5DE",
+"Q c #62A8D0",
+"! c #62A9D8",
+"~ c #6BADD5",
+"^ c #6AA9DC",
+"/ c #71AAD8",
+"( c #74B1D5",
+") c #73B2DB",
+"_ c #7AB4D4",
+"` c #61A6E1",
+"' c #62A9E5",
+"] c #63ADEA",
+"[ c #69ADE0",
+"{ c #61ADF2",
+"} c #68AFF2",
+"| c #69B0EA",
+" . c #63B2F3",
+".. c #6CB5F3",
+"X. c #6DB8F4",
+"o. c #75B4E4",
+"O. c #70B7F4",
+"+. c #73BAF4",
+"@. c #7AB7F0",
+"#. c #7DBEF4",
+"$. c #7DC0F5",
+"%. c #8C9576",
+"&. c #899379",
+"*. c #8AA277",
+"=. c #90A671",
+"-. c #AB8F55",
+";. c #A5945B",
+":. c #B28850",
+">. c #BE9D41",
+",. c #ADAB53",
+"<. c #BEA141",
+"1. c #B9A846",
+"2. c #BFBB41",
+"3. c #BBBA4A",
+"4. c #B4AF7E",
+"5. c #C1AE3E",
+"6. c #D6AF2D",
+"7. c #DCA322",
+"8. c #DEA12B",
+"9. c #ED9911",
+"0. c #FD8900",
+"q. c #FD8E0A",
+"w. c #F98F11",
+"e. c #F1950F",
+"r. c #FD9200",
+"t. c #FD9C00",
+"y. c #F79219",
+"u. c #FD9313",
+"i. c #E18F2B",
+"p. c #EE9D37",
+"a. c #F49421",
+"s. c #F09B32",
+"d. c #E2AF1C",
+"f. c #ECA118",
+"g. c #EABF13",
+"h. c #FDA300",
+"j. c #FDAC00",
+"k. c #FDB300",
+"l. c #FDBB00",
+"z. c #FDA133",
+"x. c #D19242",
+"c. c #D6A059",
+"v. c #D4BB5E",
+"b. c #C9A675",
+"n. c #DDB67A",
+"m. c #DDB87F",
+"M. c #E6A754",
+"N. c #FDAC48",
+"B. c #FBAF55",
+"V. c #FDB646",
+"C. c #FDBB4B",
+"Z. c #FDBD5A",
+"A. c #FCB661",
+"S. c #FDBA60",
+"D. c #DBC523",
+"F. c #EFCC0E",
+"G. c #EBC013",
+"H. c #E8C816",
+"J. c #FDC300",
+"K. c #FDCC00",
+"L. c #FDD000",
+"P. c #F7CA47",
+"I. c #FDC55A",
+"U. c #F7D357",
+"Y. c #F8C66D",
+"T. c #F9CC6C",
+"R. c #F9CC78",
+"E. c #F7D873",
+"W. c #909083",
+"Q. c #9FAF90",
+"!. c #8EB4A1",
+"~. c #87B3BE",
+"^. c #AEA488",
+"/. c #A5AF9E",
+"(. c #B0A185",
+"). c #BDBB9B",
+"_. c #87A7C2",
+"`. c #88B4CC",
+"'. c #8BB8CC",
+"]. c #80B7D9",
+"[. c #95BCC9",
+"{. c #81BDF3",
+"}. c #BAC7BD",
+"|. c #83C3F6",
+" X c #89C4F5",
+".X c #89C8F6",
+"XX c #9AC6E5",
+"oX c #96CBF7",
+"OX c #94CDF8",
+"+X c #9ACCF5",
+"@X c #96D0F8",
+"#X c #9BD3F8",
+"$X c #A0C6DD",
+"%X c #A8CCD1",
+"&X c #BDC2C5",
+"*X c #B3D3D3",
+"=X c #A2CAE9",
+"-X c #A4D3F2",
+";X c #A0D5F8",
+":X c #A6D9F9",
+">X c #ADD4F5",
+",X c #A9D6F8",
+"<X c #AEDAF1",
+"1X c #ABDBF9",
+"2X c #B4D8E9",
+"3X c #BDDBE6",
+"4X c #B2DBF6",
+"5X c #B3DCF9",
+"6X c #B7E1F7",
+"7X c #B4E0FA",
+"8X c #B8E0FA",
+"9X c #C6B896",
+"0X c #CCBD9A",
+"qX c #D7B682",
+"wX c #DAB884",
+"eX c #DBBE8D",
+"rX c #D2BF97",
+"tX c #C9CDBF",
+"yX c #C2D1BA",
+"uX c #CAD1B5",
+"iX c #D2C3A0",
+"pX c #D6CCB1",
+"aX c #DCE1BD",
+"sX c #FDCB87",
+"dX c #FECC8E",
+"fX c #FCD180",
+"gX c #FAD49F",
+"hX c #FDD891",
+"jX c #F1CFA8",
+"kX c #FCDDAC",
+"lX c #F2D8BC",
+"zX c #FDDEBD",
+"xX c #F6E19E",
+"cX c #FAE39B",
+"vX c #F9E89F",
+"bX c #EDE2AD",
+"nX c #F3E3A3",
+"mX c #F6E3AC",
+"MX c #FBE3A3",
+"NX c #FBE2AC",
+"BX c #FDE8A5",
+"VX c #FDEAA9",
+"CX c #FCE2B4",
+"ZX c #FDE1BA",
+"AX c #C0D6DA",
+"SX c #D1D8D1",
+"DX c #C1DFF7",
+"FX c #D4E0C9",
+"GX c #C2E2F3",
+"HX c #C6E3F8",
+"JX c #CBE4F8",
+"KX c #D5E9F8",
+"LX c None",
+/* pixels */
+"LXLXLXLXLXLXLXLXLXLXLXLXm m e 8 7 7 9 9 LXLXLXLXLXLXLXLXLXLXLXLX",
+"LXLXLXLXLXLXLXLXLXLXm 9 < < 3 5 4 4 @ , 6 c LXLXLXLXLXLXLXLXLXLX",
+"LXLXLXLXLXLXLXLXm 3 < 8 T X.+.+.X.X.Y b e 4 4 0 LXLXLXLXLXLXLXLX",
+"LXLXLXLXLXLXLXZ , < Y $..X.X$.X.T T T T G n 3 4 c LXLXLXLXLXLXLX",
+"LXLXLXLXLXLXb 3 w +.#X@X+.Z h g * $ , 3 w G n e < 5 LXLXLXLXLXLX",
+"LXLXLXLXLX` 3 3 #.#X#Xo.W.:.x.c.b.(.p * @ 8 b n 5 < b LXLXLXLXLX",
+"LXLXLXLXK 3 7 O.1X-X(.i.N.sXCXZXZXzXZXjX_.6 6 U t 5 < x LXLXLXLX",
+"LXLXLXLX0 < L #X<X9Xa.Z.kXzXZXCXzXzXzXzXlX&X6 n .8 4 5 LXLXLXLX",
+"LXLXLXJ 3 5 @X7X0Xa.dXZXzXNXZXCXCXCXCXzXZXkXtXv ] X.5 4 S LXLXLX",
+"LXLXK 0 < G 5X5Xp.B.ZXZXzXNXCXCXkXNXNXNXCXkXkX}.c XF @ 8 I LXLX",
+"LXLXK 3 7 #.4X0Xz.jXCXCXNXNXBXMXxXMXnXMXMXMXMXBX`.@.|.8 4 P LXLX",
+"LXLXc 3 w oX3XM.Z.NXNXVXMXMXMXBXcXgXvXgXMXMXBXMXuXo.>XU 4 S LXLX",
+"LXLXr < U :XSXy.hXVXxXnXvXnXxXcXcXcXcXcXvXBXBXVXmX'.KX#.4 q LXLX",
+"LXLX6 < { 1XiXw.hXVXgXMXbXFXaXnXvXcXcXcXBXBXVXVXVXyXJX,X4 5 LXLX",
+"LXLX1 , ..8XwX0.Z.fXR.Y.[.) [ /.V.C.I.T.%X*XxXBXVXnX<XHX4 4 LXLX",
+"LXLX1 , O.5Xm.0.q.u.u.u.= + @ u r.t.h.7.5 q v.P.E.U.=XJX5 4 LXLX",
+"LXLX2 , ..8XwX0.0.0.0.0.$ + + # t.t.h.<.+ + 1.l.l.J.$XDX5 5 LXLX",
+"LXLX1 , } 5XeX0.0.0.0.0.y + + & t.h.j.<.+ + 5.J.K.K.XX>X5 5 LXLX",
+"LXLX6 , b 1XpXy.0.0.0.0.-.# > &.h.j.k.d.> > g.K.K.H.+X X8 5 LXLX",
+"LXLXe < n oXSXs.0.0.r.r.9.;.%.7.j.k.k.l.*.*.K.K.K.3.>X+.5 w LXLX",
+"LXLXr < 3 O.DXwXr.r.t.t.h.h.j.k.l.l.l.J.K.K.L.L.H.!.@XY 5 N LXLX",
+"LXLXb 3 , U <XAXe.r.t.t.h.j.k.k.l.l.J.K.K.K.L.L.3._ $.A 5 C LXLX",
+"LXLXm n , 3 |.8X).f.h.j.j.k.l.l.J.J.K.L.L.L.L.D.C |.Y 8 q C LXLX",
+"LXLXLXm , @ Y OX2X4.j.k.k.l.l.l.J.K.L.L.L.L.D.a .+.A 4 N LXLXLX",
+"LXLXLXLX7 < 3 Y ;X,X/.6.l.l.K.K.L.L.L.L.F.v.j G O.T < 7 LXLXLXLX",
+"LXLXLXLXx < , 7 +.;X-X~.,.g.K.L.L.L.L.D.s : b .. .e 4 l LXLXLXLX",
+"LXLXLXLXLXx , , 7 T oX1X|.L f d s i : < q T +. .5 < l LXLXLXLXLX",
+"LXLXLXLXLXLX7 , < 3 T {.#X;X|.X.Y G T .$.$.G 8 < 5 LXLXLXLXLXLX",
+"LXLXLXLXLXLXLXx , , , 0 G } #.|..X.X$...b 7 4 < 9 LXLXLXLXLXLXLX",
+"LXLXLXLXLXLXLXLXn 3 , , 3 7 e r w w 7 8 5 < 3 w LXLXLXLXLXLXLXLX",
+"LXLXLXLXLXLXLXLXLXLXc 7 < 3 3 7 5 3 3 4 5 q LXLXLXLXLXLXLXLXLXLX",
+"LXLXLXLXLXLXLXLXLXLXLXLXr r 3 7 7 7 r n c LXLXLXLXLXLXLXLXLXLXLX"
+};
diff --git a/packages/debian/lintian/gcstar b/packages/debian/lintian/gcstar
new file mode 100644
index 0000000..41006db
--- /dev/null
+++ b/packages/debian/lintian/gcstar
@@ -0,0 +1,2 @@
+gcstar: script-not-executable ./usr/share/gcstar/helpers/xdg-open
+gcstar: script-not-executable ./usr/share/gcstar/xslt/applyXSLT.pl
diff --git a/packages/debian/menu b/packages/debian/menu
new file mode 100644
index 0000000..d61295c
--- /dev/null
+++ b/packages/debian/menu
@@ -0,0 +1 @@
+?package(gcfilms):needs="X11" section="Apps/Office" title="gcfilms" command="/usr/bin/gcfilms" icon="/usr/share/gcfilms/gcfilms.png"
diff --git a/packages/debian/patches/00list b/packages/debian/patches/00list
new file mode 100644
index 0000000..f67ce62
--- /dev/null
+++ b/packages/debian/patches/00list
@@ -0,0 +1,5 @@
+01-set_usr_lib.dpatch
+02gzip-manpage.dpatch
+03_change_default_browser.dpatch
+04-install-set_usr_lib
+07_fix_manpath.dpatch
diff --git a/packages/debian/patches/01-set_usr_lib.dpatch b/packages/debian/patches/01-set_usr_lib.dpatch
new file mode 100644
index 0000000..8fd45ca
--- /dev/null
+++ b/packages/debian/patches/01-set_usr_lib.dpatch
@@ -0,0 +1,26 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## test.dpatch by <nyall@crackfox>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+diff -urNad gcstarzombiepig-1.6~/bin/gcstar gcstarzombiepig-1.6/bin/gcstar
+--- gcstarzombiepig-1.6~/bin/gcstar 2009-09-20 17:12:25.000000000 -0300
++++ gcstarzombiepig-1.6/bin/gcstar 2009-09-20 17:29:43.000000000 -0300
+@@ -44,12 +44,12 @@
+ use POSIX qw(locale_h);
+
+ $ENV{GCS_BIN_DIR} = $RealBin;
+-($ENV{GCS_LIB_DIR} = $ENV{GCS_BIN_DIR}) =~ s/bin\/?$/lib\/gcstar/;
++($ENV{GCS_LIB_DIR} = $ENV{GCS_BIN_DIR}) =~ s/bin\/?$/share\/gcstar\/lib/;
+ ($ENV{GCS_SHARE_DIR} = $ENV{GCS_BIN_DIR}) =~ s/bin\/?$/share\/gcstar/;
+-use lib File::Spec->canonpath("$RealBin/../lib/gcstar");
++use lib File::Spec->canonpath("$RealBin/../share/gcstar/lib");
+ if (exists $ENV{PAR_TEMP})
+ {
+- unshift @INC, "$RealBin/../lib/gcstar";
++ unshift @INC, "$RealBin/../share/gcstar/lib";
+ }
+
+ # For win32, redirect all the output to files
diff --git a/packages/debian/patches/02gzip-manpage.dpatch b/packages/debian/patches/02gzip-manpage.dpatch
new file mode 100644
index 0000000..6829218
--- /dev/null
+++ b/packages/debian/patches/02gzip-manpage.dpatch
@@ -0,0 +1,19 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 02gzip-manpage.dpatch by Alexander Wirt <formorer@debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+diff -urNad gcstar-0.4.1~/install gcstar-0.4.1/install
+--- gcstar-0.4.1~/install 2006-10-14 09:25:28.000000000 +0200
++++ gcstar-0.4.1/install 2006-10-14 09:25:36.000000000 +0200
+@@ -145,7 +145,7 @@
+ mkpath $baseDir.'/man/man1';
+ my $manPage = "$baseDir/man/man1/$binName.1";
+ copy 'man/gcstar.1', $manPage;
+- `gzip -f $manPage 2>&1 >/dev/null`;
++ `gzip -f -9 $manPage 2>&1 >/dev/null`;
+
+ chmod 0755, $baseDir.'/bin/'.$binName;
+
diff --git a/packages/debian/patches/03_change_default_browser.dpatch b/packages/debian/patches/03_change_default_browser.dpatch
new file mode 100644
index 0000000..fbc093b
--- /dev/null
+++ b/packages/debian/patches/03_change_default_browser.dpatch
@@ -0,0 +1,19 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 03_change_default_browser.dpatch by Alexander Wirt <formorer@debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+diff -urNad gcstar-1.2.0~/lib/gcstar/GCOptions.pm gcstar-1.2.0/lib/gcstar/GCOptions.pm
+--- gcstar-1.2.0~/lib/gcstar/GCOptions.pm 2007-08-18 14:41:14.000000000 +0200
++++ gcstar-1.2.0/lib/gcstar/GCOptions.pm 2007-09-08 22:33:51.000000000 +0200
+@@ -122,7 +122,7 @@
+ autosave => 1,
+ noautoload => 0,
+ programs => "system",
+- browser => "firefox",
++ browser => "x-www-browser",
+ player => "mplayer",
+ audio => "xmms",
+ file => "",
diff --git a/packages/debian/patches/04-install-set_usr_lib.dpatch b/packages/debian/patches/04-install-set_usr_lib.dpatch
new file mode 100644
index 0000000..0a8dc3a
--- /dev/null
+++ b/packages/debian/patches/04-install-set_usr_lib.dpatch
@@ -0,0 +1,21 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## test.dpatch by <nyall@crackfox>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+diff -urNad gcstar~/install gcstar/install
+--- gcstar~/install 2009-09-20 20:49:02.000000000 -0300
++++ gcstar/install 2009-09-20 20:50:50.000000000 -0300
+@@ -196,8 +196,8 @@
+ chmod 0755, $baseDir.'/bin/'.$binName;
+
+ #Copying lib
+- verbosePrint $lang{InstallCopyDirectory}, $baseDir.'/lib/gcstar';
+- recursiveCopy('lib/gcstar', $baseDir.'/lib/gcstar');
++ verbosePrint $lang{InstallCopyDirectory}, $baseDir.'/share/gcstar/lib';
++ recursiveCopy('lib/gcstar', $baseDir.'/share/gcstar/lib');
+
+ #Copying share
+ verbosePrint $lang{InstallCopyDirectory}, $baseDir.'/share/gcstar';
diff --git a/packages/debian/patches/07_fix_manpath.dpatch b/packages/debian/patches/07_fix_manpath.dpatch
new file mode 100644
index 0000000..53fb281
--- /dev/null
+++ b/packages/debian/patches/07_fix_manpath.dpatch
@@ -0,0 +1,19 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## test.dpatch by <nyall@crackfox>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+diff -urNad gcstarzombiepig-1.6~/install gcstarzombiepig-1.6/install
+--- gcstarzombiepig-1.6~/install 2009-09-20 17:32:03.000000000 -0300
++++ gcstarzombiepig-1.6/install 2009-09-20 17:33:56.000000000 -0300
+@@ -107,7 +107,7 @@
+ }
+
+ unlink $baseDir.'/bin/'.$binName;
+- unlink $baseDir.'/man/man1/'.$binName.'.1.gz';
++ unlink $baseDir.'/share/man/man1/'.$binName.'.1.gz';
+
+ # remove menu and mime items
+
diff --git a/packages/debian/postinst b/packages/debian/postinst
new file mode 100644
index 0000000..80dc2f0
--- /dev/null
+++ b/packages/debian/postinst
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+update-desktop-database
+update-mime-database /usr/share/mime
+gtk-update-icon-cache /usr/share/icons/hicolor
+
+exit 0
+
diff --git a/packages/debian/postrm b/packages/debian/postrm
new file mode 100644
index 0000000..80dc2f0
--- /dev/null
+++ b/packages/debian/postrm
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+update-desktop-database
+update-mime-database /usr/share/mime
+gtk-update-icon-cache /usr/share/icons/hicolor
+
+exit 0
+
diff --git a/packages/debian/rules b/packages/debian/rules
new file mode 100644
index 0000000..edacc8a
--- /dev/null
+++ b/packages/debian/rules
@@ -0,0 +1,112 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+export DH_VERBOSE=1
+
+export LANG=C
+export LC_ALL=C
+
+build: patch build-stamp
+
+build-stamp:
+ dh_testdir
+
+ touch build-stamp
+
+clean: clean1 unpatch
+
+clean1:
+ dh_testdir
+ dh_testroot
+ rm -f build-stamp configure-stamp
+
+ dh_clean
+
+install: build
+ dh_testdir
+ dh_testroot
+ dh_clean -k
+ dh_installdirs
+ ./install --text --prefix=$(CURDIR)/debian/gcstar/usr
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_16x16.png \
+ debian/gcstar/usr/share/icons/hicolor/16x16/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_22x22.png \
+ debian/gcstar/usr/share/icons/hicolor/22x22/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_24x24.png \
+ debian/gcstar/usr/share/icons/hicolor/24x24/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_32x32.png \
+ debian/gcstar/usr/share/icons/hicolor/32x32/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_36x36.png \
+ debian/gcstar/usr/share/icons/hicolor/36x36/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_48x48.png \
+ debian/gcstar/usr/share/icons/hicolor/48x48/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_64x64.png \
+ debian/gcstar/usr/share/icons/hicolor/64x64/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_72x72.png \
+ debian/gcstar/usr/share/icons/hicolor/72x72/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_96x96.png \
+ debian/gcstar/usr/share/icons/hicolor/96x96/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_128x128.png \
+ debian/gcstar/usr/share/icons/hicolor/128x128/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_192x192.png \
+ debian/gcstar/usr/share/icons/hicolor/192x192/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_256x256.png \
+ debian/gcstar/usr/share/icons/hicolor/256x256/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_scalable.svg \
+ debian/gcstar/usr/share/icons/hicolor/scalable/apps/gcstar.svg
+ install -D -m 0644 share/applications/gcstar.xml \
+ debian/gcstar/usr/share/mime/packages/gcstar.xml
+
+ #this is also in the copyright file
+ -rm debian/gcstar/usr/share/gcstar/LICENSE
+
+ # Installing lintian overrides
+ for LINTIAN in debian/lintian/*; \
+ do \
+ install -D -m 644 $$LINTIAN debian/`basename $$LINTIAN`/usr/share/lintian/overrides/`basename $$LINTIAN` || exit 1; \
+ done
+
+
+# Build architecture-independent files here.
+binary-arch: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-indep: build install patch
+ dh_testdir
+ dh_testroot
+ dh_installchangelogs CHANGELOG
+ dh_installdocs
+ dh_installexamples
+ dh_install
+ dh_installmenu
+ dh_installman
+ dh_link
+ dh_strip
+ dh_compress
+ dh_fixperms
+ dh_perl
+ dh_installdeb
+ dh_shlibdeps
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+patch: patch-stamp
+patch-stamp:
+ dpatch apply-all
+ #dpatch call-all -a=pkg-info >patch-stamp #I don't understand this one.
+ echo patched > patch-stamp
+
+unpatch:
+ dpatch deapply-all
+ rm -rf patch-stamp debian/patched
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install
diff --git a/packages/fedora/gcstar.spec b/packages/fedora/gcstar.spec
new file mode 100644
index 0000000..2244363
--- /dev/null
+++ b/packages/fedora/gcstar.spec
@@ -0,0 +1,111 @@
+Name: gcstar
+Version: 1.7.0
+Release: 4%{?dist}
+Summary: Personal collections manager
+
+Group: Applications/Databases
+License: GPL
+URL: http://www.gcstar.org/
+Source0: http://download.gna.org/gcstar/gcstar-%{version}.tar.gz
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+BuildArch: noarch
+
+BuildRequires: desktop-file-utils
+Requires: perl-Gtk2
+
+%define desktop_vendor fedora
+
+%description
+GCstar is an application for managing your personal collections.
+Detailed information on each item can be automatically retrieved
+from the internet and you can store additional data, depending on
+the collection type. And also who you've lent your them to. You
+may also search and filter your collection by criteria.
+
+%prep
+%setup -q -n gcstar
+
+
+%build
+
+%install
+rm -rf %{buildroot}
+%{__mkdir_p} %{buildroot}%{_prefix}
+%{__install} -d %{buildroot}%{_bindir}
+%{__install} bin/gcstar %{buildroot}%{_bindir}
+%{__install} -d %{buildroot}%{_libdir}
+%{__cp} -a lib/gcstar %{buildroot}%{_libdir}
+%{__install} -d %{buildroot}%{_datadir}
+%{__cp} -a share/gcstar %{buildroot}%{_datadir}
+%{__install} -d %{buildroot}%{_mandir}/man1
+%{__install} man/gcstar.1 %{buildroot}%{_mandir}/man1
+gzip %{buildroot}%{_mandir}/man1/gcstar.1
+
+# Install menu entry
+%{__cat} > %{name}.desktop << EOF
+[Desktop Entry]
+Name=GCstar
+Comment=Manage your collections
+GenericName=Personal collections manager
+Exec=gcstar
+Icon=%{_datadir}/gcstar/icons/gcstar_64x64.png
+Terminal=false
+Type=Application
+MimeType=application/x-gcstar
+Categories=Application;Office;
+Encoding=UTF-8
+EOF
+
+%{__mkdir_p} %{buildroot}%{_datadir}/applications
+desktop-file-install \
+ --vendor %{desktop_vendor} \
+ --dir %{buildroot}%{_datadir}/applications \
+ %{name}.desktop
+
+#Mime Type
+%{__cat} > %{name}.xml <<EOF
+<?xml version="1.0" encoding="UTF-8"?>
+<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+ <mime-type type="application/x-gcstar">
+ <comment>GCstar collection</comment>
+ <glob pattern="*.gcs"/>
+ </mime-type>
+</mime-info>
+EOF
+
+%{__mkdir_p} %{buildroot}%{_datadir}/mime/packages
+cp %{name}.xml %{buildroot}%{_datadir}/mime/packages
+
+
+%clean
+rm -rf %{buildroot}
+
+%post
+update-desktop-database &> /dev/null ||:
+update-mime-database %{_datadir}/mime &> /dev/null || :
+
+%postun
+update-desktop-database &> /dev/null ||:
+update-mime-database %{_datadir}/mime &> /dev/null || :
+
+%files
+%defattr(-,root,root)
+%doc CHANGELOG README LICENSE
+%{_libdir}/gcstar
+%{_datadir}/gcstar
+%{_mandir}/man1/gcstar.1.gz
+%attr(0755,root,root) %{_bindir}/gcstar
+%{_datadir}/applications/%{desktop_vendor}-%{name}.desktop
+%{_datadir}/mime/packages/%{name}.xml
+
+%changelog
+* Sat Oct 28 2006 Tian <tian@c-sait.net> - 0.5.0-4
+ - Re-creation of the module because of a problem with previous import
+* Sun Oct 22 2006 Tian <tian@c-sait.net> - 0.5.0-3
+ - Restored BuildRequires
+* Sat Oct 21 2006 Tian <tian@c-sait.net> - 0.5.0-2
+ - Changed desktop vendor
+ - Removed desktop-file-utils and shared-mime-info from required
+ - Fixed icon path in desktop file
+* Sat Oct 21 2006 Tian <tian@c-sait.net> - 0.5.0-1
+ - First Fedora Extras version.
diff --git a/packages/rpm/gcstar.spec b/packages/rpm/gcstar.spec
new file mode 100644
index 0000000..b4df656
--- /dev/null
+++ b/packages/rpm/gcstar.spec
@@ -0,0 +1,41 @@
+# Initial spec file created by autospec ver. 0.8 with rpm 3 compatibility
+Summary: GCstar, Collection manager
+Name: gcstar
+Version: 1.7.0
+Release: 1
+Group: Applications/Databases
+License: GPL
+Source: gcstar-%{version}.tar.gz
+Requires: perl-Gtk2 >= 1.054
+BuildRoot: %{_tmppath}/%{name}-root
+URL: https://gna.org/projects/gcstar/
+BuildArch: noarch
+
+%description
+GCstar - Application that can be used to manage some collections.
+
+#%description -l fr
+GCstar - Application permettant de gérer des collections.
+
+%prep
+#%setup -c RPM
+%setup -q -n %{name}
+
+%install
+#%__cp -a . "${RPM_BUILD_ROOT-/}"
+./install --prefix=${RPM_BUILD_ROOT}/usr/ >/dev/null
+
+
+%clean
+[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"
+
+%files
+%defattr(-,root,root)
+/usr/lib/gcstar/
+/usr/share/gcstar/
+/usr/man/man1/gcstar.1.gz
+%attr(0755,root,root) /usr/bin/gcstar
+
+%changelog
+* Tue Feb 08 2005 Tian <tian@c-sait.net>
+- Initial spec file created by autospec ver. 0.8 with rpm 3 compatibility
diff --git a/packages/win32/createExe.bat b/packages/win32/createExe.bat
new file mode 100644
index 0000000..3605a24
--- /dev/null
+++ b/packages/win32/createExe.bat
@@ -0,0 +1 @@
+C:\Perl\bin\pp -o gcstar.exe -g -B -M filetest -M Glib::Object::Subclass -M locale -M Digest::MD5 -M MIME::Base64 -M LWP -M LWP::Simple -M LWP::UserAgent -M Net::SMTP -M URI::Escape -M HTTP::Cookies::Netscape -M HTML::Entities -M Gtk2::SimpleList -M Text::Wrap -M XML::Simple -M MP3::Info -M MP3::Tag -M Net::FreeDB -M DateTime::Format::Strptime -M Archive::Tar -M Archive::Zip -M Compress::Zlib -M Time::Piece -M Ogg::Vorbis::Header::PurePerl -M Getopt::Long -M FindBin -M Gtk2::Gdk::Keysyms -M Unicode::Normalize -M GD -M GD::Text -M GD::Graph::bars -M GD::Graph::area -M GD::Graph::pie -M Date::Calc -a "..\lib\gcstar;lib" -a "..\share\gcstar;share" --link=C:\Perl\site\lib\auto\Cairo\Cairo.dll --link=C:\Perl\site\lib\auto\Glib\Glib.dll --link=C:\Perl\site\lib\auto\Gtk2\Gtk2.dll -vvv --icon=..\share\gcstar\icons\GCstar.ico --info="ProductName=GCstar;ProductVersion=1.6.1;FileVersion=1.6.1;FileDescription=GCstar, Personal Collections Manager;Comments=http://www.gcstar.org;LegalCopyright=GNU GPL" gcstar \ No newline at end of file
diff --git a/packages/win32/gcs_lang.nsh b/packages/win32/gcs_lang.nsh
new file mode 100644
index 0000000..42ca6a6
--- /dev/null
+++ b/packages/win32/gcs_lang.nsh
@@ -0,0 +1,65 @@
+;Title Lang support for GCstar installer. Made from AbiWord one.
+;FileDesc functions/macros/etc for supporting multi-language text within installer
+
+
+!ifndef _GCS_LANG_NSH_
+!define _GCS_LANG_NSH_
+
+ ; Languages, include MUI & NSIS language support
+ ; then include app install specific language support
+
+ ; indicate default language definitions to use if a translation is missing a string
+ !define DEF_LANG "ENGLISH"
+
+ ; actually sets the LangString
+ !macro SETLSTR NAME VALUE ; e.g. English sectID sectDesc
+ !echo "${LANG} ( ${LANG_${LANG}} )"
+ !define "STRING_ISSET_${LANG}_${NAME}"
+ LangString "${NAME}" "${LANG_${LANG}}" "${VALUE}"
+ !macroend
+ !define SETLSTR "!insertmacro SETLSTR"
+
+ ; macro to set string, assumes LANG already defined (call within context of LANG_LOAD)
+ !macro LSTR NAME VALUE ; e.g. sectID sectDesc
+ !ifdef SETDEFLANG
+ ; if string is already set, we do nothing, otherwise we set to default value and warn user
+ !ifndef "STRING_ISSET_${LANG}_${NAME}"
+ !ifndef APPSET_LANGUAGEFILE_DEFAULT_USED ; flag default value must be used
+ !define APPSET_LANGUAGEFILE_DEFAULT_USED
+ !endif
+ ${SETLSTR} "${NAME}" "${VALUE}" ; set to default value
+ !endif
+ !else ; just set the value
+ ${SETLSTR} "${NAME}" "${VALUE}"
+ !endif
+ !macroend
+ !define LSTR "!insertmacro LSTR"
+
+ ; macro to include necessary language files
+ ; Usage:
+ ; ${LANG_LOAD} "<nsis language name>"
+ ; e.g. ${LANG_LOAD} "English"
+ ;
+ !macro LANG_LOAD LANG
+ !insertmacro MUI_LANGUAGE "${LANG}"
+ !echo "Loading language ${LANG} ( ${LANG_${LANG}} )"
+ ; Specify the license text to use (for multilang support, must come after MUI_LANGUAGE)
+ ;LicenseLangString LicenseTXT "${LANG_${LANG}}" "..\AbiSuite\Copying"
+ !verbose push
+ !verbose 3
+ !include "langs\gcs_${LANG}.nsh" ; Localized Installer Messages (Language Strings)
+ !define SETDEFLANG
+ ;!include "gcs_${DEF_LANG}.nsh"
+ !verbose pop
+ !ifdef APPSET_LANGUAGEFILE_DEFAULT_USED
+ !undef APPSET_LANGUAGEFILE_DEFAULT_USED
+ !warning "${LANG} Installation language file incomplete. Using default texts for missing strings."
+ !endif
+ !undef SETDEFLANG
+ !echo "End loading language ${LANG}"
+ !undef LANG
+ !macroend
+ !define LANG_LOAD "!insertmacro LANG_LOAD"
+
+!endif ; _GCS_LANG_NSH_
+; End of file
diff --git a/packages/win32/gcstar.bat b/packages/win32/gcstar.bat
new file mode 100644
index 0000000..81142a1
--- /dev/null
+++ b/packages/win32/gcstar.bat
@@ -0,0 +1,3 @@
+@echo off
+cd %0\..
+set PATH=..\usr\bin;..\usr\lib;%PATH%
diff --git a/packages/win32/gcstar.nsi b/packages/win32/gcstar.nsi
new file mode 100644
index 0000000..e426da2
--- /dev/null
+++ b/packages/win32/gcstar.nsi
@@ -0,0 +1,362 @@
+; NSIS for GCstar ( http://www.gcstar.org/ )
+; Based on Frozen Bubble NSIS
+
+; Helper defines
+!define PRODUCT_NAME "GCstar"
+!define PRODUCT_VERSION "1.7.0"
+!define PRODUCT_PUBLISHER "Tian"
+!define PRODUCT_WEB_SITE "http://www.gcstar.org/"
+!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${PRODUCT_NAME}"
+!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
+!define PRODUCT_UNINST_ROOT_KEY "HKLM"
+!define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir"
+
+; MUI 1.67 compatible ------
+!include "MUI.nsh"
+
+; MUI Settings
+!define MUI_ABORTWARNING
+!define MUI_ICON "img\icon_install.ico"
+!define MUI_UNICON "img\icon_uninstall.ico"
+!define MUI_HEADERIMAGE
+!define MUI_HEADERIMAGE_RIGHT
+!define MUI_HEADERIMAGE_BITMAP "img\banner_top.bmp"
+!define MUI_HEADERIMAGE_UNBITMAP "img\uninstall_top.bmp"
+
+!define MUI_COMPONENTSPAGE_CHECKBITMAP "img\checks.bmp"
+
+!define MUI_FINISHPAGE_RUN
+!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchGCstar"
+!define MUI_FINISHPAGE_RUN_TEXT "$(FINISH_LAUNCH)"
+
+!define MUI_FINISHPAGE_LINK "$(FINISH_WEBSITE)"
+!define MUI_FINISHPAGE_LINK_LOCATION "${PRODUCT_WEB_SITE}"
+!define MUI_FINISHPAGE_LINK_COLOR "1C86EE"
+
+;COLORS
+!define MUI_BGCOLOR "FFFFFF"
+!define MUI_LICENSEPAGE_BGCOLOR "FFFFFF"
+!define MUI_INSTALLCOLORS "1C86EE FFFFFF"
+!define MUI_INSTFILESPAGE_COLORS "1C86EE FFFFFF"
+
+; Language Selection Dialog Settings
+!define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
+!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
+!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language"
+
+; Welcome page
+!define MUI_WELCOMEFINISHPAGE_BITMAP "img\banner_left.bmp"
+!insertmacro MUI_PAGE_WELCOME
+; License page
+!define MUI_LICENSEPAGE_CHECKBOX
+!insertmacro MUI_PAGE_LICENSE "LICENSE"
+; Components page
+!insertmacro MUI_PAGE_COMPONENTS
+; Directory page
+!insertmacro MUI_PAGE_DIRECTORY
+; Start menu page
+var ICONS_GROUP
+;!define MUI_STARTMENUPAGE_NODISABLE
+!define MUI_STARTMENUPAGE_DEFAULTFOLDER "GCstar"
+!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
+!define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
+!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${PRODUCT_STARTMENU_REGVAL}"
+!insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP
+; Instfiles page
+!insertmacro MUI_PAGE_INSTFILES
+; Finish page
+!insertmacro MUI_PAGE_FINISH
+
+; Uninstaller pages
+!insertmacro MUI_UNPAGE_INSTFILES
+
+; MUI end ------
+
+; Languages
+!include "gcs_lang.nsh"
+
+${LANG_LOAD} "Bulgarian"
+${LANG_LOAD} "Czech"
+${LANG_LOAD} "German"
+${LANG_LOAD} "English"
+${LANG_LOAD} "Spanish"
+${LANG_LOAD} "French"
+${LANG_LOAD} "Italian"
+${LANG_LOAD} "Polish"
+${LANG_LOAD} "Romanian"
+${LANG_LOAD} "Russian"
+${LANG_LOAD} "SerbianLatin"
+${LANG_LOAD} "Turkish"
+
+Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
+OutFile "${PRODUCT_NAME}_${PRODUCT_VERSION}_Setup.exe"
+InstallDir "$PROGRAMFILES\GCstar"
+InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
+ShowInstDetails hide
+ShowUnInstDetails hide
+
+InstType "$(INSTALL_APP_DEP)"
+InstType "$(INSTALL_APP_ONLY)"
+InstType "$(INSTALL_FULL)"
+
+Function .onInit
+ SetShellVarContext all
+ !define MUI_LANGDLL_ALWAYSSHOW
+ !insertmacro MUI_LANGDLL_DISPLAY
+
+ ;Prevent Multiple Instances:
+ System::Call 'kernel32::CreateMutexA(i 0, i 0, t "GCstarSetup") i .r1 ?e'
+ Pop $R0
+ StrCmp $R0 0 +3
+ MessageBox MB_OK|MB_ICONEXCLAMATION "$(PRE_MULTIPLE)"
+ Abort
+
+ ReadRegStr $R0 HKLM \
+ "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
+ "UninstallString"
+ StrCmp $R0 "" NoRemove
+ Return
+ NoRemove:
+ SectionSetText 0 "" ; and make invisible so user doesn't see it
+ Return
+FunctionEnd
+
+Function LaunchGCstar
+ SetOutPath "$INSTDIR\bin"
+ Exec "$\"$INSTDIR\bin\gcstar.bat$\""
+FunctionEnd
+
+Section "$(SEC_UN)" SEC01
+ SetShellVarContext all
+ SectionIn 3
+ ReadRegStr $R0 HKLM \
+ "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
+ "UninstallString"
+ StrCmp $R0 "" NoRemove
+ call RemovePrevious
+ NoRemove:
+SectionEnd
+
+Section "!GCstar" SEC02
+ SetShellVarContext all
+ SectionIn 1 2 3 RO
+ SetOutPath "$INSTDIR"
+ SetOverwrite try
+ File /r "lib"
+ File /r "share"
+ File /r "usr"
+
+ SetOutPath "$INSTDIR\bin"
+ File "bin\gcstar.exe"
+ File "bin\gcstar.bat"
+ File "bin\update.bat"
+
+ FileOpen $1 "$INSTDIR\bin\gcstar.bat" a
+ FileSeek $1 0 END
+ FileWrite $1 "set LANG=$(LANG_CODE)$\r$\n"
+ FileWrite $1 "start gcstar.exe %1$\r$\n"
+ FileClose $1
+
+ Call SetFileAssociation
+
+; Shortcuts
+ !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
+ CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(LINK_APPLICATION).lnk" '"$INSTDIR\bin\gcstar.bat"' "" $INSTDIR\share\gcstar\icons\GCstar.ico "" SW_SHOWMINIMIZED "" "$(LINK_APPLICATION_DESCRIPTION)"
+ !insertmacro MUI_STARTMENU_WRITE_END
+SectionEnd
+
+SectionGroup "$(SEC_ICONS)" GroupSec02
+
+Section "$(SEC_DSK)" SEC05
+ SetShellVarContext all
+ SectionIn 1 3
+ SetOutPath "$INSTDIR\bin"
+ CreateShortCut "$DESKTOP\$(LINK_APPLICATION).lnk" '"$INSTDIR\bin\gcstar.bat"' "" $INSTDIR\share\gcstar\icons\GCstar.ico "" SW_SHOWMINIMIZED "" "$(LINK_APPLICATION_DESCRIPTION)"
+SectionEnd
+
+Section "$(SEC_QUICK)" SEC06
+ SetShellVarContext all
+ SectionIn 1 3
+ StrCmp $QUICKLAUNCH $TEMP +3
+ SetOutPath "$INSTDIR\bin"
+ CreateShortCut "$QUICKLAUNCH\$(LINK_APPLICATION).lnk" '"$INSTDIR\bin\gcstar.bat"' "" $INSTDIR\share\gcstar\icons\GCstar.ico "" SW_SHOWMINIMIZED "" "$(LINK_APPLICATION_DESCRIPTION)"
+SectionEnd
+
+SectionGroupEnd
+
+Section -AdditionalIcons
+ SetShellVarContext all
+ !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(LINK_UPDATE).lnk" '"$INSTDIR\bin\update.bat"' "" $INSTDIR\share\gcstar\icons\icon_install.ico "" "" "" "$(LINK_UPDATE_DESCRIPTION)"
+ WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(LINK_SITE).lnk" "$INSTDIR\${PRODUCT_NAME}.url" "" $INSTDIR\share\gcstar\icons\web.ico "" "" "" "$(LINK_SITE_DESCRIPTION)"
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(LINK_REMOVE).lnk" "$INSTDIR\uninst.exe" "" "" "" "" "" "$(LINK_REMOVE_DESCRIPTION)"
+ !insertmacro MUI_STARTMENU_WRITE_END
+SectionEnd
+
+Section -Post
+ SetShellVarContext all
+ WriteUninstaller "$INSTDIR\uninst.exe"
+ WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\gcstar"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
+SectionEnd
+
+; Section descriptions
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+; !insertmacro MUI_DESCRIPTION_TEXT ${GroupSec00} "$(DESC_DEPENDENCIES)"
+; !insertmacro MUI_DESCRIPTION_TEXT ${SEC00} "$(DESC_ACTIVEPERL)"
+; !insertmacro MUI_DESCRIPTION_TEXT ${GroupSec01} "$(DESC_GTKPERL)"
+; !insertmacro MUI_DESCRIPTION_TEXT ${SEC03} "$(DESC_GTK)"
+; !insertmacro MUI_DESCRIPTION_TEXT ${SEC04} "$(DESC_PERL)"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SEC01} "$(DESC_UN)"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SEC02} "$(DESC_APP)"
+ !insertmacro MUI_DESCRIPTION_TEXT ${GroupSec02} "$(DESC_ICONS)"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SEC05} "$(DESC_DESKTOP)"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SEC06} "$(DESC_QUICK)"
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+
+Function un.onUninstSuccess
+ HideWindow
+ MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) has been successfullly removed from your computer."
+FunctionEnd
+
+Function un.onInit
+ !insertmacro MUI_UNGETLANGUAGE
+FunctionEnd
+
+Section Uninstall
+ SetShellVarContext all
+ MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "$(UN_QUESTION)" IDYES DoUnInstall
+
+ Abort "$(UN_ABORTED)"
+ Quit
+
+ DoUnInstall:
+
+ !insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
+
+ Delete "$DESKTOP\$(LINK_APPLICATION).lnk"
+ Delete "$QUICKLAUNCH\$(LINK_APPLICATION).lnk"
+ Delete "$SMPROGRAMS\$ICONS_GROUP\$(LINK_APPLICATION).lnk"
+ Delete "$SMPROGRAMS\$ICONS_GROUP\$(LINK_UPDATE).lnk"
+ Delete "$SMPROGRAMS\$ICONS_GROUP\$(LINK_SITE).lnk"
+ Delete "$SMPROGRAMS\$ICONS_GROUP\$(LINK_REMOVE).lnk"
+ RMDir "$SMPROGRAMS\$ICONS_GROUP"
+
+ RMDir /r "$INSTDIR\bin"
+ RMDir /r "$INSTDIR\lib"
+ RMDir /r "$INSTDIR\share"
+ RMDir /r "$INSTDIR\usr"
+
+ Delete "$INSTDIR\*"
+
+ MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "$(UN_PERSO)" IDNO ContinueUnInstall
+
+ RMDir /r "$INSTDIR\data"
+ RMDir /r "$INSTDIR\config"
+
+ ContinueUninstall:
+
+ Call un.RemoveFileAssociation
+
+ StrCpy $5 "all"
+ Push "$INSTDIR\bin"
+ DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
+ DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
+
+ RMDir "$INSTDIR"
+
+ SetAutoClose true
+SectionEnd
+
+;----------------------------------------
+; based upon a script of "Written by KiCHiK 2003-01-18 05:57:02"
+;----------------------------------------
+!verbose 3
+!include "WinMessages.nsh"
+!verbose 4
+;====================================================
+; Usefull for file association
+;====================================================
+Function SetFileAssociation
+ !define Index "Line${__LINE__}"
+ ReadRegStr $1 HKCR ".gcs" ""
+ StrCmp $1 "" "${Index}-NoBackup"
+ StrCmp $1 "GCstarFile" "${Index}-NoBackup"
+ WriteRegStr HKCR ".gcs" "backup_val" $1
+ "${Index}-NoBackup:"
+ WriteRegStr HKCR ".gcs" "" "GCstarFile"
+ ReadRegStr $0 HKCR "GCstarFile" ""
+ StrCmp $0 "" 0 "${Index}-Skip"
+ WriteRegStr HKCR "GCstarFile" "" "$(FILE_DESC)"
+ WriteRegStr HKCR "GCstarFile\shell" "" "open"
+ WriteRegStr HKCR "GCstarFile\DefaultIcon" "" "$INSTDIR\share\gcstar\icons\GCstar.ico"
+ "${Index}-Skip:"
+ WriteRegStr HKCR "GCstarFile\shell\open\command" "" \
+ '"$INSTDIR\bin\gcstar.bat" "%1"'
+ !undef Index
+ Call RefreshShellIcons
+FunctionEnd
+
+Function un.RemoveFileAssociation
+ !define Index "Line${__LINE__}"
+ ReadRegStr $1 HKCR ".gcs" ""
+ StrCmp $1 "GCstarFile" 0 "${Index}-NoOwn" ; only do this if we own it
+ ReadRegStr $1 HKCR ".gcs" "backup_val"
+ StrCmp $1 "" 0 "${Index}-Restore" ; if backup="" then delete the whole key
+ DeleteRegKey HKCR ".gcs"
+ Goto "${Index}-NoOwn"
+ "${Index}-Restore:"
+ WriteRegStr HKCR ".gcs" "" $1
+ DeleteRegValue HKCR ".gcs" "backup_val"
+
+ "${Index}-NoOwn:"
+ DeleteRegKey HKCR "GCstarFile" ;Delete key with association settings
+ !undef Index
+ Call un.RefreshShellIcons
+FunctionEnd
+
+!define SHCNE_ASSOCCHANGED 0x08000000
+!define SHCNF_IDLIST 0
+
+Function RefreshShellIcons
+ ; By jerome tremblay - april 2003
+ System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v \
+ (${SHCNE_ASSOCCHANGED}, ${SHCNF_IDLIST}, 0, 0)'
+FunctionEnd
+
+Function un.RefreshShellIcons
+ ; By jerome tremblay - april 2003
+ System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v \
+ (${SHCNE_ASSOCCHANGED}, ${SHCNF_IDLIST}, 0, 0)'
+FunctionEnd
+
+Function RemovePrevious
+ ReadRegStr $R0 HKLM \
+ "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
+ "DisplayVersion"
+
+ ReadRegStr $R0 HKLM \
+ "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
+ "UninstallString"
+
+ ;Run the uninstaller
+ ClearErrors
+ ExecWait '$R0 _?=$INSTDIR' ;Do not copy the uninstaller to a temp file
+
+ IfErrors no_remove_uninstaller
+ ;You can either use Delete /REBOOTOK in the uninstaller or add some code
+ ;here to remove to remove the uninstaller. Use a registry key to check
+ ;whether the user has chosen to uninstall. If you are using an uninstaller
+ ;components page, make sure all sections are uninstalled.
+ no_remove_uninstaller:
+
+FunctionEnd
+
diff --git a/packages/win32/img/banner_left.bmp b/packages/win32/img/banner_left.bmp
new file mode 100644
index 0000000..539a239
--- /dev/null
+++ b/packages/win32/img/banner_left.bmp
Binary files differ
diff --git a/packages/win32/img/banner_top.bmp b/packages/win32/img/banner_top.bmp
new file mode 100644
index 0000000..da5aadc
--- /dev/null
+++ b/packages/win32/img/banner_top.bmp
Binary files differ
diff --git a/packages/win32/img/checks.bmp b/packages/win32/img/checks.bmp
new file mode 100644
index 0000000..53e8e14
--- /dev/null
+++ b/packages/win32/img/checks.bmp
Binary files differ
diff --git a/packages/win32/img/icon_install.ico b/packages/win32/img/icon_install.ico
new file mode 100644
index 0000000..6fe942e
--- /dev/null
+++ b/packages/win32/img/icon_install.ico
Binary files differ
diff --git a/packages/win32/img/icon_uninstall.ico b/packages/win32/img/icon_uninstall.ico
new file mode 100644
index 0000000..488f3a3
--- /dev/null
+++ b/packages/win32/img/icon_uninstall.ico
Binary files differ
diff --git a/packages/win32/img/uninstall_top.bmp b/packages/win32/img/uninstall_top.bmp
new file mode 100644
index 0000000..517c461
--- /dev/null
+++ b/packages/win32/img/uninstall_top.bmp
Binary files differ
diff --git a/packages/win32/img/website.ico b/packages/win32/img/website.ico
new file mode 100644
index 0000000..9cdd1d9
--- /dev/null
+++ b/packages/win32/img/website.ico
Binary files differ
diff --git a/packages/win32/langs/gcs_Bulgarian.nsh b/packages/win32/langs/gcs_Bulgarian.nsh
new file mode 100644
index 0000000..b352346
--- /dev/null
+++ b/packages/win32/langs/gcs_Bulgarian.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "BG"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_Czech.nsh b/packages/win32/langs/gcs_Czech.nsh
new file mode 100644
index 0000000..6cb63a5
--- /dev/null
+++ b/packages/win32/langs/gcs_Czech.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "CS"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_English.nsh b/packages/win32/langs/gcs_English.nsh
new file mode 100644
index 0000000..0145d67
--- /dev/null
+++ b/packages/win32/langs/gcs_English.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "EN"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_French.nsh b/packages/win32/langs/gcs_French.nsh
new file mode 100644
index 0000000..55e7c68
--- /dev/null
+++ b/packages/win32/langs/gcs_French.nsh
@@ -0,0 +1,68 @@
+${LSTR} LANG_CODE "FR"
+
+${LSTR} INSTALL_APP_DEP "Dfaut"
+${LSTR} INSTALL_FULL "Complte"
+${LSTR} INSTALL_APP_ONLY "Seulement ${PRODUCT_NAME}"
+
+${LSTR} PRE_MULTIPLE "Le programme d'installation de ${PRODUCT_NAME} ${PRODUCT_VERSION} est dj lanc."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Gestionnaire de collections personnelles"
+${LSTR} LINK_UPDATE "Mettre jour les modules"
+${LSTR} LINK_UPDATE_DESCRIPTION "Tlcharge et installe les corrections dans les modules (ne modifie pas l'application elle-mme)"
+${LSTR} LINK_SITE "Site web"
+${LSTR} LINK_SITE_DESCRIPTION "Visiter le site Web de ${PRODUCT_NAME}"
+${LSTR} LINK_REMOVE "Dsinstaller"
+${LSTR} LINK_REMOVE_DESCRIPTION "Supprimer ${PRODUCT_NAME} du systme"
+
+${LSTR} FILE_DESC "Collection ${PRODUCT_NAME}"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Tlchargement de %s"
+${LSTR} DOWNLOAD_CONNECTING "Connection en cours..."
+${LSTR} DOWNLOAD_SECOND "seconde"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "heure"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dko (%d%%) sur %dko"
+${LSTR} DOWNLOAD_REMAINING " (Temps restant : %d %s%s)"
+
+${LSTR} PERL_VERIFYING "Verification des modules Perl disponibles..."
+${LSTR} PERL_INSTALLING "Installation du module"
+${LSTR} PERL_UPDATING "Mise a jour du module"
+${LSTR} PERL_WAIT "Veuillez patientez, cela peut durer un certain temps..."
+${LSTR} PERL_INSTALLERROR "ActivePerl n'a pas t install.$\r$\n \
+Sans ce programme ${PRODUCT_NAME} ne pourra pas fonctionner.$\r$\n \
+Veuillez l'installer manuellement et relancer cette installation.$\r$\n \
+Voulez-vous vous rendre sur la page de tlchargement d'ActivePerl ?"
+
+${LSTR} SEC_DEPENDENCIES "Dpendances"
+${LSTR} SEC_ACTIVEPERL "Installer ActivePerl"
+${LSTR} SEC_LIB "Bibliothques Gtk2"
+${LSTR} SEC_PPM "Modules Perl"
+${LSTR} SEC_UN "Supprimer version prcdente"
+${LSTR} SEC_ICONS "Icones"
+${LSTR} SEC_DSK "Icone sur le bureau"
+${LSTR} SEC_QUICK "Icone de lancement rapide"
+
+${LSTR} DESC_DEPENDENCIES "Installer d'autres programmes utiliss par ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Tlcharger (environ 12.5 Mo) et installer ActivePerl."
+${LSTR} DESC_GTKPERL "Installer les dpendances Gtk2. Si vous n'tes pas sr, installez les."
+${LSTR} DESC_GTK "Installer les librairies Gtk2 utilises par ${PRODUCT_NAME}."
+${LSTR} DESC_PERL "Installer les liaisons pour Perl (Modules ActivePerl)."
+${LSTR} DESC_UN "Supprimer la prcdente installation."
+${LSTR} DESC_APP "Installer les composants de ${PRODUCT_NAME} (Obligatoire)."
+${LSTR} DESC_ICONS "Ajouter des icones de lancement."
+${LSTR} DESC_DESKTOP "Ajoute une icone sur le bureau."
+${LSTR} DESC_QUICK "Ajoute une icone dans la barre de lancement rapide (si disponible)."
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} ncessite un changement dans l'environnement pour pouvoir fonctionner. Voulez vous que ce soit fait pour tous les utilisateurs ?$\r$\nEn rpondant Non, cela sera uniquement fait pour l'utilisateur courant.$\r$\n(Des permissions administrateur sont ncessaires pour le faire pour tous les utilisateurs)"
+${LSTR} INSTALL_ALL_ERROR "L'environnement ne peut tre chang pour tous les utilisateurs$\r$\nVoulez vous essayer de le changer pour celui courant?"
+${LSTR} INSTALL_USER_ERROR "L'environnement ne peut pas tre chang pour l'utilisateur courant."
+
+${LSTR} FINISH_LAUNCH "Lancer ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visiter le site web ${PRODUCT_NAME}"
+
+${LSTR} UN_QUESTION "Voulez vous vraiment supprimer $(^Name) et tous ses composants ?"
+${LSTR} UN_PERSO "Voulez-vous aussi supprimer vos informations personnelles (collections et configuration) ?"
+${LSTR} UN_SUCESS "$(^Name) a t supprim avec succs de votre ordinateur."
+${LSTR} UN_ABORTED "La dsinstallation a t arrte."
diff --git a/packages/win32/langs/gcs_German.nsh b/packages/win32/langs/gcs_German.nsh
new file mode 100644
index 0000000..8bd6445
--- /dev/null
+++ b/packages/win32/langs/gcs_German.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "DE"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_Italian.nsh b/packages/win32/langs/gcs_Italian.nsh
new file mode 100644
index 0000000..a6c1c52
--- /dev/null
+++ b/packages/win32/langs/gcs_Italian.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "IT"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_Polish.nsh b/packages/win32/langs/gcs_Polish.nsh
new file mode 100644
index 0000000..b1bbd21
--- /dev/null
+++ b/packages/win32/langs/gcs_Polish.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "PL"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_Romanian.nsh b/packages/win32/langs/gcs_Romanian.nsh
new file mode 100644
index 0000000..a0b3406
--- /dev/null
+++ b/packages/win32/langs/gcs_Romanian.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "RO"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_Russian.nsh b/packages/win32/langs/gcs_Russian.nsh
new file mode 100644
index 0000000..655b6b5
--- /dev/null
+++ b/packages/win32/langs/gcs_Russian.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "RU"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_SerbianLatin.nsh b/packages/win32/langs/gcs_SerbianLatin.nsh
new file mode 100644
index 0000000..3f6df2d
--- /dev/null
+++ b/packages/win32/langs/gcs_SerbianLatin.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "SR"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_Spanish.nsh b/packages/win32/langs/gcs_Spanish.nsh
new file mode 100644
index 0000000..71b02ea
--- /dev/null
+++ b/packages/win32/langs/gcs_Spanish.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "ES"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_Turkish.nsh b/packages/win32/langs/gcs_Turkish.nsh
new file mode 100644
index 0000000..3fe329f
--- /dev/null
+++ b/packages/win32/langs/gcs_Turkish.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "TR"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/update.bat b/packages/win32/update.bat
new file mode 100644
index 0000000..7dcfb6c
--- /dev/null
+++ b/packages/win32/update.bat
@@ -0,0 +1,4 @@
+@echo off
+cd %0\..
+set PATH=..\usr\bin;..\usr\lib;%PATH%
+start "" gcstar.exe -u -n
diff --git a/share/applications/gcstar-thumbnailer b/share/applications/gcstar-thumbnailer
new file mode 100644
index 0000000..ff054fe
--- /dev/null
+++ b/share/applications/gcstar-thumbnailer
@@ -0,0 +1,260 @@
+#!/usr/bin/perl
+use strict;
+
+use XML::Simple;
+use URI::file;
+use Gtk2;
+
+{
+ # GCS file to load
+ my $uriIn = URI->new($ARGV[0]);
+ my $fileIn = $uriIn->file;
+
+ my $maxIcons = 16;
+ my $itemsPerRow = 4;
+ my $skin;
+ my $skinFile;
+
+ # Find user selected skin
+ # Fix - hardcoded path
+ open (CONF, $ENV{'HOME'}.'/.config/gcstar/GCstar.conf');
+ my $line;
+ foreach $line (<CONF>) {
+ if ($line =~ /listImgSkin=(.*)/)
+ {
+ $skinFile= $1;
+ }
+ }
+ if (!$skinFile)
+ {
+ $skinFile = "Wood";
+ }
+ close (CONF);
+
+ # Fix - hardcoded path
+ $skin = "/usr/local/share/gcstar/list_bg/".$skinFile."/list_bg.png";
+
+ # Load the collection file temporarily, to grab the model type
+ my $collectionXML= XMLin($fileIn, forcearray => 1);
+
+ # Load the collection model to determine id and cover fields
+ # Fix - hardcoded path
+ my $collectionModel = XMLin("/usr/local/lib/gcstar/GCModels/".$collectionXML->{type}.".gcm");
+ my $idField = $collectionModel->{options}->{fields}->{id};
+ my $picField = $collectionModel->{options}->{fields}->{cover};
+
+ # Now that we now the id field, reopen collection xml using proper id
+ $collectionXML= XMLin($fileIn, forcearray => 1, keyattr=>$idField);
+ my $collectionItems=$collectionXML->{item};
+
+ my $count;
+ my $favCount;
+ my $nonFavCount;
+ my @images;
+ my @favourites;
+ my @nonFavourites;
+
+ # Hacky part, but for some reason items won't load as an array, so just jump through collection grabbing the first few covers
+ # (Prefer favourites - so I don't see romantic comedies as the thumbnail for my films!!)
+
+ foreach my $collectionItem (values %$collectionItems)
+ {
+ if ($collectionItem->{$picField})
+ {
+ if ($collectionItem->{favourite})
+ {
+ if ($favCount < $maxIcons)
+ {
+ @favourites[$favCount] = $collectionItem->{$picField};
+ $favCount++;
+ }
+ }
+ else
+ {
+ @nonFavourites[$nonFavCount] = $collectionItem->{$picField};
+ $nonFavCount++;
+ }
+
+ }
+ }
+
+ # Load a few pixbufs
+ my $gcstarIconPixBuf;
+ my $backgroundPixBuf;
+
+ # Fix - hardcoded path
+ $gcstarIconPixBuf = Gtk2::Gdk::Pixbuf->new_from_file("/usr/local/share/gcstar/icons/gcstar_24x24.png");
+ $backgroundPixBuf = Gtk2::Gdk::Pixbuf->new_from_file($skin);
+
+
+ my $tempPixbuf;
+ my @pixBuf;
+ my $bgWidth = $backgroundPixBuf->get_width;
+ my $bgHeight = $backgroundPixBuf->get_height;
+ my $maxHeight;
+
+ # Load covers to pixbufs, scale them to fit in background
+ for (my $imgCount = 0; $imgCount < $maxIcons; $imgCount++)
+ {
+ if (@favourites[$imgCount])
+ {
+ @pixBuf[$imgCount] = Gtk2::Gdk::Pixbuf->new_from_file(@favourites[$imgCount]);
+ # Scale to 80% of background size (seems like a good size)
+ @pixBuf[$imgCount] = scaleMaxPixbuf(@pixBuf[$imgCount], $bgWidth*.80, $bgHeight*.80);
+ if (@pixBuf[$imgCount]->get_height > $maxHeight)
+ {
+ $maxHeight = @pixBuf[$imgCount]->get_height;
+ }
+ }
+ elsif (@nonFavourites[$imgCount - $favCount])
+ {
+ @pixBuf[$imgCount] = Gtk2::Gdk::Pixbuf->new_from_file(@nonFavourites[$imgCount - $favCount]);
+ # Scale to 80% of background size (seems like a good size)
+ @pixBuf[$imgCount] = scaleMaxPixbuf(@pixBuf[$imgCount], $bgWidth*.80, $bgHeight*.80);
+ if (@pixBuf[$imgCount]->get_height > $maxHeight)
+ {
+ $maxHeight = @pixBuf[$imgCount]->get_height;
+ }
+ }
+ else
+ {
+ # If we run out of items in the collection with covers, just make empty pixbufs for simplicity
+ @pixBuf[$imgCount] = Gtk2::Gdk::Pixbuf->new('rgb',1,8,$bgWidth * .80,$bgHeight * .80);
+ @pixBuf[$imgCount]->fill(0x00000000);
+ }
+ }
+
+ my $factor;
+ my $rows;
+ my $destHeight;
+
+ # Change the positioning slightly if it's a reflection type skin (items sit higher on shelf)
+ # Work out number of rows of pictures, and desired height of rows (not much logic to these numbers,
+ # it's just what looks good)
+ if ($skinFile =~ /Glass/)
+ {
+ $factor = 40;
+ if ($maxHeight < 70)
+ {
+ $rows = 4;
+ $destHeight = $bgHeight - 145;
+ }
+ elsif ($maxHeight < 130)
+ {
+ $rows = 3;
+ $destHeight = $bgHeight - 100;
+ }
+ else
+ {
+ $rows = 2;
+ $destHeight = $bgHeight;
+ }
+ }
+ else
+ {
+ $factor = 10;
+ if ($maxHeight < 70)
+ {
+ $rows = 4;
+ $destHeight = $bgHeight - 60;
+ }
+ elsif ($maxHeight < 130)
+ {
+ $rows = 3;
+ $destHeight = $bgHeight - 15;
+ }
+ else
+ {
+ $rows = 3;
+ $destHeight = $bgHeight;
+ }
+ }
+
+ # Put covers on background
+ for (my $imgCount = 0; $imgCount < $itemsPerRow * $rows; $imgCount++)
+ {
+ $tempPixbuf = $backgroundPixBuf->copy;
+ @pixBuf[$imgCount]->composite($tempPixbuf,
+ ( $bgWidth - @pixBuf[$imgCount]->get_width ) / 2,
+ $bgHeight - @pixBuf[$imgCount]->get_height - $factor,
+ @pixBuf[$imgCount]->get_width, @pixBuf[$imgCount]->get_height,
+ ( $bgWidth - @pixBuf[$imgCount]->get_width ) / 2,
+ $bgHeight - @pixBuf[$imgCount]->get_height - $factor,
+ 1, 1,
+ 'nearest', 255);
+
+ if ($rows > 2)
+ {
+ # If needed, crop image to avoid wasted space
+ $tempPixbuf = $tempPixbuf->new_subpixbuf(0,$bgHeight-$destHeight,$bgWidth,$destHeight);
+ }
+ @pixBuf[$imgCount] = $tempPixbuf;
+ }
+
+ # Get pixbuf ready for final image
+ $tempPixbuf = Gtk2::Gdk::Pixbuf->new('rgb',1,8,$bgWidth * $itemsPerRow,$destHeight * $rows);
+ $tempPixbuf->fill(0x00000000);
+
+ # Put each cover in place
+ for (my $imgCount = 0; $imgCount < $itemsPerRow * $rows; $imgCount++)
+ {
+ @pixBuf[$imgCount]->composite($tempPixbuf,
+ @pixBuf[0]->get_width * ($imgCount % $itemsPerRow),
+ @pixBuf[0]->get_height * int($imgCount / $itemsPerRow),
+ @pixBuf[5]->get_width,
+ @pixBuf[5]->get_height,
+ @pixBuf[0]->get_width * ($imgCount % $itemsPerRow),
+ @pixBuf[0]->get_height * int($imgCount / $itemsPerRow),
+ 1, 1, 'nearest', 255);
+ }
+
+ # Scale to specified size, or else to max 128 pixels wide/high
+ if ($ARGV[2])
+ {
+ $tempPixbuf = scaleMaxPixbuf($tempPixbuf,$ARGV[2],$ARGV[2]);
+ }
+ else
+ {
+ $tempPixbuf = scaleMaxPixbuf($tempPixbuf,128,128);
+ }
+
+ # Place little gcstar icon in corner
+ $gcstarIconPixBuf->composite($tempPixbuf,
+ $tempPixbuf->get_width - $gcstarIconPixBuf->get_width - 4,
+ $tempPixbuf->get_height - $gcstarIconPixBuf->get_height - 5,
+ $gcstarIconPixBuf->get_width,
+ $gcstarIconPixBuf->get_height,
+ $tempPixbuf->get_width - $gcstarIconPixBuf->get_width - 4,
+ $tempPixbuf->get_height - $gcstarIconPixBuf->get_height - 5,
+ 1,1,'nearest',255);
+
+ # Save pixbuf
+ $tempPixbuf->save($ARGV[1],"png");
+
+}
+
+sub scaleMaxPixbuf
+{
+ my ($pixbuf, $maxWidth, $maxHeight) = @_;
+
+ my ($width, $height) = ($pixbuf->get_width, $pixbuf->get_height);
+ if (($height > $maxHeight) || ($width > $maxWidth))
+ {
+ my ($newWidth, $newHeight);
+ my $ratio = $height / $width;
+ if (($width) * ($maxHeight / $height) < $maxWidth)
+ {
+ $newHeight = $maxHeight;
+ $newWidth = $newHeight / $ratio;
+ }
+ else
+ {
+ $newWidth = $maxWidth;
+ $newHeight = $newWidth * $ratio;
+ }
+
+ $pixbuf = $pixbuf->scale_simple($newWidth, $newHeight, 'bilinear');
+ }
+
+ return $pixbuf;
+}
diff --git a/share/applications/gcstar.desktop b/share/applications/gcstar.desktop
new file mode 100644
index 0000000..aa6a46d
--- /dev/null
+++ b/share/applications/gcstar.desktop
@@ -0,0 +1,18 @@
+[Desktop Entry]
+Version=1.0
+Name=GCstar Collections Manager
+Name[es]=Gestor de colecciones GCstar
+Name[fr]=GCstar gestionnaire de collections
+GenericName=Personal Collections Manager
+Comment=Manage your collections of movies, games, books, music and more
+Comment[en]=Manage your collections of movies, games, books, music and more
+Comment[es]=Organice sus colecciones de películas, juegos, libros, música y más
+Comment[fr]=Gérer vos collections de films, jeux vidéos, livres, musique,...
+Comment[pt]=Organize as suas colecções de filmes, jogos, vídeos, livros e música...
+Exec=gcstar %f
+Icon=gcstar
+Terminal=false
+StartupNotify=true
+Type=Application
+Categories=Office;
+MimeType=application/x-gcstar
diff --git a/share/applications/gcstar.xml b/share/applications/gcstar.xml
new file mode 100644
index 0000000..c342767
--- /dev/null
+++ b/share/applications/gcstar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+ <mime-type type="application/x-gcstar">
+ <comment>GCstar collection</comment>
+ <glob pattern="*.gcs"/>
+ </mime-type>
+</mime-info>
diff --git a/share/gcstar/LICENSE b/share/gcstar/LICENSE
new file mode 100644
index 0000000..3912109
--- /dev/null
+++ b/share/gcstar/LICENSE
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 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.
+
+ 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 Library 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 St, 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 Library General
+Public License instead of this License.
diff --git a/share/gcstar/fonts/AUTHORS b/share/gcstar/fonts/AUTHORS
new file mode 100644
index 0000000..8448d44
--- /dev/null
+++ b/share/gcstar/fonts/AUTHORS
@@ -0,0 +1,8 @@
+Designer:
+
+ Steve Matteson (Ascender Corp.)
+ http://www.ascendercorp.com/typedesigners.html
+
+Maintainer:
+
+ Caius 'kaio' Chance <k AT kaio.me>
diff --git a/share/gcstar/fonts/COPYING b/share/gcstar/fonts/COPYING
new file mode 100644
index 0000000..846b7da
--- /dev/null
+++ b/share/gcstar/fonts/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 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.
+
+ 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 Library 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 St, 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 Library General
+Public License instead of this License.
diff --git a/share/gcstar/fonts/ChangeLog b/share/gcstar/fonts/ChangeLog
new file mode 100644
index 0000000..4ceea3f
--- /dev/null
+++ b/share/gcstar/fonts/ChangeLog
@@ -0,0 +1,176 @@
+* Tue 14 Jul 2009 Caius 'kaio' Chance <me AT kaio.me>
+- Generated TTFs with tradition kern table, with fontforge ver 20090408.
+- Added make target alias dist-src as dist-sfd.
+
+* Mon 13 Jul 2009 Caius 'kaio' Chance <me AT kaio.me>
+- Updated for generation of traditional kern table via scripts.
+
+* Mon 06 Jul 2009 Caius 'kaio' Chance <me AT kaio.me>
+- Reconverted SFDs from original TTFs with traditional kern table.
+- Updated "clean" target in Makefile.
+
+* Tue 30 Jun 2009 Caius 'kaio' Chance <me AT kaio.me>
+- Reconverted SFDs from original TTFs with traditional kern table.
+- Updated "clean" target in Makefile.
+
+* Tue 30 Jun 2009 Caius 'kaio' Chance <me AT kaio.me>
+- Generated cleaner SFD from original TTFs.
+- Include Makefile in sources tarball.
+
+* Wed 24 Jun 2009 Caius 'kaio' Chance <me AT kaio.me>
+- Makefile: pack SFD files as source tarball.
+- Makefile: pack TTF files as ttf packs.
+- Tidy up repository.
+- Updated documents.
+
+* Mon 12 Jan 2009 Caius Chance <cchance@redhat.com>
+- Fixed copyright holder name typo for Sans Regular font (rhbz#479521).
+
+* Tue 09 Dec 2008 Caius Chance <cchance@redhat.com>
+- Changed cent sign glyph (U+00A2) to be coressed in Sans and Mono
+ (rhbz#474522).
+
+* Wed 03 Dec 2008 Caius Chance <cchance@redhat.com>
+- Started 1.04.93.devel.
+- Fixed blurriness of U+03BC for Sans Regular font (rhbz#473481).
+- Fixed src tarball mis-inclusion of dist files in Makefile.
+
+* Fri 28 Nov 2008 Caius Chance <cchance@redhat.com>
+- Corrected version number in Makefile.
+- Fixed make target of source tarball.
+- Uploaded 1.04.92 source tarball to release area.
+
+* Wed 15 Oct 2008 Caius Chance <cchance@redhat.com>
+- Fixed blurred 'u' and 'W' for Sans Bold font (rhbz#463036).
+- Released as version 1.04.92
+
+* Wed 17 Sep 2008 Caius Chance <cchance@redhat.com>
+- Fixed missing hinting instructions for all Mono fonts (rhbz#460090).
+- Fixed missing hinting instructions for all Sans fonts (rhbz#460090).
+- Fixed missing hinting instructions for all Serif fonts (rhbz#460090).
+- Released as version 1.04.91
+
+* Tue 09 Sep 2008 Caius Chance <cchance@redhat.com>
+- Backed up all released files in ./dist directory.
+
+* Fri 05 Sep 2008 Caius Chance <cchance@redhat.com>
+- Fixed incorrect glyph points and missing hinting instructions for:
+ Mono Bold Italic (up to U+2012) (rhbz#460090).
+
+* Mon 25 Aug 2008 Caius Chance <cchance@redhat.com>
+- Fixed incorrect glyph points and missing hinting instructions for:
+ U+0079, U+03BC, U+0431, U+2010..2012, U+1114117 (rhbz#458592).
+- Released as version 1.04.90.
+
+* Thu 13 Jul 2008 Caius Chance <cchance@redhat.com>
+- Released as version 1.04.
+
+* Thu 12 Jun 2008 Caius Chance <cchance@redhat.com>
+- Released as version 1.04.beta2 (1.03.99).
+- Added ZIP package building for non-tar users.
+- rhbz#440992:
+ - Created Romanian "T/t/S/s with comma below" (U+0218..021B) on all fonts.
+ - Fixed "T/s with cedilla below" (U+0162/0163) on all fonts.
+ - Created "Hyphen" and "Non-Breaking Hyphen" (U+2010..2011) on all fonts.
+
+* Wed 11 Jun 2008 Caius Chance <cchance@redhat.com>
+- Added last Version 1.03 from original manufacturer.
+- Renamed directory 'archive' to 'sandbox'.
+- Added directory description in hosting home directory.
+- Created ZIP packages for Version 1.03 and 1.04.beta.
+
+* Tue 04 Jun 2008 Caius Chance <cchance@redhat.com>
+- rhbz#440992:
+ - Created "Hyphen" and "Non-Breaking Hyphen" (U+2010..2011) on Sans Regular.
+
+* Mon 03 Jun 2008 Caius Chance <cchance@redhat.com>
+- rhbz#440992:
+ - Created Romanian "T/t/S/s with comma below" (U+0218..021B) on Sans Regular.
+ - Fixed "T/s with cedilla below" (U+0162/0163) on Sans Regular.
+
+* Fri 30 May 2008 Caius Chance <cchance@redhat.com>
+- Release Version 1.04.beta (liberation-fonts-1_04_beta).
+
+* Thu 29 May 2008 Caius Chance <cchance@redhat.com>
+- Correct SFD version numbers in "TTF Info" categor for correct version
+ number during export to TTFs.
+
+* Wed 28 May 2008 Caius Chance <cchance@redhat.com>
+- Reencoded with "Glyph Order" by FontForge.
+- Corrected font name for all Regular fonts.
+- Generated TTFs (experimantal, in "archive") with old stle kern and dummy
+ DSIG table.
+- Updated README in 1.04b TTFs (experimental, in "archive").
+
+* Tue 27 May 2008 Caius Chance <cchance@redhat.com>
+- Fixed Unicode name mis-mapping of Sans and Serif TTF files.
+- Regenerate SFD files from Unicode name mis-mapping fixed Sans and Serif TTF
+ files.
+
+* Mon 26 May 2008 Caius Chance <cchance@redhat.com>
+- Fixed Unicode name mis-mapping of Mono TTF files.
+- Regenerate SFD files from Unicode name mis-mapping fixed Mono TTF files.
+==========
+- Applied following patches submitted by Nicolas Spalinger
+ <nicolas_spalinger sil org>:
+ - We-need-versioned-tarballs.
+ - Add-ignore-file-so-the-VCS-does-not-track-the-folder.
+ - Adjust-path-for-various-Makefile-targets-subfolders.
+ - Fix-versionning-mismatch-in-the-binary-font-metadata.
+ - Add-some-description-and-extra-lines-to-the-build-ta.
+ - Reword-and-restructure-maintainers-recommendations.
+ - Some-rewording-of-the-readme-file.
+==========
+
+* Thu May 22 2008 Caius Chance <cchance@redhat.com>
+- Added latest (1.03) TTF files from Ascender. (in 'archive')
+
+* Fri May 16 2008 Caius Chance <cchance@redhat.com>
+- Change source tree as 'trunk', 'tags', 'branches'.
+==========
+- Applied following patches submitted by Nicolas Spalinger
+ <nicolas_spalinger sil org>:
+ - Add-more-information-about-the-upstream-designer.
+ - Minor-typo-and-layout-fixes.
+ - Adjust-fontforge-path-with-env-as-a-source-build.
+==========
+
+* Wed May 14 2008 Caius Chance <cchance@redhat.com>
+- Renamed target 'ttf' to 'build'.
+- Removed 'Re-Package' chapter from README and refine contents.
+- Changed AUTHORS contents.
+- Created maintainer documentation MAINTAINER.
+
+* Tue May 06 2008 Caius Chance <cchance@redhat.com>
+- Refined clean target.
+- Removed TTFs from git.
+
+* Fri May 02 2008 Caius Chance <cchance@redhat.com>
+- Imported into fedorahosted.org repository and be hosted.
+ https://fedorahosted.org/liberation-fonts/
+- Modified source root directory name definition in Makefile.
+- Created 'dist' target for binary TTF tarball and 'src' for source tarball.
+- Corrected Regular fonts filenames.
+- Added TTF -> SFD make target.
+
+* Thu May 01 2008 Caius Chance <cchance@redhat.com>
+- Converted previous TTF files into SFD files to be open source.
+- Created fontforge SFD -> TTF scripts.
+- Created Makefile.
+- Added documentations: AUTHORS, ChangeLog, README.
+
+* Thu Apr 10 2008 Caius Chance <cchance@redhat.com>
+- Fixed exchanged and incomplete glyphs (from Ascender).
+- Repacked source tarball.
+- Released version 1.03.
+
+* Tue Mar 25 2008 Caius Chance <cchance@redhat.com>
+- Fixed alignment mismatch of dot accents (from Ascender).
+- Released version 1.02.
+
+* Mon Jan 14 2008 Caius Chance <cchance@redhat.com>
+- Updated new source tarball from Ascender.
+- Released version 1.0.
+
+* Thu Jun 14 2007 Caius Chance <cchance@redhat.com>
+- Updated new source tarball from Ascender.
diff --git a/share/gcstar/fonts/LiberationSans-Regular.ttf b/share/gcstar/fonts/LiberationSans-Regular.ttf
new file mode 100644
index 0000000..4b2ebce
--- /dev/null
+++ b/share/gcstar/fonts/LiberationSans-Regular.ttf
Binary files differ
diff --git a/share/gcstar/fonts/License.txt b/share/gcstar/fonts/License.txt
new file mode 100644
index 0000000..f178728
--- /dev/null
+++ b/share/gcstar/fonts/License.txt
@@ -0,0 +1,19 @@
+LICENSE AGREEMENT AND LIMITED PRODUCT WARRANTY
+LIBERATION FONT SOFTWARE
+
+This agreement governs the use of the Software and any updates to the Software, regardless of the delivery mechanism. Subject to the following terms, Red Hat, Inc. ("Red Hat") grants to the user ("Client") a license to this work pursuant to the GNU General Public License v.2 with the exceptions set forth below and such other terms as are set forth in this End User License Agreement.
+
+ 1. The Software and License Exception. LIBERATION font software (the "Software") consists of TrueType-OpenType formatted font software for rendering LIBERATION typefaces in sans-serif, serif, and monospaced character styles. You are licensed to use, modify, copy, and distribute the Software pursuant to the GNU General Public License v.2 with the following exceptions:
+
+ (a) As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.
+
+ (b) As a further exception, any distribution of the object code of the Software in a physical product must provide you the right to access and modify the source code for the Software and to reinstall that modified version of the Software in object code form on the same physical product on which you received it.
+
+ 2. Intellectual Property Rights. The Software and each of its components, including the source code, documentation, appearance, structure and organization are owned by Red Hat and others and are protected under copyright and other laws. Title to the Software and any component, or to any copy, modification, or merged portion shall remain with the aforementioned, subject to the applicable license. The "LIBERATION" trademark is a trademark of Red Hat, Inc. in the U.S. and other countries. This agreement does not permit Client to distribute modified versions of the Software using Red Hat's trademarks. If Client makes a redistribution of a modified version of the Software, then Client must modify the files names to remove any reference to the Red Hat trademarks and must not use the Red Hat trademarks in any way to reference or promote the modified Software.
+
+ 3. Limited Warranty. To the maximum extent permitted under applicable law, the Software is provided and licensed "as is" without warranty of any kind, expressed or implied, including the implied warranties of merchantability, non-infringement or fitness for a particular purpose. Red Hat does not warrant that the functions contained in the Software will meet Client's requirements or that the operation of the Software will be entirely error free or appear precisely as described in the accompanying documentation.
+
+ 4. Limitation of Remedies and Liability. To the maximum extent permitted by applicable law, Red Hat or any Red Hat authorized dealer will not be liable to Client for any incidental or consequential damages, including lost profits or lost savings arising out of the use or inability to use the Software, even if Red Hat or such dealer has been advised of the possibility of such damages.
+
+ 5. General. If any provision of this agreement is held to be unenforceable, that shall not affect the enforceability of the remaining provisions. This agreement shall be governed by the laws of the State of North Carolina and of the United States, without regard to any conflict of laws provisions, except that the United Nations Convention on the International Sale of Goods shall not apply.
+Copyright © 2007 Red Hat, Inc. All rights reserved. LIBERATION is a trademark of Red Hat, Inc.
diff --git a/share/gcstar/fonts/README b/share/gcstar/fonts/README
new file mode 100644
index 0000000..13d1bd4
--- /dev/null
+++ b/share/gcstar/fonts/README
@@ -0,0 +1,90 @@
+ 1. What's this?
+=================
+
+ The Liberation Fonts is font collection which aims display compatibility to
+ document files that used Times New Roman, Arial, Courier New as fonts.
+
+
+ 2. Requirements
+=================
+
+ * fontforge to be installed.
+ (http://fontforge.sourceforge.net)
+
+
+ 3. Install
+============
+
+ 3.1 Decompress tarball
+
+ You can extract the files by following command:
+
+ $ tar zxvf liberation-fonts-[VERSION].tar.gz
+
+ 3.2 Build from the source
+
+ Change into directory liberation-fonts-[VERSION]/ and build from sources by
+ following commands:
+
+ $ cd liberation-fonts-[VERSION]
+ $ make
+
+ The built font files will be available in 'build' directory.
+
+ 3.3 Install to system
+
+ You can manually install the fonts by copying the TTFs to ~/.fonts for user
+ wide usage, or to /usr/share/fonts/truetype/liberation for system-wide
+ availability.
+
+
+ 4. Usage
+==========
+
+ The fonts should be installed and detected by the system after installation.
+ Simply select preferred liberation font in applications and start using.
+
+
+ 5. License
+============
+
+ For redistribution information, please read the GPL license file 'COPYING'.
+
+ For EULA information, please read file 'License.txt'.
+
+
+ 6. Maintainers
+================
+
+ (FIXME)
+ Before packaging a new release based on a new source tarball, you have to
+ update the version number in the Makefile:
+
+ VER = [VERSION]
+
+ Make sure that the defined version corresponds to the font software metadata
+which you can check with ftinfo/otfinfo or fontforge itself. It is highly recommended that file 'ChangeLog' is updated to reflect
+changes.
+
+Create a tarball with the following command:
+$ make dist
+
+The new versionned tarball will be available in the dist/ folder as
+'liberation-fonts-[NEW_VERSION].tar.gz'.
+ (FIXME)
+
+ 7. Credits
+============
+
+Special thanks to all involved to the proejct of Liberation Fonts!
+
+ * Caius 'kaio' Chance <k AT kaio.me>
+ - Current project maintainer.
+
+ * Mark Webbink <mwebbink AT redhat.com>
+ - Release coordinator, Red Hat Inc.
+
+ * Steve Matteson
+ - Designer, Ascender Corp.
+
+ * And, all other anonymous participants.
diff --git a/share/gcstar/genres/EN.genres b/share/gcstar/genres/EN.genres
new file mode 100644
index 0000000..83074cb
--- /dev/null
+++ b/share/gcstar/genres/EN.genres
@@ -0,0 +1,12 @@
+Science Fiction|Sci-Fi,SF
+Fantasy|Fantastic,Fantastique,Fantastico,Fantascienza
+Comedy|Comedie,Commedia,Comédie
+Adventure|Avventura,Aventure,Action-Adventure
+Animation|Anime,Cartoon,Animated
+Music|Musical
+Thriller|Suspense
+Action|Martial Arts
+Family|Children,Kids
+Classic|Classics
+Television|TV
+War|Military \ No newline at end of file
diff --git a/share/gcstar/genres/ES.genres b/share/gcstar/genres/ES.genres
new file mode 100644
index 0000000..ead23a3
--- /dev/null
+++ b/share/gcstar/genres/ES.genres
@@ -0,0 +1,12 @@
+Ciencia Ficción|Sci-Fi,SF
+Fantástico|Fantastic,Fantastique,Fantastico,Fantascienza
+Comedia|Comedie,Commedia,Comédie,Comedy,Commedia
+Aventuras|Avventura,Aventure,Action-Adventure
+Animación|Anime,Cartoon,Animated
+Musical|Musical
+Thriller|Suspense
+Acción|Martial Arts
+Familiar|Children,Kids
+Clásico|Classics
+Televisión|TV
+Bélico|Military
diff --git a/share/gcstar/genres/FR.genres b/share/gcstar/genres/FR.genres
new file mode 100644
index 0000000..a450b52
--- /dev/null
+++ b/share/gcstar/genres/FR.genres
@@ -0,0 +1,4 @@
+Comédie|Comedie,Comedy,Commedia
+Aventure|Avventura,Adventure
+Fantastique|Fantastico,Fantascienza,Fantastic
+Science Fiction|SF,Sci-Fi \ No newline at end of file
diff --git a/share/gcstar/helpers/xdg-open b/share/gcstar/helpers/xdg-open
new file mode 100644
index 0000000..e25e67f
--- /dev/null
+++ b/share/gcstar/helpers/xdg-open
@@ -0,0 +1,469 @@
+#!/bin/sh
+#---------------------------------------------
+# xdg-open
+#
+# Utility script to open a URL in the registered default application.
+#
+# Refer to the usage() function below for usage.
+#
+# Copyright 2006, Kevin Krammer <kevin.krammer@gmx.at>
+# Copyright 2006, Jeremy White <jwhite@codeweavers.com>
+#
+# LICENSE:
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+#---------------------------------------------
+
+manualpage()
+{
+cat << _MANUALPAGE
+Name
+
+xdg-open ? opens a file or URL in the user's preferred application
+
+Synopsis
+
+xdg-open { file | URL }
+
+xdg-open { --help | --manual | --version }
+
+Description
+
+xdg-open opens a file or URL in the user's preferred application. If a URL is
+provided the URL will be opened in the user's preferred web browser. If a file
+is provided the file will be opened in the preferred application for files of
+that type. xdg-open supports file, ftp, http and https URLs.
+
+xdg-open is for use inside a desktop session only. It is not recommended to use
+xdg-open as root.
+
+Options
+
+--help
+ Show command synopsis.
+--manual
+ Show this manualpage.
+--version
+ Show the xdg-utils version information.
+
+Exit Codes
+
+An exit code of 0 indicates success while a non-zero exit code indicates
+failure. The following failure codes can be returned:
+
+1
+ Error in command line syntax.
+2
+ One of the files passed on the command line did not exist.
+3
+ A required tool could not be found.
+4
+ The action failed.
+
+Examples
+
+xdg-open 'http://www.freedesktop.org/'
+
+Opens the Freedesktop.org website in the user's default browser
+
+xdg-open /tmp/foobar.png
+
+Opens the PNG image file /tmp/foobar.png in the user's default image viewing
+application.
+
+_MANUALPAGE
+}
+
+usage()
+{
+cat << _USAGE
+xdg-open ? opens a file or URL in the user's preferred application
+
+Synopsis
+
+xdg-open { file | URL }
+
+xdg-open { --help | --manual | --version }
+
+_USAGE
+}
+
+#@xdg-utils-common@
+
+#----------------------------------------------------------------------------
+# Common utility functions included in all XDG wrapper scripts
+#----------------------------------------------------------------------------
+
+DEBUG()
+{
+ [ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && return 0;
+ [ ${XDG_UTILS_DEBUG_LEVEL} -lt $1 ] && return 0;
+ shift
+ echo "$@" >&2
+}
+
+#-------------------------------------------------------------
+# Exit script on successfully completing the desired operation
+
+exit_success()
+{
+ if [ $# -gt 0 ]; then
+ echo "$@"
+ echo
+ fi
+
+ exit 0
+}
+
+
+#-----------------------------------------
+# Exit script on malformed arguments, not enough arguments
+# or missing required option.
+# prints usage information
+
+exit_failure_syntax()
+{
+ if [ $# -gt 0 ]; then
+ echo "xdg-open: $@" >&2
+ echo "Try 'xdg-open --help' for more information." >&2
+ else
+ usage
+ echo "Use 'man xdg-open' or 'xdg-open --manual' for additional info."
+ fi
+
+ exit 1
+}
+
+#-------------------------------------------------------------
+# Exit script on missing file specified on command line
+
+exit_failure_file_missing()
+{
+ if [ $# -gt 0 ]; then
+ echo "xdg-open: $@" >&2
+ fi
+
+ exit 2
+}
+
+#-------------------------------------------------------------
+# Exit script on failure to locate necessary tool applications
+
+exit_failure_operation_impossible()
+{
+ if [ $# -gt 0 ]; then
+ echo "xdg-open: $@" >&2
+ fi
+
+ exit 3
+}
+
+#-------------------------------------------------------------
+# Exit script on failure returned by a tool application
+
+exit_failure_operation_failed()
+{
+ if [ $# -gt 0 ]; then
+ echo "xdg-open: $@" >&2
+ fi
+
+ exit 4
+}
+
+#------------------------------------------------------------
+# Exit script on insufficient permission to read a specified file
+
+exit_failure_file_permission_read()
+{
+ if [ $# -gt 0 ]; then
+ echo "xdg-open: $@" >&2
+ fi
+
+ exit 5
+}
+
+#------------------------------------------------------------
+# Exit script on insufficient permission to read a specified file
+
+exit_failure_file_permission_write()
+{
+ if [ $# -gt 0 ]; then
+ echo "xdg-open: $@" >&2
+ fi
+
+ exit 6
+}
+
+check_input_file()
+{
+ if [ ! -e "$1" ]; then
+ exit_failure_file_missing "file '$1' does not exist"
+ fi
+ if [ ! -r "$1" ]; then
+ exit_failure_file_permission_read "no permission to read file '$1'"
+ fi
+}
+
+check_vendor_prefix()
+{
+ file_label="$2"
+ [ -n "$file_label" ] || file_label="filename"
+ file=`basename "$1"`
+ case "$file" in
+ [a-zA-Z]*-*)
+ return
+ ;;
+ esac
+
+ echo "xdg-open: $file_label '$file' does not have a proper vendor prefix" >&2
+ echo 'A vendor prefix consists of alpha characters ([a-zA-Z]) and is terminated' >&2
+ echo 'with a dash ("-"). An example '"$file_label"' is '"'example-$file'" >&2
+ echo "Use --novendor to override or 'xdg-open --manual' for additional info." >&2
+ exit 1
+}
+
+check_output_file()
+{
+ # if the file exists, check if it is writeable
+ # if it does not exists, check if we are allowed to write on the directory
+ if [ -e "$1" ]; then
+ if [ ! -w "$1" ]; then
+ exit_failure_file_permission_write "no permission to write to file '$1'"
+ fi
+ else
+ DIR=`dirname "$1"`
+ if [ ! -w "$DIR" -o ! -x "$DIR" ]; then
+ exit_failure_file_permission_write "no permission to create file '$1'"
+ fi
+ fi
+}
+
+#----------------------------------------
+# Checks for shared commands, e.g. --help
+
+check_common_commands()
+{
+ while [ $# -gt 0 ] ; do
+ parm="$1"
+ shift
+
+ case "$parm" in
+ --help)
+ usage
+ echo "Use 'man xdg-open' or 'xdg-open --manual' for additional info."
+ exit_success
+ ;;
+
+ --manual)
+ manualpage
+ exit_success
+ ;;
+
+ --version)
+ echo "xdg-open 1.0.2"
+ exit_success
+ ;;
+ esac
+ done
+}
+
+check_common_commands "$@"
+
+[ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && unset XDG_UTILS_DEBUG_LEVEL;
+if [ ${XDG_UTILS_DEBUG_LEVEL-0} -lt 1 ]; then
+ # Be silent
+ xdg_redirect_output=" > /dev/null 2> /dev/null"
+else
+ # All output to stderr
+ xdg_redirect_output=" >&2"
+fi
+
+#--------------------------------------
+# Checks for known desktop environments
+# set variable DE to the desktop environments name, lowercase
+
+detectDE()
+{
+ if [ x"$KDE_FULL_SESSION" = x"true" ]; then DE=kde;
+ elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then DE=gnome;
+ elif `dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetNameOwner string:org.gnome.SessionManager > /dev/null 2>&1` ; then DE=gnome;
+ elif xprop -root _DT_SAVE_MODE 2> /dev/null | grep ' = \"xfce4\"$' >/dev/null 2>&1; then DE=xfce;
+ fi
+}
+
+#----------------------------------------------------------------------------
+# kfmclient exec/openURL can give bogus exit value in KDE <= 3.5.4
+# It also always returns 1 in KDE 3.4 and earlier
+# Simply return 0 in such case
+
+kfmclient_fix_exit_code()
+{
+ version=`kde${KDE_SESSION_VERSION}-config --version 2>/dev/null | grep KDE`
+ major=`echo $version | sed 's/KDE: \([0-9]\).*/\1/'`
+ minor=`echo $version | sed 's/KDE: [0-9]*\.\([0-9]\).*/\1/'`
+ release=`echo $version | sed 's/KDE: [0-9]*\.[0-9]*\.\([0-9]\).*/\1/'`
+ test "$major" -gt 3 && return $1
+ test "$minor" -gt 5 && return $1
+ test "$release" -gt 4 && return $1
+ return 0
+}
+
+open_kde()
+{
+ if kde-open -v 2>/dev/null 1>&2; then
+ kde-open "$1"
+ else
+ if [ x"$KDE_SESSION_VERSION" = x"4" ]; then
+ kfmclient openURL "$1"
+ else
+ kfmclient exec "$1"
+ kfmclient_fix_exit_code $?
+ fi
+ fi
+
+ if [ $? -eq 0 ]; then
+ exit_success
+ else
+ exit_failure_operation_failed
+ fi
+}
+
+open_gnome()
+{
+ if gvfs-open --help 2>/dev/null 1>&2; then
+ gvfs-open "$1"
+ else
+ gnome-open "$1"
+ fi
+
+ if [ $? -eq 0 ]; then
+ exit_success
+ else
+ exit_failure_operation_failed
+ fi
+}
+
+open_xfce()
+{
+ exo-open "$1"
+
+ if [ $? -eq 0 ]; then
+ exit_success
+ else
+ exit_failure_operation_failed
+ fi
+}
+
+open_generic()
+{
+ if mimeopen -v 2>/dev/null 1>&2; then
+ mimeopen -n "$1"
+ if [ $? -eq 0 ]; then
+ exit_success
+ fi
+ fi
+
+ if which run-mailcap 2>/dev/null 1>&2 &&
+ (echo "$1" | grep -q '^file://' ||
+ ! echo "$1" | egrep -q '^[a-zA-Z+\.\-]+:'); then
+
+ local file=$(echo "$1" | sed 's%^file://%%')
+ run-mailcap --action=view "$file"
+ if [ $? -eq 0 ]; then
+ exit_success
+ fi
+ fi
+
+ IFS=":"
+ for browser in $BROWSER; do
+ if [ x"$browser" != x"" ]; then
+
+ browser_with_arg=`printf "$browser" "$1" 2>/dev/null`
+ if [ $? -ne 0 ]; then browser_with_arg=$browser;
+ fi
+
+ if [ x"$browser_with_arg" = x"$browser" ]; then "$browser" "$1";
+ else $browser_with_arg;
+ fi
+
+ if [ $? -eq 0 ]; then exit_success;
+ fi
+ fi
+ done
+
+ exit_failure_operation_impossible "no method available for opening '$1'"
+}
+
+[ x"$1" != x"" ] || exit_failure_syntax
+
+url=
+while [ $# -gt 0 ] ; do
+ parm="$1"
+ shift
+
+ case "$parm" in
+ -*)
+ exit_failure_syntax "unexpected option '$parm'"
+ ;;
+
+ *)
+ if [ -n "$url" ] ; then
+ exit_failure_syntax "unexpected argument '$parm'"
+ fi
+ url="$parm"
+ ;;
+ esac
+done
+
+if [ -z "${url}" ] ; then
+ exit_failure_syntax "file or URL argument missing"
+fi
+
+detectDE
+
+if [ x"$DE" = x"" ]; then
+ # if BROWSER variable is not set, check some well known browsers instead
+ if [ x"$BROWSER" = x"" ]; then
+ BROWSER=htmlview:firefox:mozilla:netscape:links:lynx
+ fi
+ DE=generic
+fi
+
+case "$DE" in
+ kde)
+ open_kde "$url"
+ ;;
+
+ gnome)
+ open_gnome "$url"
+ ;;
+
+ xfce)
+ open_xfce "$url"
+ ;;
+
+ generic)
+ open_generic "$url"
+ ;;
+
+ *)
+ exit_failure_operation_impossible "no method available for opening '$url'"
+ ;;
+esac
diff --git a/share/gcstar/html_models/GCboardgames/piwi b/share/gcstar/html_models/GCboardgames/piwi
new file mode 100644
index 0000000..9a32430
--- /dev/null
+++ b/share/gcstar/html_models/GCboardgames/piwi
@@ -0,0 +1,275 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
+<!--
+ Template made by Tian ( http://www.c-sait.net/ ) - Mods by Piwi -->
+<head>
+ <title>$$PAGETITLE$$</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+[JAVASCRIPT]
+ <script type="text/javascript">
+<!--
+expandTooltip="Afficher les informations du jeu";
+collapseTooltip="Masquer les informations du jeu";
+function prn(s)
+{
+ document.write(s)
+}
+function getE(id)
+{
+ return document.getElementById(id)
+}
+function expcolAll(dir,rowNum)
+{
+ for(x=0;x < rowNum;x++) {
+ try {
+ getE('movie'+x).style.display=dir
+ if(dir=="none") getE('switch'+x).innerHTML="+"
+ else getE('switch'+x).innerHTML="&ndash;"
+ }
+ catch(err) { }
+ }
+}
+function toggleDisplay(id,swt)
+{
+ if((getE(id).style.display=="")||(getE(id).style.display=="none")) {
+ getE(id).style.display="block"
+ getE(swt).innerHTML="&ndash;"
+ getE(swt).title=collapseTooltip
+ } else {
+ getE(id).style.display="none"
+ getE(swt).innerHTML="+"
+ getE(swt).title=expandTooltip
+ }
+ return false
+}
+function writeExpandControl(elementId,collapse)
+{
+ prn("<a href=\"#\" class=\"movie-expand\" id=\"switch"+elementId+"\" onclick=\"return toggleDisplay('movie"+elementId+"','switch"+elementId+"');\" title=\""+((collapse) ? expandTooltip : collapseTooltip)+"\">"+((collapse) ? "+" : "&ndash;")+"</a>")
+}
+function searchMovies(text)
+{
+ getE("collapseAll").click()
+ alldt=document.getElementsByTagName("dt")
+ alldd=document.getElementsByTagName("dd")
+ nb=alldt.length
+ re=new RegExp(text,"i")
+ for(i=0;i<nb;i++) {
+ s1=alldt[i].getElementsByTagName("a")[1].innerHTML
+ s2=alldd[i].innerHTML
+ res=0
+ if(getE("searchType").value=="all") res=(re.test(s1)||re.test(s2))
+ else res=re.test(s1)
+ if(res) st="block"
+ else st="none"
+ alldt[i].style.display=st
+ alldd[i].style.display=st
+ }
+}
+-->
+ </script>
+[/JAVASCRIPT]
+ <style type="text/css">
+ body {
+ background:#FEEFCF;
+ }
+ h1 {
+ font-weight:bold;
+ font-size:160%;
+ text-align:center;
+ margin-bottom:1em;
+ }
+ #top {
+ color:#FF912D ! important;
+ background:transparent ! important;
+ }
+ form {
+ text-align:center;
+ border:1px dashed #999999;
+ background:#FCCC67;
+ margin:0 3em;
+ padding:0.5em;
+ }
+ input, select {
+ border:1px solid #666666;
+ background: #FCCC67;
+ color: #993300;
+ margin:0 0.5em;
+ }
+ input:focus, input.submit:hover {
+ background:#FCCC67;
+ color: #993300;
+ }
+ }
+ input:hover, input.submit:hover {
+ background:#FCCC67;
+ color: #993300;
+ }
+ input.submit {
+ cursor:pointer;
+ }
+ #links {
+ margin-top:0.5em;
+ text-align:center;
+ font-size:120%;
+ color: #993300;
+ }
+ img {
+ float:left;
+ margin:0 1em 1em 1em;
+ }
+ dt {
+ color:#FF912D;
+ font-size:120%;
+ margin:0em 0.5em;
+ clear:both;
+ }
+ dd {
+ margin:0.5em 2em 1em;
+ border-left:1px dashed #FF912D;
+ border-bottom:1px dashed #FF912D;
+ }
+ table {
+ font-size:90%;
+ margin:0 1em;
+ border:1px dashed #990000;
+ width:60%;
+ color: #990000;
+ }
+ th {
+ font-weight:bold;
+ text-align:left;
+ width:25%;
+ }
+ .tr1 {
+ background:#FCCC67;
+ }
+ .tr2 {
+ background:#FCCC67;
+ }
+ a {
+ color:#ffaa00;
+ background:transparent;
+ text-decoration:none;
+ }
+ a:hover, a:focus {
+ color:#FCCC67;
+ background-color:#ffaa00;
+ }
+ .topl {
+ color:#BBBBBB;
+ font-size:90%;
+ }
+ .movie-expand {
+ width:1em;
+ text-align:center;
+ font-size:120%;
+ float:left;
+ margin:0.2em;
+ }
+ p, #note {
+ color:#993300;
+ background:#FEEFCF;
+ border:1px dashed #999999;
+ clear:left;
+ margin:1em 2em;
+ padding:0.5em;
+ }
+ .borrowed0 {
+ color:#BBBBBB;
+ background:transparent;
+ text-decoration:none;
+ font-size:50%;
+ display:block;
+ }
+ .borrowed1 {
+ color:#BBBBBB;
+ background:transparent;
+ text-decoration:none;
+ font-size:50%;
+ display:block;
+ }
+ #note {
+ text-align:center;
+ }
+ </style>
+</head>
+<body>
+ <h1><a id="top">$$PAGETITLE$$</a></h1>
+[JAVASCRIPT]
+ <form onsubmit="searchMovies(getE('searchText').value); return false" action="">
+ <div>
+ <input type="text" id="searchText" title="$$FORM_INPUT$$" size="20" />
+ <select id="searchType">
+ <option value="title">$$FORM_SEARCH1$$</option>
+ <option value="all">$$FORM_SEARCH2$$</option>
+ </select>
+ <input type="button" class="submit" value="$$FORM_SEARCHBUTTON$$" title="$$FORM_SEARCHTITLE$$" onclick="searchMovies(getE('searchText').value)" />
+ <input type="button" class="submit" value="$$FORM_ALLBUTTON$$" title="$$FORM_ALLTITLE$$" onclick="searchMovies('')" />
+ <br />
+ <br />
+ <input type="button" class="submit" value="$$FORM_EXPAND$$" onclick="expcolAll('block','$$TOTALNUMBER$$')" title="$$FORM_EXPANDTITLE$$" />
+ <input type="button" id="collapseAll" class="submit" value="$$FORM_COLLAPSE$$" onclick="expcolAll('none','$$TOTALNUMBER$$')" title="$$FORM_COLLAPSETITLE$$" />
+ </div>
+ </form>
+[/JAVASCRIPT]
+ <div id="links">| _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |</div>
+ <dl>
+[/HEADER]
+[ITEM]
+ <dt>
+[JAVASCRIPT]
+ <script type="text/javascript">writeExpandControl('$$IDX$$',1)</script>
+[/JAVASCRIPT]
+ <a id="movielink_$$IDX$$" href="$$URL$$">$$TITLE_FIELD$$</a> | <a class="topl" href="#top">($$TOP$$)</a>
+ <span class="borrowed$$borrower_FLAG$$">$$borrower_YESNO$$$$borrower_OREMPTY$$</span>
+ </dt>
+ <dd>
+ <div id="movie$$IDX$$" style="display:none;">
+ <img src="$$boxpic$$" alt="$$name$$" title= "$$name$$" height="$$HEIGHT_PIC$$" />
+ <table>
+ <tr class="tr1"><th>$$playingtime_LABEL$$</th><td>$$playingtime$$</td></tr>
+ <tr class="tr2"><th>$$mechanics_LABEL$$</th><td>$$mechanics$$</td></tr>
+ <tr class="tr1"><th>$$suggestedage_LABEL$$</th><td>$$suggestedage$$</td></tr>
+ <tr class="tr2"><th>$$players_LABEL$$</th><td>$$players$$</td></tr>
+ <tr class="tr1"><th>$$publishedby_LABEL$$</th><td>$$publishedby$$</td></tr>
+ <tr class="tr2"><th>$$designedby_LABEL$$</th><td>$$designedby$$</td></tr>
+ <tr class="tr1"><th>$$illustratedby_LABEL$$</th><td>$$illustratedby$$</td></tr>
+ <tr class="tr2"><th>$$original_LABEL$$</th><td>$$original$$</td></tr>
+ <tr class="tr1"><th>$$expandedby_LABEL$$</th><td>$$expandedby$$</td></tr>
+ <tr class="tr2"><th>$$expansionfor_LABEL$$</th><td>$$expansionfor$$</td></tr>
+ <tr class="tr1"><th>$$released_LABEL$$</th><td>$$released$$</td></tr>
+ </table>
+ <p>$$description$$<br /><br /><em>$$comment$$</em></p>
+ </div>
+ </dd>
+[/ITEM]
+[FOOTER]
+ </dl>
+ <div id="note">$$GENERATOR_NOTE$$ - Modèle Piwi - Adapté de Tian</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+
+ my %letters = ();
+ my $idx = 0; foreach (@items)
+ {
+ my $firstLetter = uc(substr($_->{name}, 0, 1));
+ $firstLetter =~ s/[^A-Z]/_/;
+ if (!$letters{$firstLetter})
+ {
+ $body =~ s/<a id="movielink_$idx"/<a id="$firstLetter"/;
+ $letters{$firstLetter} = 1;
+ }
+ $idx++;
+ }
+
+ foreach (keys %letters)
+ {
+ $header =~ s/\| $_ \|/| <a class="letter" href="#$_">$_<\/a> |/;
+ }
+ $header =~ s/\| ([^<|]) /| <span class="letter">$1<\/span> /g;
+ #$header =~ s/\| ([^<]) \|/| <span class="letter">$1<\/span> |/g;
+[/POST] \ No newline at end of file
diff --git a/share/gcstar/html_models/GCboardgames/piwi.png b/share/gcstar/html_models/GCboardgames/piwi.png
new file mode 100644
index 0000000..bbd6ce8
--- /dev/null
+++ b/share/gcstar/html_models/GCboardgames/piwi.png
Binary files differ
diff --git a/share/gcstar/html_models/GCbooks/FloFred b/share/gcstar/html_models/GCbooks/FloFred
new file mode 100644
index 0000000..59c625a
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/FloFred
@@ -0,0 +1,73 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template par Florent pour fred. Adapaté de rootII.
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+body
+{
+ color:black;
+}
+.borrowed1
+{
+ color:#777777;
+ font-style:italic;
+}
+#legend
+{
+ margin:1em;
+ border:1px solid black;
+ display:inline;
+ padding:0.5em;
+}
+#note
+{
+ border-top:1px solid black;
+ margin:3em 8%;
+ margin-bottom:2em;
+ padding-top:0.5em;
+ text-align:center;
+ font-size:90%;
+}
+#note a
+{
+ color:black ! important;
+ text-decoration:underline;
+ font-weight:bold;
+}
+</style>
+</head>
+<body>
+<h1>$$PAGETITLE$$</h1>
+<table border="0" align="center" cellspacing="0" cellpadding="0" width="80%">
+<tr><td><br><hr></td></tr>
+[/HEADER]
+[ITEM]
+<tr><td>
+<table border="0" cellspacing="10" cellpadding="0" width="100%">
+ <tr><td colspan="3"><strong>$$title$$</strong></td></tr>
+ <tr><td rowspan="5" width="80"><img src="$$cover$$" height="$$HEIGHT_PIC$$" alt="$$title$$" title="$$title$$" border="0"/></td></tr>
+ <tr><td style="font-size:10pt;" width="100"><b>$$authors_LABEL$$$$SEPARATOR$$</b></td><td style="font-size:10pt;">$$authors$$&nbsp;</td></tr>
+ <tr><td style="font-size:10pt;" width="100"><b>$$publisher_LABEL$$$$SEPARATOR$$</b></td><td style="font-size:10pt;">$$publisher$$</td></tr>
+ <tr><td style="font-size:10pt;" width="100"><b>$$publication_LABEL$$$$SEPARATOR$$</b></td><td style="font-size:10pt;">$$publication$$</td></tr>
+ <tr><td style="font-size:10pt;" width="100"><b>$$format_LABEL$$$$SEPARATOR$$</b></td><td style="font-size:10pt;">$$format$$</td></tr>
+ <tr><td colspan="3" style="font-size:10pt;">$$description$$</td></tr>
+</table>
+</td></tr>
+<tr><td><br><hr></td></tr>
+[/ITEM]
+[FOOTER]
+</table>
+<p id="note">$$GENERATOR_NOTE$$ - Design Florent</p>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
+
+
+
diff --git a/share/gcstar/html_models/GCbooks/FloFred.png b/share/gcstar/html_models/GCbooks/FloFred.png
new file mode 100644
index 0000000..050fd0a
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/FloFred.png
Binary files differ
diff --git a/share/gcstar/html_models/GCbooks/NellistosDark b/share/gcstar/html_models/GCbooks/NellistosDark
new file mode 100644
index 0000000..79b983d
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/NellistosDark
@@ -0,0 +1,67 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template mady by Nellistos.
+ nellistos@hotmail.com
+-->
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <title>$$PAGETITLE$$</title>
+ <style type="text/css">
+ body{font-family:sans;font-size:0.7em; background-color: #151515; color: #fff;}
+ h1{text-align:center;}
+ label{font-weight:bold;}
+ a {color:#36A0A6;font-weight:bold;}
+
+ .books{margin:50px;}
+ ul.bookslist{list-style:none;margin:0px;padding:0;}
+ ul.bookslist li {margin:35px 0px 0px 0px;padding:5px 5px 5px 5px;border-top:1px solid #555;border-bottom:1px solid #555; background-color: #333;}
+ ul.fieldslist{margin:0;padding:0;}
+ ul.fieldslist li {margin:0;padding:0;border:none;}
+
+ .details{margin-top:5px;padding: 5px 5px 5px 5px;}
+ .image{float:left;padding:0; margin:0px 25px 0px 0px;}
+ .clear{clear:both;}
+ </style>
+</head>
+<body>
+ <h1>$$PAGETITLE$$</h1>
+ <div class="books">
+ <ul class="bookslist">
+[/HEADER]
+[ITEM]
+ <li>
+ <div class="item">
+ <div class="caption"><a href="$$gcsfield1$$">$$title$$</a></div>
+ <div class="details">
+ <div class="image"><img src="$$cover$$" height="$$HEIGHT_PIC$$" alt="Book cover" title="$$title$$"/></div>
+ <div class="fields">
+ <ul class="fieldslist">
+ <li><label>$$authors_LABEL$$$$SEPARATOR$$</label>$$authors$$</li>
+ <li><label>$$publisher_LABEL$$$$SEPARATOR$$</label>$$publisher$$</li>
+ <li><label>$$publication_LABEL$$$$SEPARATOR$$</label>$$publication$$</li>
+ <li><label>$$format_LABEL$$$$SEPARATOR$$</label>$$format$$</li>
+ <li><label>$$tag_LABEL$$$$SEPARATOR$$</label>$$tags$$</li>
+ </ul>
+ </div>
+ </div>
+ <div class="description"><small>$$description$$</small> </div>
+ </div>
+ <div class="clear"/>
+ </li>
+[/ITEM]
+[FOOTER]
+ </ul>
+ </div>
+ <div align="center">Design <a href="mailto:nellistos@hotmail.com">Nellistos</a>
+ <br/>
+ <small><i>based on microFormats Spec</i></small></div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
+
+
+
diff --git a/share/gcstar/html_models/GCbooks/NellistosDark.png b/share/gcstar/html_models/GCbooks/NellistosDark.png
new file mode 100644
index 0000000..ca505cd
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/NellistosDark.png
Binary files differ
diff --git a/share/gcstar/html_models/GCbooks/NellistosLight b/share/gcstar/html_models/GCbooks/NellistosLight
new file mode 100644
index 0000000..2cf897d
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/NellistosLight
@@ -0,0 +1,66 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template mady by Nellistos.
+ nellistos@hotmail.com
+-->
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <title>$$PAGETITLE$$</title>
+ <style type="text/css">
+ body{font-family:sans;font-size:0.7em; background-color: #fff; color: #000;}
+ h1{text-align:center;}
+ label{font-weight:bold;}
+
+ .books{margin:50px;}
+ ul.bookslist{list-style:none;margin:0px;padding:0;}
+ ul.bookslist li {margin:35px 0px 0px 0px;padding:5px 5px 5px 5px;border-top:1px solid #cdcdcd;border-bottom:1px solid #cdcdcd; background-color: #fff;}
+ ul.fieldslist{margin:0;padding:0;}
+ ul.fieldslist li {margin:0;padding:0;border:none;}
+
+ .details{margin-top:5px;padding: 5px 5px 5px 5px;}
+ .image{float:left;padding:0; margin:0px 25px 0px 0px;}
+ .clear{clear:both;}
+ </style>
+</head>
+<body>
+ <h1>$$PAGETITLE$$</h1>
+ <div class="books">
+ <ul class="bookslist">
+[/HEADER]
+[ITEM]
+ <li>
+ <div class="item">
+ <div class="caption"><a href="$$gcsfield1$$">$$title$$</a></div>
+ <div class="details">
+ <div class="image"><img src="$$cover$$" height="$$HEIGHT_PIC$$" alt="Book cover" title="$$title$$"/></div>
+ <div class="fields">
+ <ul class="fieldslist">
+ <li><label>$$authors_LABEL$$$$SEPARATOR$$</label>$$authors$$</li>
+ <li><label>$$publisher_LABEL$$$$SEPARATOR$$</label>$$publisher$$</li>
+ <li><label>$$publication_LABEL$$$$SEPARATOR$$</label>$$publication$$</li>
+ <li><label>$$format_LABEL$$$$SEPARATOR$$</label>$$format$$</li>
+ <li><label>$$tag_LABEL$$$$SEPARATOR$$</label>$$tags$$</li>
+ </ul>
+ </div>
+ </div>
+ <div class="description"><small>$$description$$</small> </div>
+ </div>
+ <div class="clear"/>
+ </li>
+[/ITEM]
+[FOOTER]
+ </ul>
+ </div>
+ <div align="center">Design <a href="mailto:nellistos@hotmail.com">Nellistos</a>
+ <br/>
+ <small><i>based on microFormats Spec</i></small></div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
+
+
+
diff --git a/share/gcstar/html_models/GCbooks/NellistosLight.png b/share/gcstar/html_models/GCbooks/NellistosLight.png
new file mode 100644
index 0000000..3186e1b
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/NellistosLight.png
Binary files differ
diff --git a/share/gcstar/html_models/GCbooks/Shelf b/share/gcstar/html_models/GCbooks/Shelf
new file mode 100644
index 0000000..72def06
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/Shelf
@@ -0,0 +1,12 @@
+<metamodel>
+ <model>Shelf</model>
+ <fields>
+ <field>authors</field>
+ <field>publisher</field>
+ <field>publication</field>
+ <field>description</field>
+ <field>format</field>
+ <field>rating</field>
+ <field>acquisition</field>
+ </fields>
+</metamodel> \ No newline at end of file
diff --git a/share/gcstar/html_models/GCbooks/Shelf.png b/share/gcstar/html_models/GCbooks/Shelf.png
new file mode 100644
index 0000000..a74305b
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/Shelf.png
Binary files differ
diff --git a/share/gcstar/html_models/GCbooks/Simple b/share/gcstar/html_models/GCbooks/Simple
new file mode 100644
index 0000000..b737209
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/Simple
@@ -0,0 +1,10 @@
+<metamodel>
+ <model>Simple</model>
+ <fields>
+ <field>title</field>
+ <field>authors</field>
+ <field>publisher</field>
+ <field>publication</field>
+ <field>format</field>
+ </fields>
+</metamodel> \ No newline at end of file
diff --git a/share/gcstar/html_models/GCbooks/Simple.png b/share/gcstar/html_models/GCbooks/Simple.png
new file mode 100644
index 0000000..341a1f7
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/Simple.png
Binary files differ
diff --git a/share/gcstar/html_models/GCcoins/Simple b/share/gcstar/html_models/GCcoins/Simple
new file mode 100644
index 0000000..2111fe2
--- /dev/null
+++ b/share/gcstar/html_models/GCcoins/Simple
@@ -0,0 +1,11 @@
+<metamodel>
+ <model>Simple</model>
+ <fields>
+ <field>type</field>
+ <field>currency</field>
+ <field>value</field>
+ <field>year</field>
+ <field>country</field>
+ <field>condition</field>
+ </fields>
+</metamodel> \ No newline at end of file
diff --git a/share/gcstar/html_models/GCcoins/Simple.png b/share/gcstar/html_models/GCcoins/Simple.png
new file mode 100644
index 0000000..8052733
--- /dev/null
+++ b/share/gcstar/html_models/GCcoins/Simple.png
Binary files differ
diff --git a/share/gcstar/html_models/GCfilms/Flat b/share/gcstar/html_models/GCfilms/Flat
new file mode 100644
index 0000000..a33d302
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Flat
@@ -0,0 +1,109 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by Yanbab. Flat and compact list.
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+
+body {
+ color:black;
+ background-color : white;
+ font-family : arial, sans-serif;
+ font-size : 12px;
+ margin : 10px;
+}
+
+td {
+ font-family : arial, sans-serif;
+ font-size : 12px;
+}
+
+h1 {
+ font-size:130%;
+ font-weight:bold;
+ border-bottom : solid black 1px;
+ margin:0px;
+}
+
+.borrowed1 {
+}
+
+#footer {
+ border-top : solid black 1px;
+ font-size:small;
+ color : #666;
+}
+a {
+ color : #666;
+ text-decoration : none;
+
+}
+a:hover {
+ text-decoration : underline;
+}
+#total {
+ float: right;
+ font-weight: bold;
+}
+.title {
+ font-size : 110%;
+ font-weight : bold;
+}
+
+.synopsis {
+ margin-top : .6em;
+ text-align : justify;
+
+ margin-bottom : 1.5em;
+ color : #333;
+}
+
+.image {
+ margin-bottom : 1.5em;
+}
+
+.detail {
+ float : right;
+ text-align : right;
+ color : #888;
+}
+</style>
+</head>
+<body>
+<div id="total">$$TOTALNUMBER$$ $$ITEMS$$</div>
+<h1>$$PAGETITLE$$</h1>
+<table cellpadding="8" cellspacing="0">
+[/HEADER]
+[ITEM]
+<tr class="borrowed$$borrower_FLAG$$">
+ <td valign="top" align="center" bgcolor="#ddd" width="80" >
+ <img align="top" src="$$image$$" height="$$HEIGHT_PIC$$" border="0" alt="$$title$$" title="$$title$$" class="image">
+ </td>
+ <td valign="top">
+ <div class="detail">$$genre$$ - $$country$$ - $$time$$<br>
+ $$date$$</div>
+
+ <div class="title">$$title$$</div>
+ $$director$$ <br>
+
+ <div class="synopsis">$$actors_LABEL$$$$SEPARATOR$$$$actors$$<br>
+ $$synopsis$$
+ </div>
+
+ </td>
+</tr>
+[/ITEM]
+[FOOTER]
+</table>
+<div id="footer">
+ $$GENERATOR_NOTE$$
+</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCfilms/Flat.png b/share/gcstar/html_models/GCfilms/Flat.png
new file mode 100644
index 0000000..5373102
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Flat.png
Binary files differ
diff --git a/share/gcstar/html_models/GCfilms/Shelf b/share/gcstar/html_models/GCfilms/Shelf
new file mode 100644
index 0000000..1a7d7ae
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Shelf
@@ -0,0 +1,284 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by Tian. It emulates a shelf display.
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+body
+{
+ color:black;
+}
+h1
+{
+ text-align:left;
+ margin-left:0.5em;
+ font-size:200%;
+ font-weight:bold;
+ color:#6c7b8b;
+}
+h2
+{
+ font-size:150%;
+ text-align:center;
+ color:#1c86ee;
+ font-weight:bold;
+}
+h3
+{
+ font-size:120%;
+ font-weight:bold;
+ margin:1em 0;
+ color:#6c7b8b;
+ border-bottom:1px dashed #6c7b8b;
+}
+#left
+{
+[JAVASCRIPT]
+ width:48%;
+[/JAVASCRIPT]
+ border:1px dashed #6c7b8b;
+ background:#f0f0f0;
+}
+.imgbox
+{
+ float:left;
+ padding:2em 1em 0em;
+ margin:0;
+}
+img
+{
+ margin:0;
+ padding:0;
+[JAVASCRIPT]
+ cursor:pointer;
+[/JAVASCRIPT]
+}
+.imginfo
+{
+ float:left;
+ margin-top:0.5em;
+[JAVASCRIPT]
+ cursor:default;
+[/JAVASCRIPT]
+}
+.synopsis
+{
+ height:8em;
+ overflow:auto;
+ padding:0.2em;
+ background:#f0f0f0;
+}
+table
+{
+ margin:0 0.5em;
+}
+th
+{
+ font-weight:bold;
+ text-align:left;
+ white-space:nowrap;
+ padding:0.5em;
+ background:#f0f0f0;
+}
+td
+{
+ padding:0.5em;
+ background:#f0f0f0;
+}
+#note
+{
+ text-align:center;
+ padding-top:0.5em;
+[JAVASCRIPT]
+ width:48%;
+[/JAVASCRIPT]
+ color:#6c7b8b;
+}
+#note a
+{
+ font-weight:bold;
+ color:#1c86ee;
+}
+#note a:hover
+{
+ color:#6c7b8b;
+}
+.spacer
+{
+ clear: both;
+}
+[JAVASCRIPT]
+.expander
+{
+ padding:0;
+ width:1em;
+ display:block;
+ float:left;
+ text-align:center;
+ margin-right:0.5em;
+ cursor:pointer;
+}
+[/JAVASCRIPT]
+.info
+{
+ position:fixed;
+ top:0;
+ right:1%;
+ width:48%;
+ display:none;
+}
+.details
+{
+ overflow: auto;
+ height: 500px;
+}
+</style>
+[JAVASCRIPT]
+<script type="text/javascript">
+<!--
+function getBoxes()
+{
+ return document.getElementById("left").getElementsByTagName("div")
+}
+function getHeight()
+{
+ //From http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
+ myHeight = 0;
+ if( typeof( window.innerWidth ) == 'number' ) {
+ //Non-IE
+ myHeight = window.innerHeight;
+ } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
+ //IE 6+ in 'standards compliant mode'
+ myHeight = document.documentElement.clientHeight;
+ } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
+ //IE 4 compatible
+ myHeight = document.body.clientHeight;
+ }
+ return myHeight - 150;
+}
+function init()
+{
+ // CSS changes from http://www.quirksmode.org/dom/changess.html
+ if (!document.styleSheets) return;
+ var theRules = new Array();
+ if (document.styleSheets[0].cssRules)
+ theRules = document.styleSheets[0].cssRules
+ else if (document.styleSheets[0].rules)
+ theRules = document.styleSheets[0].rules
+ theRules[theRules.length-1].style.height = getHeight()+'px';
+
+ boxes = getBoxes()
+ for(i=0; i < boxes.length; i++)
+ {
+ box = boxes[i]
+ if (box.className == "movie")
+ {
+ boxes2 = box.getElementsByTagName("div")
+ boxes2[0].onclick = function(evt)
+ {
+ div = this.parentNode
+ showMe(div.getElementsByTagName("div")[1], this)
+ }
+ }
+ }
+ headers = document.getElementById("left").getElementsByTagName("h3")
+ for(i=0; i < headers.length; i++)
+ {
+ header = headers[i]
+ header.style.cursor = 'pointer'
+ header.innerHTML = '<span class="expander">−</span> ' + header.innerHTML
+ header.onclick = function(evt)
+ {
+ table = this.nextSibling
+ while (table.tagName != "TABLE") { table = table.nextSibling }
+ if (table.style.display == "none")
+ {
+ table.style.display = "table"
+ this.innerHTML = this.innerHTML.replace(/\+<\/span>/, '−</span>')
+ }
+ else
+ {
+ table.style.display = "none"
+ this.innerHTML = this.innerHTML.replace(/−<\/span>/, '+</span>')
+ }
+ }
+ }
+}
+var currentBox = 0
+var currentImg = 0
+function showMe(box, img)
+{
+ hidePrevious()
+ box.style.display = "block"
+ img.style.background = "#4b4f63"
+ img.style.padding = "1em"
+ currentBox = box
+ currentImg = img
+}
+function hidePrevious()
+{
+ if (currentBox)
+ {
+ currentBox.style.display = "none"
+ currentImg.style.background = "#f0f0f0"
+ currentImg.style.padding = "2em 1em 0em"
+ }
+}
+-->
+</script>
+[/JAVASCRIPT]
+</head>
+<body [JAVASCRIPT]onload="init()"[/JAVASCRIPT]>
+<h1>$$PAGETITLE$$</h1>
+<div id="left">
+[/HEADER]
+[ITEM]
+<div class="movie">
+ <div class="imgbox">
+ <img src="$$image$$" height="$$HEIGHT_PIC$$" alt="$$title$$" title="$$title$$" />
+ </div>
+ <div class="info">
+ <h2>$$title$$</h2>
+ <div class="details">
+ <h3>$$info_LABEL$$</h3>
+ <table>
+ <tr>
+ <td rowspan="5" width="10%">
+ <img class="imginfo" src="$$image$$" height="$$HEIGHT_PIC$$" alt="$$title$$" title="$$title$$" />
+ </td>
+ <th>$$date_LABEL$$</th><td>$$date$$</td>
+ </tr>
+ <tr><th>$$director_LABEL$$</th><td>$$director$$</td></tr>
+ <tr><th>$$time_LABEL$$</th><td>$$time$$</td></tr>
+ <tr><th>$$genre_LABEL$$</th><td>$$genre$$</td></tr>
+ <tr><th>$$actors_LABEL$$</th><td>$$actors$$</td></tr>
+ <tr>
+ <td colspan="3">
+ <p class="synopsis">
+ $$synopsis$$
+ </p>
+ </td>
+ </table>
+ <h3>$$details_LABEL$$</h3>
+ <table>
+ <tr><th>$$rating_LABEL$$</th><td>$$rating$$/10</td></tr>
+ <tr><th>$$format_LABEL$$</th><td>$$format$$ ($$number$$)</td></tr>
+ <tr><th>$$borrower_LABEL$$</th><td>$$borrower$$</td></tr>
+ </table>
+ </div>
+ </div>
+</div>
+[/ITEM]
+[FOOTER]
+<div class="spacer">&nbsp;</div>
+</div>
+<p id="note">$$GENERATOR_NOTE$$</p>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCfilms/Shelf.png b/share/gcstar/html_models/GCfilms/Shelf.png
new file mode 100644
index 0000000..f4423d0
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Shelf.png
Binary files differ
diff --git a/share/gcstar/html_models/GCfilms/Simple b/share/gcstar/html_models/GCfilms/Simple
new file mode 100644
index 0000000..ee5a5f8
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Simple
@@ -0,0 +1,100 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by Tian. A really simple list that could be printed
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+body
+{
+ color:black;
+}
+h1
+{
+ text-align:center;
+ font-size:200%;
+ font-weight:bold;
+}
+table
+{
+ border-collapse:collapse;
+ margin:1em 5%;
+ margin-bottom:3em;
+ width:90%;
+}
+tr+tr
+{
+ border-top:1px solid black;
+}
+.borrowed1
+{
+ color:#777777;
+ font-style:italic;
+}
+th
+{
+ border-bottom:2px solid black;
+ margin:0;
+ padding:1em;
+ font-weight:bold;
+}
+td
+{
+ padding:0.2em 1em;
+}
+#legend
+{
+ margin:1em;
+ border:1px solid black;
+ display:inline;
+ padding:0.5em;
+}
+#note
+{
+ border-top:1px solid black;
+ margin:3em 8%;
+ margin-bottom:2em;
+ padding-top:0.5em;
+ text-align:center;
+ font-size:90%;
+}
+#note a
+{
+ color:black ! important;
+ text-decoration:underline;
+ font-weight:bold;
+}
+</style>
+</head>
+<body>
+<h1>$$PAGETITLE$$</h1>
+<table>
+<tr>
+ <th>$$title_LABEL$$</th>
+ <th>$$director_LABEL$$</th>
+ <th>$$genre_LABEL$$</th>
+ <th>$$date_LABEL$$</th>
+ <th>$$time_LABEL$$</th>
+</tr>
+[/HEADER]
+[ITEM]
+<tr class="borrowed$$borrower_FLAG$$">
+ <td>$$title$$</td>
+ <td>$$director$$</td>
+ <td>$$genre$$</td>
+ <td>$$date$$</td>
+ <td>$$time$$</td>
+</tr>
+[/ITEM]
+[FOOTER]
+</table>
+<p id="legend" class="borrowed1">$$BORROWED_ITEMS$$</p>
+<p id="note">$$GENERATOR_NOTE$$</p>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCfilms/Simple.png b/share/gcstar/html_models/GCfilms/Simple.png
new file mode 100644
index 0000000..3e23235
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Simple.png
Binary files differ
diff --git a/share/gcstar/html_models/GCfilms/Tabs b/share/gcstar/html_models/GCfilms/Tabs
new file mode 100644
index 0000000..bec3b18
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Tabs
@@ -0,0 +1,245 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by Tian. It emulates a notebook display.
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+body {
+ margin:0;
+ padding:0;
+ background:white;
+}
+h1 {
+ text-align:center;
+ color:#7c551a;
+}
+h2 {
+ background:transparent;
+ margin:0 0 1em;
+ color:#ffffff;
+}
+.movie {
+ height:18em;
+ clear:both;
+ margin:1em;
+ padding:0.5em;
+ background:#e3c79e;
+ border:1px dashed #7c551a;
+}
+.imgbox {
+ text-align:center;
+ float:left;
+ margin-right:1em;
+ width:120px;
+}
+h3 {
+ color:#513D23;
+ background:#ffffff;
+ cursor:default;
+ margin:0;
+ padding:0.4em;
+ display:none;
+ font-size:100%;
+ border-left:0.1em solid black;
+ border-bottom:0.1em solid white;
+ border-right:0.1em solid black;
+ border-top:0.1em solid black;
+ -moz-border-radius-topright:2em;
+ z-index:99;
+ position:relative;
+}
+div > h3
+{
+ display:block;
+}
+.details h3, .synopsis h3 {
+ background:#ffffff;
+ border-bottom:0.1em solid black;
+}
+.info, .details, .synopsis {
+ float:left;
+ width:12em;
+}
+.info dl, .details dl, .synopsis p {
+ border:0.1em solid black;
+ padding:1em 0.5em 0.5em;
+ margin:-0.1em 0 0;
+ z-index:1;
+ position:relative;
+ width:45em;
+ height:10em;
+ background:white;
+}
+.details dl, .synopsis p {
+ display:none;
+ margin-left:-11.8em;
+ width:44.8em;
+}
+.synopsis p {
+ margin-left:-23.8em;
+}
+dt {
+ float:left;
+ width:10em;
+ font-weight:bold;
+ height:1.5em;
+ color:#A49480;
+}
+dd {
+ padding:0;
+ margin-left:10em;
+ height:1.5em;
+ color:#555555;
+}
+#note {
+ text-align:center;
+ margin:2em 5em;
+ background:#e3c79e;
+ border:1px solid #7c551a;
+ padding:0.3em;
+}
+#note a {
+ font-weight:bold;
+ color:#7c551a;
+}
+[NOJAVASCRIPT]
+.info:hover dl,.details:hover dl, .synopsis:hover p {
+ padding-top:1em;
+ display:block;
+ color:#555555;
+ z-index:2;
+}
+.details:hover dl, .synopsis:hover p {
+ border:0;
+ border-top:0.1em solid black;
+ margin-top:-0.1em;
+ margin-left:-11.9em;
+ height:9.9em;
+ z-index:100;
+}
+.synopsis:hover p {
+ margin-left:-23.9em;
+}
+.info:hover h3, .details:hover h3, .synopsis:hover h3 {
+ background:#ffffff;
+ border-bottom:0;
+ border-bottom:0.1em solid white;
+ z-index:999;
+}
+[/NOJAVASCRIPT]
+[JAVASCRIPT]
+h3 {
+ cursor:pointer;
+ background:#e8ded0 ! important;
+}
+.details_active dl, .synopsis_active p {
+ padding-top:1em;
+ display:block;
+ color:#555555;
+ z-index:2;
+}
+.details_active dl, .synopsis_active p {
+ border:0;
+ border-top:0.1em solid black;
+ margin-top:-0.1em;
+ margin-left:-11.9em;
+ height:9.9em;
+ z-index:100;
+}
+.synopsis_active p {
+ margin-left:-23.9em;
+}
+.info_active h3, .details_active h3, .synopsis_active h3 {
+ background:#ffffff ! important;
+ border-bottom:0.1em solid white;
+ z-index:999;
+}
+.synopsis p {
+ overflow:auto;
+}
+[/JAVASCRIPT]
+</style>
+[JAVASCRIPT]
+<script type="text/javascript">
+<!--
+ function showMe(cssClass, objectId)
+ {
+ divs = document.getElementById('movie'+objectId).getElementsByTagName("div")
+ for(i=0; i < divs.length; i++)
+ {
+ if ((divs[i].className != 'imgbox') && (divs[i].className.substr(0,4) != 'note'))
+ {
+ if (divs[i].className.indexOf(cssClass) != -1)
+ {
+ divs[i].className = cssClass + '_active ' + cssClass
+ }
+ else
+ {
+ idx = divs[i].className.indexOf(' ')
+ if (idx != -1)
+ {
+ //alert('Setting ' + divs[i].className.substring(idx + 1))
+ divs[i].className = divs[i].className.substring(idx + 1)
+ }
+ }
+ }
+ }
+ }
+-->
+</script>
+[/JAVASCRIPT]
+</head>
+<body>
+<h1>$$PAGETITLE$$</h1>
+[/HEADER]
+[ITEM]
+<div class="movie" id="movie$$IDX$$">
+ <h2>$$title$$</h2>
+ <div class="imgbox">
+ <img src="$$image$$" height="$$HEIGHT_PIC$$" alt="$$title$$" title="$$title$$" />
+ </div>
+ <div class="info[JAVASCRIPT]_active info[/JAVASCRIPT]">
+ <h3[JAVASCRIPT] onclick="showMe('info', $$IDX$$)"[/JAVASCRIPT]>$$info_LABEL$$</h3>
+ <dl>
+ <dt>$$date_LABEL$$</dt>
+ <dd>$$date$$</dd>
+ <dt>$$director_LABEL$$</dt>
+ <dd>$$director$$</dd>
+ <dt>$$time_LABEL$$</dt>
+ <dd>$$time$$</dd>
+ <dt>$$genre_LABEL$$</dt>
+ <dd>$$genre$$</dd>
+ <dt>$$actors_LABEL$$</dt>
+ <dd>$$actors$$</dd>
+ </dl>
+ </div>
+ <div class="details">
+ <h3[JAVASCRIPT] onclick="showMe('details', $$IDX$$)"[/JAVASCRIPT]>$$details_LABEL$$</h3>
+ <dl>
+ <dt>$$rating_LABEL$$</dt>
+ <dd><div class="note$$RATING$$">$$rating$$/10</div></dd>
+ <dt>$$format_LABEL$$</dt>
+ <dd>$$format$$ ($$number$$)</dd>
+ <dt>$$audio_LABEL$$</dt>
+ <dd>$$audio$$</dd>
+ <dt>$$borrower_LABEL$$</dt>
+ <dd>$$borrower$$</dd>
+ </dl>
+ </div>
+ <div class="synopsis">
+ <h3[JAVASCRIPT] onclick="showMe('synopsis', $$IDX$$)"[/JAVASCRIPT]>$$synopsis_LABEL$$</h3>
+ <p>$$synopsis$$</p>
+ </div>
+</div>
+[/ITEM]
+[FOOTER]
+<div id="note">$$GENERATOR_NOTE$$</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCfilms/Tabs.png b/share/gcstar/html_models/GCfilms/Tabs.png
new file mode 100644
index 0000000..fc217aa
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Tabs.png
Binary files differ
diff --git a/share/gcstar/html_models/GCfilms/Tian b/share/gcstar/html_models/GCfilms/Tian
new file mode 100644
index 0000000..c87d34f
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Tian
@@ -0,0 +1,276 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
+<!--
+ Template made by Tian. It is based on design of Tian's website:
+ http://www.c-sait.net/
+-->
+<head>
+ <title>$$PAGETITLE$$</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+[JAVASCRIPT]
+ <script type="text/javascript">
+<!--
+expandTooltip="Afficher les informations du film";
+collapseTooltip="Masquer les informations du film";
+function prn(s)
+{
+ document.write(s)
+}
+function getE(id)
+{
+ return document.getElementById(id)
+}
+function expcolAll(dir,rowNum)
+{
+ for(x=0;x < rowNum;x++) {
+ try {
+ getE('movie'+x).style.display=dir
+ if(dir=="none") getE('switch'+x).innerHTML="+"
+ else getE('switch'+x).innerHTML="&ndash;"
+ }
+ catch(err) { }
+ }
+}
+function toggleDisplay(id,swt)
+{
+ if((getE(id).style.display=="")||(getE(id).style.display=="none")) {
+ getE(id).style.display="block"
+ getE(swt).innerHTML="&ndash;"
+ getE(swt).title=collapseTooltip
+ } else {
+ getE(id).style.display="none"
+ getE(swt).innerHTML="+"
+ getE(swt).title=expandTooltip
+ }
+ return false
+}
+function writeExpandControl(elementId,collapse)
+{
+ prn("<a href=\"#\" class=\"movie-expand\" id=\"switch"+elementId+"\" onclick=\"return toggleDisplay('movie"+elementId+"','switch"+elementId+"');\" title=\""+((collapse) ? expandTooltip : collapseTooltip)+"\">"+((collapse) ? "+" : "&ndash;")+"</a>")
+}
+function searchMovies(text)
+{
+ getE("collapseAll").click()
+ alldt=document.getElementsByTagName("dt")
+ alldd=document.getElementsByTagName("dd")
+ nb=alldt.length
+ re=new RegExp(text,"i")
+ for(i=0;i<nb;i++) {
+ s1=alldt[i].getElementsByTagName("a")[1].innerHTML
+ s2=alldd[i].innerHTML
+ res=0
+ if(getE("searchType").value=="all") res=(re.test(s1)||re.test(s2))
+ else res=re.test(s1)
+ if(res) st="block"
+ else st="none"
+ alldt[i].style.display=st
+ alldd[i].style.display=st
+ }
+}
+-->
+ </script>
+[/JAVASCRIPT]
+ <style type="text/css">
+ body {
+ background:#f7f8ff;
+ }
+ h1 {
+ font-weight:bold;
+ font-size:160%;
+ text-align:center;
+ margin-bottom:1em;
+ }
+ #top {
+ color:#624a66 ! important;
+ background:transparent ! important;
+ }
+ form {
+ text-align:center;
+ border:1px solid #c0c0c0;
+ background:#e2e2df;
+ margin:0 3em;
+ padding:0.5em;
+ }
+ input,select {
+ border:2px solid #aaaaaa;
+ background:purple;
+ color:white;
+ margin:0 0.5em;
+ }
+ input:focus, input.submit:hover {
+ background:#f3e3f9;
+ color:black;
+ }
+ input.submit {
+ cursor:pointer;
+ }
+ #links {
+ margin-top:0.5em;
+ text-align:center;
+ font-size:120%;
+ color:#aaaaaa;
+ }
+ .letter {
+ padding:0 0.5em;
+ }
+ img {
+ float:left;
+ margin:0 1em 1em 1em;
+ }
+ dt {
+ color:#aaaaaa;
+ font-size:120%;
+ margin:0em 0.5em;
+ clear:both;
+ }
+ dd {
+ margin:0.5em 2em 1em;
+ border-left:1px solid #2e3766;
+ border-bottom:1px solid #2e3766;
+ }
+ table {
+ font-size:90%;
+ margin:0 1em;
+ border:1px solid black;
+ width:60%;
+ }
+ th {
+ font-weight:bold;
+ text-align:left;
+ width:25%;
+ }
+ .tr1 {
+ background:#d4cce0;
+ }
+ .tr2 {
+ background:#c0b9cc;
+ }
+ a {
+ color:#2e3766;
+ background:transparent;
+ text-decoration:none;
+ }
+ a:hover, a:focus {
+ background-color:#e8e8ef;
+ }
+ .topl {
+ color:#aaaaaa;
+ font-size:90%;
+ }
+ .movie-expand {
+ width:1em;
+ text-align:center;
+ font-size:120%;
+ float:left;
+ margin:0.2em;
+ }
+ p, #note {
+ background:white;
+ border:2px solid purple;
+ clear:left;
+ margin:1em 2em;
+ padding:0.5em;
+ }
+ .borrowed0 {
+ font-size:80%;
+ color:#c0b9cc;
+ background:transparent;
+ text-decoration:none;
+ display:block;
+ }
+ .borrowed1 {
+ font-size:80%;
+ color:purple;
+ background:transparent;
+ text-decoration:none;
+ display:block;
+ }
+ #note {
+ text-align:center;
+ }
+ #note a {
+ text-decoration:underline;
+ }
+ </style>
+</head>
+<body>
+ <h1><a id="top">$$PAGETITLE$$</a></h1>
+[JAVASCRIPT]
+ <form onsubmit="searchMovies(getE('searchText').value); return false" action="">
+ <div>
+ <input type="text" id="searchText" title="$$FORM_INPUT$$" />
+ <select id="searchType">
+ <option value="title">$$FORM_SEARCH1$$</option>
+ <option value="all">$$FORM_SEARCH2$$</option>
+ </select>
+ <input type="button" class="submit" value="$$FORM_SEARCHBUTTON$$" title="$$FORM_SEARCHTITLE$$" onclick="searchMovies(getE('searchText').value)" />
+ <input type="button" class="submit" value="$$FORM_ALLBUTTON$$" title="$$FORM_ALLTITLE$$" onclick="searchMovies('')" />
+ <br />
+ <br />
+ <input type="button" class="submit" value="$$FORM_EXPAND$$" onclick="expcolAll('block','$$TOTALNUMBER$$')" title="$$FORM_EXPANDTITLE$$" />
+ <input type="button" id="collapseAll" class="submit" value="$$FORM_COLLAPSE$$" onclick="expcolAll('none','$$TOTALNUMBER$$')" title="$$FORM_COLLAPSETITLE$$" />
+ </div>
+ </form>
+[/JAVASCRIPT]
+ <div id="links">| _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |</div>
+ <dl>
+[/HEADER]
+[ITEM]
+ <dt>
+[JAVASCRIPT]
+ <script type="text/javascript">writeExpandControl('$$IDX$$',1)</script>
+[/JAVASCRIPT]
+ <a id="movielink_$$IDX$$" href="$$URL$$">$$title$$</a> | <a class="topl" href="#top">($$TOP$$)</a>
+ <span class="borrowed$$borrower_FLAG$$">$$borrower_YESNO$$$$borrower_OREMPTY$$</span>
+ </dt>
+ <dd>
+ <div id="movie$$IDX$$" style="display:none;">
+ <img src="$$image$$" alt="$$title$$" title= "$$title$$" height="$$HEIGHT_PIC$$" />
+ <table>
+ <tr class="tr1"><th>$$time_LABEL$$</th><td>$$time$$</td></tr>
+ <tr class="tr2"><th>$$genre_LABEL$$</th><td>$$genre$$</td></tr>
+ <tr class="tr1"><th>$$date_LABEL$$</th><td>$$date$$</td></tr>
+ <tr class="tr2"><th>$$director_LABEL$$</th><td>$$director$$</td></tr>
+ <tr class="tr1"><th>$$actors_LABEL$$</th><td>$$actors$$</td></tr>
+ <tr class="tr2"><th>$$format_LABEL$$</th><td>$$format$$ ($$number$$)</td></tr>
+ <tr class="tr1"><th>$$rating_LABEL$$</th><td>$$rating$$/10</td></tr>
+ <tr class="tr2"><th>$$audio_LABEL$$</th><td>$$audio$$</td></tr>
+ <tr class="tr1"><th>$$subt_LABEL$$</th><td>$$subt$$</td></tr>
+ </table>
+ <p>$$synopsis$$<br /><br /><em>$$comment$$</em></p>
+ </div>
+ </dd>
+[/ITEM]
+[FOOTER]
+ </dl>
+ <div id="note">$$GENERATOR_NOTE$$</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+
+ my %letters = ();
+ my $idx = 0;
+
+ foreach (@items)
+ {
+ my $title = $self->{options}->{originalList}->transformValue($_->{title}, 'title');
+ my $firstLetter = uc(substr($title, 0, 1));
+ $firstLetter =~ s/[^A-Z]/_/;
+ if (!$letters{$firstLetter})
+ {
+ $body =~ s/<a id="movielink_$idx"/<a id="$firstLetter"/;
+ $letters{$firstLetter} = 1;
+ }
+ $idx++;
+ }
+
+ foreach (keys %letters)
+ {
+ $header =~ s/\| $_ \|/| <a class="letter" href="#$_">$_<\/a> |/;
+ }
+ $header =~ s/\| ([^<|]) /| <span class="letter">$1<\/span> /g;
+ #$header =~ s/\| ([^<]) \|/| <span class="letter">$1<\/span> |/g;
+[/POST]
diff --git a/share/gcstar/html_models/GCfilms/Tian-Mario b/share/gcstar/html_models/GCfilms/Tian-Mario
new file mode 100644
index 0000000..15ff986
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Tian-Mario
@@ -0,0 +1,276 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
+<!--
+ Template made by Tian ( http://www.c-sait.net/ )
+ Color scheme by Mario Tomic ( http://www.mariotomic.com/ )
+-->
+<head>
+ <title>$$PAGETITLE$$</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+[JAVASCRIPT]
+ <script type="text/javascript">
+<!--
+expandTooltip="Afficher les informations du film";
+collapseTooltip="Masquer les informations du film";
+function prn(s)
+{
+ document.write(s)
+}
+function getE(id)
+{
+ return document.getElementById(id)
+}
+function expcolAll(dir,rowNum)
+{
+ for(x=0;x < rowNum;x++) {
+ try {
+ getE('movie'+x).style.display=dir
+ if(dir=="none") getE('switch'+x).innerHTML="+"
+ else getE('switch'+x).innerHTML="&ndash;"
+ }
+ catch(err) { }
+ }
+}
+function toggleDisplay(id,swt)
+{
+ if((getE(id).style.display=="")||(getE(id).style.display=="none")) {
+ getE(id).style.display="block"
+ getE(swt).innerHTML="&ndash;"
+ getE(swt).title=collapseTooltip
+ } else {
+ getE(id).style.display="none"
+ getE(swt).innerHTML="+"
+ getE(swt).title=expandTooltip
+ }
+ return false
+}
+function writeExpandControl(elementId,collapse)
+{
+ prn("<a href=\"#\" class=\"movie-expand\" id=\"switch"+elementId+"\" onclick=\"return toggleDisplay('movie"+elementId+"','switch"+elementId+"');\" title=\""+((collapse) ? expandTooltip : collapseTooltip)+"\">"+((collapse) ? "+" : "&ndash;")+"</a>")
+}
+function searchMovies(text)
+{
+ getE("collapseAll").click()
+ alldt=document.getElementsByTagName("dt")
+ alldd=document.getElementsByTagName("dd")
+ nb=alldt.length
+ re=new RegExp(text,"i")
+ for(i=0;i<nb;i++) {
+ s1=alldt[i].getElementsByTagName("a")[1].innerHTML
+ s2=alldd[i].innerHTML
+ res=0
+ if(getE("searchType").value=="all") res=(re.test(s1)||re.test(s2))
+ else res=re.test(s1)
+ if(res) st="block"
+ else st="none"
+ alldt[i].style.display=st
+ alldd[i].style.display=st
+ }
+}
+-->
+ </script>
+[/JAVASCRIPT]
+ <style type="text/css">
+ body {
+ background:#222222;
+ }
+ h1 {
+ font-weight:bold;
+ font-size:160%;
+ text-align:center;
+ margin-bottom:1em;
+ }
+ #top {
+ color:#ffaa00 ! important;
+ background:transparent ! important;
+ }
+ form {
+ text-align:center;
+ border:1px dashed #999999;
+ background:#111111;
+ margin:0 3em;
+ padding:0.5em;
+ }
+ input,select {
+ border:1px solid #666666;
+ background: #333333;
+ color: #b2b2b2;
+ margin:0 0.5em;
+ }
+ input:focus, input.submit:hover {
+ background:#000000;
+ color: #b2b2b2;
+ }
+ }
+ input:hover, input.submit:hover {
+ background:#000000;
+ color: #b2b2b2;
+ }
+ input.submit {
+ cursor:pointer;
+ }
+ #links {
+ margin-top:0.5em;
+ text-align:center;
+ font-size:120%;
+ color: #333333;
+ }
+ img {
+ float:left;
+ margin:0 1em 1em 1em;
+ }
+ dt {
+ color:#aaaaaa;
+ font-size:120%;
+ margin:0em 0.5em;
+ clear:both;
+ }
+ dd {
+ margin:0.5em 2em 1em;
+ border-left:1px dashed #999999;
+ border-bottom:1px dashed #999999;
+ }
+ table {
+ font-size:90%;
+ margin:0 1em;
+ border:1px dashed #b2b2b2;
+ width:60%;
+ color: #b2b2b2;
+ }
+ th {
+ font-weight:bold;
+ text-align:left;
+ width:25%;
+ }
+ .tr1 {
+ background:#333333;
+ }
+ .tr2 {
+ background:#333333;
+ }
+ a {
+ color:#ffaa00;
+ background:transparent;
+ text-decoration:none;
+ }
+ a:hover, a:focus {
+ color:#000000;
+ background-color:#ffaa00;
+ }
+ .topl {
+ color:#444444;
+ font-size:90%;
+ }
+ .movie-expand {
+ width:1em;
+ text-align:center;
+ font-size:120%;
+ float:left;
+ margin:0.2em;
+ }
+ p, #note {
+ color:#b2b2b2;
+ background:#000000;
+ border:1px dashed #999999;
+ clear:left;
+ margin:1em 2em;
+ padding:0.5em;
+ }
+ .borrowed0 {
+ color:#222222;
+ background:transparent;
+ text-decoration:none;
+ font-size:50%;
+ display:block;
+ }
+ .borrowed1 {
+ color:#333333;
+ background:transparent;
+ text-decoration:none;
+ font-size:50%;
+ display:block;
+ }
+ #note {
+ text-align:center;
+ }
+ </style>
+</head>
+<body>
+ <h1><a id="top">$$PAGETITLE$$</a></h1>
+[JAVASCRIPT]
+ <form onsubmit="searchMovies(getE('searchText').value); return false" action="">
+ <div>
+ <input type="text" id="searchText" title="$$FORM_INPUT$$" />
+ <select id="searchType">
+ <option value="title">$$FORM_SEARCH1$$</option>
+ <option value="all">$$FORM_SEARCH2$$</option>
+ </select>
+ <input type="button" class="submit" value="$$FORM_SEARCHBUTTON$$" title="$$FORM_SEARCHTITLE$$" onclick="searchMovies(getE('searchText').value)" />
+ <input type="button" class="submit" value="$$FORM_ALLBUTTON$$" title="$$FORM_ALLTITLE$$" onclick="searchMovies('')" />
+ <br />
+ <br />
+ <input type="button" class="submit" value="$$FORM_EXPAND$$" onclick="expcolAll('block','$$TOTALNUMBER$$')" title="$$FORM_EXPANDTITLE$$" />
+ <input type="button" id="collapseAll" class="submit" value="$$FORM_COLLAPSE$$" onclick="expcolAll('none','$$TOTALNUMBER$$')" title="$$FORM_COLLAPSETITLE$$" />
+ </div>
+ </form>
+[/JAVASCRIPT]
+ <div id="links">| _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |</div>
+ <dl>
+[/HEADER]
+[ITEM]
+ <dt>
+[JAVASCRIPT]
+ <script type="text/javascript">writeExpandControl('$$IDX$$',1)</script>
+[/JAVASCRIPT]
+ <a id="movielink_$$IDX$$" href="$$URL$$">$$title$$</a> | <a class="topl" href="#top">($$TOP$$)</a>
+ <span class="borrowed$$borrower_FLAG$$">$$borrower_YESNO$$$$borrower_OREMPTY$$</span>
+ </dt>
+ <dd>
+ <div id="movie$$IDX$$" style="display:none;">
+ <img src="$$image$$" alt="$$title$$" title= "$$title$$" height="$$HEIGHT_PIC$$" />
+ <table>
+ <tr class="tr1"><th>$$time_LABEL$$</th><td>$$time$$</td></tr>
+ <tr class="tr2"><th>$$genre_LABEL$$</th><td>$$genre$$</td></tr>
+ <tr class="tr1"><th>$$date_LABEL$$</th><td>$$date$$</td></tr>
+ <tr class="tr2"><th>$$director_LABEL$$</th><td>$$director$$</td></tr>
+ <tr class="tr1"><th>$$actors_LABEL$$</th><td>$$actors$$</td></tr>
+ <tr class="tr2"><th>$$format_LABEL$$</th><td>$$format$$ ($$number$$)</td></tr>
+ <tr class="tr1"><th>$$rating_LABEL$$</th><td>$$rating$$/10</td></tr>
+ <tr class="tr2"><th>$$audio_LABEL$$</th><td>$$audio$$</td></tr>
+ <tr class="tr1"><th>$$subt_LABEL$$</th><td>$$subt$$</td></tr>
+ </table>
+ <p>$$synopsis$$<br /><br /><em>$$comment$$</em></p>
+ </div>
+ </dd>
+[/ITEM]
+[FOOTER]
+ </dl>
+ <div id="note">$$GENERATOR_NOTE$$</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+
+ my %letters = ();
+ my $idx = 0;
+
+ foreach (@items)
+ {
+ my $title = $self->{options}->{originalList}->transformValue($_->{title}, 'title');
+ my $firstLetter = uc(substr($title, 0, 1));
+ $firstLetter =~ s/[^A-Z]/_/;
+ if (!$letters{$firstLetter})
+ {
+ $body =~ s/<a id="movielink_$idx"/<a id="$firstLetter"/;
+ $letters{$firstLetter} = 1;
+ }
+ $idx++;
+ }
+
+ foreach (keys %letters)
+ {
+ $header =~ s/\| $_ \|/| <a href="#$_">$_<\/a> |/;
+ }
+[/POST]
diff --git a/share/gcstar/html_models/GCfilms/Tian-Mario-Kim b/share/gcstar/html_models/GCfilms/Tian-Mario-Kim
new file mode 100644
index 0000000..2772020
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Tian-Mario-Kim
@@ -0,0 +1,281 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
+<!--
+ Template made by Tian ( http://www.c-sait.net/ )
+ Color scheme by Mario Tomic ( http://www.mariotomic.com/ )
+-->
+<head>
+ <title>$$PAGETITLE$$</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+[JAVASCRIPT]
+ <script type="text/javascript">
+<!--
+expandTooltip="Afficher les informations du film";
+collapseTooltip="Masquer les informations du film";
+function prn(s)
+{
+ document.write(s)
+}
+function getE(id)
+{
+ return document.getElementById(id)
+}
+function expcolAll(dir,rowNum)
+{
+ for(x=0;x < rowNum;x++) {
+ try {
+ getE('movie'+x).style.display=dir
+ if(dir=="none") getE('switch'+x).innerHTML="+"
+ else getE('switch'+x).innerHTML="&ndash;"
+ }
+ catch(err) { }
+ }
+}
+function toggleDisplay(id,swt)
+{
+ if((getE(id).style.display=="")||(getE(id).style.display=="none")) {
+ getE(id).style.display="block"
+ getE(swt).innerHTML="&ndash;"
+ getE(swt).title=collapseTooltip
+ } else {
+ getE(id).style.display="none"
+ getE(swt).innerHTML="+"
+ getE(swt).title=expandTooltip
+ }
+ return false
+}
+function writeExpandControl(elementId,collapse)
+{
+ prn("<a href=\"#\" class=\"movie-expand\" id=\"switch"+elementId+"\" onclick=\"return toggleDisplay('movie"+elementId+"','switch"+elementId+"');\" title=\""+((collapse) ? expandTooltip : collapseTooltip)+"\">"+((collapse) ? "+" : "&ndash;")+"</a>")
+}
+function searchMovies(text)
+{
+ getE("collapseAll").click()
+ alldt=document.getElementsByTagName("dt")
+ alldd=document.getElementsByTagName("dd")
+ nb=alldt.length
+ re=new RegExp(text,"i")
+ for(i=0;i<nb;i++) {
+ s1=alldt[i].getElementsByTagName("a")[1].innerHTML
+ s2=alldd[i].innerHTML
+ res=0
+ if(getE("searchType").value=="all") res=(re.test(s1)||re.test(s2))
+ else res=re.test(s1)
+ if(res) st="block"
+ else st="none"
+ alldt[i].style.display=st
+ alldd[i].style.display=st
+ }
+}
+-->
+ </script>
+[/JAVASCRIPT]
+ <style type="text/css">
+ body {
+ background:#222222;
+ }
+ h1 {
+ font-weight:bold;
+ font-size:160%;
+ text-align:center;
+ margin-bottom:1em;
+ }
+ #top {
+ color:#ffaa00 ! important;
+ background:transparent ! important;
+ }
+ form {
+ text-align:center;
+ border:1px dashed #999999;
+ background:#111111;
+ margin:0 3em;
+ padding:0.5em;
+ }
+ input,select {
+ border:1px solid #666666;
+ background: #333333;
+ color: #b2b2b2;
+ margin:0 0.5em;
+ }
+ input:focus, input.submit:hover {
+ background:#000000;
+ color: #b2b2b2;
+ }
+ }
+ input:hover, input.submit:hover {
+ background:#000000;
+ color: #b2b2b2;
+ }
+ input.submit {
+ cursor:pointer;
+ }
+ #links {
+ margin-top:0.5em;
+ text-align:center;
+ font-size:120%;
+ color: #333333;
+ }
+ img {
+ float:left;
+ margin:0 1em 1em 1em;
+ }
+ dt {
+ color:#aaaaaa;
+ font-size:120%;
+ margin:0em 0.5em;
+ clear:both;
+ }
+ dd {
+ margin:0.5em 2em 1em;
+ border-left:1px dashed #999999;
+ border-bottom:1px dashed #999999;
+ }
+ table {
+ font-size:90%;
+ margin:0 1em;
+ border:1px dashed #b2b2b2;
+ width:60%;
+ color: #b2b2b2;
+ }
+ th {
+ font-weight:bold;
+ text-align:left;
+ width:25%;
+ }
+ .tr1 {
+ background:#333333;
+ }
+ .tr2 {
+ background:#333333;
+ }
+ a {
+ color:#ffaa00;
+ background:transparent;
+ text-decoration:none;
+ }
+ a:hover, a:focus {
+ color:#000000;
+ background-color:#ffaa00;
+ }
+ .topl {
+ color:#444444;
+ font-size:90%;
+ }
+ .movie-expand {
+ width:1em;
+ text-align:center;
+ font-size:120%;
+ float:left;
+ margin:0.2em;
+ }
+ p, #note {
+ color:#b2b2b2;
+ background:#000000;
+ border:1px dashed #999999;
+ clear:left;
+ margin:1em 2em;
+ padding:0.5em;
+ }
+ .borrowed0 {
+ color:#222222;
+ background:transparent;
+ text-decoration:none;
+ font-size:50%;
+ display:block;
+ }
+ .borrowed1 {
+ color:#333333;
+ background:transparent;
+ text-decoration:none;
+ font-size:50%;
+ display:block;
+ }
+ #note {
+ text-align:center;
+ }
+ </style>
+</head>
+<body>
+ <h1><a id="top">$$PAGETITLE$$</a></h1>
+[JAVASCRIPT]
+ <form onsubmit="searchMovies(getE('searchText').value); return false" action="">
+ <div>
+ <input type="text" id="searchText" title="$$FORM_INPUT$$" />
+ <select id="searchType">
+ <option value="title">$$FORM_SEARCH1$$</option>
+ <option value="all">$$FORM_SEARCH2$$</option>
+ </select>
+ <input type="button" class="submit" value="$$FORM_SEARCHBUTTON$$" title="$$FORM_SEARCHTITLE$$" onclick="searchMovies(getE('searchText').value)" />
+ <input type="button" class="submit" value="$$FORM_ALLBUTTON$$" title="$$FORM_ALLTITLE$$" onclick="searchMovies('')" />
+ <br />
+ <br />
+ <input type="button" class="submit" value="$$FORM_EXPAND$$" onclick="expcolAll('block','$$TOTALNUMBER$$')" title="$$FORM_EXPANDTITLE$$" />
+ <input type="button" id="collapseAll" class="submit" value="$$FORM_COLLAPSE$$" onclick="expcolAll('none','$$TOTALNUMBER$$')" title="$$FORM_COLLAPSETITLE$$" />
+ </div>
+ </form>
+[/JAVASCRIPT]
+ <div id="links">| _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |</div>
+ <dl>
+[/HEADER]
+[ITEM]
+ <dt>
+[JAVASCRIPT]
+ <script type="text/javascript">writeExpandControl('$$IDX$$',1)</script>
+[/JAVASCRIPT]
+ <a id="movielink_$$IDX$$" href="$$URL$$">$$title$$</a> | <a class="topl" href="#top">($$TOP$$)</a>
+ <span class="borrowed$$borrower_FLAG$$">$$borrower_YESNO$$$$borrower_OREMPTY$$</span>
+ </dt>
+ <dd>
+ <div id="movie$$IDX$$" style="display:none;">
+ <a href="$$backpic$$"><img src="$$image$$" alt="$$title$$" title= "$$title$$" height="$$HEIGHT_PIC$$" /></a>
+ <table>
+ <tr class="tr1"><th>$$date_LABEL$$</th><td>$$date$$</td></tr>
+ <tr class="tr2"><th>$$genre_LABEL$$</th><td>$$genre$$</td></tr>
+ <tr class="tr1"><th>$$id_LABEL$$</th><td>$$id$$</td></tr>
+ <tr class="tr2"><th>$$original_LABEL$$</th><td>$$original$$</td></tr>
+ <tr class="tr1"><th>$$time_LABEL$$</th><td>$$time$$ Min.</td></tr>
+ <tr class="tr2"><th>$$director_LABEL$$</th><td>$$director$$</td></tr>
+ <tr class="tr1"><th>$$actors_LABEL$$</th><td>$$actors$$</td></tr>
+ <tr class="tr2"><th>$$rating_LABEL$$</th><td>$$rating$$/10</td></tr>
+ <tr class="tr1"><th>$$age_LABEL$$</th><td>$$age$$</td></tr>
+ <tr class="tr2"><th>$$country_LABEL$$</th><td>$$country$$</td></tr>
+ <tr class="tr1"><th>$$audio_LABEL$$</th><td>$$audio$$</td></tr>
+ <tr class="tr2"><th>$$comment_LABEL$$</th><td>$$comment$$</td></tr>
+ <tr class="tr1"><th>$$serie_LABEL$$</th><td>$$serie$$</td></tr>
+ <tr class="tr2"><th>$$subt_LABEL$$</th><td>$$subt$$</td></tr>
+ </table>
+ <p>$$synopsis$$</p>
+ </div>
+ </dd>
+[/ITEM]
+[FOOTER]
+ </dl>
+ <div id="note">$$GENERATOR_NOTE$$</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+
+ my %letters = ();
+ my $idx = 0;
+
+ foreach (@items)
+ {
+ my $title = $self->{options}->{originalList}->transformValue($_->{title}, 'title');
+ my $firstLetter = uc(substr($title, 0, 1));
+ $firstLetter =~ s/[^A-Z]/_/;
+ if (!$letters{$firstLetter})
+ {
+ $body =~ s/<a id="movielink_$idx"/<a id="$firstLetter"/;
+ $letters{$firstLetter} = 1;
+ }
+ $idx++;
+ }
+
+ foreach (keys %letters)
+ {
+ $header =~ s/\| $_ \|/| <a href="#$_">$_<\/a> |/;
+ }
+[/POST]
diff --git a/share/gcstar/html_models/GCfilms/Tian-Mario.png b/share/gcstar/html_models/GCfilms/Tian-Mario.png
new file mode 100644
index 0000000..70dc0b3
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Tian-Mario.png
Binary files differ
diff --git a/share/gcstar/html_models/GCfilms/Tian.png b/share/gcstar/html_models/GCfilms/Tian.png
new file mode 100644
index 0000000..942f51c
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Tian.png
Binary files differ
diff --git a/share/gcstar/html_models/GCfilms/float b/share/gcstar/html_models/GCfilms/float
new file mode 100644
index 0000000..47a9924
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/float
@@ -0,0 +1,120 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by float
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+body {
+ color:#004DFF;
+ background-color : white;
+ font-family : arial, helvetica, sans-serif;
+ font-size : 12px;
+ margin : 10px;
+}
+
+td {
+ font-family : arial, sans-serif;
+ font-size : 12px;
+}
+h1 {
+ font-size:130%;
+ font-weight:bold;
+ border-bottom : solid black 1px;
+ margin:0px;
+}
+.borrowed1 {
+}
+a {
+ color : #666;
+ text-decoration : none;
+
+}
+a:hover {
+ text-decoration : underline;
+}
+.title {
+ font-size : 110%;
+ font-weight : bold;
+}
+.synopsis {
+ margin-top : .6em;
+ text-align : justify;
+
+ margin-bottom : 1.5em;
+ color : #333;
+}
+.image {
+ margin-bottom : 1.5em;
+}
+.detail {
+ float : right;
+ text-align : right;
+ color : #888;
+}
+#total {
+ float: center;
+ font-weight: bold;
+ text-align: center;
+}
+#footer {
+ border-top : solid black 1px;
+ font-size:small;
+ color : #666;
+ text-align: center;
+}
+#top {
+ text-align: left;
+}
+#middle {
+ text-align: center;
+}
+#bottom {
+ text-align: right;
+}
+</style>
+</head>
+<body>
+<a name="top" id="top"></a>
+<div id="total">$$PAGETITLE$$ - $$TOTALNUMBER$$ $$ITEMS$$</div><br><br>
+<table width="550" align="center" cellpadding="8" cellspacing="0">
+[/HEADER]
+[ITEM]
+<tr class="borrowed$$borrower_FLAG$$">
+ <td valign="top" align="center" bgcolor="#E3E1C6" width="80" >
+ <img align="top" src="$$image$$" height="$$HEIGHT_PIC$$" border="0" alt="$$title$$" title="$$title$$" class="image">
+ </td>
+ <td valign="top" bgcolor="#ECEBD9">
+ <div class="detail"><b>$$time_LABEL$$:</b>&nbsp;$$time$$<br>
+ <b>$$genre_LABEL$$:</b>&nbsp;$$genre$$</div>
+ <div class="title">$$title$$</div>
+ <div class="synopsis"><b>$$director_LABEL$$:</b><br>$$director$$
+ <br><br><b>$$actors_LABEL$$:</b><br>$$actors$$
+ <br><br><b>$$synopsis_LABEL$$:</b><br>$$synopsis$$
+ <br><br>
+ <b>
+ <table width="100%">
+ <tr>
+ <td align="left"><a href="#top">$$TOP$$</a></td>
+ <td align="center"><a href="$$trailer$$">$$gtk-media-play$$</a></td>
+ <td align="right"><a href="#bottom">$$BOTTOM$$</a></td>
+ </tr>
+ </table>
+ </div>
+ </td>
+</tr>
+[/ITEM]
+[FOOTER]
+</table>
+<div id="footer">
+ $$GENERATOR_NOTE$$
+</div>
+<a name="bottom" id="bottom"></a>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST] \ No newline at end of file
diff --git a/share/gcstar/html_models/GCfilms/float.png b/share/gcstar/html_models/GCfilms/float.png
new file mode 100644
index 0000000..e047a32
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/float.png
Binary files differ
diff --git a/share/gcstar/html_models/GCfilms/rootII_design b/share/gcstar/html_models/GCfilms/rootII_design
new file mode 100644
index 0000000..74873aa
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/rootII_design
@@ -0,0 +1,118 @@
+[HEADER]
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <!-- ------------------------------------------------------------------------------------------------
+ rootII 2005
+ Template for HTML export of a GCfilms collection
+ ------------------------------------------------------------------------------------------------ -->
+<head>
+ <meta content="text/html; charset=UTF-8" http-equiv="content-type">
+ <title>$$PAGETITLE$$</title>
+[JAVASCRIPT]
+ <script type="text/javascript" language="javascript1.2"><!--
+ var alreadyOpennedLayer="";
+ function hidelayer(id){
+ if (document.getElementById(id).style.visibility=="visible")
+ document.getElementById(id).style.visibility='hidden';
+ }
+ function showlayer(id){
+ if (document.getElementById(id) && document.getElementById(id).style.visibility!='visible')
+ {
+ if (alreadyOpennedLayer!="") hidelayer(alreadyOpennedLayer);
+ alreadyOpennedLayer=id;
+ document.getElementById(id).style.visibility='visible';
+ }
+ }
+//--></script>
+[/JAVASCRIPT]
+<style type="text/css" media="screen">
+ body {
+ font-family:helvetica, verdana, arial;
+ color:rgb(253, 253, 253);
+ background-color:rgb(204, 204, 204);
+ font-family:helvetica, verdana, arial;
+ font-size:100%;
+ }
+ .synopsis {
+ background-color:rgb(174,174,174 );
+ border:1px none #000000;
+ text-align:justify;
+ font-family:helvetica, verdana, arial;
+ font-size:90%;
+ visibility:hidden;
+ position:absolute;
+ width:80%;
+ }
+ strong {
+ color:#FFFFFF;
+ font-size:120%;
+ }
+ td {
+ color : #666666;
+ }
+ a {
+ text-decoration : none;
+ }
+ #design {
+ text-align:right;
+ color:rgb(174, 174, 174);
+ }
+ #gcstar {
+ text-align:right;
+ color:rgb(174, 174, 174);
+ }
+</style>
+<style type="text/css" media="print" >
+ body {
+ font-family:helvetica, verdana, arial;
+ font-size:100%;
+ }
+ .synopsis {
+ display: none;
+ }
+ #design {
+ display: none;
+ }
+ #gcstar {
+ text-align:right;
+ color:rgb(174, 174,174);
+ }
+</style>
+</head>
+<body link="#666666" alink="#666666" vlink="#999999">
+ <div id="header-title">
+ <h1>$$PAGETITLE$$</h1>
+ </div>
+ <table border="0" align="center" cellspacing="0" cellpadding="0" width="80%">
+ <tr>
+ <td>
+[/HEADER]
+[ITEM]
+ <table border="0" align="center" cellspacing="0" cellpadding="0" width="100%">
+ <tr><td colspan=3><strong>$$title$$</strong></td></tr>
+ <tr><td width="80" rowspan=7><img align="top" src="$$image$$" height="$$HEIGHT_PIC$$" border="0"
+ name="image$$IDX$$" alt="$$title$$" title="$$title$$"
+ [JAVASCRIPT]onMouseOver='showlayer("synop$$IDX$$")'[/JAVASCRIPT]></td>
+ <td width="100"><small>$$original_LABEL$$$$SEPARATOR$$</small></td><td><small>$$original$$</small></td></tr>
+ <tr><td><small>$$director_LABEL$$$$SEPARATOR$$</small></td><td><small>$$director$$</small></td></tr>
+ <tr><td><small>$$date_LABEL$$$$SEPARATOR$$</small></td><td><small>$$date$$</small></td></tr>
+ <tr><td><small>$$time_LABEL$$$$SEPARATOR$$</small></td><td><small>$$time$$</small></td></tr>
+ <tr><td><small>$$country_LABEL$$$$SEPARATOR$$</small></td><td><small>$$country$$</small></td></tr>
+ <tr><td><small>$$genre_LABEL$$$$SEPARATOR$$</small></td><td><small>$$genre$$</small></td></tr>
+ <tr><td><small>$$actors_LABEL$$$$SEPARATOR$$</small></td><td><small>$$actors$$</small></td></tr>
+ <tr><td colspan=3><div class="synopsis" id="synop$$IDX$$" [JAVASCRIPT]onMouseOut='hidelayer("synop$$IDX$$")'[/JAVASCRIPT]>$$synopsis$$</div></td></tr>
+ <tr><td colspan=3><hr></td></tr>
+ </table>
+[/ITEM]
+[FOOTER]
+</td></tr>
+<tr><td>$$TOTALNUMBER$$ films</td></tr>
+ </table>
+ <div id="design"><br><br><br><br><small>design by
+ <em>rootII design department</em></small></div>
+ <div id="export">$$GENERATOR_NOTE$$</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCfilms/rootII_design.png b/share/gcstar/html_models/GCfilms/rootII_design.png
new file mode 100644
index 0000000..ffeae14
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/rootII_design.png
Binary files differ
diff --git a/share/gcstar/html_models/GCgames/Flat b/share/gcstar/html_models/GCgames/Flat
new file mode 100644
index 0000000..8587298
--- /dev/null
+++ b/share/gcstar/html_models/GCgames/Flat
@@ -0,0 +1,111 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by Yanbab. Flat and compact list.
+ Adapted to video games by Tian.
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+
+body {
+ color:black;
+ background-color : white;
+ font-family : arial, sans-serif;
+ font-size : 12px;
+ margin : 10px;
+}
+
+td {
+ font-family : arial, sans-serif;
+ font-size : 12px;
+}
+
+h1 {
+ font-size:130%;
+ font-weight:bold;
+ border-bottom : solid black 1px;
+ margin:0px;
+}
+
+.borrowed1 {
+}
+
+#footer {
+ border-top : solid black 1px;
+ font-size:small;
+ color : #666;
+}
+a {
+ color : #666;
+ text-decoration : none;
+
+}
+a:hover {
+ text-decoration : underline;
+}
+#total {
+ float: right;
+ font-weight: bold;
+}
+.title {
+ font-size : 110%;
+ font-weight : bold;
+}
+
+.synopsis {
+ margin-top : .6em;
+ text-align : justify;
+
+ margin-bottom : 1.5em;
+ color : #333;
+}
+
+.image {
+ margin-bottom : 1.5em;
+}
+
+.detail {
+ float : right;
+ text-align : right;
+ color : #888;
+}
+</style>
+</head>
+<body>
+<div id="total">$$TOTALNUMBER$$ $$ITEMS$$</div>
+<h1>$$PAGETITLE$$</h1>
+<table cellpadding="8" cellspacing="0">
+[/HEADER]
+[ITEM]
+<tr class="borrowed$$borrower_FLAG$$">
+ <td valign="top" align="center" bgcolor="#ddd" width="80" >
+ <a href="$$web$$">
+ <img align="top" src="$$boxpic$$" height="$$HEIGHT_PIC$$" border="0" alt="$$name$$" title="$$name$$" class="image">
+ </a>
+ </td>
+ <td valign="top">
+ <div class="detail">$$platform$$ - $$editor$$<br>
+ $$genre$$</div>
+
+ <div class="title">$$name$$</div>
+
+ <div class="synopsis">
+ $$description$$
+ </div>
+
+ </td>
+</tr>
+[/ITEM]
+[FOOTER]
+</table>
+<div id="footer">
+ $$GENERATOR_NOTE$$
+</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCgames/Flat.png b/share/gcstar/html_models/GCgames/Flat.png
new file mode 100644
index 0000000..68dc96a
--- /dev/null
+++ b/share/gcstar/html_models/GCgames/Flat.png
Binary files differ
diff --git a/share/gcstar/html_models/GCgames/Simple b/share/gcstar/html_models/GCgames/Simple
new file mode 100644
index 0000000..dc61b0d
--- /dev/null
+++ b/share/gcstar/html_models/GCgames/Simple
@@ -0,0 +1,10 @@
+<metamodel>
+ <model>Simple</model>
+ <fields>
+ <field>name</field>
+ <field>editor</field>
+ <field>platform</field>
+ <field>genre</field>
+ <field>players</field>
+ </fields>
+</metamodel>
diff --git a/share/gcstar/html_models/GCgames/Simple.png b/share/gcstar/html_models/GCgames/Simple.png
new file mode 100644
index 0000000..d1c34d3
--- /dev/null
+++ b/share/gcstar/html_models/GCgames/Simple.png
Binary files differ
diff --git a/share/gcstar/html_models/GCgames/Tabs b/share/gcstar/html_models/GCgames/Tabs
new file mode 100644
index 0000000..e6b5ccb
--- /dev/null
+++ b/share/gcstar/html_models/GCgames/Tabs
@@ -0,0 +1,284 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by Tian. It emulates a notebook display.
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+body {
+ margin:0;
+ padding:0;
+ background:white;
+}
+h1 {
+ text-align:center;
+ color:#7c551a;
+}
+h2 {
+ background:transparent;
+ margin:0 0 1em;
+ color:#ffffff;
+}
+.item {
+ height:23em;
+ clear:both;
+ margin:1em;
+ padding:0.5em;
+ background:#e3c79e;
+ border:1px dashed #7c551a;
+}
+.imgbox {
+ text-align:center;
+ float:left;
+ margin-right:1em;
+ width:120px;
+}
+a img {
+ border:0;
+}
+h3 {
+ color:#513D23;
+ background:#ffffff;
+ cursor:default;
+ margin:0;
+ padding:0.4em;
+ display:none;
+ font-size:100%;
+ border-left:0.1em solid black;
+ border-bottom:0.1em solid white;
+ border-right:0.1em solid black;
+ border-top:0.1em solid black;
+ -moz-border-radius-topright:2em;
+ z-index:99;
+ position:relative;
+}
+div > h3
+{
+ display:block;
+}
+.description h3, .tips h3 {
+ background:#ffffff;
+ border-bottom:0.1em solid black;
+}
+.info, .description, .tips {
+ float:left;
+ width:12em;
+}
+.info dl, .description table, .tips div {
+ border:0.1em solid black;
+ padding:1em 0.5em 0.5em;
+ margin:-0.1em 0 0;
+ z-index:1;
+ position:relative;
+ width:45em;
+ height:15em;
+ background:white;
+}
+.description table, .tips div {
+ display:none;
+ margin-left:-11.8em;
+ width:44.8em;
+}
+.tips div {
+ margin-left:-23.8em;
+}
+dt {
+ float:left;
+ width:15em;
+ font-weight:bold;
+ height:1.5em;
+ color:#A49480;
+}
+dd {
+ padding:0;
+ margin-left:15em;
+ height:1.5em;
+ color:#555555;
+}
+.codes {
+ width:99%;
+}
+.codes td, .codes th {
+ padding:0.2em;
+ width:50%;
+}
+.codes th, .codes .odd td {
+ background:#e8ded0;
+}
+.codes + .codes {
+ margin:1em 0;
+ padding:1em 0;
+ border-top:2px solid #7c551a;
+ border-bottom:2px solid #7c551a;
+}
+#note {
+ text-align:center;
+ margin:2em 5em;
+ background:#e3c79e;
+ border:1px solid #7c551a;
+ padding:0.3em;
+}
+#note a {
+ font-weight:bold;
+ color:#7c551a;
+}
+[NOJAVASCRIPT]
+.info:hover dl,.description:hover table, .tips:hover div {
+ padding-top:1em;
+ display:block;
+ color:#555555;
+ z-index:2;
+}
+.description:hover table, .tips:hover div {
+ border:0;
+ border-top:0.1em solid black;
+ margin-top:-0.1em;
+ margin-left:-11.9em;
+ height:14.9em;
+ z-index:100;
+}
+.tips:hover div {
+ margin-left:-23.9em;
+}
+.info:hover h3, .description:hover h3, .tips:hover h3 {
+ background:#ffffff;
+ border-bottom:0;
+ border-bottom:0.1em solid white;
+ z-index:999;
+}
+[/NOJAVASCRIPT]
+[JAVASCRIPT]
+h3 {
+ cursor:pointer;
+ background:#e8ded0 ! important;
+}
+.description_active table, .tips_active div {
+ padding-top:1em;
+ display:block;
+ color:#555555;
+ z-index:2;
+}
+.description_active table, .tips_active div {
+ border:0;
+ border-top:0.1em solid black;
+ margin-top:-0.1em;
+ margin-left:-11.9em;
+ height:14.9em;
+ z-index:100;
+}
+.tips_active div {
+ margin-left:-23.9em;
+}
+.info_active h3, .description_active h3, .tips_active h3 {
+ background:#ffffff ! important;
+ border-bottom:0.1em solid white;
+ z-index:999;
+}
+.tips div {
+ overflow:auto;
+}
+td.desc {
+ height:5em;
+}
+td.desc p {
+ margin:0;
+ padding:0;
+ overflow:auto;
+ height:7em;
+}
+[/JAVASCRIPT]
+</style>
+[JAVASCRIPT]
+<script type="text/javascript">
+<!--
+ function showMe(cssClass, objectId)
+ {
+ divs = document.getElementById('item'+objectId).getElementsByTagName("div")
+ for(i=0; i < divs.length; i++)
+ {
+ if ((divs[i].className != 'imgbox') && (divs[i].className.substr(0,4) != 'note'))
+ {
+ if (divs[i].className.indexOf(cssClass) != -1)
+ {
+ divs[i].className = cssClass + '_active ' + cssClass
+ }
+ else
+ {
+ idx = divs[i].className.indexOf(' ')
+ if (idx != -1)
+ {
+ //alert('Setting ' + divs[i].className.substring(idx + 1))
+ divs[i].className = divs[i].className.substring(idx + 1)
+ }
+ }
+ }
+ }
+ }
+-->
+</script>
+[/JAVASCRIPT]
+</head>
+<body>
+<h1>$$PAGETITLE$$</h1>
+[/HEADER]
+[ITEM]
+<div class="item" id="item$$IDX$$">
+ <h2>$$name$$</h2>
+ <div class="imgbox">
+ <img src="$$boxpic$$" height="$$HEIGHT_PIC$$" alt="$$name$$" title="$$name$$" />
+ </div>
+ <div class="info[JAVASCRIPT]_active info[/JAVASCRIPT]">
+ <h3[JAVASCRIPT] onclick="showMe('info', $$IDX$$)"[/JAVASCRIPT]>$$info_LABEL$$</h3>
+ <dl>
+ <dt>$$platform_LABEL$$</dt>
+ <dd>$$platform$$</dd>
+ <dt>$$genre_LABEL$$</dt>
+ <dd>$$genre$$</dd>
+ <dt>$$players_LABEL$$</dt>
+ <dd>$$players$$</dd>
+ <dt>$$editor_LABEL$$</dt>
+ <dd>$$editor$$</dd>
+ <dt>$$released_LABEL$$</dt>
+ <dd>$$released$$</dd>
+ <dt>$$rating_LABEL$$</dt>
+ <dd>$$rating$$/10</dd>
+ <dt>$$completion_LABEL$$</dt>
+ <dd>$$completion$$</dd>
+ <dt>$$borrower_LABEL$$</dt>
+ <dd>$$borrower$$</dd>
+ </dl>
+ </div>
+ <div class="description">
+ <h3[JAVASCRIPT] onclick="showMe('description', $$IDX$$)"[/JAVASCRIPT]>$$description_LABEL$$</h3>
+ <table>
+ <tr><td><a href="$$screenshot1$$"><img height="100" src="$$screenshot1$$" alt="$$screenshot1_LABEL$$" /></a></td>
+ <td><a href="$$screenshot2$$"><img height="100" src="$$screenshot2$$" alt="$$screenshot2_LABEL$$" /></a></td></tr>
+ <tr><td colspan="2" class="desc"><p>$$description$$</p></td></tr>
+ </table>
+ </div>
+ <div class="tips">
+ <h3[JAVASCRIPT] onclick="showMe('tips', $$IDX$$)"[/JAVASCRIPT]>$$tips_LABEL$$</h3>
+ <div>
+ <table class="codes">
+ <tr><th>$$code_LABEL$$</th><th>$$Effect_LABEL$$</th></tr>
+ $$code_TABLE$$
+ </table>
+ <table class="codes">
+ <tr><th>$$unlockable_LABEL$$</th><th>$$Howto_LABEL$$</th></tr>
+ $$unlockable_TABLE$$
+ </table>
+ <p>$$secrets$$</p>
+ </div>
+ </div>
+</div>
+[/ITEM]
+[FOOTER]
+<div id="note">$$GENERATOR_NOTE$$</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCgames/Tabs.png b/share/gcstar/html_models/GCgames/Tabs.png
new file mode 100644
index 0000000..01adbc7
--- /dev/null
+++ b/share/gcstar/html_models/GCgames/Tabs.png
Binary files differ
diff --git a/share/gcstar/html_models/GCminicars/Tian-Jim b/share/gcstar/html_models/GCminicars/Tian-Jim
new file mode 100644
index 0000000..1d942bf
--- /dev/null
+++ b/share/gcstar/html_models/GCminicars/Tian-Jim
@@ -0,0 +1,279 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
+<!--
+ Template made by Tian. It is based on design of Tian's website:
+ http://www.c-sait.net/
+-->
+<head>
+ <title>$$PAGETITLE$$</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+[JAVASCRIPT]
+ <script type="text/javascript">
+<!--
+expandTooltip="Afficher les informations de la Miniature";
+collapseTooltip="Masquer les informations de la Miniature";
+function prn(s)
+{
+ document.write(s)
+}
+function getE(id)
+{
+ return document.getElementById(id)
+}
+function expcolAll(dir,rowNum)
+{
+ for(x=0;x < rowNum;x++) {
+ try {
+ getE('minicar'+x).style.display=dir
+ if(dir=="none") getE('switch'+x).innerHTML="+"
+ else getE('switch'+x).innerHTML="&ndash;"
+ }
+ catch(err) { }
+ }
+}
+function toggleDisplay(id,swt)
+{
+ if((getE(id).style.display=="")||(getE(id).style.display=="none")) {
+ getE(id).style.display="block"
+ getE(swt).innerHTML="&ndash;"
+ getE(swt).name=collapseTooltip
+ } else {
+ getE(id).style.display="none"
+ getE(swt).innerHTML="+"
+ getE(swt).name=expandTooltip
+ }
+ return false
+}
+function writeExpandControl(elementId,collapse)
+{
+ prn("<a href=\"#\" class=\"minicar-expand\" id=\"switch"+elementId+"\" onclick=\"return toggleDisplay('minicar"+elementId+"','switch"+elementId+"');\" title=\""+((collapse) ? expandTooltip : collapseTooltip)+"\">"+((collapse) ? "+" : "&ndash;")+"</a>")
+}
+function searchMinicars(text)
+{
+ getE("collapseAll").click()
+ alldt=document.getElementsByTagName("dt")
+ alldd=document.getElementsByTagName("dd")
+ nb=alldt.length
+ re=new RegExp(text,"i")
+ for(i=0;i<nb;i++) {
+ s1=alldt[i].getElementsByTagName("a")[1].innerHTML
+ s2=alldd[i].innerHTML
+ res=0
+ if(getE("searchType").value=="all") res=(re.test(s1)||re.test(s2))
+ else res=re.test(s1)
+ if(res) st="block"
+ else st="none"
+ alldt[i].style.display=st
+ alldd[i].style.display=st
+ }
+}
+-->
+ </script>
+[/JAVASCRIPT]
+ <style type="text/css">
+ body {
+ background:#f7f8ff;
+ }
+ h1 {
+ font-weight:bold;
+ font-size:160%;
+ text-align:center;
+ margin-bottom:1em;
+ }
+ #top {
+ color:#624a66 ! important;
+ background:transparent ! important;
+ }
+ form {
+ text-align:center;
+ border:1px solid #c0c0c0;
+ background:#e2e2df;
+ margin:0 3em;
+ padding:0.5em;
+ }
+ input,select {
+ border:2px solid #aaaaaa;
+ background:purple;
+ color:white;
+ margin:0 0.5em;
+ }
+ input:focus, input.submit:hover {
+ background:#f3e3f9;
+ color:black;
+ }
+ input.submit {
+ cursor:pointer;
+ }
+ #links {
+ margin-top:0.5em;
+ text-align:center;
+ font-size:120%;
+ color:#aaaaaa;
+ }
+ .letter {
+ padding:0 0.5em;
+ }
+ img {
+ float:left;
+ margin:0 1em 1em 1em;
+ border:1px solid #aaaaaa;
+ }
+ dt {
+ color:#aaaaaa;
+ font-size:120%;
+ margin:0em 0.5em;
+ clear:both;
+ }
+ dd {
+ margin:0.5em 2em 1em;
+ border-left:1px solid #2e3766;
+ border-bottom:1px solid #2e3766;
+ }
+ table {
+ font-size:90%;
+ margin:0 1em;
+ border:1px solid black;
+ width:60%;
+ }
+ th {
+ font-weight:bold;
+ text-align:left;
+ width:25%;
+ }
+ .tr1 {
+ background:#d4cce0;
+ }
+ .tr2 {
+ background:#c0b9cc;
+ }
+ a {
+ color:#2e3766;
+ background:transparent;
+ text-decoration:none;
+ }
+ a:hover, a:focus {
+ background-color:#e8e8ef;
+ }
+ .topl {
+ color:#aaaaaa;
+ font-size:90%;
+ }
+ .minicar-expand {
+ width:1em;
+ text-align:center;
+ font-size:120%;
+ float:left;
+ margin:0.2em;
+ }
+ p, #note {
+ background:white;
+ border:2px solid purple;
+ clear:left;
+ margin:1em 2em;
+ padding:0.5em;
+ }
+ .borrowed0 {
+ font-size:80%;
+ color:#c0b9cc;
+ background:transparent;
+ text-decoration:none;
+ display:block;
+ }
+ .borrowed1 {
+ font-size:80%;
+ color:purple;
+ background:transparent;
+ text-decoration:none;
+ display:block;
+ }
+ #note {
+ text-align:center;
+ }
+ #note a {
+ text-decoration:underline;
+ }
+ </style>
+</head>
+<body>
+ <h1><a id="top">$$PAGETITLE$$</a></h1>
+[JAVASCRIPT]
+ <form onsubmit="searchMinicars(getE('searchText').value); return false" action="">
+ <div>
+ <input type="text" id="searchText" title="$$FORM_INPUT$$" />
+ <select id="searchType">
+ <option value="name">$$FORM_SEARCH1$$</option>
+ <option value="all">$$FORM_SEARCH2$$</option>
+ </select>
+ <input type="button" class="submit" value="$$FORM_SEARCHBUTTON$$" title="$$FORM_SEARCHTITLE$$" onclick="searchMinicars(getE('searchText').value)" />
+ <input type="button" class="submit" value="$$FORM_ALLBUTTON$$" title="$$FORM_ALLTITLE$$" onclick="searchMinicars('')" />
+ <br />
+ <br />
+ <input type="button" class="submit" value="$$FORM_EXPAND$$" onclick="expcolAll('block','$$TOTALNUMBER$$')" title="$$FORM_EXPANDTITLE$$" />
+ <input type="button" id="collapseAll" class="submit" value="$$FORM_COLLAPSE$$" onclick="expcolAll('none','$$TOTALNUMBER$$')" title="$$FORM_COLLAPSETITLE$$" />
+ </div>
+ </form>
+[/JAVASCRIPT]
+ <div id="links">| _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |</div>
+ <dl>
+[/HEADER]
+[ITEM]
+ <dt>
+[JAVASCRIPT]
+ <script type="text/javascript">writeExpandControl('$$IDX$$',1)</script>
+[/JAVASCRIPT]
+ <a id="minicarlink_$$IDX$$" href="$$URL$$">$$name$$</a> | <a class="topl" href="#top">($$TOP$$)</a>
+ <span class="borrowed$$borrower_FLAG$$">$$borrower_YESNO$$$$borrower_OREMPTY$$</span>
+ </dt>
+ <dd>
+ <div id="minicar$$IDX$$" style="display:none;">
+ <img src="$$picture$$" alt="$$name$$" title="$$name$$" height="160" />
+ <table>
+ <tr class="tr1"><th>$$scale_LABEL$$</th><td>$$scale$$</td></tr>
+ <tr class="tr2"><th>$$manufacturer_LABEL$$</th><td>$$manufacturer$$</td></tr>
+ <tr class="tr1"><th>$$type1_LABEL$$</th><td>$$type1$$</td></tr>
+ <tr class="tr2"><th>$$constructor_LABEL$$</th><td>$$constructor$$</td></tr>
+ <tr class="tr1"><th>$$modele_LABEL$$</th><td>$$modele$$</td></tr>
+ <tr class="tr2"><th>$$version_LABEL$$</th><td>$$version$$</td></tr>
+ <tr class="tr1"><th>$$color_LABEL$$</th><td>$$color$$</td></tr>
+ <tr class="tr2"><th>$$pub_LABEL$$</th><td>$$pub$$</td></tr>
+ <tr class="tr1"><th>$$year_LABEL$$</th><td>$$year$$</td></tr>
+ <tr class="tr2"><th>$$reference_LABEL$$</th><td>$$reference$$</td></tr>
+ <tr class="tr1"><th>$$rating1_LABEL$$</th><td>$$rating1$$/10</td></tr>
+ </table>
+ <p><em>$$comments1$$</em></p>
+ </div>
+ </dd>
+[/ITEM]
+[FOOTER]
+ </dl>
+ <div id="note">$$GENERATOR_NOTE$$</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+
+ my %letters = ();
+ my $idx = 0;
+
+ foreach (@items)
+ {
+ my $name = $self->{options}->{originalList}->transformValue($_->{name}, 'name');
+ my $firstLetter = uc(substr($name, 0, 1));
+ $firstLetter =~ s/[^A-Z]/_/;
+ if (!$letters{$firstLetter})
+ {
+ $body =~ s/<a id="minicarlink_$idx"/<a id="$firstLetter"/;
+ $letters{$firstLetter} = 1;
+ }
+ $idx++;
+ }
+
+ foreach (keys %letters)
+ {
+ $header =~ s/\| $_ \|/| <a class="letter" href="#$_">$_<\/a> |/;
+ }
+ $header =~ s/\| ([^<|]) /| <span class="letter">$1<\/span> /g;
+ #$header =~ s/\| ([^<]) \|/| <span class="letter">$1<\/span> |/g;
+[/POST]
diff --git a/share/gcstar/html_models/GCminicars/Tian-Jim.png b/share/gcstar/html_models/GCminicars/Tian-Jim.png
new file mode 100644
index 0000000..3815533
--- /dev/null
+++ b/share/gcstar/html_models/GCminicars/Tian-Jim.png
Binary files differ
diff --git a/share/gcstar/html_models/GCmusics/Shelf b/share/gcstar/html_models/GCmusics/Shelf
new file mode 100644
index 0000000..429f179
--- /dev/null
+++ b/share/gcstar/html_models/GCmusics/Shelf
@@ -0,0 +1,298 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by Tian. It emulates a shelf display.
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+body
+{
+ color:black;
+}
+h1
+{
+ text-align:left;
+ margin-left:0.5em;
+ font-size:200%;
+ font-weight:bold;
+ color:#6c7b8b;
+}
+h2
+{
+ font-size:150%;
+ text-align:center;
+ color:#1c86ee;
+ font-weight:bold;
+ height:3em;
+}
+h3
+{
+ font-size:120%;
+ font-weight:bold;
+ margin:1em 0;
+ color:#6c7b8b;
+ border-bottom:1px dashed #6c7b8b;
+}
+#left
+{
+[JAVASCRIPT]
+ width:48%;
+[/JAVASCRIPT]
+ border:1px dashed #6c7b8b;
+ background:#f0f0f0;
+}
+.imgbox
+{
+ float:left;
+ padding:2em 1em 0em;
+ margin:0;
+}
+img
+{
+ margin:0;
+ padding:0;
+[JAVASCRIPT]
+ cursor:pointer;
+[/JAVASCRIPT]
+}
+.imginfo
+{
+ float:left;
+ margin-top:0.5em;
+[JAVASCRIPT]
+ cursor:default;
+[/JAVASCRIPT]
+}
+.synopsis
+{
+ height:8em;
+ overflow:auto;
+ padding:0.2em;
+ background:#f0f0f0;
+}
+table
+{
+ margin:0 2%;
+ width:95%;
+}
+th
+{
+ font-weight:bold;
+ text-align:left;
+ white-space:nowrap;
+ padding:0.5em;
+ background:#f0f0f0;
+ width:40%;
+}
+td
+{
+ padding:0.5em;
+ background:#f0f0f0;
+ display:block;
+ min-height:1.5em;
+ max-height:10em;
+ overflow:auto;
+}
+#tracks td
+{
+ display:table-cell;
+}
+tr.even td
+{
+ background:#f0f0f0;
+}
+tr.odd td
+{
+ background:#e0e0d0;
+}
+#note
+{
+ text-align:center;
+ padding-top:0.5em;
+[JAVASCRIPT]
+ width:48%;
+[/JAVASCRIPT]
+ color:#6c7b8b;
+}
+#note a
+{
+ font-weight:bold;
+ color:#1c86ee;
+}
+#note a:hover
+{
+ color:#6c7b8b;
+}
+.spacer
+{
+ clear: both;
+}
+[JAVASCRIPT]
+.expander
+{
+ padding:0;
+ width:1em;
+ display:block;
+ float:left;
+ text-align:center;
+ margin-right:0.5em;
+ cursor:pointer;
+}
+[/JAVASCRIPT]
+.info
+{
+ position:fixed;
+ top:0;
+ right:1%;
+ width:48%;
+ display:none;
+}
+.details
+{
+ overflow: auto;
+ height: 500px;
+}
+</style>
+[JAVASCRIPT]
+<script type="text/javascript">
+<!--
+function getBoxes()
+{
+ return document.getElementById("left").getElementsByTagName("div")
+}
+function getHeight()
+{
+ //From http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
+ myHeight = 0;
+ if( typeof( window.innerWidth ) == 'number' ) {
+ //Non-IE
+ myHeight = window.innerHeight;
+ } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
+ //IE 6+ in 'standards compliant mode'
+ myHeight = document.documentElement.clientHeight;
+ } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
+ //IE 4 compatible
+ myHeight = document.body.clientHeight;
+ }
+ return myHeight - 150;
+}
+function init()
+{
+ // CSS changes from http://www.quirksmode.org/dom/changess.html
+ if (!document.styleSheets) return;
+ var theRules = new Array();
+ if (document.styleSheets[0].cssRules)
+ theRules = document.styleSheets[0].cssRules
+ else if (document.styleSheets[0].rules)
+ theRules = document.styleSheets[0].rules
+ theRules[theRules.length-1].style.height = getHeight()+'px';
+
+ boxes = getBoxes()
+ for(i=0; i < boxes.length; i++)
+ {
+ box = boxes[i]
+ if (box.className == "movie")
+ {
+ boxes2 = box.getElementsByTagName("div")
+ boxes2[0].onclick = function(evt)
+ {
+ div = this.parentNode
+ showMe(div.getElementsByTagName("div")[1], this)
+ }
+ }
+ }
+ headers = document.getElementById("left").getElementsByTagName("h3")
+ for(i=0; i < headers.length; i++)
+ {
+ header = headers[i]
+ header.style.cursor = 'pointer'
+ header.innerHTML = '<span class="expander">−</span> ' + header.innerHTML
+ header.onclick = function(evt)
+ {
+ table = this.nextSibling
+ while (table.tagName != "TABLE") { table = table.nextSibling }
+ if (table.style.display == "none")
+ {
+ table.style.display = "table"
+ this.innerHTML = this.innerHTML.replace(/\+<\/span>/, '−</span>')
+ }
+ else
+ {
+ table.style.display = "none"
+ this.innerHTML = this.innerHTML.replace(/−<\/span>/, '+</span>')
+ }
+ }
+ }
+}
+var currentBox = 0
+var currentImg = 0
+function showMe(box, img)
+{
+ hidePrevious()
+ box.style.display = "block"
+ img.style.background = "#4b4f63"
+ img.style.padding = "1em"
+ currentBox = box
+ currentImg = img
+}
+function hidePrevious()
+{
+ if (currentBox)
+ {
+ currentBox.style.display = "none"
+ currentImg.style.background = "#f0f0f0"
+ currentImg.style.padding = "2em 1em 0em"
+ }
+}
+-->
+</script>
+[/JAVASCRIPT]
+</head>
+<body [JAVASCRIPT]onload="init()"[/JAVASCRIPT]>
+<h1>$$PAGETITLE$$</h1>
+<div id="left">
+[/HEADER]
+[ITEM]
+<div class="movie">
+ <div class="imgbox">
+ <img src="$$COVER_FIELD$$" height="$$HEIGHT_PIC$$" alt="$$TITLE_FIELD$$" title="$$TITLE_FIELD$$" />
+ </div>
+ <div class="info">
+ <h2>$$TITLE_FIELD$$</h2>
+ <div class="details">
+ <h3>$$main_LABEL$$</h3>
+ <table>
+ <tr><th>$$artist_LABEL$$</th><td>$$artist$$</td></tr>
+ <tr><th>$$label_LABEL$$</th><td>$$label$$</td></tr>
+ <tr><th>$$release_LABEL$$</th><td>$$release$$</td></tr>
+ <tr><th>$$running_LABEL$$</th><td>$$running$$</td></tr>
+ <tr><th>$$genre_LABEL$$</th><td>$$genre$$</td></tr>
+ </table>
+
+ <h3>$$details_LABEL$$</h3>
+ <table>
+ <tr><th>$$producer_LABEL$$</th><td>$$producer$$</td></tr>
+ <tr><th>$$composer_LABEL$$</th><td>$$composer$$</td></tr>
+ <tr><th>$$comments_LABEL$$</th><td>$$comments$$</td></tr>
+ </table>
+
+ <h3>$$tracks_LABEL$$</h3>
+ <table id="tracks">
+ $$tracks_TABLE$$
+ </table>
+ </div>
+ </div>
+</div>
+[/ITEM]
+[FOOTER]
+<div class="spacer">&nbsp;</div>
+</div>
+<p id="note">$$GENERATOR_NOTE$$</p>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCmusics/Shelf.png b/share/gcstar/html_models/GCmusics/Shelf.png
new file mode 100644
index 0000000..83dbfd8
--- /dev/null
+++ b/share/gcstar/html_models/GCmusics/Shelf.png
Binary files differ
diff --git a/share/gcstar/html_models/GCmusics/Simple b/share/gcstar/html_models/GCmusics/Simple
new file mode 100644
index 0000000..7cef04c
--- /dev/null
+++ b/share/gcstar/html_models/GCmusics/Simple
@@ -0,0 +1,10 @@
+<metamodel>
+ <model>Simple</model>
+ <fields>
+ <field>title</field>
+ <field>artist</field>
+ <field>running</field>
+ <field>label</field>
+ <field>genre</field>
+ </fields>
+</metamodel>
diff --git a/share/gcstar/html_models/GCmusics/Simple.png b/share/gcstar/html_models/GCmusics/Simple.png
new file mode 100644
index 0000000..4bc59cf
--- /dev/null
+++ b/share/gcstar/html_models/GCmusics/Simple.png
Binary files differ
diff --git a/share/gcstar/html_models/GCstar/Shelf b/share/gcstar/html_models/GCstar/Shelf
new file mode 100644
index 0000000..e699fdc
--- /dev/null
+++ b/share/gcstar/html_models/GCstar/Shelf
@@ -0,0 +1,282 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by Tian. It emulates a shelf display.
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+body
+{
+ color:black;
+}
+h1
+{
+ text-align:left;
+ margin-left:0.5em;
+ font-size:200%;
+ font-weight:bold;
+ color:#6c7b8b;
+}
+h2
+{
+ font-size:150%;
+ text-align:center;
+ color:#1c86ee;
+ font-weight:bold;
+ height:3em;
+}
+h3
+{
+ font-size:120%;
+ font-weight:bold;
+ margin:1em 0;
+ color:#6c7b8b;
+ border-bottom:1px dashed #6c7b8b;
+}
+#left
+{
+[JAVASCRIPT]
+ width:48%;
+[/JAVASCRIPT]
+ border:1px dashed #6c7b8b;
+ background:#f0f0f0;
+}
+.imgbox
+{
+ float:left;
+ padding:2em 1em 0em;
+ margin:0;
+}
+.imgbox img
+{
+ margin:0;
+ padding:0;
+[JAVASCRIPT]
+ cursor:pointer;
+[/JAVASCRIPT]
+}
+.imginfo
+{
+ float:left;
+ margin-top:0.5em;
+[JAVASCRIPT]
+ cursor:default;
+[/JAVASCRIPT]
+}
+.info
+{
+ position:fixed;
+ top:0;
+ right:1%;
+ width:48%;
+ display:none;
+}
+.synopsis
+{
+ height:8em;
+ overflow:auto;
+ padding:0.2em;
+ background:#f0f0f0;
+}
+table
+{
+ margin:0 2%;
+ width:95%;
+}
+th
+{
+ font-weight:bold;
+ text-align:left;
+ white-space:nowrap;
+ padding:0.5em;
+ background:#f0f0f0;
+ width:40%;
+}
+td
+{
+ padding:0.5em;
+ background:#f0f0f0;
+ display:block;
+ min-height:1.5em;
+ max-height:12em;
+ overflow:auto;
+}
+#note
+{
+ text-align:center;
+ padding-top:0.5em;
+[JAVASCRIPT]
+ width:48%;
+[/JAVASCRIPT]
+ color:#6c7b8b;
+}
+#note a
+{
+ font-weight:bold;
+ color:#1c86ee;
+}
+#note a:hover
+{
+ color:#6c7b8b;
+}
+.spacer
+{
+ clear: both;
+}
+[JAVASCRIPT]
+.expander
+{
+ padding:0;
+ width:1em;
+ display:block;
+ float:left;
+ text-align:center;
+ margin-right:0.5em;
+ cursor:pointer;
+}
+[/JAVASCRIPT]
+.info
+{
+ position:fixed;
+ top:0;
+ right:1%;
+ width:48%;
+ display:none;
+}
+.details
+{
+ overflow: auto;
+ height: 500px;
+}
+</style>
+[JAVASCRIPT]
+<script type="text/javascript">
+<!--
+function getBoxes()
+{
+ return document.getElementById("left").getElementsByTagName("div")
+}
+function getHeight()
+{
+ //From http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
+ myHeight = 0;
+ if( typeof( window.innerWidth ) == 'number' ) {
+ //Non-IE
+ myHeight = window.innerHeight;
+ } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
+ //IE 6+ in 'standards compliant mode'
+ myHeight = document.documentElement.clientHeight;
+ } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
+ //IE 4 compatible
+ myHeight = document.body.clientHeight;
+ }
+ return myHeight - 150;
+}
+function init()
+{
+ // CSS changes from http://www.quirksmode.org/dom/changess.html
+ if (!document.styleSheets) return;
+ var theRules = new Array();
+ if (document.styleSheets[0].cssRules)
+ theRules = document.styleSheets[0].cssRules
+ else if (document.styleSheets[0].rules)
+ theRules = document.styleSheets[0].rules
+ theRules[theRules.length-1].style.height = getHeight()+'px';
+
+ boxes = getBoxes()
+ for(i=0; i < boxes.length; i++)
+ {
+ box = boxes[i]
+ if (box.className == "movie")
+ {
+ boxes2 = box.getElementsByTagName("div")
+ boxes2[0].onclick = function(evt)
+ {
+ div = this.parentNode
+ showMe(div.getElementsByTagName("div")[1], this)
+ }
+ }
+ }
+ headers = document.getElementById("left").getElementsByTagName("h3")
+ for(i=0; i < headers.length; i++)
+ {
+ header = headers[i]
+ header.style.cursor = 'pointer'
+ header.innerHTML = '<span class="expander">−</span> ' + header.innerHTML
+ header.onclick = function(evt)
+ {
+ table = this.nextSibling
+ while (table.tagName != "TABLE") { table = table.nextSibling }
+ if (table.style.display == "none")
+ {
+ table.style.display = "table"
+ this.innerHTML = this.innerHTML.replace(/\+<\/span>/, '−</span>')
+ }
+ else
+ {
+ table.style.display = "none"
+ this.innerHTML = this.innerHTML.replace(/−<\/span>/, '+</span>')
+ }
+ }
+ }
+}
+var currentBox = 0
+var currentImg = 0
+function showMe(box, img)
+{
+ hidePrevious()
+ box.style.display = "block"
+ img.style.background = "#4b4f63"
+ img.style.padding = "1em"
+ currentBox = box
+ currentImg = img
+}
+function hidePrevious()
+{
+ if (currentBox)
+ {
+ currentBox.style.display = "none"
+ currentImg.style.background = "#f0f0f0"
+ currentImg.style.padding = "2em 1em 0em"
+ }
+}
+-->
+</script>
+[/JAVASCRIPT]
+</head>
+<body [JAVASCRIPT]onload="init()"[/JAVASCRIPT]>
+<h1>$$PAGETITLE$$</h1>
+<div id="left">
+[/HEADER]
+[ITEM]
+<div class="movie">
+ <div class="imgbox">
+ <img src="$$COVER_FIELD$$" height="$$HEIGHT_PIC$$" alt="$$TITLE_FIELD$$" title="$$TITLE_FIELD$$" />
+ </div>
+ <div class="info">
+ <h2>$$TITLE_FIELD$$</h2>
+ <div class="details">
+ [LOOP0 values=GCSgroups idx=GROUP]
+ <h3>$$GROUP_LABEL$$</h3>
+ <table>
+ [LOOP1 values=GROUP idx=VALUE]
+ <tr><th>$$VALUE_LABEL$$</th><td>$$VALUE$$</td></tr>
+ [/LOOP1]
+ </table>
+ [/LOOP0]
+ </div>
+ </div>
+</div>
+[/ITEM]
+[FOOTER]
+<div class="spacer">&nbsp;</div>
+</div>
+<p id="note">$$GENERATOR_NOTE$$</p>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCstar/Shelf.png b/share/gcstar/html_models/GCstar/Shelf.png
new file mode 100644
index 0000000..f4423d0
--- /dev/null
+++ b/share/gcstar/html_models/GCstar/Shelf.png
Binary files differ
diff --git a/share/gcstar/html_models/GCstar/Simple b/share/gcstar/html_models/GCstar/Simple
new file mode 100644
index 0000000..1db1548
--- /dev/null
+++ b/share/gcstar/html_models/GCstar/Simple
@@ -0,0 +1,96 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by Tian. A really simple list that could be printed
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+body
+{
+ color:black;
+}
+h1
+{
+ text-align:center;
+ font-size:200%;
+ font-weight:bold;
+}
+table
+{
+ border-collapse:collapse;
+ margin:1em 5%;
+ margin-bottom:3em;
+ width:90%;
+}
+tr+tr
+{
+ border-top:1px solid black;
+}
+.borrowed1
+{
+ color:#777777;
+ font-style:italic;
+}
+th
+{
+ border-bottom:2px solid black;
+ margin:0;
+ padding:1em;
+ font-weight:bold;
+}
+td
+{
+ padding:0.2em 1em;
+}
+#legend
+{
+ margin:1em;
+ border:1px solid black;
+ display:inline;
+ padding:0.5em;
+}
+#note
+{
+ border-top:1px solid black;
+ margin:3em 8%;
+ margin-bottom:2em;
+ padding-top:0.5em;
+ text-align:center;
+ font-size:90%;
+}
+#note a
+{
+ color:black ! important;
+ text-decoration:underline;
+ font-weight:bold;
+}
+</style>
+</head>
+<body>
+<h1>$$PAGETITLE$$</h1>
+<table>
+<tr>
+ [LOOP1 values=GCSfields idx=title]
+ <th>$$title_LABEL$$</th>
+ [/LOOP1]
+</tr>
+[/HEADER]
+[ITEM]
+<tr class="borrowed$$borrower_FLAG$$">
+ [LOOP2 values=GCSfields idx=field]
+ <td>$$field$$</td>
+ [/LOOP2]
+</tr>
+[/ITEM]
+[FOOTER]
+</table>
+[LENDING]<p id="legend" class="borrowed1">$$BORROWED_ITEMS$$</p>[/LENDING]
+<p id="note">$$GENERATOR_NOTE$$</p>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCstar/Simple.png b/share/gcstar/html_models/GCstar/Simple.png
new file mode 100644
index 0000000..3e23235
--- /dev/null
+++ b/share/gcstar/html_models/GCstar/Simple.png
Binary files differ
diff --git a/share/gcstar/icons/GCstar.ico b/share/gcstar/icons/GCstar.ico
new file mode 100644
index 0000000..ddc75ec
--- /dev/null
+++ b/share/gcstar/icons/GCstar.ico
Binary files differ
diff --git a/share/gcstar/icons/gcstar_128x128.png b/share/gcstar/icons/gcstar_128x128.png
new file mode 100644
index 0000000..6121ebf
--- /dev/null
+++ b/share/gcstar/icons/gcstar_128x128.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_16x16.png b/share/gcstar/icons/gcstar_16x16.png
new file mode 100644
index 0000000..249b4c0
--- /dev/null
+++ b/share/gcstar/icons/gcstar_16x16.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_192x192.png b/share/gcstar/icons/gcstar_192x192.png
new file mode 100644
index 0000000..a1d65b8
--- /dev/null
+++ b/share/gcstar/icons/gcstar_192x192.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_22x22.png b/share/gcstar/icons/gcstar_22x22.png
new file mode 100644
index 0000000..ba81e06
--- /dev/null
+++ b/share/gcstar/icons/gcstar_22x22.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_24x24.png b/share/gcstar/icons/gcstar_24x24.png
new file mode 100644
index 0000000..c361bee
--- /dev/null
+++ b/share/gcstar/icons/gcstar_24x24.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_256x256.png b/share/gcstar/icons/gcstar_256x256.png
new file mode 100644
index 0000000..0db7cb5
--- /dev/null
+++ b/share/gcstar/icons/gcstar_256x256.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_32x32.png b/share/gcstar/icons/gcstar_32x32.png
new file mode 100644
index 0000000..6a4aa63
--- /dev/null
+++ b/share/gcstar/icons/gcstar_32x32.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_36x36.png b/share/gcstar/icons/gcstar_36x36.png
new file mode 100644
index 0000000..09d0815
--- /dev/null
+++ b/share/gcstar/icons/gcstar_36x36.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_48x48.png b/share/gcstar/icons/gcstar_48x48.png
new file mode 100644
index 0000000..75b22e4
--- /dev/null
+++ b/share/gcstar/icons/gcstar_48x48.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_64x64.png b/share/gcstar/icons/gcstar_64x64.png
new file mode 100644
index 0000000..9ab0f26
--- /dev/null
+++ b/share/gcstar/icons/gcstar_64x64.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_72x72.png b/share/gcstar/icons/gcstar_72x72.png
new file mode 100644
index 0000000..6346b0c
--- /dev/null
+++ b/share/gcstar/icons/gcstar_72x72.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_96x96.png b/share/gcstar/icons/gcstar_96x96.png
new file mode 100644
index 0000000..fc4bb66
--- /dev/null
+++ b/share/gcstar/icons/gcstar_96x96.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_scalable.svg b/share/gcstar/icons/gcstar_scalable.svg
new file mode 100644
index 0000000..a8f4345
--- /dev/null
+++ b/share/gcstar/icons/gcstar_scalable.svg
@@ -0,0 +1,354 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48"
+ height="48"
+ id="svg2819"
+ sodipodi:version="0.32"
+ inkscape:version="0.47pre4 r22446"
+ sodipodi:docname="gcstar_scalable.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ version="1.0"
+ inkscape:export-filename="/home/nyall/Sources/gcstar/gcstar/share/gcstar/icons/gcstar48.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs3">
+ <linearGradient
+ id="linearGradient12410">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="0"
+ id="stop12412" />
+ <stop
+ id="stop12418"
+ offset="0.41"
+ style="stop-color:#ffffff;stop-opacity:0.84482759;" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0.41379312;"
+ offset="1"
+ id="stop12414" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient12204">
+ <stop
+ style="stop-color:#f8f7f5;stop-opacity:0.68965518;"
+ offset="0"
+ id="stop12206" />
+ <stop
+ style="stop-color:#f8f7f5;stop-opacity:1;"
+ offset="1"
+ id="stop12208" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient12049">
+ <stop
+ style="stop-color:#1c86ee;stop-opacity:1;"
+ offset="0"
+ id="stop12051" />
+ <stop
+ id="stop12057"
+ offset="0.02173913"
+ style="stop-color:#1c86ee;stop-opacity:1;" />
+ <stop
+ style="stop-color:#1c86ee;stop-opacity:0;"
+ offset="1"
+ id="stop12053" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient12019">
+ <stop
+ style="stop-color:#e9f6fd;stop-opacity:1;"
+ offset="0"
+ id="stop12021" />
+ <stop
+ id="stop12029"
+ offset="0.89999998"
+ style="stop-color:#e9f6fd;stop-opacity:0.80000001;" />
+ <stop
+ style="stop-color:#1c86ee;stop-opacity:0.62068963;"
+ offset="1"
+ id="stop12023" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient10825-3">
+ <stop
+ style="stop-color:#ff8b00;stop-opacity:1"
+ offset="0"
+ id="stop10827-7" />
+ <stop
+ style="stop-color:#ffda2c;stop-opacity:1;"
+ offset="1"
+ id="stop10829-2" />
+ </linearGradient>
+ <linearGradient
+ y2="81.559097"
+ x2="48.764919"
+ y1="49.470879"
+ x1="13.621812"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient10903"
+ xlink:href="#linearGradient10825-3"
+ inkscape:collect="always"
+ gradientTransform="matrix(0.41155376,0,0,0.37629294,-265.80467,82.438907)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient12019"
+ id="radialGradient12025"
+ cx="-84.0952"
+ cy="66.399673"
+ fx="-84.0952"
+ fy="66.399673"
+ r="53.790623"
+ gradientTransform="matrix(1,0,0,1.1502348,0,-9.9755405)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient12049"
+ id="radialGradient12055"
+ cx="-168.95901"
+ cy="50.659706"
+ fx="-168.95901"
+ fy="50.659706"
+ r="34.345188"
+ gradientTransform="matrix(1.4498533,-0.12758225,0.20790246,1.4810386,65.474492,-46.435922)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient12204"
+ id="radialGradient12212"
+ cx="-194.366"
+ cy="76.325996"
+ fx="-194.366"
+ fy="76.325996"
+ r="35.096848"
+ gradientTransform="matrix(0.61646016,0.02621381,-0.01958688,0.4371301,-122.60409,75.947141)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ inkscape:collect="always"
+ id="filter12283"
+ color-interpolation-filters="sRGB">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.55968507"
+ id="feGaussianBlur12285" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient12410"
+ id="linearGradient12440"
+ gradientUnits="userSpaceOnUse"
+ spreadMethod="reflect"
+ x1="76.058029"
+ y1="14.752228"
+ x2="75.362732"
+ y2="104.39509"
+ gradientTransform="matrix(0.39783017,0,0,0.38755469,3.0478444,71.768767)" />
+ <linearGradient
+ id="linearGradient12049-8">
+ <stop
+ style="stop-color:#1c86ee;stop-opacity:1;"
+ offset="0"
+ id="stop12051-8" />
+ <stop
+ id="stop12057-0"
+ offset="0.02173913"
+ style="stop-color:#1c86ee;stop-opacity:1;" />
+ <stop
+ style="stop-color:#1c86ee;stop-opacity:0;"
+ offset="1"
+ id="stop12053-3" />
+ </linearGradient>
+ <radialGradient
+ r="34.345188"
+ fy="50.659706"
+ fx="-168.95901"
+ cy="50.659706"
+ cx="-168.95901"
+ gradientTransform="matrix(1.4498533,-0.12758225,0.20790246,1.4810386,65.474492,-46.435922)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient12624"
+ xlink:href="#linearGradient12049-8"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:document-units="px"
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6"
+ inkscape:cx="58.070793"
+ inkscape:cy="21.605344"
+ inkscape:current-layer="layer2"
+ inkscape:window-width="1024"
+ inkscape:window-height="525"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ height="350px"
+ width="350px"
+ showgrid="false"
+ inkscape:snap-nodes="false"
+ inkscape:snap-grids="false"
+ inkscape:snap-to-guides="false"
+ inkscape:window-maximized="1"
+ inkscape:showpageshadow="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid12442"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ dotted="false"
+ originy="0px"
+ spacingx="1px"
+ spacingy="1px"
+ originx="0px" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Shadow" />
+ <g
+ inkscape:label="Shape"
+ inkscape:groupmode="layer"
+ id="layer1"
+ style="display:inline"
+ transform="translate(278.8021,-83.301965)">
+ <path
+ sodipodi:type="arc"
+ style="fill:#1c86ee;fill-opacity:1;stroke:none"
+ id="path11995"
+ sodipodi:cx="-84.0952"
+ sodipodi:cy="66.399673"
+ sodipodi:rx="53.790623"
+ sodipodi:ry="61.871845"
+ d="m -30.304577,66.399673 a 53.790623,61.871845 0 1 1 -107.581243,0 53.790623,61.871845 0 1 1 107.581243,0 z"
+ transform="matrix(0.39969792,0,0,0.37173613,-220.64158,82.694658)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient12025);fill-opacity:1;stroke:none;display:inline"
+ id="path11995-2"
+ sodipodi:cx="-84.0952"
+ sodipodi:cy="66.399673"
+ sodipodi:rx="53.790623"
+ sodipodi:ry="61.871845"
+ d="m -30.304577,66.399673 a 53.790623,61.871845 0 1 1 -107.581243,0 53.790623,61.871845 0 1 1 107.581243,0 z"
+ transform="matrix(0.35487197,0,0,0.34244851,-224.17797,84.004615)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient12055);fill-opacity:1;stroke:none"
+ id="path12031"
+ sodipodi:cx="-195.46452"
+ sodipodi:cy="55.287994"
+ sodipodi:rx="34.345188"
+ sodipodi:ry="38.133259"
+ d="m -161.11934,55.287994 a 34.345188,38.133259 0 1 1 -68.69037,0 34.345188,38.133259 0 1 1 68.69037,0 z"
+ transform="matrix(0.34955445,-0.20324359,0.23891661,0.3610748,-194.81789,40.934613)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.63333333;fill:url(#radialGradient12624);fill-opacity:1;stroke:none;display:inline"
+ id="path12031-7"
+ sodipodi:cx="-195.46452"
+ sodipodi:cy="55.287994"
+ sodipodi:rx="34.345188"
+ sodipodi:ry="38.133259"
+ d="m -161.11934,55.287994 a 34.345188,38.133259 0 1 1 -68.69037,0 34.345188,38.133259 0 1 1 68.69037,0 z"
+ transform="matrix(0.24395051,0.31715383,-0.34463632,0.26837757,-183.28697,161.43492)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Frame Details"
+ style="display:inline"
+ transform="translate(0,-70.692917)">
+ <path
+ transform="matrix(0.42963728,0,0,0.39370638,0.8196103,71.267098)"
+ style="opacity:0.92957746;fill:#1c86ee;fill-opacity:1;stroke:none;filter:url(#filter12283)"
+ d="m 92.403138,59.05006 c 0,24.852814 -13.645663,45 -34.903138,45 -20.316188,0 -36.785713,-20.147186 -36.785713,-45 0,-24.852813 18.135902,-45.37322 38.44969,-45.703125 21.647369,-0.351562 33.239161,21.347496 33.239161,45.703125 z"
+ id="path12267"
+ sodipodi:nodetypes="csssc" />
+ <path
+ style="fill:url(#linearGradient12440);fill-opacity:1;stroke:none;display:inline"
+ d="m 32.089449,77.618419 c 5.761051,3.911675 8.752263,7.524674 8.752263,16.967628 0,9.679593 -6.174441,16.554383 -12.508561,17.647563 7.783371,-0.69205 14.069638,-7.11559 14.211772,-17.090451 0.142081,-9.971217 -3.505091,-14.44351 -10.455474,-17.52474 z"
+ id="path12366"
+ sodipodi:nodetypes="cscsc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="Orange Face"
+ style="display:inline"
+ transform="translate(278.8021,-83.301965)">
+ <path
+ style="fill:url(#linearGradient10903);fill-opacity:1;stroke:none;display:inline"
+ d="m -238.78208,107.13955 c 0,9.02702 -6.74719,16.34487 -15.07029,16.34487 -8.32308,0 -15.07028,-7.31785 -15.07028,-16.34487 0,-9.027022 5.78737,-16.531557 15.07028,-16.344869 8.32132,0.167349 15.07029,7.317847 15.07029,16.344869 z"
+ id="path10051"
+ sodipodi:nodetypes="csssc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Eyes"
+ style="display:inline"
+ transform="translate(278.8021,-83.301965)">
+ <path
+ sodipodi:type="arc"
+ style="fill:#2287e7;fill-opacity:1;stroke:none"
+ id="path12200"
+ sodipodi:cx="-230.56732"
+ sodipodi:cy="68.167442"
+ sodipodi:rx="8.8388348"
+ sodipodi:ry="14.647212"
+ d="m -221.72849,68.167442 a 8.8388348,14.647212 0 1 1 -17.67767,0 8.8388348,14.647212 0 1 1 17.67767,0 z"
+ transform="matrix(0.37134401,-0.021034,0.0215917,0.36175264,-172.41705,77.950439)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#2287e7;fill-opacity:1;stroke:none"
+ id="path12202"
+ sodipodi:cx="-204.30336"
+ sodipodi:cy="67.914902"
+ sodipodi:rx="7.0710678"
+ sodipodi:ry="12.879445"
+ d="m -197.23229,67.914902 a 7.0710678,12.879445 0 1 1 -14.14214,0 7.0710678,12.879445 0 1 1 14.14214,0 z"
+ transform="matrix(0.39204386,0.02209561,-0.02344396,0.3769938,-165.14717,86.401306)"
+ inkscape:export-xdpi="120"
+ inkscape:export-ydpi="120" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Gloss"
+ transform="translate(278.8021,-83.301965)"
+ style="display:inline">
+ <path
+ style="opacity:0.85;fill:url(#radialGradient12212);fill-opacity:1;display:inline"
+ d="m -265.40032,100.20156 c -2.68359,5.52441 -1.5331,7.47527 6.84606,5.40973 6.11499,-1.50737 11.50992,-1.7882 19.78978,1.22675 -0.0647,-6.61559 -3.94917,-12.281952 -9.09606,-14.70295 -7.39496,-1.875584 -14.40235,1.607757 -17.53978,8.06647 z"
+ id="path6484-2"
+ sodipodi:nodetypes="csccs" />
+ </g>
+</svg>
diff --git a/share/gcstar/icons/icon_install.ico b/share/gcstar/icons/icon_install.ico
new file mode 100644
index 0000000..6fe942e
--- /dev/null
+++ b/share/gcstar/icons/icon_install.ico
Binary files differ
diff --git a/share/gcstar/icons/star.png b/share/gcstar/icons/star.png
new file mode 100644
index 0000000..063d0df
--- /dev/null
+++ b/share/gcstar/icons/star.png
Binary files differ
diff --git a/share/gcstar/icons/star_hover.png b/share/gcstar/icons/star_hover.png
new file mode 100644
index 0000000..fb7f0d1
--- /dev/null
+++ b/share/gcstar/icons/star_hover.png
Binary files differ
diff --git a/share/gcstar/icons/stardark.png b/share/gcstar/icons/stardark.png
new file mode 100644
index 0000000..4c57a41
--- /dev/null
+++ b/share/gcstar/icons/stardark.png
Binary files differ
diff --git a/share/gcstar/icons/stardark_hover.png b/share/gcstar/icons/stardark_hover.png
new file mode 100644
index 0000000..0874b55
--- /dev/null
+++ b/share/gcstar/icons/stardark_hover.png
Binary files differ
diff --git a/share/gcstar/icons/web.ico b/share/gcstar/icons/web.ico
new file mode 100644
index 0000000..9cdd1d9
--- /dev/null
+++ b/share/gcstar/icons/web.ico
Binary files differ
diff --git a/share/gcstar/list_bg/Box/group.png b/share/gcstar/list_bg/Box/group.png
new file mode 100644
index 0000000..ff26ccf
--- /dev/null
+++ b/share/gcstar/list_bg/Box/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Box/list_bg.png b/share/gcstar/list_bg/Box/list_bg.png
new file mode 100644
index 0000000..302ec62
--- /dev/null
+++ b/share/gcstar/list_bg/Box/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Box/style b/share/gcstar/list_bg/Box/style
new file mode 100644
index 0000000..25b9cd4
--- /dev/null
+++ b/share/gcstar/list_bg/Box/style
@@ -0,0 +1,2 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
diff --git a/share/gcstar/list_bg/Brick_and_Glass/group.png b/share/gcstar/list_bg/Brick_and_Glass/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Brick_and_Glass/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Brick_and_Glass/list_bg.png b/share/gcstar/list_bg/Brick_and_Glass/list_bg.png
new file mode 100644
index 0000000..42cc613
--- /dev/null
+++ b/share/gcstar/list_bg/Brick_and_Glass/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Brick_and_Glass/list_fg.png b/share/gcstar/list_bg/Brick_and_Glass/list_fg.png
new file mode 100644
index 0000000..361a825
--- /dev/null
+++ b/share/gcstar/list_bg/Brick_and_Glass/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Brick_and_Glass/style b/share/gcstar/list_bg/Brick_and_Glass/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Brick_and_Glass/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Dark_Glass/group.png b/share/gcstar/list_bg/Dark_Glass/group.png
new file mode 100644
index 0000000..9e634fc
--- /dev/null
+++ b/share/gcstar/list_bg/Dark_Glass/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Dark_Glass/list_bg.png b/share/gcstar/list_bg/Dark_Glass/list_bg.png
new file mode 100644
index 0000000..7b6c933
--- /dev/null
+++ b/share/gcstar/list_bg/Dark_Glass/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Dark_Glass/list_fg.png b/share/gcstar/list_bg/Dark_Glass/list_fg.png
new file mode 100644
index 0000000..3f4b0ec
--- /dev/null
+++ b/share/gcstar/list_bg/Dark_Glass/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Dark_Glass/style b/share/gcstar/list_bg/Dark_Glass/style
new file mode 100644
index 0000000..a15c4b2
--- /dev/null
+++ b/share/gcstar/list_bg/Dark_Glass/style
@@ -0,0 +1,4 @@
+groupStyle="weight='bold' color='#ffffff' size='large'"
+groupAlign="center"
+withReflect=1
+
diff --git a/share/gcstar/list_bg/Glass/group.png b/share/gcstar/list_bg/Glass/group.png
new file mode 100644
index 0000000..bbf095c
--- /dev/null
+++ b/share/gcstar/list_bg/Glass/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Glass/list_bg.png b/share/gcstar/list_bg/Glass/list_bg.png
new file mode 100644
index 0000000..028b75c
--- /dev/null
+++ b/share/gcstar/list_bg/Glass/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Glass/list_fg.png b/share/gcstar/list_bg/Glass/list_fg.png
new file mode 100644
index 0000000..9886f4e
--- /dev/null
+++ b/share/gcstar/list_bg/Glass/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Glass/style b/share/gcstar/list_bg/Glass/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Glass/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Green_Glass/group.png b/share/gcstar/list_bg/Green_Glass/group.png
new file mode 100644
index 0000000..ca4c99a
--- /dev/null
+++ b/share/gcstar/list_bg/Green_Glass/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Green_Glass/list_bg.png b/share/gcstar/list_bg/Green_Glass/list_bg.png
new file mode 100644
index 0000000..12d2b1a
--- /dev/null
+++ b/share/gcstar/list_bg/Green_Glass/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Green_Glass/list_fg.png b/share/gcstar/list_bg/Green_Glass/list_fg.png
new file mode 100644
index 0000000..3da18aa
--- /dev/null
+++ b/share/gcstar/list_bg/Green_Glass/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Green_Glass/style b/share/gcstar/list_bg/Green_Glass/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Green_Glass/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Luxury_Green_Glass/group.png b/share/gcstar/list_bg/Luxury_Green_Glass/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Green_Glass/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Green_Glass/list_bg.png b/share/gcstar/list_bg/Luxury_Green_Glass/list_bg.png
new file mode 100644
index 0000000..9af5e50
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Green_Glass/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Green_Glass/list_fg.png b/share/gcstar/list_bg/Luxury_Green_Glass/list_fg.png
new file mode 100644
index 0000000..f555372
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Green_Glass/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Green_Glass/style b/share/gcstar/list_bg/Luxury_Green_Glass/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Green_Glass/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Luxury_Green_Wood/group.png b/share/gcstar/list_bg/Luxury_Green_Wood/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Green_Wood/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Green_Wood/list_bg.png b/share/gcstar/list_bg/Luxury_Green_Wood/list_bg.png
new file mode 100644
index 0000000..bedb34a
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Green_Wood/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Green_Wood/list_fg.png b/share/gcstar/list_bg/Luxury_Green_Wood/list_fg.png
new file mode 100644
index 0000000..968a418
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Green_Wood/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Green_Wood/style b/share/gcstar/list_bg/Luxury_Green_Wood/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Green_Wood/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Luxury_Grey_Glass/group.png b/share/gcstar/list_bg/Luxury_Grey_Glass/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Grey_Glass/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Grey_Glass/list_bg.png b/share/gcstar/list_bg/Luxury_Grey_Glass/list_bg.png
new file mode 100644
index 0000000..bafb27c
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Grey_Glass/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Grey_Glass/list_fg.png b/share/gcstar/list_bg/Luxury_Grey_Glass/list_fg.png
new file mode 100644
index 0000000..77234f7
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Grey_Glass/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Grey_Glass/style b/share/gcstar/list_bg/Luxury_Grey_Glass/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Grey_Glass/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Luxury_Grey_Wood/group.png b/share/gcstar/list_bg/Luxury_Grey_Wood/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Grey_Wood/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Grey_Wood/list_bg.png b/share/gcstar/list_bg/Luxury_Grey_Wood/list_bg.png
new file mode 100644
index 0000000..14f22c1
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Grey_Wood/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Grey_Wood/list_fg.png b/share/gcstar/list_bg/Luxury_Grey_Wood/list_fg.png
new file mode 100644
index 0000000..968a418
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Grey_Wood/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Grey_Wood/style b/share/gcstar/list_bg/Luxury_Grey_Wood/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Grey_Wood/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Luxury_Purple_Glass/group.png b/share/gcstar/list_bg/Luxury_Purple_Glass/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Purple_Glass/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Purple_Glass/list_bg.png b/share/gcstar/list_bg/Luxury_Purple_Glass/list_bg.png
new file mode 100644
index 0000000..7d8dd4b
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Purple_Glass/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Purple_Glass/list_fg.png b/share/gcstar/list_bg/Luxury_Purple_Glass/list_fg.png
new file mode 100644
index 0000000..85dde3e
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Purple_Glass/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Purple_Glass/style b/share/gcstar/list_bg/Luxury_Purple_Glass/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Purple_Glass/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Luxury_Purple_Wood/group.png b/share/gcstar/list_bg/Luxury_Purple_Wood/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Purple_Wood/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Purple_Wood/list_bg.png b/share/gcstar/list_bg/Luxury_Purple_Wood/list_bg.png
new file mode 100644
index 0000000..8930822
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Purple_Wood/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Purple_Wood/list_fg.png b/share/gcstar/list_bg/Luxury_Purple_Wood/list_fg.png
new file mode 100644
index 0000000..968a418
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Purple_Wood/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Purple_Wood/style b/share/gcstar/list_bg/Luxury_Purple_Wood/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Purple_Wood/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Luxury_Red_Glass/group.png b/share/gcstar/list_bg/Luxury_Red_Glass/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Red_Glass/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Red_Glass/list_bg.png b/share/gcstar/list_bg/Luxury_Red_Glass/list_bg.png
new file mode 100644
index 0000000..8205509
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Red_Glass/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Red_Glass/list_fg.png b/share/gcstar/list_bg/Luxury_Red_Glass/list_fg.png
new file mode 100644
index 0000000..1b3305f
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Red_Glass/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Red_Glass/style b/share/gcstar/list_bg/Luxury_Red_Glass/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Red_Glass/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Luxury_Red_Wood/group.png b/share/gcstar/list_bg/Luxury_Red_Wood/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Red_Wood/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Red_Wood/list_bg.png b/share/gcstar/list_bg/Luxury_Red_Wood/list_bg.png
new file mode 100644
index 0000000..876682b
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Red_Wood/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Red_Wood/list_fg.png b/share/gcstar/list_bg/Luxury_Red_Wood/list_fg.png
new file mode 100644
index 0000000..968a418
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Red_Wood/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Red_Wood/style b/share/gcstar/list_bg/Luxury_Red_Wood/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Red_Wood/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Marble/group.png b/share/gcstar/list_bg/Marble/group.png
new file mode 100644
index 0000000..371a322
--- /dev/null
+++ b/share/gcstar/list_bg/Marble/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Marble/list_bg.png b/share/gcstar/list_bg/Marble/list_bg.png
new file mode 100644
index 0000000..adbb4bc
--- /dev/null
+++ b/share/gcstar/list_bg/Marble/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Marble/style b/share/gcstar/list_bg/Marble/style
new file mode 100644
index 0000000..613426b
--- /dev/null
+++ b/share/gcstar/list_bg/Marble/style
@@ -0,0 +1,2 @@
+groupStyle="weight='bold' color='#ffffff'"
+groupAlign="center"
diff --git a/share/gcstar/list_bg/Wood/group.png b/share/gcstar/list_bg/Wood/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Wood/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Wood/list_bg.png b/share/gcstar/list_bg/Wood/list_bg.png
new file mode 100644
index 0000000..b30737e
--- /dev/null
+++ b/share/gcstar/list_bg/Wood/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Wood/list_fg.png b/share/gcstar/list_bg/Wood/list_fg.png
new file mode 100644
index 0000000..fd1b76f
--- /dev/null
+++ b/share/gcstar/list_bg/Wood/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Wood/style b/share/gcstar/list_bg/Wood/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Wood/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Wood2/group.png b/share/gcstar/list_bg/Wood2/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Wood2/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Wood2/list_bg.png b/share/gcstar/list_bg/Wood2/list_bg.png
new file mode 100644
index 0000000..e89f956
--- /dev/null
+++ b/share/gcstar/list_bg/Wood2/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Wood2/list_fg.png b/share/gcstar/list_bg/Wood2/list_fg.png
new file mode 100644
index 0000000..968a418
--- /dev/null
+++ b/share/gcstar/list_bg/Wood2/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Wood2/style b/share/gcstar/list_bg/Wood2/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Wood2/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Wood_and_Glass/group.png b/share/gcstar/list_bg/Wood_and_Glass/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Wood_and_Glass/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Wood_and_Glass/list_bg.png b/share/gcstar/list_bg/Wood_and_Glass/list_bg.png
new file mode 100644
index 0000000..d3e4135
--- /dev/null
+++ b/share/gcstar/list_bg/Wood_and_Glass/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Wood_and_Glass/list_fg.png b/share/gcstar/list_bg/Wood_and_Glass/list_fg.png
new file mode 100644
index 0000000..62c1c0e
--- /dev/null
+++ b/share/gcstar/list_bg/Wood_and_Glass/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Wood_and_Glass/style b/share/gcstar/list_bg/Wood_and_Glass/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Wood_and_Glass/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/logos/Peri.png b/share/gcstar/logos/Peri.png
new file mode 100644
index 0000000..08f39ff
--- /dev/null
+++ b/share/gcstar/logos/Peri.png
Binary files differ
diff --git a/share/gcstar/logos/Peri_main_logo.png b/share/gcstar/logos/Peri_main_logo.png
new file mode 100644
index 0000000..cb4cd37
--- /dev/null
+++ b/share/gcstar/logos/Peri_main_logo.png
Binary files differ
diff --git a/share/gcstar/logos/Peri_main_logo.svg b/share/gcstar/logos/Peri_main_logo.svg
new file mode 100644
index 0000000..98bff66
--- /dev/null
+++ b/share/gcstar/logos/Peri_main_logo.svg
@@ -0,0 +1,3436 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1"
+ xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;" i:viewOrigin="-192 208" i:rulerOrigin="0 0" i:pageBounds="0 16 16 0"
+ xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" width="401" height="401"
+ viewBox="0 0 401 401" overflow="visible" enable-background="new 0 0 401 401" xml:space="preserve">
+<metadata><?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="3.1.1-111">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about=""
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <dc:format>image/svg+xml</dc:format>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xap="http://ns.adobe.com/xap/1.0/"
+ xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/">
+ <xap:CreatorTool>Adobe Illustrator CS2</xap:CreatorTool>
+ <xap:CreateDate>2005-11-07T17:36:23+01:00</xap:CreateDate>
+ <xap:ModifyDate>2005-11-07T17:36:23+01:00</xap:ModifyDate>
+ <xap:MetadataDate>2005-11-07T17:36:23+01:00</xap:MetadataDate>
+ <xap:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType="Resource">
+ <xapGImg:width>256</xapGImg:width>
+ <xapGImg:height>256</xapGImg:height>
+ <xapGImg:format>JPEG</xapGImg:format>
+ <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX&#xA;Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY&#xA;q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq&#xA;7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX&#xA;Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY&#xA;q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq&#xA;7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqh7q/trUfvXox6KOuThjMuTCeQR5pTdeb&#xA;LWFWchVRASzO1AANyTmVDRyLi5NbCIs8mNJ+Zesaq8sPl3SlmCEKNQuWZIAwbf4BRmBXp8QPtmwP&#xA;ZOPHRyzr+iOfz/Y6X+XsmYkafHf9KWw+Xu8735IqLzL58tyZLu0027jCn9xbvNBIT2o8nqr+GVnS&#xA;aaW0TOJ7zR+6mce0NbHecMch3RMgftsMm0LzDYazFK1sHint24XNpMAs0ZP2eSgsKMBVWBIP0HNd&#xA;qNLLERe4PIjkXcaPXQ1APDYMTRieY/t6HqmeY7mOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux&#xA;V2KuxV2KuxV2KuxV2KuxV2KuxVK/MmvWuh6VJfXDAGoSFD+1Ieg/CuZOl00s0xEOHr9bDTYjOZ93&#xA;veR6h57eaR5KtI7bljsDnUYuzaFPEZ/aGyaBKG0qPUPNuqLp7MYtPipLestd1B2Wvie339sszGGl&#xA;hxc5HYNGlnl1+TgPpxjc/j7vnvT0GGxW4g+oaaPqWmQ1jM0XwsxH2hGRSnu3jnnuo7WzZsp8I1EH&#xA;eZF2f6IO1DvO3k+mabsfDhxAZBzG0QTGh5kb2fLf4oW+/LvRrkGRJriC9G6XiSfvA3if5sydL2rq&#xA;cR3mZx6xkI19gFfBxtZ2HpMw2gIT6SiTxfaTfxvypjOl61qPl3zIkerOBc2DLFcXhUkT2ErAMxoC&#xA;x47OKb1WnjXrjjhqsHFj5S6fzZj8V7jbxPjz0GrEcvONDir6sZP6Nj13BHffaM5V712KuxV2KuxV&#xA;2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvGPzo18za5BpMbfu7GMPKoP+&#xA;7Zhy3HsnGnzzrewdNWMzP8R+wfteC9qtTx5hiHKA395/Z97zpZSzgHp1PyG+b6nljGg9N8oINM8m&#xA;vdqON1qUh+PvxFQPwBIzz3207QOLGaO/0j48/sfSvYfs+M6JHO5H3R2A917shh83+XtO02EXMptl&#xA;QLHRkZqtT/IDddznK9hXqyMOEeqMbPu7/mXre2sw0cTmzH0mVD393fyT2w1Gyv7dZ7SZJonFQyEH&#xA;M3N+7ySxy+qPNpw5BkxjJH6ZcmG/mRp8ck8NyF/efUrn1H/yYZIWX8XP351Hs3qDUo9OKP2iX6nj&#xA;va3TxlR6+HPf+rKBH3/a9L02e4uNOtZ7mL0biaGOSaH+R2UFl38DtmvyxEZkA2AS9Dp5yljjKQqR&#xA;AJHca5IjK212KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KtO6ojO5C&#xA;ooJZj0AG5OEC0E1u+XNf1V9W1u+1Jq/6VM8ig9QhPwL/ALFaDPRtNh8LHGHcHybV6g5sssh/iN/q&#xA;+SBU0OXFxi9WtSZPK+kRp9n0yT81AH8c8k9u8Z4b7sn3gvrvsPlAiB/Q+4pT5g8v3mo2sUdsV5rJ&#xA;yYOaClCK9D0zR+x/buDs7LklmupQ2rfcHl8XZ+13ZObtDDCGIi4zvfYVVfYr6hY6pp+kWlppBkF0&#xA;0kUAmj5AqN2ZyV6KSvxdqZd2H2jg1HaWXV6ogQEZzo/ACI7zR28w4vbOmzYOz8el01mRlCFj5mRr&#xA;kLHq6USm3mWa51K1j02oN7dNFp1vJQULXEqSu78asPTW3XlQdGzpPY7LOWOWeYqNmXwiCPtMiB/V&#xA;LofauEZyjghvM8MfK5SjI312EAT5SD1XF3bzfzh+Zk0eoPpGiV5owilvEAdzJWhSFSGHX4SSD3oO&#xA;hzf6LskGHiZPl5ef4/U8d2r7RmOU4cPPkZDc33RH2X76HVDQ+SvNWpQpc3kEbNSoXUJmknp17rNT&#xA;5Mw+jJy1+HGaiT/mih+j7lh2VqMsRKcYn+vK5fdL7/ku8u65qOka1Dp83qpG00dncafIaiMyMEQx&#xA;ipVOJcN8Hwsvj8JA1OnjlxmQrkZCXf7+/wCO4PxDPR6yWDKIGwOIQMD0vYUOQ5g+naQ79iyzzP5s&#xA;XTJVsbQLJfsA8hepSJD0JpTkzU2WvuewbWaXR8Y4pfT9/wCz+zvrda7tDw5cEfr5nuA/ST3fE9BK&#xA;PW2la5r0AuHQXcRIkimv3KxMenKJAknHYVqsYU9szZ5ceE1fD/V5/HcfaSXWwwZNRHirjHMGZ2Pn&#xA;HY18IiJuwtaK/wBDulhVRYXQHqxmLe3l7MSBwEigtRgwDCtfhqrY3HKL+qPLfmP1fd79wnhlhlwg&#xA;eHPnt9J7+7iHQ3RHP03Esi1HzUDa2qWY4XN1Ck0pND9XSRAwBBBBkPLYEU7nsGwoaSieLkDXv/Z+&#xA;PdssmvuMeAbyFn+jY/3Xl8T0BDaMusXazPZ3TILUiJWuJJJQ7lQWBDFuiOCGNfi7EDeeYwjXEPq7&#xA;gB+N+nc16cZJXwH6dtyTffz8jz336HqKvrrU7GGG0kuaXNzI8rSKOfCCPiCiuw+0zMOq9CwHQHK4&#xA;RhK5VsNvietfjpfc25Z5IVHi3kb7/SK2vzNdOXFXIEGXl+WaXS0klkeVi8oDyijcVkZR2FRQbHuP&#xA;HrlOoAE9hXL7nJ0kiYWSTuefvP4B6jv5oq51CwtCourmKAtuoldUrTw5EZXDHKX0gltyZoQ+oge8&#xA;qokjMfqBh6dOXOo48aVrXwyNG6Z2KvopWmoWF4HNncxXIjPGQwusnFvA8SaHJTxSh9QI97Xiz48l&#xA;8EhKudG189xb28RluJUhiX7UkjBVHzJoMEYmRoCyznOMRcjQ82re6tblDJbTJOgJBeNg4qOoqpOM&#xA;oSiaIpEMkZi4kEeSrkWbsVdirsVdirsVdirsVQ93qNlaD/SJlj9jufuGWQxSlyDXkzRhzLBvPH5h&#xA;6L+gtQ060lJvbmFoUJA4gP8AC9SCSPgJptm47P7MyeLGch6Qbec7X7bweDPHE3OQr58/seGkUNK1&#xA;9xnZPCB2Ks78qas1xopsI6Ne2T+vbRM3ESDcMlfEqxpXYGhzmO3uy46mEoS2jMVfceh+Br3iw9H2&#xA;D2nPARw7zgeIC64gfqH2nyBo9GVabqek3cXKOdEkX+9gkISWMjqroTUEHPEtf2DrNLMxnjke6UQT&#xA;GXmCP7e8B9U0nben1MOKEx5xO0h5EfgdyH1TzXpFkpit5Y7m73HFWBRKdWlZa0A8B8R7DNp2L7H6&#xA;vVzByRliw9TIUT5RB533/T59HVdq+0+m00ajITydwOw/rEcq7vq7gmX5d6FdX14nma/UrCiuNLVi&#xA;Q7tJVZrl1BoOQ+BB/L7KpPpWsOPTYhpsWwFX5Aco/pJ79+ZLzPZGnyZ8v5vL1vh875yI8+QHSNDl&#xA;GJZB+YeuvovlO8uYn9O5lAt7dgSrB5TQlSNwypyYfLMfszT+LniDyG5+Dse29WcGmkQakfSPee7z&#xA;As/BgX5L6Lb3t/davOhb6hxjtQfs+pIDybr1VRQV/m8Rm67ezmERjH8XP3D8fY8x7K6CMskssv4P&#xA;p95u/kPvZh+Y3nm88rWtr9UsxPNdlgs0vL0U4U2IWhJNdhUZquy+z46mR4jQj83oe2u1J6SMeCNm&#xA;XU8h+PexDyt+Z8mp+ZYpNX0qxBWGZzfwREXESwwvKSGdnJHFSKCnX6M2us7IGPCRjnLmNidjZA8n&#xA;R6HtzxNQJZYY9oy9Qj6hQJ52el7Ma8qWsvm/z7HJqR9VJ5Xu7xa1BSMchHRj9ivFKdlzYa2Y0ulq&#xA;G1Ch+v39fe6zs/GdZrAcm9kyl8Om/TkPc+hQAAABQDYAZwr6UoXmn2F6qpeW0VyqHkizIsgVvEBg&#xA;aHJwyyh9JI9zVlwY8gqcRKu8W8S8za5q9t57v9M0qVb1ZboJDE4X++m4lo+Q4n4ZGKbntnXaXTY5&#xA;aaM5jhqP2Dr8t3hNbq8sNXKGM8dy2G3M9OnI7c0XrusS6f5gTy40X6UnVowUHFIvrk6qKRqeVRx4&#xA;KC5qDy6A0yrT6cTxeKDwDf38I7/t5eXc26vUyx5/BI8WW3kOMjoN/Ib7g8XQ0muo+Y7MeYn0OCcz&#xA;X9ssGmWs0nNlmlRaVcitG9aRg59sxYaSRxDIRUDcj5Dy+A2c2eujHMcINziIwiT/ABEd/ceIkSR9&#xA;7qGmT6udJgeO5ayKafZWpf1JPgUI9VapB5cg7fyrU7DKI4piHGbHF6ieQ/Hd5lyp5sRyeGKlw+iI&#xA;uztsdvfdnuFlM7jSpdGhiLNDS4ehhgj4cGKlmJNfjFRTlxHbbMYZBlJ57d5/Ffa5ngHAB9PqPKIq&#xA;up9/voLtP0ebUfUuoFgtgjlUuJIfVaRgPiICtHQK21eVSQRQdSJ5RCgbPldV9/4pceCWQmURGNdS&#xA;Lv5Ecvf0IobFbp1298+mSRMsU8zxyI4HMKvH1ZUBIGzxKy1p3xnj4DMHcC/1D5GijFlOWOOQ2lLh&#xA;Pf8A0iPjGxa4XhKRXj85JpCBc3EaB5o0NeXpo3KgVv2ACeuzN1HBuY8h0HT4/r+0BkclRE9yepA3&#xA;A60PL+bv7ieZlaxNdXUbQ3UVwkTI5masd3Gla8HQKK8ypG/Hbsab1SPCNwRfxifj5fH3uRjBlLYg&#xA;1XlIDuI86/o7dNtz7MRz3Yq7FXYq7FXYq7FXYq811P8ALzzdq+tXJvNVig0p5HZGj5PIUYnivCiC&#xA;tOvxU8K50GHtPBixjhgTOvg8lqOxNVqMsvEyAYiTy7vdt8d2CfmP5Z0jy5qVrYWM8887Q+tcvOyE&#xA;DkxVAoVVp9kk19s3XZeryZ4GUgALoU6Htjs/FpcghAyJqzdfo/HJiObR1DgK4q9F8ofl5puvaEL/&#xA;AErWXi1iE/v4XjCrG9DxQhW5cWPSQHpX4a1A0Ot7TnhycM4XjP2/ju+16LQdi49Vh48eSso5ju7u&#xA;W+/877L2Ai+/K/ztdXCR3MdhOxHxXwdl8B8Xwq5/4E5DH2vp4iwZjy/H605vZ3WTkATA/wBL9e2/&#xA;yT7yx+T1taSxXWuTJdvG3IWMIP1eoJp6jOA0g6GlFHY8hmDq+3DIGOMcPmefw7vt+DsuzvZaGOQn&#xA;mPHIdP4fj3/Z8Q9HVVVQqgKqigA2AAzQEvWgUxL80tCu9Y8pTR2aNLc2siXKQoKs4SqsAPHi5NBu&#xA;aUzadj6iOLODLYEU6Tt/Ryz6aoi5RPFXfzH3G3l35d/mCnlY3FvdWz3FldMrsYyokjZQQSAaBqim&#xA;xYdM6PtTsz8zRiakPteU7G7Y/KXGQ4oS7uY/X80x83/mTe+bLb9BaPpsghuGBYf3s8vAh1Cog+Gh&#xA;Wp3P0ZRoeyo6Y+LkluPgA5PaXbc9WPBxQPCfjI1vyHL7fgyjyZ+Vp03Rr9tRZRq+pWstsKfGtsky&#xA;FSNjRm3+Ij5A9Sddr+2PEyR4PohIH+tTtuzuwTjwz4z+9yQMe/hsfae/5Dz5noOq6l5L80+tc2h+&#xA;sWvOG5tHPAsrDs1G9mBHX5Z0Gpww1eGgdjuC8tpNRk0OouUfVGwY/t399/oZxqv55l7Yx6TppS5c&#xA;UWa4cMqmvZEHxf8ABDNPh9nqNzlt5O+1HtV6f3cKPfLp8P2pt+Xmnec4Gv8AzD5jurgrNC3pafO7&#xA;VJqJPUMdeMVOPFV413OwHXG7Ty6eXDixAbH6h8qvr5uZ2Nh1UTLNnlKiNon53X8PcBXyHOE/ltBJ&#xA;e+Z7zzLqBL22lRzahey8QeUrKxG23xfacf6ubftWQhhGGHOdRHu/G3xdD2LEzzyzz+nGDOR89/t5&#xA;n4LPIvqah5q1DzPfRepDpkdxqt0qr8JlozIik7K3Illr/Lku0ahgjhid5mMB7vxsfex7KvJqJZ5i&#xA;xASyHbrz+Bvce5f+W6Tza5qfmm8Vp10i2uL6Z9vjndWIU17sObV8Rke1SBjjhjtxyEfh+KZdignN&#xA;PUS9XhxlM+ZN/fufgmX5NaVPqPmS9166rJ9WVqTMTU3FwTVvA/Bzr8xmP27mGPDHFHr9w/bXycr2&#xA;b08suolmlvw9f6Uvv2u/eF35z6nez+ZtO0y15creENEI6iQzXD0oKbnaNaYOwcMRhlOXU/YP7Sn2&#xA;mzSlqIQj/CNq53I/sDOvMJk8sflxcpCec9rarAZlJUmWYiJ5q7nlzkL/ADzTaWtRqxfIyv4DevkK&#xA;d/rb0mgIHMRq+W8tjL32eL3sA8m+aNX0jQrzzNfRy6nBDJHp9rFyCKpcc5HdgrUA4ooJB3NM3eu0&#xA;WPJlGGNQJHEf0V9rz3Zuvy4cMs87yCJEBv37knn/AEdz3+aeXX5leRr3RZr545bXWnQk2sAZZTLx&#xA;4KTMF9JwNqGSuw+z2zDj2TqI5BHaWPvPKvdzHw+bn5O3NLLEZ0Y5T0Gxvl9VcJ+N7fw9Eh/LOXzF&#xA;ea4+v3tzcSaVpUM73Mjs7K3KPeJF6E9HoPAe2Zva0cMMfhREROZFfPmfu+Pvdd2JLNPN485SOPGJ&#xA;XzPTkPsNeQ8nq2geY4tXe4iELQTWwjd0YOBwm5cPtpGa/AeW1Ae5zmtTpTiAN2Df2e4l6/R64ZyR&#xA;VSjR68jdcwO7fuO1lN8xXOdirsVdirsVdirsVdir53/NGK9TzvqEl0pAmKPbvQhWiEaqhXxpxofc&#xA;HO77HMTpoiPTn77fNO3YyGrmZda+VCv1e8MUzZuoegflV5LsteGp3GoIWto41ggYEgiVzyLKR3QK&#xA;P+CzR9s6+WHhEOfP4fj7nouwuyoakTOQemqHv538P0s58q+Q59D11LyOqRKrxysrikiFdgRUmnKh&#xA;+jNNrO0hmxcJ5u97O7E/LZhOPmOfMf20WdZpno3Yq7FXYqlF95R8r38xnu9LtpZ2JZ5TGodiepZg&#xA;AW+nMrHrc0BUZyA97h5eztPkNyhEn3IvTtG0jTQw0+ygtOYAf0I0jLU6cioFfpyrLnyZPrkZe8tu&#xA;HS4sX0RjG+4AIzKm9BaloejanT9I2MF2VBVGmjV2UHrxYiq/Rl2LUZMf0SMfcWjNpcWX64xl7xan&#xA;p3lvy/prrJYabbW0qghZo4kElD1+OnL8cll1WXIKlKRHvYYdFhxG4QjE99C/mmDKrqVYBlYUZTuC&#xA;D2OY4NOSRaGsNJ0vT7Y21jaRW1uxJeKJFVWJFCWAG5p45bkzTmbkSS1YdPjxx4YRER5BbbaNpFtb&#xA;S2ttY28FrOCJ4I4kSNww4nmqgBqjbfGWfJIiRkSR1tENNihExjGIieYAFH3utdF0i0sXsLayhhsp&#xA;QRLbpGqo4ZeLc1A+Lkooa9cZ58kpcRkTIdbXHpsUIGEYgRPMVsfev0/TdP062FrYW8dtbqSRFEoU&#xA;VPU7d8GXLLIeKRsssOCGKPDACI8lkujaTNfpqE1lBJfRgCO5eNWkUKajixFRTDHPMR4BI8PdezGW&#xA;mxymJmIMx1rdEXNtbXUD29zEk8EgpJFIodGHgVaoOQhMxNg0W2cIzHDIWD0Kkmmaalj9QS0hWwoV&#xA;+qCNBDRjUj06caEmvTJHNMy4rPF33v8ANgMGMQ4BEcHdW3ySqPyF5NjnM66Pal26howyd+iNVB18&#xA;MyT2lqCK45fjzcOPZGlEuLw437tvlyTuGCCGFIIY1jhRQqRIAqqo2ACjYDMOUiTZO7nxgIgRAoDo&#xA;pWWnafYRtHZW0VrG7cmSFFQFvEhQMnkyymbkSfe14dPjxCoRER5CkRlbc7FXYq7FXYq7FXE03OKp&#xA;B5k81WOl2ch5gyUIr2H9uZul0cskg67XdoY8ECSXjWp+ehfztBqNjFqGnBiY4ZCUljJ6mKZPiQtt&#xA;Ubr7Z1uLs7gFwkYz+w+8dfveEydrnLI+JATx9AeY90hyvrzCWPH5JkCsk+pWrH7cRhguQPk/q29f&#xA;+BzIB1A5iB+JH2VL73GlHTECjkj3+mMvt4ofc938h6JZaR5atobQShLkfWm9cKsvKVQfjC1AIUAU&#xA;zi+0dRLLmJlW223LZ9D7J0sMOCIjfq9W/PfvZBmC7J2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux&#xA;V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVbNH6kTx1K8gRyHUVwxNG0SFimLy/l3pV5di41Sea9VTVb&#xA;Yn04q+LBfiP/AAWbGPak4RqAEfPq6fJ2JiyzEsplOunKP6/tYZ+Z/k7yjYg6hDN+jbhgF+pworJI&#xA;wG3COqcfc1p7Vrm37I12efoI4x3np8XSdvdm6bH64ngl/NA2PuG1efTyY9+XXkC58wX8d5eRMmiw&#xA;Nyldqr6xU/3aHwqPiI6fPM7tTtIYI8MT+8P2ef6nW9jdjy1MhKY/dDn5+Q/T+t79nEPozsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVSnV/Kfl3WLu&#xA;C81KxS5uLcUidy1KA8qMoIVxXswOZWDW5cUTGEqBcHU9m4M8xPJHilH8b948imkUUUMSRRIscUah&#xA;Y41AVVVRQAAbAAZjEkmzzcyMREAAUAuwMnYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq&#xA;7FXYq7FXYq7FXYq7FXYqhX1SzQkc+RHgCcmMZYHIFP8AS9t2Vz9A/rh8Mo8UO/SsR6I34Y+GV8QL&#xA;hqSH9g/fg4F8RcNQQ/sHHgTxrxexnsfwwcKeJcLmI+IwcKeJUV1boa4KS3irsVdirsVdirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVU3t4JDV41Y+JArhEigxCmdPsz/uofQSP1HD&#xA;xlHAGv0dadkP3nDxlHAG/wBH247H78HGV4A2LKAdj9+PEU8AXC1hH7P4nHiKeELhDEOi4LWl4AHQ&#xA;UwJdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd&#xA;irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd&#xA;irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdir/9k=</xapGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xap:Thumbnails>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/">
+ <xapMM:DocumentID>uuid:0D242DA2AC4FDA11B312AE4ADC8A7260</xapMM:DocumentID>
+ <xapMM:InstanceID>uuid:0E242DA2AC4FDA11B312AE4ADC8A7260</xapMM:InstanceID>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end="w"?>
+ </metadata>
+<switch>
+ <foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
+ <i:pgfRef xlink:href="#adobe_illustrator_pgf">
+ </i:pgfRef>
+ </foreignObject>
+ <g i:extraneous="self">
+ <g id="Calque_1" i:layer="yes" i:editable="no" i:dimmedPercent="50" i:rgbTrio="#4F008000FFFF">
+ <rect x="0.5" y="0.5" fill="none" stroke="#FFFFFF" width="400" height="400"/>
+ </g>
+ <g id="logo_x5F_GCfilms" i:layer="yes" i:editable="no" i:dimmedPercent="50" i:rgbTrio="#FFFF4F004F00">
+ <g>
+
+ <linearGradient id="XMLID_84_" gradientUnits="userSpaceOnUse" x1="464.9299" y1="-455.522" x2="289.7179" y2="-477.1064" gradientTransform="matrix(1 0.0046 0.0046 -1 -289.3605 -205.7951)">
+ <stop offset="0.0056" style="stop-color:#FFFFFF"/>
+ <stop offset="0.3072" style="stop-color:#ECF2F9"/>
+ <stop offset="0.9175" style="stop-color:#BAD2EA"/>
+ <stop offset="1" style="stop-color:#B3CDE8"/>
+ <a:midPointStop offset="0.0056" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.3072" style="stop-color:#ECF2F9"/>
+ <a:midPointStop offset="0.5" style="stop-color:#ECF2F9"/>
+ <a:midPointStop offset="0.9175" style="stop-color:#BAD2EA"/>
+ <a:midPointStop offset="0.5" style="stop-color:#BAD2EA"/>
+ <a:midPointStop offset="1" style="stop-color:#B3CDE8"/>
+ </linearGradient>
+ <path fill="url(#XMLID_84_)" d="M132.352,262.551c-0.012,2.467-21.148,4.367-47.21,4.246
+ c-26.062-0.119-47.18-2.217-47.168-4.684c0.011-2.465,21.148-4.367,47.209-4.246
+ C111.244,257.986,132.363,260.085,132.352,262.551z"/>
+ <g>
+ <path i:knockout="Off" fill="#FFFFFF" d="M382.129,194.818c-0.992-0.993-2.266-1.519-3.683-1.519
+ c-1.016,0-1.948,0.281-2.759,0.803c0.052-0.266,0.105-0.531,0.138-0.805c0.443-3.673-0.979-6.05-2.966-7.64
+ c0.496-0.16,1.005-0.387,1.528-0.697c2.944-1.732,4.224-5.028,3.029-7.834c-1.1-2.572-3.624-3.624-4.839-4.127
+ c-6.059-2.543-12.757-2.287-18.363,0.707c-1.276,0.684-2.379,1.47-3.321,2.341c-0.437-0.839-1.059-1.624-1.913-2.322
+ l-0.15-0.151c-0.003-0.001-0.246-0.175-0.246-0.175c-3.16-2.265-7.138-2.194-9.854-1.945c-1.664,0.154-3.25,0.48-4.724,0.972
+ c0.006-0.001-0.263,0.088-0.263,0.088c-0.935,0.314-1.729,0.576-2.373,0.6c-0.152-0.062-0.398-0.181-0.577-0.267
+ c-0.349-0.168-0.782-0.379-1.283-0.567c-1.665-0.637-3.439-1.031-5.246-1.159c-1.841-0.127-3.566,0.015-5.144,0.425
+ c-0.665,0.171-1.284,0.387-1.785,0.561c-0.64,0.22-1.181,0.407-1.568,0.444c-0.457,0.044-1.206-0.069-1.932-0.18
+ c-1.948-0.291-4.549-0.655-7.141,0.711c0.2-0.6,0.337-1.019,0.335-1.016l0.002-0.008c0.396-1.18,1.129-3.378,0.407-5.71
+ c-0.903-2.919-3.816-4.531-7.25-4.008c-1.454,0.22-3.237,0.865-4.82,2.506c-0.434-0.769-1.052-1.444-1.854-1.976
+ c-1.959-1.303-4.627-1.34-7.063-0.147c-2.898-2.799-8.086-1.713-8.138-1.701c-2.988,0.662-5.713,2.35-8.115,5.016
+ c-0.836,0.927-1.536,1.924-2.151,2.802c-0.299,0.423-0.585,0.819-0.864,1.195c-0.86-3.145-3.153-5.964-6.404-7.795l0.002,0.002
+ c-4.699-2.65-10.969-3.066-17.653-1.173c-4.856,1.378-9.38,4.144-13.091,8c-1.12,1.165-2.144,2.423-3.085,3.743
+ c-0.002-0.98-0.152-2.006-0.48-3.051c-0.946-2.998-3.185-5.618-6.307-7.38c-4.703-2.646-10.971-3.06-17.649-1.168
+ c-9.6,2.723-17.588,10.789-20.851,21.051c-2.234,7.024-1.416,13.599,2.244,18.038c4.392,5.332,11.449,5.824,15.265,5.642
+ c5.93-0.277,11.632-2.402,16.484-6.139c1.841-1.416,4.039-3.252,5.949-5.485c0.56,2.188,1.534,4.166,2.911,5.837
+ c4.391,5.33,11.446,5.825,15.266,5.646c5.89-0.281,11.556-2.375,16.385-6.059c0.637-0.487,1.499-1.147,2.36-1.97
+ c-0.337,2.125-0.206,4.698,1.823,6.607c1.183,1.111,2.753,1.69,4.426,1.623c2.536-0.102,4.772-1.61,6.026-2.989
+ c0.316-0.349,0.593-0.714,0.855-1.084c0.617,1.684,1.92,2.989,3.636,3.568c2.76,0.941,5.786-0.19,7.426-1.637
+ c0.429-0.378,0.796-0.783,1.14-1.193c0.116,0.24,0.249,0.483,0.407,0.719c0.908,1.373,2.34,2.279,4.027,2.543
+ c2.508,0.39,4.961-0.719,6.298-1.791c0.622-0.492,1.145-1.053,1.597-1.633c0.674,1.559,1.854,2.396,2.757,2.831
+ c3.46,1.656,7.563,0.003,9.964-4.022c0.727-1.216,1.135-2.466,1.46-3.472c0.002-0.009,0.141-0.422,0.141-0.422
+ c-0.005,0.016,1.434-4.307,1.434-4.307c0.164-0.49,0.341-1.033,0.531-1.648c0.515-1.621,1.045-3.305,1.785-4.614
+ c0.723-1.282,2.437-2.394,3.775-2.177c-0.114,0.588-0.373,1.314-0.629,2.022c-0.123,0.34-0.265,0.735-0.399,1.135l0.073,0.012
+ c-0.286,0.646-0.531,1.366-0.782,2.124l-0.702,2.114c-0.003,0.013-0.221,0.677-0.221,0.677c-0.317,0.979-0.69,2.13-1.027,3.272
+ l-0.149,0.505v0.02c-0.459,1.639-0.995,4.134,0.349,6.506c0.843,1.488,2.236,2.495,3.928,2.844
+ c2.467,0.51,4.897-0.49,6.347-1.596c2.698-2.045,3.688-5.325,4.344-7.496c-0.002,0.002,0.119-0.398,0.119-0.398
+ c0.435-1.424,0.908-2.881,1.368-4.291l0.063-0.193c0.004-0.012,1.063-3.304,1.063-3.304c0.538-1.708,1.132-2.983,2.305-3.718
+ c0.512-0.322,1.243-0.559,1.801-0.536c-0.045,0.328-0.153,0.847-0.41,1.658c0.004-0.003-0.041,0.135-0.041,0.135
+ c-0.714,2.261-1.524,4.826-2.377,7.265c-1.499,4.281-1.449,7.458,0.155,9.712c1.164,1.637,3.003,2.533,5.177,2.521
+ c2.955-0.005,4.942-1.676,6.289-3.574c0.764,0.866,1.649,1.558,2.496,2.029c4.323,2.388,10.096,2.638,17.16,0.747
+ c3.296-0.879,6.737-2.86,9.002-5.737c0.144,1.13,0.633,2.182,1.455,3.004c0.986,0.986,2.284,1.529,3.654,1.529
+ c1.377,0,2.687-0.544,3.687-1.532c0.964-0.95,1.495-2.247,1.495-3.65C383.628,197.085,383.096,195.784,382.129,194.818z"/>
+ <path i:knockout="Off" fill="#FFFFFF" d="M137.419,202.284c0.012,0.025,0.019,0.053,0.031,0.078
+ c0.008,0.016,0.021,0.031,0.029,0.051L137.419,202.284z"/>
+ <path i:knockout="Off" fill="#FFFFFF" d="M172.476,136.879l-0.01-0.01l-0.007-0.009c-0.003-0.001-0.012-0.013-0.018-0.017
+ c-0.307-0.407-0.639-0.819-1.039-1.286c-2.015-2.348-4.362-4.217-6.967-5.568l0.067,0.035l-0.207-0.126
+ c-0.005-0.002-0.032-0.014-0.066-0.029c-0.063-0.038-0.129-0.077-0.226-0.127c-0.187-0.098-0.359-0.178-0.497-0.244
+ c-0.061-0.027-0.116-0.054-0.158-0.075l-0.013-0.006c-0.125-0.06-0.138-0.066-0.138-0.066l-0.1-0.049
+ c-0.093-0.049-0.246-0.132-0.441-0.217l-0.078-0.034c-0.116-0.046-0.195-0.076-0.195-0.076l-0.034-0.013
+ c-1.978-0.85-4.147-1.408-6.378-1.627c-2.538-0.282-5.249-0.133-8.012,0.451c-0.076,0.016-0.371,0.078-0.371,0.078
+ c-0.114,0.023-0.262,0.062-0.387,0.088l-1.649-0.15l-0.247-0.039c-1.03-0.165-2.025-0.29-2.958-0.369
+ c-13.499-1.652-31.593,1.844-40.393,27.953c-0.722,2.144-2.493,7.979-4.733,15.367l-2.848,9.363
+ c-9.089,0.619-15.507,2.667-19.093,6.104c-1.508,1.314-2.433,3.182-2.534,5.167c-0.028,0.561,0.034,1.132,0.149,1.723
+ c0.405,3.66,3.474,6.563,7.207,6.778c2.252,0.132,4.439-0.712,6.002-2.313l0.079-0.064c-0.068,0.072-0.112,0.105-0.113,0.106
+ c0.267-0.199,1.246-0.629,3.218-1.06c-0.076,0.244-0.338,1.074-0.338,1.074l-1.156,3.656l-0.056-0.111
+ c0.005-0.016-2.783,8.315-2.783,8.315l-0.299,0.893l-0.09,0.271c0.017-0.047-0.049,0.142-0.049,0.142l-0.596,1.711l0.015,0.023
+ c-0.514,1.5-0.709,1.998-0.781,2.159c-0.521,1.124-1.351,2.135-2.405,2.926c-1.049,0.763-2.435,1.394-4.193,1.899l-0.563,0.155
+ c-1.674,0.457-4.205,1.144-5.874,3.504c-1.94,2.755-1.774,6.442,0.397,8.966c1.95,2.276,5.118,3.228,8.473,2.543
+ c2.214-0.45,4.518-1.197,6.846-2.226c0.004,0,0.222-0.099,0.222-0.099c0.842-0.371,1.734-0.77,2.623-1.252
+ c0.404,0.377,0.825,0.734,1.264,1.075c-0.85,1.118-1.378,2.436-1.519,3.831c-0.204,2.029,0.392,4.006,1.675,5.571
+ c1.268,1.545,3.057,2.504,5.038,2.696c1.297,0.134,2.624-0.084,3.823-0.634l-0.02,0.04c4.696-2.093,8.683-4.902,11.849-8.358
+ c1.53-1.721,2.89-3.618,4.083-5.681l-0.048-0.035c0.219-0.309,0.422-0.62,0.596-0.943c1.171-2.165,2.154-4.488,2.921-6.9
+ l0.324-1.018l0.056-0.021c0.118-0.034,0.683-1.813,0.683-1.813l0.023-0.075l2.144-6.741l0.006,0.004
+ c0.004,0,1.072-3.381,1.072-3.381c0.032-0.1,0.065-0.194,0.097-0.293c0.198,0.256,0.36,0.483,0.522,0.715
+ c0.359,0.515,0.766,1.097,1.452,1.761c2.832,2.741,6.75,3.37,9.785,1.594l-0.042,0.029c0.031-0.016,0.051-0.031,0.081-0.049
+ c0.013-0.009,0.028-0.013,0.042-0.02l0.382-0.231l0.094-0.095c0.011-0.006,0.028-0.018,0.036-0.023
+ c0.205-0.137,0.456-0.304,0.737-0.555c2.534-2.259,3.174-5.932,1.611-9.156c-0.468-1.027-1.11-1.945-1.919-2.729
+ c-0.076-0.076-0.146-0.129-0.221-0.195c-0.31-0.36-0.632-0.732-0.984-1.124c-0.45-0.516-1.005-1.139-1.64-1.819
+ c0.083,0.007,0.167,0.021,0.25,0.031c0.639,0.363,1.265,0.697,1.89,0.981c2.786,1.269,5.753,1.987,8.823,2.14
+ c0.046,0.002,0.138,0.006,0.138,0.006l0.206,0.011c0.12,0.008,0.29,0.011,0.44,0.014c4.102,0.101,8.095-0.795,11.998-2.663
+ c0.223-0.104,0.423-0.218,0.569-0.3c0.052-0.03,0.108-0.061,0.135-0.075c0.523-0.26,1.099-0.568,1.66-0.891
+ c8.19-4.73,14.806-13.263,18.146-23.411c4.192-12.732,2.521-26.267-4.359-35.322L172.476,136.879z"/>
+ <path i:knockout="Off" fill="#FFFFFF" d="M75.22,186.231c0.019-0.02,0.042-0.035,0.062-0.052
+ c0.056-0.048,0.106-0.102,0.164-0.151L75.22,186.231z"/>
+ </g>
+ <g i:knockout="Off">
+ <path i:knockout="Off" fill-rule="evenodd" clip-rule="evenodd" fill="#1C86EE" d="M378.447,194.799
+ c-1.01,0-1.897,0.374-2.583,1.07c-0.707,0.716-1.09,1.645-1.09,2.612c0,0.979,0.373,1.887,1.079,2.593
+ c0.707,0.707,1.625,1.09,2.594,1.09s1.907-0.383,2.633-1.1c0.686-0.676,1.049-1.574,1.049-2.583
+ c0-0.999-0.363-1.907-1.06-2.603C380.364,195.173,379.455,194.799,378.447,194.799z M378.456,195.465
+ c0.827,0,1.563,0.313,2.139,0.888c0.565,0.565,0.867,1.312,0.867,2.128c0,0.828-0.292,1.554-0.857,2.108
+ c-0.595,0.586-1.361,0.898-2.148,0.898c-0.797,0-1.544-0.313-2.118-0.889c-0.576-0.574-0.898-1.331-0.898-2.118
+ c0-0.796,0.322-1.553,0.898-2.138C376.903,195.768,377.628,195.465,378.456,195.465z"/>
+ <path i:knockout="Off" fill-rule="evenodd" clip-rule="evenodd" fill="#1C86EE" d="M378.408,197.87
+ c-0.208-0.38-0.563-0.531-0.975-0.531c-0.6,0-1.076,0.424-1.076,1.142c0,0.73,0.448,1.143,1.097,1.143
+ c0.416,0,0.771-0.229,0.967-0.576l-0.457-0.232c-0.102,0.245-0.258,0.318-0.453,0.318c-0.338,0-0.494-0.282-0.494-0.653
+ c0-0.371,0.132-0.652,0.494-0.652c0.098,0,0.294,0.053,0.408,0.297L378.408,197.87z"/>
+ <path i:knockout="Off" fill-rule="evenodd" clip-rule="evenodd" fill="#1C86EE" d="M380.533,197.87
+ c-0.209-0.38-0.563-0.531-0.976-0.531c-0.6,0-1.076,0.424-1.076,1.142c0,0.73,0.448,1.143,1.097,1.143
+ c0.417,0,0.771-0.229,0.967-0.576l-0.456-0.232c-0.103,0.245-0.258,0.318-0.453,0.318c-0.338,0-0.494-0.282-0.494-0.653
+ c0-0.371,0.131-0.652,0.494-0.652c0.098,0,0.293,0.053,0.408,0.297L380.533,197.87z"/>
+ </g>
+ <g>
+
+ <linearGradient id="XMLID_85_" gradientUnits="userSpaceOnUse" x1="82.4421" y1="213.8887" x2="91.0083" y2="222.7718" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.548" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_85_)" d="M97.208,231.683c3.602,1.103,7.555,0.707,10.867-1.08
+ c1.632-0.882,3.25-2.056,4.142-3.703c1.081-2,1.966-4.106,2.653-6.271c-4.832,1.115-9.986,0.685-14.652-0.941
+ c-4.633-1.616-9.5-4.569-11.809-9.063c-0.321,0.947-1.531,4.669-1.945,5.562c-0.792,1.71-2.017,3.176-3.524,4.308
+ c-1.608,1.17-3.471,1.94-5.377,2.486c-1.624,0.465-3.423,0.787-4.465,2.261c-0.957,1.36-0.906,3.219,0.186,4.487
+ c1.236,1.442,3.21,1.708,4.981,1.346c2.086-0.423,4.157-1.131,6.104-1.989c1.708-0.754,3.539-1.53,4.886-2.868
+ c1.017,1.453,2.308,2.703,3.788,3.678c0.737,0.483,1.521,0.899,2.339,1.235C95.835,231.316,97.235,231.689,97.208,231.683"/>
+
+ <linearGradient id="XMLID_86_" gradientUnits="userSpaceOnUse" x1="115.2771" y1="131.5142" x2="122.2609" y2="160.4007" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0.0056" style="stop-color:#FFF7FF"/>
+ <stop offset="0.1382" style="stop-color:#CEDFFB"/>
+ <stop offset="0.3023" style="stop-color:#98C4F7"/>
+ <stop offset="0.4629" style="stop-color:#6CAEF4"/>
+ <stop offset="0.6163" style="stop-color:#499CF1"/>
+ <stop offset="0.7607" style="stop-color:#3090F0"/>
+ <stop offset="0.8924" style="stop-color:#2189EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.0056" style="stop-color:#FFF7FF"/>
+ <a:midPointStop offset="0.3352" style="stop-color:#FFF7FF"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_86_)" d="M174.29,149.629c-1.714-7.276-6.044-13.546-11.979-16.661
+ c-3.138-1.648-6.722-2.417-10.608-1.985c-0.358,0.04-0.717,0.091-1.078,0.152c-0.242,0.04-0.483,0.089-0.727,0.138
+ c-0.104,0.023-0.212,0.042-0.322,0.065c-0.307,0.069-0.621,0.147-0.936,0.229c-0.029,0.01-0.059,0.017-0.09,0.026
+ c-0.338,0.091-0.683,0.191-1.028,0.304c-1.88,0.6-3.813,1.472-5.786,2.662c-5.366,3.238-9.574,7.509-12.657,12.308
+ c-0.151,0.236-0.292,0.479-0.44,0.717c1.438-3.934,3.367-6.72,4.865-8.309c2.655-2.812,6.597-6.066,11.229-7.917
+ c-0.965-0.154-1.87-0.265-2.694-0.336c-16.241-1.984-29.679,4.871-36.627,25.485c-1.065,3.159-4.568,14.885-8.373,27.337
+ c-6.443,0.292-15.021,1.456-19.092,5.352c-0.837,0.676-1.397,1.674-1.465,2.815c-0.129,2.188,1.589,4.067,3.834,4.196
+ c1.246,0.071,2.389-0.406,3.186-1.22l0.007,0.009c1.323-1.434,5.837-2.443,10.998-2.917c-0.134,0.431-0.267,0.859-0.397,1.287
+ c-0.442,1.389-0.881,2.777-1.316,4.167c-0.602,1.911-1.2,3.823-1.81,5.731c-0.303,0.951-0.611,1.905-0.92,2.856
+ c-0.084,2.672,1.574,5.437,4.7,7.801c4.804,3.633,13.475,6.386,21.173,3.853c0.85-2.676,1.984-6.246,3.24-10.188h0.005
+ c0.696-2.201,1.439-4.089,2.211-5.711c1.441,1.307,2.868,2.746,4.129,4.135c0.804,1.016,1.028,1.547,1.742,2.239
+ c1.935,1.872,4.539,2.157,6.21,0.46c1.669-1.694,1.458-4.585-0.474-6.458c-0.092-0.088-0.188-0.171-0.286-0.251
+ c-1.414-1.656-3.803-4.287-6.628-6.747c3.402-2.957,6.864-2.728,9.392-1.856c0.032,0.019,0.059,0.038,0.089,0.055
+ c6.097,3.571,13.021,3.274,19.294,0.276c5.137-2.454,9.604-6.613,13.015-11.663c3.114-4.612,5.332-9.944,6.476-15.453
+ C175.528,160.928,175.568,155.044,174.29,149.629z M166.707,179.95c-6.425,9.176-17.576,14.066-26.006,7.692
+ c-12.5-9.453-10.592-33.814,5.362-45.217c11.903-8.513,22.89-1.746,26.018,9.706
+ C174.475,160.894,172.172,172.143,166.707,179.95z"/>
+
+ <linearGradient id="XMLID_87_" gradientUnits="userSpaceOnUse" x1="82.511" y1="213.6699" x2="91.1143" y2="222.5916" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.548" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_87_)" d="M97.208,231.683c-0.78,0.461-1.603,0.911-2.521,1.331
+ c-0.141,0.049-0.275,0.11-0.407,0.171c-0.532,0.316-1.014,0.678-1.408,1.124c-0.442,0.568-0.739,1.263-0.817,2.034
+ c-0.216,2.152,1.325,4.066,3.442,4.273c0.693,0.069,1.36-0.051,1.952-0.323l0.012,0.025c4.799-2.137,8.215-4.84,10.646-7.491
+ c1.379-1.554,2.576-3.248,3.614-5.042C108.151,231.624,102.563,233.318,97.208,231.683z"/>
+
+ <linearGradient id="XMLID_88_" gradientUnits="userSpaceOnUse" x1="97.8445" y1="229.5684" x2="100.5151" y2="232.3378" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.548" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_88_)" d="M97.208,231.683c-0.78,0.461-1.603,0.911-2.521,1.331
+ c-0.141,0.049-0.275,0.11-0.407,0.171c-0.532,0.316-1.014,0.678-1.408,1.124c-0.442,0.568-0.739,1.263-0.817,2.034
+ c-0.216,2.152,1.325,4.066,3.442,4.273c0.693,0.069,1.36-0.051,1.952-0.323l0.012,0.025c4.799-2.137,8.215-4.84,10.646-7.491
+ c1.379-1.554,2.576-3.248,3.614-5.042C108.151,231.624,102.563,233.318,97.208,231.683z"/>
+
+ <linearGradient id="XMLID_89_" gradientUnits="userSpaceOnUse" x1="86.2268" y1="180.4746" x2="90.0388" y2="190.0047" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.548" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_89_)" d="M80.06,195.488c1.182,0.06,2.266-0.403,3.015-1.18l0.009,0.008
+ c1.958-2.153,11.391-3.375,18.972-3.165l0.375,0.009c0.002,0,0.373-0.061,0.373-0.061s2.002-1.694,1.503-4.469
+ c-0.498-2.775-2.037-3.083-2.037-3.083c-4.407-0.126-18.958-0.094-24.512,5.298c-0.79,0.648-1.314,1.6-1.37,2.685
+ C76.281,193.609,77.927,195.382,80.06,195.488z"/>
+
+ <linearGradient id="XMLID_90_" gradientUnits="userSpaceOnUse" x1="127.3293" y1="216.0127" x2="127.9639" y2="198.5599" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.548" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_90_)" d="M133.174,202.521c-0.088-0.091-0.181-0.177-0.277-0.255
+ c-1.757-2.147-5.078-5.911-8.921-8.913c-0.851,2.681-1.738,5.475-2.613,8.229c1.429,1.349,2.841,2.821,4.083,4.247
+ c0.773,1.021,0.979,1.543,1.681,2.249c1.888,1.897,4.523,2.296,6.283,0.726C135.168,207.235,135.064,204.421,133.174,202.521z"
+ />
+ <g>
+ <g i:knockout="On" a:adobe-knockout="true">
+
+ <radialGradient id="XMLID_91_" cx="155.7458" cy="161.2598" r="52.7172" gradientTransform="matrix(1.0169 0.0102 0.0047 1.0111 -2.8353 -3.7854)" gradientUnits="userSpaceOnUse">
+ <stop offset="0.118" style="stop-color:#1C86EE"/>
+ <stop offset="0.5169" style="stop-color:#80D1FF"/>
+ <stop offset="0.6036" style="stop-color:#5BB5F9"/>
+ <stop offset="0.7215" style="stop-color:#2E93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#80D1FF"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#80D1FF"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1C86EE"/>
+ </radialGradient>
+ <path i:knockout="Off" fill="url(#XMLID_91_)" a:adobe-knockout="false" d="M173.478,171.201
+ c-6.066,18.417-22.996,29.434-37.141,22.992c-13.995-6.372-18.005-26.599-9.819-43.702
+ c7.471-15.623,22.702-23.197,34.678-18.066C173.273,137.604,179.011,154.404,173.478,171.201z"/>
+
+ <linearGradient id="XMLID_92_" gradientUnits="userSpaceOnUse" x1="153.156" y1="186.3149" x2="129.7401" y2="75.1286" gradientTransform="matrix(1.0119 0.0089 0.0036 1.008 -1.7908 -3.1402)">
+ <stop offset="0" style="stop-color:#1C86EE"/>
+ <stop offset="0.118" style="stop-color:#1C86EE"/>
+ <stop offset="0.5169" style="stop-color:#7DCFFE"/>
+ <stop offset="0.5989" style="stop-color:#5BB5F8"/>
+ <stop offset="0.7199" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#7DCFFE"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#7DCFFE"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_92_)" a:adobe-knockout="false" d="M173.443,171.214
+ c-6.034,18.341-22.859,29.278-36.93,22.872c-13.924-6.337-17.989-26.464-9.914-43.532
+ c7.385-15.642,22.567-23.264,34.547-18.128C173.225,137.607,178.962,154.435,173.443,171.214z"/>
+
+ <linearGradient id="XMLID_93_" gradientUnits="userSpaceOnUse" x1="151.5535" y1="187.2744" x2="136.4717" y2="76.2394" gradientTransform="matrix(1.007 0.0076 0.0025 1.0049 -0.7472 -2.493)">
+ <stop offset="0" style="stop-color:#1D86EE"/>
+ <stop offset="0.118" style="stop-color:#1D86EE"/>
+ <stop offset="0.5169" style="stop-color:#7ACCFE"/>
+ <stop offset="0.594" style="stop-color:#5BB5F9"/>
+ <stop offset="0.7182" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#1D86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D86EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1D86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D86EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#7ACCFE"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#7ACCFE"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_93_)" a:adobe-knockout="false" d="M173.407,171.227
+ c-6.001,18.265-22.723,29.122-36.719,22.752c-13.853-6.303-17.973-26.33-10.008-43.363
+ c7.299-15.662,22.432-23.331,34.416-18.191C173.177,137.612,178.913,154.466,173.407,171.227z"/>
+
+ <linearGradient id="XMLID_94_" gradientUnits="userSpaceOnUse" x1="149.8308" y1="188.0806" x2="142.9579" y2="78.1492" gradientTransform="matrix(1.002 0.0063 0.0014 1.0019 0.2973 -1.8467)">
+ <stop offset="0" style="stop-color:#1D87EE"/>
+ <stop offset="0.118" style="stop-color:#1D87EE"/>
+ <stop offset="0.5169" style="stop-color:#77CAFD"/>
+ <stop offset="0.5887" style="stop-color:#5BB5F8"/>
+ <stop offset="0.7165" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#77CAFD"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#77CAFD"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_94_)" a:adobe-knockout="false" d="M173.372,171.24
+ c-5.968,18.188-22.585,28.966-36.508,22.632c-13.782-6.268-17.957-26.195-10.103-43.193
+ c7.213-15.681,22.296-23.397,34.284-18.253C173.129,137.616,178.864,154.497,173.372,171.24z"/>
+
+ <linearGradient id="XMLID_95_" gradientUnits="userSpaceOnUse" x1="148.0081" y1="188.7188" x2="149.1006" y2="80.8275" gradientTransform="matrix(0.9971 0.0051 2.741814e-004 0.9988 1.3409 -1.201)">
+ <stop offset="0" style="stop-color:#1E87EE"/>
+ <stop offset="0.118" style="stop-color:#1D87EE"/>
+ <stop offset="0.5169" style="stop-color:#74C8FD"/>
+ <stop offset="0.5831" style="stop-color:#5BB5F9"/>
+ <stop offset="0.7146" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#74C8FD"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#74C8FD"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_95_)" a:adobe-knockout="false" d="M173.336,171.253
+ c-5.936,18.112-22.449,28.81-36.298,22.512c-13.71-6.233-17.94-26.061-10.197-43.024c7.127-15.7,22.161-23.464,34.153-18.315
+ C173.081,137.62,178.815,154.527,173.336,171.253z"/>
+
+ <linearGradient id="XMLID_96_" gradientUnits="userSpaceOnUse" x1="146.1008" y1="189.1719" x2="154.7993" y2="84.218" gradientTransform="matrix(0.9921 0.0038 -8.322702e-004 0.9957 2.385 -0.5547)">
+ <stop offset="0" style="stop-color:#1E87EE"/>
+ <stop offset="0.118" style="stop-color:#1E87EE"/>
+ <stop offset="0.5169" style="stop-color:#71C5FC"/>
+ <stop offset="0.5772" style="stop-color:#5BB5F8"/>
+ <stop offset="0.7126" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#71C5FC"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#71C5FC"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_96_)" a:adobe-knockout="false" d="M173.301,171.267
+ c-5.903,18.036-22.312,28.654-36.087,22.392c-13.64-6.198-17.924-25.926-10.292-42.854
+ c7.041-15.719,22.026-23.531,34.021-18.378C173.033,137.624,178.766,154.558,173.301,171.267z"/>
+
+ <linearGradient id="XMLID_97_" gradientUnits="userSpaceOnUse" x1="144.1335" y1="189.4263" x2="159.97" y2="88.2441" gradientTransform="matrix(0.9872 0.0025 -0.0019 0.9926 3.4291 0.0906)">
+ <stop offset="0" style="stop-color:#1E87EE"/>
+ <stop offset="0.118" style="stop-color:#1E87EE"/>
+ <stop offset="0.5169" style="stop-color:#6EC3FC"/>
+ <stop offset="0.5686" style="stop-color:#5CB5F9"/>
+ <stop offset="0.7098" style="stop-color:#2E93F1"/>
+ <stop offset="0.7809" style="stop-color:#1D86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#6EC3FC"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#6EC3FC"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D86EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_97_)" a:adobe-knockout="false" d="M173.265,171.28
+ c-5.871,17.96-22.175,28.498-35.876,22.272c-13.569-6.164-17.908-25.791-10.387-42.686
+ c6.955-15.738,21.891-23.597,33.891-18.44C172.985,137.628,178.717,154.588,173.265,171.28z"/>
+
+ <linearGradient id="XMLID_98_" gradientUnits="userSpaceOnUse" x1="142.1311" y1="189.4775" x2="164.5387" y2="92.8278" gradientTransform="matrix(0.9822 0.0012 -0.003 0.9896 4.4727 0.7373)">
+ <stop offset="0" style="stop-color:#1F88EE"/>
+ <stop offset="0.118" style="stop-color:#1E87EE"/>
+ <stop offset="0.5169" style="stop-color:#6BC1FB"/>
+ <stop offset="0.5616" style="stop-color:#5CB5F8"/>
+ <stop offset="0.7074" style="stop-color:#2E93F1"/>
+ <stop offset="0.7809" style="stop-color:#1D86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#6BC1FB"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#6BC1FB"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D86EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_98_)" a:adobe-knockout="false" d="M173.23,171.293
+ c-5.837,17.884-22.038,28.342-35.666,22.152c-13.498-6.129-17.892-25.656-10.481-42.516
+ c6.869-15.757,21.755-23.664,33.759-18.502C172.937,137.632,178.668,154.619,173.23,171.293z"/>
+
+ <linearGradient id="XMLID_99_" gradientUnits="userSpaceOnUse" x1="140.115" y1="189.3169" x2="168.4442" y2="97.8604" gradientTransform="matrix(0.9772 -7.098209e-005 -0.0042 0.9865 5.5168 1.3831)">
+ <stop offset="0" style="stop-color:#1F88EE"/>
+ <stop offset="0.118" style="stop-color:#1F88EE"/>
+ <stop offset="0.5169" style="stop-color:#68BEFB"/>
+ <stop offset="0.5541" style="stop-color:#5CB5F9"/>
+ <stop offset="0.7049" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#68BEFB"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#68BEFB"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_99_)" a:adobe-knockout="false" d="M173.195,171.306
+ c-5.805,17.808-21.902,28.186-35.455,22.033c-13.427-6.095-17.876-25.522-10.577-42.347
+ c6.784-15.777,21.621-23.731,33.628-18.564C172.889,137.636,178.619,154.65,173.195,171.306z"/>
+
+ <linearGradient id="XMLID_100_" gradientUnits="userSpaceOnUse" x1="138.1189" y1="188.9487" x2="171.6521" y2="103.2424" gradientTransform="matrix(0.9723 -0.0014 -0.0053 0.9834 6.5608 2.0294)">
+ <stop offset="0" style="stop-color:#1F88EE"/>
+ <stop offset="0.118" style="stop-color:#1F88EE"/>
+ <stop offset="0.5169" style="stop-color:#65BCFA"/>
+ <stop offset="0.546" style="stop-color:#5CB5F8"/>
+ <stop offset="0.7022" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#65BCFA"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#65BCFA"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_100_)" a:adobe-knockout="false" d="M173.159,171.319
+ c-5.772,17.731-21.765,28.03-35.244,21.913c-13.356-6.06-17.86-25.387-10.671-42.177
+ c6.698-15.796,21.485-23.797,33.497-18.626C172.841,137.64,178.571,154.681,173.159,171.319z"/>
+
+ <linearGradient id="XMLID_101_" gradientUnits="userSpaceOnUse" x1="136.1531" y1="188.3687" x2="174.126" y2="108.8494" gradientTransform="matrix(0.9673 -0.0026 -0.0064 0.9803 7.6049 2.6751)">
+ <stop offset="0" style="stop-color:#2088EE"/>
+ <stop offset="0.118" style="stop-color:#2088EE"/>
+ <stop offset="0.5169" style="stop-color:#62BAFA"/>
+ <stop offset="0.5373" style="stop-color:#5CB5F9"/>
+ <stop offset="0.6993" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#62BAFA"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#62BAFA"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_101_)" a:adobe-knockout="false" d="M173.123,171.333
+ c-5.74,17.655-21.628,27.874-35.033,21.793c-13.285-6.025-17.844-25.252-10.766-42.008
+ c6.612-15.815,21.35-23.864,33.366-18.689C172.793,137.644,178.521,154.711,173.123,171.333z"/>
+
+ <linearGradient id="XMLID_102_" gradientUnits="userSpaceOnUse" x1="134.2507" y1="187.5918" x2="175.8687" y2="114.579" gradientTransform="matrix(0.9624 -0.0039 -0.0075 0.9772 8.6485 3.3214)">
+ <stop offset="0" style="stop-color:#2088EE"/>
+ <stop offset="0.118" style="stop-color:#2088EE"/>
+ <stop offset="0.5169" style="stop-color:#5FB7F9"/>
+ <stop offset="0.5279" style="stop-color:#5CB5F8"/>
+ <stop offset="0.6962" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#5FB7F9"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#5FB7F9"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_102_)" a:adobe-knockout="false" d="M173.088,171.346
+ c-5.708,17.579-21.491,27.718-34.823,21.673c-13.214-5.99-17.828-25.118-10.861-41.838
+ c6.526-15.834,21.215-23.931,33.234-18.751C172.744,137.648,178.472,154.742,173.088,171.346z"/>
+
+ <linearGradient id="XMLID_103_" gradientUnits="userSpaceOnUse" x1="132.4299" y1="186.6201" x2="176.8879" y2="120.3128" gradientTransform="matrix(0.9574 -0.0052 -0.0086 0.9742 9.6931 3.9672)">
+ <stop offset="0" style="stop-color:#2189EE"/>
+ <stop offset="0.118" style="stop-color:#2088EE"/>
+ <stop offset="0.5169" style="stop-color:#5CB5F8"/>
+ <stop offset="0.5176" style="stop-color:#5CB5F8"/>
+ <stop offset="0.6927" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#5CB5F8"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#5CB5F8"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_103_)" a:adobe-knockout="false" d="M173.052,171.359
+ c-5.674,17.503-21.354,27.562-34.612,21.553c-13.143-5.956-17.811-24.983-10.955-41.669
+ c6.44-15.854,21.08-23.997,33.103-18.813C172.697,137.652,178.424,154.772,173.052,171.359z"/>
+
+ <linearGradient id="XMLID_104_" gradientUnits="userSpaceOnUse" x1="130.7205" y1="185.4746" x2="177.2194" y2="125.9561" gradientTransform="matrix(0.9524 -0.0065 -0.0097 0.9711 10.7367 4.6134)">
+ <stop offset="0" style="stop-color:#2189EE"/>
+ <stop offset="0.118" style="stop-color:#2189EE"/>
+ <stop offset="0.5169" style="stop-color:#59B3F8"/>
+ <stop offset="0.689" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#59B3F8"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#59B3F8"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_104_)" a:adobe-knockout="false" d="M173.017,171.372
+ c-5.642,17.427-21.217,27.405-34.401,21.433c-13.072-5.921-17.795-24.848-11.05-41.5
+ c6.354-15.873,20.944-24.064,32.972-18.876C172.649,137.656,178.375,154.803,173.017,171.372z"/>
+
+ <linearGradient id="XMLID_105_" gradientUnits="userSpaceOnUse" x1="129.1306" y1="184.166" x2="176.8978" y2="131.4056" gradientTransform="matrix(0.9475 -0.0078 -0.0108 0.968 11.7807 5.2592)">
+ <stop offset="0" style="stop-color:#2189EE"/>
+ <stop offset="0.118" style="stop-color:#2189EE"/>
+ <stop offset="0.5169" style="stop-color:#56B0F7"/>
+ <stop offset="0.6849" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#56B0F7"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#56B0F7"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_105_)" a:adobe-knockout="false" d="M172.982,171.385
+ c-5.609,17.351-21.081,27.25-34.191,21.313c-13.001-5.886-17.779-24.714-11.145-41.331
+ c6.268-15.892,20.809-24.131,32.84-18.938C172.6,137.66,178.325,154.834,172.982,171.385z"/>
+
+ <linearGradient id="XMLID_106_" gradientUnits="userSpaceOnUse" x1="127.675" y1="182.7129" x2="175.9801" y2="136.5743" gradientTransform="matrix(0.9425 -0.0091 -0.0119 0.9649 12.8248 5.9054)">
+ <stop offset="0" style="stop-color:#2289EE"/>
+ <stop offset="0.118" style="stop-color:#2189EE"/>
+ <stop offset="0.5169" style="stop-color:#53AEF7"/>
+ <stop offset="0.6803" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#2289EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2289EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#53AEF7"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#53AEF7"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_106_)" a:adobe-knockout="false" d="M172.946,171.398
+ c-5.577,17.274-20.944,27.093-33.98,21.193c-12.93-5.852-17.763-24.579-11.239-41.161c6.182-15.911,20.674-24.197,32.709-19
+ C172.552,137.664,178.277,154.865,172.946,171.398z"/>
+
+ <linearGradient id="XMLID_107_" gradientUnits="userSpaceOnUse" x1="126.3665" y1="181.1421" x2="174.5361" y2="141.3942" gradientTransform="matrix(0.9376 -0.0103 -0.013 0.9619 13.8689 6.5512)">
+ <stop offset="0" style="stop-color:#228AEF"/>
+ <stop offset="0.118" style="stop-color:#2289EF"/>
+ <stop offset="0.5169" style="stop-color:#4FACF6"/>
+ <stop offset="0.6716" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#228AEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#228AEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#2289EF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2289EF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#4FACF6"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#4FACF6"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_107_)" a:adobe-knockout="false" d="M172.91,171.412
+ c-5.543,17.198-20.807,26.938-33.769,21.074c-12.859-5.817-17.746-24.444-11.334-40.992
+ c6.097-15.931,20.539-24.264,32.578-19.063C172.504,137.668,178.228,154.896,172.91,171.412z"/>
+
+ <linearGradient id="XMLID_108_" gradientUnits="userSpaceOnUse" x1="125.2053" y1="179.4717" x2="172.6345" y2="145.8021" gradientTransform="matrix(0.9326 -0.0116 -0.0141 0.9588 14.9125 7.1975)">
+ <stop offset="0" style="stop-color:#238AEF"/>
+ <stop offset="0.118" style="stop-color:#2289EF"/>
+ <stop offset="0.5169" style="stop-color:#4CAAF6"/>
+ <stop offset="0.6656" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#2289EF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2289EF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#4CAAF6"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#4CAAF6"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_108_)" a:adobe-knockout="false" d="M172.875,171.425
+ c-5.511,17.122-20.67,26.781-33.558,20.954c-12.788-5.782-17.73-24.31-11.429-40.822
+ c6.011-15.95,20.404-24.331,32.447-19.125C172.456,137.672,178.179,154.926,172.875,171.425z"/>
+
+ <linearGradient id="XMLID_109_" gradientUnits="userSpaceOnUse" x1="124.1907" y1="177.7261" x2="170.3514" y2="149.7558" gradientTransform="matrix(0.9277 -0.0129 -0.0152 0.9557 15.9566 7.8433)">
+ <stop offset="0" style="stop-color:#238AEF"/>
+ <stop offset="0.118" style="stop-color:#2289EF"/>
+ <stop offset="0.5169" style="stop-color:#49A7F5"/>
+ <stop offset="0.6587" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#2289EF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2289EF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#49A7F5"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#49A7F5"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_109_)" a:adobe-knockout="false" d="M172.84,171.438
+ c-5.479,17.045-20.533,26.625-33.348,20.834c-12.717-5.748-17.714-24.175-11.523-40.653
+ c5.925-15.969,20.269-24.397,32.315-19.187C172.408,137.676,178.13,154.957,172.84,171.438z"/>
+
+ <linearGradient id="XMLID_110_" gradientUnits="userSpaceOnUse" x1="123.3127" y1="175.9224" x2="167.7589" y2="153.2217" gradientTransform="matrix(0.9227 -0.0142 -0.0163 0.9526 17.0007 8.4895)">
+ <stop offset="0" style="stop-color:#238AEF"/>
+ <stop offset="0.118" style="stop-color:#238AEF"/>
+ <stop offset="0.5169" style="stop-color:#46A5F5"/>
+ <stop offset="0.6509" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#46A5F5"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#46A5F5"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_110_)" a:adobe-knockout="false" d="M172.804,171.451
+ c-5.446,16.969-20.396,26.469-33.137,20.714c-12.646-5.713-17.698-24.04-11.618-40.483
+ c5.839-15.989,20.133-24.464,32.184-19.249C172.36,137.68,178.081,154.988,172.804,171.451z"/>
+
+ <linearGradient id="XMLID_111_" gradientUnits="userSpaceOnUse" x1="122.5662" y1="174.0825" x2="164.934" y2="156.1875" gradientTransform="matrix(0.9177 -0.0155 -0.0174 0.9496 18.0448 9.1353)">
+ <stop offset="0" style="stop-color:#248BEF"/>
+ <stop offset="0.118" style="stop-color:#238AEF"/>
+ <stop offset="0.5169" style="stop-color:#43A3F4"/>
+ <stop offset="0.6422" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#248BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#248BEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#43A3F4"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#43A3F4"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_111_)" a:adobe-knockout="false" d="M172.768,171.464
+ c-5.413,16.893-20.259,26.313-32.926,20.594c-12.575-5.678-17.681-23.906-11.712-40.314
+ c5.753-16.008,19.998-24.531,32.053-19.312C172.312,137.684,178.032,155.018,172.768,171.464z"/>
+
+ <linearGradient id="XMLID_112_" gradientUnits="userSpaceOnUse" x1="121.9314" y1="172.2173" x2="161.9359" y2="158.6452" gradientTransform="matrix(0.9128 -0.0168 -0.0185 0.9465 19.0888 9.7816)">
+ <stop offset="0" style="stop-color:#248BEF"/>
+ <stop offset="0.118" style="stop-color:#238AEF"/>
+ <stop offset="0.5169" style="stop-color:#40A0F3"/>
+ <stop offset="0.6318" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#248BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#248BEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#40A0F3"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#40A0F3"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_112_)" a:adobe-knockout="false" d="M172.733,171.478
+ c-5.38,16.817-20.123,26.157-32.716,20.474c-12.504-5.643-17.665-23.771-11.807-40.145
+ c5.667-16.027,19.863-24.597,31.921-19.374C172.264,137.688,177.983,155.049,172.733,171.478z"/>
+
+ <linearGradient id="XMLID_113_" gradientUnits="userSpaceOnUse" x1="121.3962" y1="170.3374" x2="158.8235" y2="160.6005" gradientTransform="matrix(0.9078 -0.018 -0.0196 0.9434 20.1324 10.4274)">
+ <stop offset="0" style="stop-color:#258BEF"/>
+ <stop offset="0.118" style="stop-color:#248AEF"/>
+ <stop offset="0.5169" style="stop-color:#3D9EF3"/>
+ <stop offset="0.6196" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#248AEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#248AEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#3D9EF3"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#3D9EF3"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_113_)" a:adobe-knockout="false" d="M172.698,171.491
+ c-5.348,16.741-19.986,26.001-32.505,20.354c-12.433-5.609-17.649-23.637-11.902-39.976
+ c5.581-16.046,19.728-24.664,31.79-19.436C172.216,137.692,177.934,155.08,172.698,171.491z"/>
+
+ <linearGradient id="XMLID_114_" gradientUnits="userSpaceOnUse" x1="120.9348" y1="168.4482" x2="155.6342" y2="162.0641" gradientTransform="matrix(0.9029 -0.0193 -0.0207 0.9403 21.1765 11.0736)">
+ <stop offset="0" style="stop-color:#258BEF"/>
+ <stop offset="0.118" style="stop-color:#248AEF"/>
+ <stop offset="0.5169" style="stop-color:#3A9CF2"/>
+ <stop offset="0.6049" style="stop-color:#2F94F0"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#248AEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#248AEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#3A9CF2"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#3A9CF2"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_114_)" a:adobe-knockout="false" d="M172.662,171.504
+ c-5.315,16.665-19.849,25.845-32.294,20.234c-12.362-5.574-17.633-23.501-11.997-39.806
+ c5.495-16.065,19.592-24.73,31.659-19.498C172.168,137.696,177.885,155.11,172.662,171.504z"/>
+
+ <linearGradient id="XMLID_115_" gradientUnits="userSpaceOnUse" x1="120.5334" y1="166.5493" x2="152.4035" y2="163.0492" gradientTransform="matrix(0.8979 -0.0206 -0.0219 0.9372 22.2201 11.7194)">
+ <stop offset="0" style="stop-color:#258BEF"/>
+ <stop offset="0.118" style="stop-color:#258BEF"/>
+ <stop offset="0.5169" style="stop-color:#3799F2"/>
+ <stop offset="0.5869" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#3799F2"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#3799F2"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E88EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_115_)" a:adobe-knockout="false" d="M172.627,171.517
+ c-5.283,16.588-19.712,25.689-32.083,20.115c-12.292-5.54-17.617-23.367-12.092-39.637
+ c5.41-16.085,19.458-24.798,31.528-19.561C172.12,137.7,177.836,155.141,172.627,171.517z"/>
+
+ <linearGradient id="XMLID_116_" gradientUnits="userSpaceOnUse" x1="120.1799" y1="164.6333" x2="149.1568" y2="163.5659" gradientTransform="matrix(0.8929 -0.0219 -0.023 0.9342 23.2647 12.3657)">
+ <stop offset="0" style="stop-color:#268CEF"/>
+ <stop offset="0.118" style="stop-color:#258BEF"/>
+ <stop offset="0.5169" style="stop-color:#3497F1"/>
+ <stop offset="0.5645" style="stop-color:#2F94F0"/>
+ <stop offset="0.7809" style="stop-color:#1E88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#268CEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#268CEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#3497F1"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#3497F1"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E88EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_116_)" a:adobe-knockout="false" d="M172.591,171.53
+ c-5.25,16.512-19.575,25.533-31.873,19.995c-12.22-5.504-17.601-23.232-12.187-39.467
+ c5.324-16.104,19.322-24.864,31.396-19.623C172.072,137.704,177.787,155.172,172.591,171.53z"/>
+
+ <linearGradient id="XMLID_117_" gradientUnits="userSpaceOnUse" x1="119.8655" y1="162.6899" x2="145.9115" y2="163.6213" gradientTransform="matrix(0.888 -0.0232 -0.0241 0.9311 24.3083 13.0119)">
+ <stop offset="0" style="stop-color:#268CEF"/>
+ <stop offset="0.118" style="stop-color:#258BEF"/>
+ <stop offset="0.5169" style="stop-color:#3195F1"/>
+ <stop offset="0.5239" style="stop-color:#3095F1"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#268CEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#268CEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#3195F1"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#3195F1"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_117_)" a:adobe-knockout="false" d="M172.555,171.543
+ c-5.217,16.436-19.438,25.377-31.662,19.875c-12.149-5.47-17.584-23.098-12.281-39.298
+ c5.238-16.123,19.187-24.931,31.266-19.685C172.024,137.708,177.738,155.203,172.555,171.543z"/>
+
+ <linearGradient id="XMLID_118_" gradientUnits="userSpaceOnUse" x1="119.5852" y1="160.7065" x2="142.6797" y2="163.2177" gradientTransform="matrix(0.883 -0.0245 -0.0252 0.928 25.3524 13.6577)">
+ <stop offset="0" style="stop-color:#268CEF"/>
+ <stop offset="0.118" style="stop-color:#268BEF"/>
+ <stop offset="0.5169" style="stop-color:#2E92F0"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#268CEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#268CEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#268BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#268BEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#2E92F0"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#2E92F0"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_118_)" a:adobe-knockout="false" d="M172.52,171.557
+ c-5.185,16.36-19.302,25.221-31.451,19.755c-12.079-5.435-17.568-22.963-12.376-39.128
+ c5.152-16.143,19.052-24.998,31.134-19.747C171.976,137.712,177.689,155.233,172.52,171.557z"/>
+
+ <linearGradient id="XMLID_119_" gradientUnits="userSpaceOnUse" x1="119.3435" y1="158.6733" x2="139.4767" y2="162.3551" gradientTransform="matrix(0.8781 -0.0257 -0.0263 0.9249 26.3965 14.304)">
+ <stop offset="0" style="stop-color:#278CEF"/>
+ <stop offset="0.118" style="stop-color:#268BEF"/>
+ <stop offset="0.5169" style="stop-color:#2B90F0"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#278CEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#278CEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#268BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#268BEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#2B90F0"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#2B90F0"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_119_)" a:adobe-knockout="false" d="M172.485,171.57
+ c-5.152,16.284-19.165,25.065-31.241,19.635c-12.007-5.401-17.552-22.829-12.47-38.959
+ c5.066-16.162,18.917-25.064,31.003-19.81C171.927,137.716,177.64,155.264,172.485,171.57z"/>
+
+ <linearGradient id="XMLID_120_" gradientUnits="userSpaceOnUse" x1="119.1467" y1="156.5752" x2="136.3165" y2="161.0223" gradientTransform="matrix(0.8731 -0.027 -0.0274 0.9219 27.44 14.9498)">
+ <stop offset="0" style="stop-color:#278DEF"/>
+ <stop offset="0.118" style="stop-color:#268CEF"/>
+ <stop offset="0.5169" style="stop-color:#288EEF"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#278DEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#278DEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#268CEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#268CEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#288EEF"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#288EEF"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_120_)" a:adobe-knockout="false" d="M172.449,171.583
+ c-5.119,16.208-19.028,24.909-31.03,19.515c-11.936-5.366-17.536-22.694-12.565-38.79
+ c4.98-16.181,18.781-25.131,30.872-19.872C171.88,137.72,177.592,155.294,172.449,171.583z"/>
+
+ <linearGradient id="XMLID_121_" gradientUnits="userSpaceOnUse" x1="119.0105" y1="154.4019" x2="133.2236" y2="159.2068" gradientTransform="matrix(0.8682 -0.0283 -0.0285 0.9188 28.4846 15.5965)">
+ <stop offset="0" style="stop-color:#288DEF"/>
+ <stop offset="0.118" style="stop-color:#278CEF"/>
+ <stop offset="0.5169" style="stop-color:#258BEF"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#288DEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#288DEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#278CEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#278CEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_121_)" a:adobe-knockout="false" d="M172.414,171.596
+ c-5.086,16.131-18.892,24.753-30.819,19.396c-11.865-5.332-17.52-22.559-12.66-38.621c4.894-16.2,18.646-25.198,30.74-19.934
+ C171.831,137.725,177.542,155.325,172.414,171.596z"/>
+
+ <linearGradient id="XMLID_122_" gradientUnits="userSpaceOnUse" x1="118.9534" y1="152.1465" x2="130.2265" y2="156.8936" gradientTransform="matrix(0.8632 -0.0296 -0.0296 0.9157 29.5282 16.2423)">
+ <stop offset="0" style="stop-color:#288DEF"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#288DEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#288DEF"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_122_)" a:adobe-knockout="false" d="M172.378,171.609
+ c-5.054,16.055-18.754,24.597-30.608,19.275c-11.794-5.296-17.503-22.424-12.754-38.451
+ c4.808-16.219,18.511-25.264,30.609-19.996C171.783,137.729,177.493,155.356,172.378,171.609z"/>
+ </g>
+ </g>
+ <g i:knockout="On" a:adobe-knockout="true">
+
+ <linearGradient id="XMLID_123_" gradientUnits="userSpaceOnUse" x1="123.4993" y1="153.2236" x2="133.7782" y2="157.5521" gradientTransform="matrix(0.9353 -0.0269 -0.0269 0.9832 16.7265 6.8872)">
+ <stop offset="0" style="stop-color:#288DEF"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#288DEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#288DEF"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_123_)" a:adobe-knockout="false" d="M173.429,171.119
+ c-5.866,18.006-22.17,28.784-35.066,22.997c-12.833-5.761-16.029-25.442-7.991-42.314
+ c7.276-15.275,20.611-23.793,31.373-19.106C172.549,137.399,179.088,153.876,173.429,171.119z"/>
+
+ <linearGradient id="XMLID_124_" gradientUnits="userSpaceOnUse" x1="123.5725" y1="153.0771" x2="135.24" y2="158.0536" gradientTransform="matrix(0.9373 -0.0258 -0.0258 0.9833 16.1743 6.7037)">
+ <stop offset="0" style="stop-color:#2F91EF"/>
+ <stop offset="0.0169" style="stop-color:#2F91EF"/>
+ <stop offset="0.1966" style="stop-color:#2B8FEF"/>
+ <stop offset="0.6471" style="stop-color:#258BEF"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#2F91EF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2F91EF"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#2F91EF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2F91EF"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#2B8FEF"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#2B8FEF"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_124_)" a:adobe-knockout="false" d="M173.38,171.184
+ c-5.875,17.927-22.109,28.601-34.94,22.809c-12.754-5.759-15.965-25.325-8.007-42.12c7.222-15.252,20.551-23.762,31.32-19.078
+ C172.578,137.502,179.056,153.991,173.38,171.184z"/>
+
+ <linearGradient id="XMLID_125_" gradientUnits="userSpaceOnUse" x1="123.6511" y1="152.9263" x2="136.6876" y2="158.5575" gradientTransform="matrix(0.9393 -0.0247 -0.0247 0.9833 15.622 6.521)">
+ <stop offset="0" style="stop-color:#3694F0"/>
+ <stop offset="0.0169" style="stop-color:#3694F0"/>
+ <stop offset="0.1966" style="stop-color:#3092F0"/>
+ <stop offset="0.5721" style="stop-color:#2A8FEF"/>
+ <stop offset="1" style="stop-color:#1C87EE"/>
+ <a:midPointStop offset="0" style="stop-color:#3694F0"/>
+ <a:midPointStop offset="0.5" style="stop-color:#3694F0"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#3694F0"/>
+ <a:midPointStop offset="0.5" style="stop-color:#3694F0"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#3092F0"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#3092F0"/>
+ <a:midPointStop offset="1" style="stop-color:#1C87EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_125_)" a:adobe-knockout="false" d="M173.33,171.248
+ c-5.885,17.848-22.048,28.418-34.813,22.621c-12.677-5.756-15.903-25.208-8.024-41.925
+ c7.168-15.229,20.492-23.732,31.268-19.05C172.608,137.605,179.023,154.106,173.33,171.248z"/>
+
+ <linearGradient id="XMLID_126_" gradientUnits="userSpaceOnUse" x1="123.7273" y1="152.7769" x2="138.114" y2="159.0699" gradientTransform="matrix(0.9413 -0.0236 -0.0236 0.9834 15.0696 6.3374)">
+ <stop offset="0" style="stop-color:#3D98F0"/>
+ <stop offset="0.0169" style="stop-color:#3D98F0"/>
+ <stop offset="0.1966" style="stop-color:#3595F0"/>
+ <stop offset="0.5225" style="stop-color:#2F92F0"/>
+ <stop offset="0.9596" style="stop-color:#1E88EE"/>
+ <stop offset="1" style="stop-color:#1C87EE"/>
+ <a:midPointStop offset="0" style="stop-color:#3D98F0"/>
+ <a:midPointStop offset="0.5" style="stop-color:#3D98F0"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#3D98F0"/>
+ <a:midPointStop offset="0.5" style="stop-color:#3D98F0"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#3595F0"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#3595F0"/>
+ <a:midPointStop offset="1" style="stop-color:#1C87EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_126_)" a:adobe-knockout="false" d="M173.281,171.313
+ c-5.894,17.77-21.987,28.235-34.687,22.434c-12.599-5.754-15.839-25.09-8.04-41.731c7.114-15.207,20.432-23.701,31.215-19.021
+ C172.637,137.708,178.991,154.221,173.281,171.313z"/>
+
+ <linearGradient id="XMLID_127_" gradientUnits="userSpaceOnUse" x1="123.803" y1="152.6226" x2="139.5216" y2="159.5844" gradientTransform="matrix(0.9433 -0.0226 -0.0226 0.9834 14.5173 6.1537)">
+ <stop offset="0" style="stop-color:#449CF1"/>
+ <stop offset="0.0169" style="stop-color:#449CF1"/>
+ <stop offset="0.1966" style="stop-color:#3998F1"/>
+ <stop offset="0.4933" style="stop-color:#3394F0"/>
+ <stop offset="0.8911" style="stop-color:#228AEF"/>
+ <stop offset="1" style="stop-color:#1C87EE"/>
+ <a:midPointStop offset="0" style="stop-color:#449CF1"/>
+ <a:midPointStop offset="0.5" style="stop-color:#449CF1"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#449CF1"/>
+ <a:midPointStop offset="0.5" style="stop-color:#449CF1"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#3998F1"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#3998F1"/>
+ <a:midPointStop offset="1" style="stop-color:#1C87EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_127_)" a:adobe-knockout="false" d="M173.232,171.377
+ c-5.903,17.691-21.925,28.052-34.561,22.246c-12.521-5.751-15.776-24.973-8.057-41.536
+ c7.061-15.184,20.372-23.671,31.163-18.994C172.666,137.811,178.959,154.336,173.232,171.377z"/>
+
+ <linearGradient id="XMLID_128_" gradientUnits="userSpaceOnUse" x1="123.8835" y1="152.4751" x2="140.9147" y2="160.112" gradientTransform="matrix(0.9453 -0.0215 -0.0215 0.9835 13.9645 5.9706)">
+ <stop offset="0" style="stop-color:#4B9FF1"/>
+ <stop offset="0.0169" style="stop-color:#4B9FF1"/>
+ <stop offset="0.1966" style="stop-color:#3E9BF1"/>
+ <stop offset="0.4648" style="stop-color:#3897F0"/>
+ <stop offset="0.8243" style="stop-color:#278DEF"/>
+ <stop offset="1" style="stop-color:#1C87EE"/>
+ <a:midPointStop offset="0" style="stop-color:#4B9FF1"/>
+ <a:midPointStop offset="0.5" style="stop-color:#4B9FF1"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#4B9FF1"/>
+ <a:midPointStop offset="0.5" style="stop-color:#4B9FF1"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#3E9BF1"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#3E9BF1"/>
+ <a:midPointStop offset="1" style="stop-color:#1C87EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_128_)" a:adobe-knockout="false" d="M173.182,171.441
+ c-5.913,17.612-21.864,27.869-34.434,22.058c-12.444-5.75-15.713-24.855-8.073-41.342c7.007-15.161,20.312-23.64,31.11-18.965
+ C172.696,137.914,178.926,154.451,173.182,171.441z"/>
+
+ <linearGradient id="XMLID_129_" gradientUnits="userSpaceOnUse" x1="123.9617" y1="152.3184" x2="142.2882" y2="160.6375" gradientTransform="matrix(0.9472 -0.0204 -0.0204 0.9836 13.4122 5.7875)">
+ <stop offset="0" style="stop-color:#52A3F2"/>
+ <stop offset="0.0169" style="stop-color:#52A3F2"/>
+ <stop offset="0.1966" style="stop-color:#439DF2"/>
+ <stop offset="0.4425" style="stop-color:#3D9AF1"/>
+ <stop offset="0.772" style="stop-color:#2C91F0"/>
+ <stop offset="1" style="stop-color:#1C88EE"/>
+ <a:midPointStop offset="0" style="stop-color:#52A3F2"/>
+ <a:midPointStop offset="0.5" style="stop-color:#52A3F2"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#52A3F2"/>
+ <a:midPointStop offset="0.5" style="stop-color:#52A3F2"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#439DF2"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#439DF2"/>
+ <a:midPointStop offset="1" style="stop-color:#1C88EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_129_)" a:adobe-knockout="false" d="M173.133,171.505
+ c-5.922,17.534-21.803,27.687-34.308,21.871c-12.366-5.747-15.65-24.738-8.089-41.147
+ c6.953-15.138,20.252-23.61,31.058-18.938C172.725,138.017,178.894,154.565,173.133,171.505z"/>
+
+ <linearGradient id="XMLID_130_" gradientUnits="userSpaceOnUse" x1="124.0432" y1="152.1655" x2="143.646" y2="161.1728" gradientTransform="matrix(0.9492 -0.0193 -0.0193 0.9836 12.8599 5.6043)">
+ <stop offset="0" style="stop-color:#59A7F2"/>
+ <stop offset="0.0169" style="stop-color:#59A7F2"/>
+ <stop offset="0.1966" style="stop-color:#48A0F2"/>
+ <stop offset="0.4243" style="stop-color:#429DF1"/>
+ <stop offset="0.7295" style="stop-color:#3193F0"/>
+ <stop offset="1" style="stop-color:#1C88EE"/>
+ <a:midPointStop offset="0" style="stop-color:#59A7F2"/>
+ <a:midPointStop offset="0.5" style="stop-color:#59A7F2"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#59A7F2"/>
+ <a:midPointStop offset="0.5" style="stop-color:#59A7F2"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#48A0F2"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#48A0F2"/>
+ <a:midPointStop offset="1" style="stop-color:#1C88EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_130_)" a:adobe-knockout="false" d="M173.083,171.57
+ c-5.931,17.455-21.742,27.504-34.182,21.683c-12.288-5.745-15.587-24.621-8.106-40.953
+ c6.899-15.115,20.192-23.579,31.005-18.909C172.754,138.12,178.862,154.681,173.083,171.57z"/>
+
+ <linearGradient id="XMLID_131_" gradientUnits="userSpaceOnUse" x1="124.1233" y1="152.0103" x2="144.9854" y2="161.7125" gradientTransform="matrix(0.9512 -0.0182 -0.0182 0.9837 12.3071 5.4207)">
+ <stop offset="0" style="stop-color:#5FAAF3"/>
+ <stop offset="0.0169" style="stop-color:#5FAAF3"/>
+ <stop offset="0.1966" style="stop-color:#4DA3F3"/>
+ <stop offset="0.4093" style="stop-color:#47A0F2"/>
+ <stop offset="0.695" style="stop-color:#3696F1"/>
+ <stop offset="1" style="stop-color:#1C88EE"/>
+ <a:midPointStop offset="0" style="stop-color:#5FAAF3"/>
+ <a:midPointStop offset="0.5" style="stop-color:#5FAAF3"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#5FAAF3"/>
+ <a:midPointStop offset="0.5" style="stop-color:#5FAAF3"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#4DA3F3"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#4DA3F3"/>
+ <a:midPointStop offset="1" style="stop-color:#1C88EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_131_)" a:adobe-knockout="false" d="M173.033,171.634
+ c-5.94,17.376-21.68,27.321-34.055,21.495c-12.21-5.742-15.524-24.503-8.122-40.757c6.845-15.093,20.132-23.549,30.953-18.881
+ C172.784,138.223,178.829,154.795,173.033,171.634z"/>
+
+ <linearGradient id="XMLID_132_" gradientUnits="userSpaceOnUse" x1="124.2048" y1="151.8516" x2="146.3088" y2="162.2551" gradientTransform="matrix(0.9532 -0.0171 -0.0171 0.9838 11.7547 5.2376)">
+ <stop offset="0" style="stop-color:#66AEF3"/>
+ <stop offset="0.0169" style="stop-color:#66AEF3"/>
+ <stop offset="0.1966" style="stop-color:#52A6F3"/>
+ <stop offset="0.3966" style="stop-color:#4CA3F2"/>
+ <stop offset="0.6652" style="stop-color:#3B9AF1"/>
+ <stop offset="0.9717" style="stop-color:#1F8BEE"/>
+ <stop offset="1" style="stop-color:#1C89EE"/>
+ <a:midPointStop offset="0" style="stop-color:#66AEF3"/>
+ <a:midPointStop offset="0.5" style="stop-color:#66AEF3"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#66AEF3"/>
+ <a:midPointStop offset="0.5" style="stop-color:#66AEF3"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#52A6F3"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#52A6F3"/>
+ <a:midPointStop offset="1" style="stop-color:#1C89EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_132_)" a:adobe-knockout="false" d="M172.984,171.699
+ c-5.95,17.298-21.619,27.138-33.929,21.308c-12.132-5.74-15.46-24.386-8.138-40.563c6.791-15.07,20.073-23.519,30.9-18.854
+ C172.813,138.326,178.797,154.91,172.984,171.699z"/>
+
+ <linearGradient id="XMLID_133_" gradientUnits="userSpaceOnUse" x1="124.2874" y1="151.6953" x2="147.6169" y2="162.8068" gradientTransform="matrix(0.9552 -0.0161 -0.0161 0.9838 11.2024 5.0544)">
+ <stop offset="0" style="stop-color:#6DB2F4"/>
+ <stop offset="0.0169" style="stop-color:#6DB2F4"/>
+ <stop offset="0.1966" style="stop-color:#57A9F4"/>
+ <stop offset="0.3857" style="stop-color:#51A6F3"/>
+ <stop offset="0.6397" style="stop-color:#409CF2"/>
+ <stop offset="0.9294" style="stop-color:#248DEF"/>
+ <stop offset="1" style="stop-color:#1C89EE"/>
+ <a:midPointStop offset="0" style="stop-color:#6DB2F4"/>
+ <a:midPointStop offset="0.5" style="stop-color:#6DB2F4"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#6DB2F4"/>
+ <a:midPointStop offset="0.5" style="stop-color:#6DB2F4"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#57A9F4"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#57A9F4"/>
+ <a:midPointStop offset="1" style="stop-color:#1C89EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_133_)" a:adobe-knockout="false" d="M172.935,171.763
+ c-5.959,17.219-21.558,26.955-33.803,21.12c-12.055-5.737-15.398-24.268-8.155-40.368
+ c6.737-15.047,20.013-23.488,30.848-18.825C172.843,138.429,178.764,155.025,172.935,171.763z"/>
+
+ <linearGradient id="XMLID_134_" gradientUnits="userSpaceOnUse" x1="124.3708" y1="151.5381" x2="148.9081" y2="163.3634" gradientTransform="matrix(0.9572 -0.015 -0.015 0.9839 10.6496 4.8708)">
+ <stop offset="0" style="stop-color:#74B5F4"/>
+ <stop offset="0.0169" style="stop-color:#74B5F4"/>
+ <stop offset="0.1966" style="stop-color:#5CACF4"/>
+ <stop offset="0.3761" style="stop-color:#56A9F3"/>
+ <stop offset="0.6173" style="stop-color:#459FF2"/>
+ <stop offset="0.8925" style="stop-color:#2990EF"/>
+ <stop offset="1" style="stop-color:#1C89EE"/>
+ <a:midPointStop offset="0" style="stop-color:#74B5F4"/>
+ <a:midPointStop offset="0.5" style="stop-color:#74B5F4"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#74B5F4"/>
+ <a:midPointStop offset="0.5" style="stop-color:#74B5F4"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#5CACF4"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#5CACF4"/>
+ <a:midPointStop offset="1" style="stop-color:#1C89EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_134_)" a:adobe-knockout="false" d="M172.885,171.828
+ c-5.968,17.14-21.496,26.772-33.676,20.932c-11.977-5.735-15.334-24.151-8.171-40.174
+ c6.683-15.025,19.953-23.458,30.795-18.797C172.872,138.532,178.732,155.14,172.885,171.828z"/>
+
+ <linearGradient id="XMLID_135_" gradientUnits="userSpaceOnUse" x1="124.4534" y1="151.3784" x2="150.1816" y2="163.9236" gradientTransform="matrix(0.9592 -0.0139 -0.0139 0.9839 10.0978 4.6877)">
+ <stop offset="0" style="stop-color:#7BB9F4"/>
+ <stop offset="0.0169" style="stop-color:#7BB9F4"/>
+ <stop offset="0.1966" style="stop-color:#60AFF4"/>
+ <stop offset="0.3694" style="stop-color:#5AACF3"/>
+ <stop offset="0.6015" style="stop-color:#49A2F2"/>
+ <stop offset="0.8663" style="stop-color:#2D92EF"/>
+ <stop offset="1" style="stop-color:#1C89EE"/>
+ <a:midPointStop offset="0" style="stop-color:#7BB9F4"/>
+ <a:midPointStop offset="0.5" style="stop-color:#7BB9F4"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#7BB9F4"/>
+ <a:midPointStop offset="0.5" style="stop-color:#7BB9F4"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#60AFF4"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#60AFF4"/>
+ <a:midPointStop offset="1" style="stop-color:#1C89EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_135_)" a:adobe-knockout="false" d="M172.836,171.892
+ c-5.978,17.062-21.435,26.589-33.55,20.745c-11.899-5.733-15.271-24.034-8.188-39.979
+ c6.63-15.002,19.893-23.427,30.743-18.769C172.901,138.635,178.699,155.255,172.836,171.892z"/>
+
+ <linearGradient id="XMLID_136_" gradientUnits="userSpaceOnUse" x1="124.5378" y1="151.2192" x2="151.441" y2="164.4907" gradientTransform="matrix(0.9612 -0.0128 -0.0128 0.984 9.5455 4.5045)">
+ <stop offset="0" style="stop-color:#82BDF5"/>
+ <stop offset="0.0169" style="stop-color:#82BDF5"/>
+ <stop offset="0.1966" style="stop-color:#65B2F5"/>
+ <stop offset="0.3618" style="stop-color:#5FAFF4"/>
+ <stop offset="0.5837" style="stop-color:#4EA5F3"/>
+ <stop offset="0.8368" style="stop-color:#3296F0"/>
+ <stop offset="1" style="stop-color:#1C8AEE"/>
+ <a:midPointStop offset="0" style="stop-color:#82BDF5"/>
+ <a:midPointStop offset="0.5" style="stop-color:#82BDF5"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#82BDF5"/>
+ <a:midPointStop offset="0.5" style="stop-color:#82BDF5"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#65B2F5"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#65B2F5"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8AEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_136_)" a:adobe-knockout="false" d="M172.786,171.957
+ c-5.987,16.983-21.374,26.406-33.424,20.557c-11.822-5.73-15.208-23.916-8.204-39.785
+ c6.576-14.979,19.833-23.396,30.69-18.741C172.93,138.737,178.667,155.37,172.786,171.957z"/>
+
+ <linearGradient id="XMLID_137_" gradientUnits="userSpaceOnUse" x1="124.6213" y1="151.0547" x2="152.6828" y2="165.0581" gradientTransform="matrix(0.9632 -0.0117 -0.0117 0.9841 8.9927 4.3209)">
+ <stop offset="0" style="stop-color:#89C0F5"/>
+ <stop offset="0.0169" style="stop-color:#89C0F5"/>
+ <stop offset="0.1966" style="stop-color:#6AB5F5"/>
+ <stop offset="0.355" style="stop-color:#64B2F4"/>
+ <stop offset="0.5677" style="stop-color:#53A8F3"/>
+ <stop offset="0.8103" style="stop-color:#3799F0"/>
+ <stop offset="1" style="stop-color:#1C8AEE"/>
+ <a:midPointStop offset="0" style="stop-color:#89C0F5"/>
+ <a:midPointStop offset="0.5" style="stop-color:#89C0F5"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#89C0F5"/>
+ <a:midPointStop offset="0.5" style="stop-color:#89C0F5"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#6AB5F5"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#6AB5F5"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8AEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_137_)" a:adobe-knockout="false" d="M172.737,172.021
+ c-5.996,16.904-21.313,26.223-33.297,20.369c-11.744-5.728-15.145-23.799-8.22-39.59
+ c6.522-14.957,19.773-23.366,30.638-18.713C172.96,138.84,178.635,155.485,172.737,172.021z"/>
+
+ <linearGradient id="XMLID_138_" gradientUnits="userSpaceOnUse" x1="124.7058" y1="150.8931" x2="153.9094" y2="165.6344" gradientTransform="matrix(0.9652 -0.0106 -0.0106 0.9841 8.4403 4.1378)">
+ <stop offset="0" style="stop-color:#90C4F6"/>
+ <stop offset="0.0169" style="stop-color:#90C4F6"/>
+ <stop offset="0.1966" style="stop-color:#6FB8F6"/>
+ <stop offset="0.3489" style="stop-color:#69B5F5"/>
+ <stop offset="0.5534" style="stop-color:#58ABF4"/>
+ <stop offset="0.7867" style="stop-color:#3C9CF1"/>
+ <stop offset="1" style="stop-color:#1C8AEE"/>
+ <a:midPointStop offset="0" style="stop-color:#90C4F6"/>
+ <a:midPointStop offset="0.5" style="stop-color:#90C4F6"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#90C4F6"/>
+ <a:midPointStop offset="0.5" style="stop-color:#90C4F6"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#6FB8F6"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#6FB8F6"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8AEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_138_)" a:adobe-knockout="false" d="M172.687,172.085
+ c-6.005,16.825-21.251,26.04-33.171,20.181c-11.666-5.726-15.082-23.681-8.237-39.396
+ c6.468-14.934,19.713-23.335,30.585-18.685C172.989,138.943,178.602,155.6,172.687,172.085z"/>
+
+ <linearGradient id="XMLID_139_" gradientUnits="userSpaceOnUse" x1="124.7927" y1="150.7305" x2="155.1227" y2="166.2156" gradientTransform="matrix(0.9671 -0.0096 -0.0096 0.9842 7.888 3.9546)">
+ <stop offset="0" style="stop-color:#97C8F6"/>
+ <stop offset="0.0169" style="stop-color:#97C8F6"/>
+ <stop offset="0.1966" style="stop-color:#74BAF6"/>
+ <stop offset="0.3433" style="stop-color:#6EB7F5"/>
+ <stop offset="0.5404" style="stop-color:#5DAEF4"/>
+ <stop offset="0.7662" style="stop-color:#419FF1"/>
+ <stop offset="1" style="stop-color:#1C8BEE"/>
+ <a:midPointStop offset="0" style="stop-color:#97C8F6"/>
+ <a:midPointStop offset="0.5" style="stop-color:#97C8F6"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#97C8F6"/>
+ <a:midPointStop offset="0.5" style="stop-color:#97C8F6"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#74BAF6"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#74BAF6"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8BEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_139_)" a:adobe-knockout="false" d="M172.638,172.149
+ c-6.015,16.747-21.19,25.857-33.045,19.994c-11.588-5.723-15.019-23.564-8.253-39.201
+ c6.414-14.911,19.654-23.305,30.533-18.657C173.018,139.046,178.57,155.715,172.638,172.149z"/>
+
+ <linearGradient id="XMLID_140_" gradientUnits="userSpaceOnUse" x1="124.8782" y1="150.5669" x2="156.3197" y2="166.802" gradientTransform="matrix(0.9691 -0.0085 -0.0085 0.9842 7.3352 3.7715)">
+ <stop offset="0" style="stop-color:#9ECCF7"/>
+ <stop offset="0.0169" style="stop-color:#9ECCF7"/>
+ <stop offset="0.1966" style="stop-color:#79BDF7"/>
+ <stop offset="0.3383" style="stop-color:#73BAF6"/>
+ <stop offset="0.5286" style="stop-color:#62B1F5"/>
+ <stop offset="0.7466" style="stop-color:#46A1F2"/>
+ <stop offset="0.9837" style="stop-color:#1F8DEE"/>
+ <stop offset="1" style="stop-color:#1C8BEE"/>
+ <a:midPointStop offset="0" style="stop-color:#9ECCF7"/>
+ <a:midPointStop offset="0.5" style="stop-color:#9ECCF7"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#9ECCF7"/>
+ <a:midPointStop offset="0.5" style="stop-color:#9ECCF7"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#79BDF7"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#79BDF7"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8BEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_140_)" a:adobe-knockout="false" d="M172.589,172.214
+ c-6.024,16.668-21.129,25.674-32.918,19.806c-11.511-5.721-14.956-23.446-8.27-39.006c6.36-14.888,19.594-23.274,30.48-18.628
+ C173.048,139.149,178.537,155.83,172.589,172.214z"/>
+
+ <linearGradient id="XMLID_141_" gradientUnits="userSpaceOnUse" x1="124.9661" y1="150.3999" x2="157.5024" y2="167.3901" gradientTransform="matrix(0.9711 -0.0074 -0.0074 0.9843 6.7829 3.5878)">
+ <stop offset="0" style="stop-color:#A5CFF7"/>
+ <stop offset="0.0169" style="stop-color:#A5CFF7"/>
+ <stop offset="0.1966" style="stop-color:#7EC0F7"/>
+ <stop offset="0.3337" style="stop-color:#78BDF6"/>
+ <stop offset="0.5178" style="stop-color:#67B3F5"/>
+ <stop offset="0.7287" style="stop-color:#4BA4F2"/>
+ <stop offset="0.958" style="stop-color:#248FEF"/>
+ <stop offset="1" style="stop-color:#1C8BEE"/>
+ <a:midPointStop offset="0" style="stop-color:#A5CFF7"/>
+ <a:midPointStop offset="0.5" style="stop-color:#A5CFF7"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#A5CFF7"/>
+ <a:midPointStop offset="0.5" style="stop-color:#A5CFF7"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#7EC0F7"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#7EC0F7"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8BEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_141_)" a:adobe-knockout="false" d="M172.539,172.278
+ c-6.033,16.589-21.067,25.492-32.792,19.619c-11.433-5.718-14.893-23.329-8.286-38.812
+ c6.306-14.865,19.534-23.244,30.427-18.601C173.077,139.252,178.505,155.945,172.539,172.278z"/>
+
+ <linearGradient id="XMLID_142_" gradientUnits="userSpaceOnUse" x1="125.054" y1="150.2329" x2="158.6707" y2="167.9843" gradientTransform="matrix(0.9731 -0.0063 -0.0063 0.9844 6.2306 3.4052)">
+ <stop offset="0" style="stop-color:#ACD3F8"/>
+ <stop offset="0.0169" style="stop-color:#ACD3F8"/>
+ <stop offset="0.1966" style="stop-color:#83C3F8"/>
+ <stop offset="0.3294" style="stop-color:#7DC0F7"/>
+ <stop offset="0.5078" style="stop-color:#6CB7F6"/>
+ <stop offset="0.7122" style="stop-color:#50A8F3"/>
+ <stop offset="0.9344" style="stop-color:#2993EF"/>
+ <stop offset="1" style="stop-color:#1C8CEE"/>
+ <a:midPointStop offset="0" style="stop-color:#ACD3F8"/>
+ <a:midPointStop offset="0.5" style="stop-color:#ACD3F8"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#ACD3F8"/>
+ <a:midPointStop offset="0.5" style="stop-color:#ACD3F8"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#83C3F8"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#83C3F8"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8CEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_142_)" a:adobe-knockout="false" d="M172.49,172.343
+ c-6.042,16.511-21.006,25.309-32.666,19.431c-11.355-5.716-14.83-23.211-8.302-38.617
+ c6.252-14.842,19.474-23.213,30.375-18.572C173.106,139.355,178.472,156.06,172.49,172.343z"/>
+
+ <linearGradient id="XMLID_143_" gradientUnits="userSpaceOnUse" x1="125.1428" y1="150.0654" x2="159.8252" y2="168.5836" gradientTransform="matrix(0.9751 -0.0052 -0.0052 0.9844 5.6782 3.2215)">
+ <stop offset="0" style="stop-color:#B3D7F8"/>
+ <stop offset="0.0169" style="stop-color:#B3D7F8"/>
+ <stop offset="0.1966" style="stop-color:#87C6F8"/>
+ <stop offset="0.3262" style="stop-color:#81C3F7"/>
+ <stop offset="0.5004" style="stop-color:#70B9F6"/>
+ <stop offset="0.6998" style="stop-color:#54AAF3"/>
+ <stop offset="0.9166" style="stop-color:#2D95F0"/>
+ <stop offset="1" style="stop-color:#1C8CEE"/>
+ <a:midPointStop offset="0" style="stop-color:#B3D7F8"/>
+ <a:midPointStop offset="0.5" style="stop-color:#B3D7F8"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#B3D7F8"/>
+ <a:midPointStop offset="0.5" style="stop-color:#B3D7F8"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#87C6F8"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#87C6F8"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8CEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_143_)" a:adobe-knockout="false" d="M172.44,172.407
+ c-6.052,16.432-20.945,25.125-32.54,19.243c-11.277-5.714-14.767-23.094-8.319-38.423
+ c6.199-14.819,19.415-23.183,30.323-18.544C173.135,139.458,178.44,156.175,172.44,172.407z"/>
+
+ <linearGradient id="XMLID_144_" gradientUnits="userSpaceOnUse" x1="125.2317" y1="149.897" x2="160.9635" y2="169.187" gradientTransform="matrix(0.9771 -0.0041 -0.0041 0.9845 5.1254 3.0379)">
+ <stop offset="0" style="stop-color:#BADAF8"/>
+ <stop offset="0.0169" style="stop-color:#BADAF8"/>
+ <stop offset="0.1966" style="stop-color:#8CC9F8"/>
+ <stop offset="0.3225" style="stop-color:#86C6F7"/>
+ <stop offset="0.4917" style="stop-color:#75BCF6"/>
+ <stop offset="0.6855" style="stop-color:#59ADF3"/>
+ <stop offset="0.896" style="stop-color:#3298F0"/>
+ <stop offset="1" style="stop-color:#1C8CEE"/>
+ <a:midPointStop offset="0" style="stop-color:#BADAF8"/>
+ <a:midPointStop offset="0.5" style="stop-color:#BADAF8"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#BADAF8"/>
+ <a:midPointStop offset="0.5" style="stop-color:#BADAF8"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#8CC9F8"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#8CC9F8"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8CEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_144_)" a:adobe-knockout="false" d="M172.39,172.472
+ c-6.061,16.354-20.884,24.942-32.413,19.056c-11.199-5.711-14.703-22.977-8.335-38.229
+ c6.145-14.797,19.354-23.152,30.27-18.516C173.165,139.561,178.408,156.29,172.39,172.472z"/>
+
+ <linearGradient id="XMLID_145_" gradientUnits="userSpaceOnUse" x1="125.324" y1="149.729" x2="162.0907" y2="169.7964" gradientTransform="matrix(0.9791 -0.0031 -0.0031 0.9845 4.5731 2.8548)">
+ <stop offset="0" style="stop-color:#C1DEF9"/>
+ <stop offset="0.0169" style="stop-color:#C1DEF9"/>
+ <stop offset="0.1966" style="stop-color:#91CCF9"/>
+ <stop offset="0.3191" style="stop-color:#8BC9F8"/>
+ <stop offset="0.4836" style="stop-color:#7ABFF7"/>
+ <stop offset="0.6721" style="stop-color:#5EB0F4"/>
+ <stop offset="0.877" style="stop-color:#379BF1"/>
+ <stop offset="1" style="stop-color:#1C8CEE"/>
+ <a:midPointStop offset="0" style="stop-color:#C1DEF9"/>
+ <a:midPointStop offset="0.5" style="stop-color:#C1DEF9"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#C1DEF9"/>
+ <a:midPointStop offset="0.5" style="stop-color:#C1DEF9"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#91CCF9"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#91CCF9"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8CEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_145_)" a:adobe-knockout="false" d="M172.341,172.536
+ c-6.07,16.274-20.822,24.76-32.287,18.868c-11.122-5.709-14.641-22.859-8.352-38.034
+ c6.091-14.774,19.294-23.122,30.217-18.488C173.194,139.664,178.375,156.405,172.341,172.536z"/>
+
+ <linearGradient id="XMLID_146_" gradientUnits="userSpaceOnUse" x1="125.4158" y1="149.5596" x2="163.204" y2="170.4103" gradientTransform="matrix(0.9811 -0.002 -0.002 0.9846 4.0208 2.6716)">
+ <stop offset="0" style="stop-color:#C8E2F9"/>
+ <stop offset="0.0169" style="stop-color:#C8E2F9"/>
+ <stop offset="0.1966" style="stop-color:#96CFF9"/>
+ <stop offset="0.3158" style="stop-color:#90CCF8"/>
+ <stop offset="0.4761" style="stop-color:#7FC2F7"/>
+ <stop offset="0.6597" style="stop-color:#63B3F4"/>
+ <stop offset="0.8591" style="stop-color:#3C9EF1"/>
+ <stop offset="1" style="stop-color:#1C8DEE"/>
+ <a:midPointStop offset="0" style="stop-color:#C8E2F9"/>
+ <a:midPointStop offset="0.5" style="stop-color:#C8E2F9"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#C8E2F9"/>
+ <a:midPointStop offset="0.5" style="stop-color:#C8E2F9"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#96CFF9"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#96CFF9"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8DEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_146_)" a:adobe-knockout="false" d="M172.292,172.601
+ c-6.08,16.196-20.761,24.577-32.161,18.68c-11.044-5.707-14.577-22.742-8.368-37.839c6.037-14.751,19.235-23.091,30.165-18.46
+ C173.223,139.767,178.343,156.52,172.292,172.601z"/>
+
+ <linearGradient id="XMLID_147_" gradientUnits="userSpaceOnUse" x1="125.5081" y1="149.3862" x2="164.3029" y2="171.0255" gradientTransform="matrix(0.9831 -8.870935e-004 -8.870935e-004 0.9847 3.4679 2.4885)">
+ <stop offset="0" style="stop-color:#CEE5FA"/>
+ <stop offset="0.0169" style="stop-color:#CEE5FA"/>
+ <stop offset="0.1966" style="stop-color:#9BD2FA"/>
+ <stop offset="0.3129" style="stop-color:#95CFF9"/>
+ <stop offset="0.4691" style="stop-color:#84C5F8"/>
+ <stop offset="0.6481" style="stop-color:#68B6F5"/>
+ <stop offset="0.8425" style="stop-color:#41A1F1"/>
+ <stop offset="1" style="stop-color:#1C8DEE"/>
+ <a:midPointStop offset="0" style="stop-color:#CEE5FA"/>
+ <a:midPointStop offset="0.5" style="stop-color:#CEE5FA"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#CEE5FA"/>
+ <a:midPointStop offset="0.5" style="stop-color:#CEE5FA"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#9BD2FA"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#9BD2FA"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8DEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_147_)" a:adobe-knockout="false" d="M172.242,172.665
+ c-6.089,16.117-20.7,24.394-32.034,18.492c-10.966-5.704-14.514-22.625-8.384-37.644
+ c5.983-14.729,19.175-23.061,30.112-18.432C173.253,139.87,178.31,156.634,172.242,172.665z"/>
+
+ <linearGradient id="XMLID_148_" gradientUnits="userSpaceOnUse" x1="125.5979" y1="149.2148" x2="165.3848" y2="171.6476" gradientTransform="matrix(0.9851 1.967764e-004 1.967764e-004 0.9847 2.9156 2.3048)">
+ <stop offset="0" style="stop-color:#D5E9FA"/>
+ <stop offset="0.0169" style="stop-color:#D5E9FA"/>
+ <stop offset="0.1966" style="stop-color:#A0D5FA"/>
+ <stop offset="0.31" style="stop-color:#9AD2F9"/>
+ <stop offset="0.4625" style="stop-color:#89C8F8"/>
+ <stop offset="0.6372" style="stop-color:#6DB9F5"/>
+ <stop offset="0.8269" style="stop-color:#46A4F2"/>
+ <stop offset="1" style="stop-color:#1C8DEE"/>
+ <a:midPointStop offset="0" style="stop-color:#D5E9FA"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D5E9FA"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#D5E9FA"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D5E9FA"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#A0D5FA"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#A0D5FA"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8DEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_148_)" a:adobe-knockout="false" d="M172.193,172.729
+ c-6.098,16.039-20.639,24.21-31.908,18.305c-10.889-5.702-14.451-22.507-8.4-37.45c5.929-14.706,19.115-23.03,30.06-18.404
+ C173.282,139.973,178.278,156.75,172.193,172.729z"/>
+
+ <linearGradient id="XMLID_149_" gradientUnits="userSpaceOnUse" x1="125.6917" y1="149.0425" x2="166.4561" y2="172.2738" gradientTransform="matrix(0.987 0.0013 0.0013 0.9848 2.3638 2.1222)">
+ <stop offset="0" style="stop-color:#DCEDFB"/>
+ <stop offset="0.0169" style="stop-color:#DCEDFB"/>
+ <stop offset="0.1966" style="stop-color:#A5D7FB"/>
+ <stop offset="0.3074" style="stop-color:#9FD4FA"/>
+ <stop offset="0.4564" style="stop-color:#8ECBF9"/>
+ <stop offset="0.627" style="stop-color:#72BCF6"/>
+ <stop offset="0.8135" style="stop-color:#4BA7F2"/>
+ <stop offset="1" style="stop-color:#1C8EEE"/>
+ <a:midPointStop offset="0" style="stop-color:#DCEDFB"/>
+ <a:midPointStop offset="0.5" style="stop-color:#DCEDFB"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#DCEDFB"/>
+ <a:midPointStop offset="0.5" style="stop-color:#DCEDFB"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#A5D7FB"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#A5D7FB"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8EEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_149_)" a:adobe-knockout="false" d="M172.143,172.793
+ c-6.107,15.96-20.578,24.028-31.782,18.117c-10.811-5.699-14.388-22.39-8.417-37.255c5.875-14.683,19.055-23,30.007-18.376
+ C173.312,140.076,178.246,156.864,172.143,172.793z"/>
+
+ <linearGradient id="XMLID_150_" gradientUnits="userSpaceOnUse" x1="125.7878" y1="148.8711" x2="167.5164" y2="172.9064" gradientTransform="matrix(0.989 0.0024 0.0024 0.9849 1.8114 1.9385)">
+ <stop offset="0" style="stop-color:#E3F0FB"/>
+ <stop offset="0.0169" style="stop-color:#E3F0FB"/>
+ <stop offset="0.1966" style="stop-color:#AADAFB"/>
+ <stop offset="0.3049" style="stop-color:#A4D7FA"/>
+ <stop offset="0.4505" style="stop-color:#93CEF9"/>
+ <stop offset="0.6173" style="stop-color:#77BFF6"/>
+ <stop offset="0.7999" style="stop-color:#50AAF3"/>
+ <stop offset="0.9933" style="stop-color:#1E8FEE"/>
+ <stop offset="1" style="stop-color:#1C8EEE"/>
+ <a:midPointStop offset="0" style="stop-color:#E3F0FB"/>
+ <a:midPointStop offset="0.5" style="stop-color:#E3F0FB"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#E3F0FB"/>
+ <a:midPointStop offset="0.5" style="stop-color:#E3F0FB"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#AADAFB"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#AADAFB"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8EEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_150_)" a:adobe-knockout="false" d="M172.094,172.858
+ c-6.117,15.881-20.516,23.845-31.655,17.93c-10.733-5.697-14.325-22.272-8.433-37.061
+ c5.821-14.661,18.995-22.969,29.955-18.348C173.341,140.179,178.213,156.979,172.094,172.858z"/>
+
+ <linearGradient id="XMLID_151_" gradientUnits="userSpaceOnUse" x1="125.8831" y1="148.6938" x2="168.5633" y2="173.5392" gradientTransform="matrix(0.991 0.0034 0.0034 0.9849 1.2586 1.7549)">
+ <stop offset="0" style="stop-color:#EAF4FC"/>
+ <stop offset="0.0169" style="stop-color:#EAF4FC"/>
+ <stop offset="0.1966" style="stop-color:#AEDDFC"/>
+ <stop offset="0.303" style="stop-color:#A8DAFB"/>
+ <stop offset="0.446" style="stop-color:#97D0FA"/>
+ <stop offset="0.6099" style="stop-color:#7BC1F7"/>
+ <stop offset="0.7893" style="stop-color:#54ACF3"/>
+ <stop offset="0.9793" style="stop-color:#2291EF"/>
+ <stop offset="1" style="stop-color:#1C8EEE"/>
+ <a:midPointStop offset="0" style="stop-color:#EAF4FC"/>
+ <a:midPointStop offset="0.5" style="stop-color:#EAF4FC"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#EAF4FC"/>
+ <a:midPointStop offset="0.5" style="stop-color:#EAF4FC"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#AEDDFC"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#AEDDFC"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8EEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_151_)" a:adobe-knockout="false" d="M172.044,172.922
+ c-6.126,15.803-20.455,23.662-31.529,17.742c-10.655-5.694-14.262-22.155-8.45-36.866
+ c5.768-14.638,18.936-22.939,29.902-18.32C173.37,140.282,178.181,157.094,172.044,172.922z"/>
+
+ <linearGradient id="XMLID_152_" gradientUnits="userSpaceOnUse" x1="125.9778" y1="148.521" x2="169.594" y2="174.1801" gradientTransform="matrix(0.993 0.0045 0.0045 0.985 0.7063 1.5718)">
+ <stop offset="0" style="stop-color:#F1F8FC"/>
+ <stop offset="0.0169" style="stop-color:#F1F8FC"/>
+ <stop offset="0.1966" style="stop-color:#B3E0FC"/>
+ <stop offset="0.3008" style="stop-color:#ADDDFB"/>
+ <stop offset="0.4408" style="stop-color:#9CD3FA"/>
+ <stop offset="0.6013" style="stop-color:#80C4F7"/>
+ <stop offset="0.7769" style="stop-color:#59AFF4"/>
+ <stop offset="0.9628" style="stop-color:#2794EF"/>
+ <stop offset="1" style="stop-color:#1C8EEE"/>
+ <a:midPointStop offset="0" style="stop-color:#F1F8FC"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F1F8FC"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#F1F8FC"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F1F8FC"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#B3E0FC"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#B3E0FC"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8EEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_152_)" a:adobe-knockout="false" d="M171.995,172.987
+ c-6.135,15.724-20.394,23.479-31.403,17.554c-10.577-5.692-14.198-22.038-8.466-36.671
+ c5.713-14.615,18.875-22.908,29.85-18.292C173.4,140.384,178.149,157.209,171.995,172.987z"/>
+
+ <linearGradient id="XMLID_153_" gradientUnits="userSpaceOnUse" x1="126.0779" y1="148.3438" x2="170.6163" y2="174.8215" gradientTransform="matrix(0.995 0.0056 0.0056 0.985 0.154 1.3886)">
+ <stop offset="0" style="stop-color:#F8FBFD"/>
+ <stop offset="0.0169" style="stop-color:#F8FBFD"/>
+ <stop offset="0.1966" style="stop-color:#B8E3FD"/>
+ <stop offset="0.2987" style="stop-color:#B2E0FC"/>
+ <stop offset="0.4358" style="stop-color:#A1D7FB"/>
+ <stop offset="0.593" style="stop-color:#85C7F8"/>
+ <stop offset="0.765" style="stop-color:#5EB2F4"/>
+ <stop offset="0.9471" style="stop-color:#2C98F0"/>
+ <stop offset="1" style="stop-color:#1C8FEE"/>
+ <a:midPointStop offset="0" style="stop-color:#F8FBFD"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F8FBFD"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#F8FBFD"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F8FBFD"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#B8E3FD"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#B8E3FD"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8FEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_153_)" a:adobe-knockout="false" d="M171.945,173.051
+ c-6.145,15.645-20.332,23.296-31.276,17.366c-10.5-5.689-14.136-21.92-8.482-36.477c5.66-14.592,18.816-22.878,29.797-18.264
+ C173.429,140.487,178.116,157.324,171.945,173.051z"/>
+
+ <linearGradient id="XMLID_154_" gradientUnits="userSpaceOnUse" x1="126.175" y1="148.168" x2="171.6249" y2="175.4708" gradientTransform="matrix(0.997 0.0067 0.0067 0.9851 -0.3988 1.2055)">
+ <stop offset="0.0169" style="stop-color:#FFFFFD"/>
+ <stop offset="0.1966" style="stop-color:#BDE6FD"/>
+ <stop offset="0.2966" style="stop-color:#B7E3FC"/>
+ <stop offset="0.4311" style="stop-color:#A6D9FB"/>
+ <stop offset="0.5851" style="stop-color:#8ACAF8"/>
+ <stop offset="0.7538" style="stop-color:#63B5F5"/>
+ <stop offset="0.9323" style="stop-color:#319AF0"/>
+ <stop offset="1" style="stop-color:#1C8FEE"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#FFFFFD"/>
+ <a:midPointStop offset="0.5" style="stop-color:#FFFFFD"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#BDE6FD"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#BDE6FD"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8FEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_154_)" a:adobe-knockout="false" d="M171.896,173.116
+ c-6.154,15.566-20.271,23.113-31.15,17.179c-10.422-5.688-14.072-21.803-8.499-36.282
+ c5.605-14.569,18.756-22.847,29.745-18.235C173.458,140.59,178.084,157.439,171.896,173.116z"/>
+ </g>
+
+ <linearGradient id="XMLID_155_" gradientUnits="userSpaceOnUse" x1="164.9543" y1="202.2217" x2="149.6072" y2="161.9356" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0.0169" style="stop-color:#FFFFFF"/>
+ <stop offset="0.0405" style="stop-color:#FFF8D8"/>
+ <stop offset="0.0716" style="stop-color:#FFF0AB"/>
+ <stop offset="0.1058" style="stop-color:#FFE982"/>
+ <stop offset="0.1424" style="stop-color:#FFE35F"/>
+ <stop offset="0.182" style="stop-color:#FFDD41"/>
+ <stop offset="0.2257" style="stop-color:#FFD929"/>
+ <stop offset="0.2749" style="stop-color:#FFD617"/>
+ <stop offset="0.3331" style="stop-color:#FFD40A"/>
+ <stop offset="0.4089" style="stop-color:#FFD202"/>
+ <stop offset="0.5674" style="stop-color:#FFD200"/>
+ <stop offset="1" style="stop-color:#FF8B00"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.1657" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.5674" style="stop-color:#FFD200"/>
+ <a:midPointStop offset="0.5" style="stop-color:#FFD200"/>
+ <a:midPointStop offset="1" style="stop-color:#FF8B00"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_155_)" d="M146.963,187.534c4.335,0.355,8.602-1.261,12.088-3.753
+ c2.567-1.832,4.755-4.097,6.448-6.695c0.013-0.017,0.02-0.032,0.032-0.047c0.335-0.515,0.649-1.043,0.947-1.583
+ c0.002-0.008,0.007-0.018,0.012-0.026c0.595-1.093,1.106-2.237,1.526-3.425c1.907-5.378,2.463-11.103,1.254-16.71
+ c-1.074-4.971-3.68-9.773-7.839-12.81c-1.984-1.447-4.13-2.335-6.593-2.491c-2.774-0.178-5.532,0.516-8.021,1.722
+ c-0.292,0.19-0.583,0.382-0.873,0.591c-9.198,6.574-13.717,17.453-13.508,27.301c0.333,5.737,2.45,11.024,6.418,14.594
+ C141.177,186.048,143.957,187.287,146.963,187.534z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M152.871,163.726c0.6-3.865-0.522-7.005-2.662-6.849
+ c-2.314,0.169-4.753,4.052-5.243,8.456c-0.463,4.194,1.088,6.84,3.284,6.14C150.298,170.817,152.301,167.43,152.871,163.726z"
+ />
+ <path i:knockout="Off" fill="#1C86EE" d="M162.636,162.831c-0.229-0.074-0.595-0.122-1.02,0.095
+ c-1.451,0.724-2.662,4.385-2.89,5.114c-0.319,1.026-1.306,4.479-0.473,5.754c0.22,0.333,0.541,0.539,0.91,0.59
+ c0.917,0.124,1.58-0.733,1.997-1.385c0.242-0.378,0.491-0.838,0.734-1.364c0.351-0.751,0.686-1.621,0.961-2.508
+ C163.516,167.019,164.369,163.397,162.636,162.831z"/>
+
+ <linearGradient id="XMLID_156_" gradientUnits="userSpaceOnUse" x1="157.2424" y1="146.5264" x2="154.0309" y2="160.3349" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.4169" style="stop-color:#FFFFFD"/>
+ <stop offset="0.6466" style="stop-color:#FFFFF5"/>
+ <stop offset="0.8302" style="stop-color:#FFFFE7"/>
+ <stop offset="0.9894" style="stop-color:#FFFFD4"/>
+ <stop offset="1" style="stop-color:#FFFFD2"/>
+ <a:midPointStop offset="0" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.8136" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="1" style="stop-color:#FFFFD2"/>
+ </linearGradient>
+ <path i:knockout="Off" opacity="0.75" fill="url(#XMLID_156_)" d="M141.049,150.84c-3.562,6.513-3.258,7.708,7.139,8.935
+ c7.664,1.236,11.396,3.66,15.189,5.776c2.492,1.122,4.064,3.785,5.62,1.77c2.158-3.913,1.6-13.077-3.001-19.51
+ C158.905,138.266,146.682,142.015,141.049,150.84z"/>
+
+ <linearGradient id="XMLID_157_" gradientUnits="userSpaceOnUse" x1="174.7786" y1="143.7949" x2="142.9488" y2="191.5393" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0.0056" style="stop-color:#1C86EE"/>
+ <stop offset="0.3764" style="stop-color:#FCFFFC"/>
+ <stop offset="0.437" style="stop-color:#F0F9FB"/>
+ <stop offset="0.5465" style="stop-color:#D0E7F9"/>
+ <stop offset="0.6924" style="stop-color:#9DCCF6"/>
+ <stop offset="0.8669" style="stop-color:#56A6F2"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.0056" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.3764" style="stop-color:#FCFFFC"/>
+ <a:midPointStop offset="0.5763" style="stop-color:#FCFFFC"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_157_)" d="M171.884,152.011c-1.553-5.683-5.044-10.198-9.621-12.281
+ c2.69,1.772,4.894,4.438,6.383,7.697c0.524,1.133,0.966,2.337,1.31,3.598c1.867,6.835,0.87,15.174-2.249,22.22
+ c0.136-0.382,0.264-0.767,0.388-1.158c-0.129,0.322-0.261,0.641-0.4,0.953c0.01-0.018,0.02-0.034,0.027-0.051
+ c-0.985,2.716-2.309,5.289-3.931,7.549c-4.159,5.805-10.422,9.747-16.525,9.768c6.978,0.854,14.433-3.608,19.244-10.475
+ C171.976,172.024,174.278,160.775,171.884,152.011z"/>
+
+ <linearGradient id="XMLID_158_" gradientUnits="userSpaceOnUse" x1="187.4504" y1="142.1313" x2="164.2581" y2="156.7162" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0" style="stop-color:#CDF0FC"/>
+ <stop offset="0.0783" style="stop-color:#C1E9FB"/>
+ <stop offset="0.2197" style="stop-color:#A1D6F9"/>
+ <stop offset="0.408" style="stop-color:#6EB7F4"/>
+ <stop offset="0.6339" style="stop-color:#278DEF"/>
+ <stop offset="0.6685" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#CDF0FC"/>
+ <a:midPointStop offset="0.5763" style="stop-color:#CDF0FC"/>
+ <a:midPointStop offset="0.6685" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_158_)" d="M164.172,141.119c-1.251-1.094-2.555-1.922-4.174-2.326
+ c-1.721-0.43-3.498-0.503-5.252-0.271c-2.867,0.38-5.571,1.604-7.956,3.206c2.497-1.214,5.264-1.912,8.048-1.733
+ c2.463,0.156,4.609,1.043,6.593,2.491c4.159,3.037,6.765,7.839,7.839,12.81c1.209,5.607,0.653,11.332-1.254,16.71
+ c-0.419,1.188-0.931,2.332-1.526,3.425c-0.005,0.008-0.01,0.018-0.012,0.026c-0.298,0.54-0.612,1.069-0.947,1.583
+ c-0.012,0.015-0.019,0.03-0.032,0.047c-1.693,2.599-3.881,4.864-6.448,6.695c-3.487,2.492-7.753,4.108-12.088,3.753
+ c-3.006-0.247-5.786-1.486-8.109-3.333c-4.351-3.915-6.502-9.888-6.484-16.264c-0.254,7.866,2.438,15.275,8.14,19.584
+ c2.119,1.604,4.413,2.494,6.758,2.782c3.801-0.011,7.666-1.546,11.044-4.104c4.957-3.631,8.622-9.341,10.458-14.954
+ C171.896,161.679,172.442,148.35,164.172,141.119z"/>
+ </g>
+ <g>
+ <path i:knockout="Off" fill="#1C86EE" d="M374.069,178.561c-0.518-1.209-1.943-1.804-2.892-2.197l0,0
+ c-5.054-2.121-10.609-1.918-15.247,0.558c-2.162,1.159-3.67,2.625-4.479,4.36c-1.121,2.403-0.544,4.625,1.627,6.257
+ c1.782,1.344,3.916,1.957,5.948,2.472c2.727,0.688,4.185,1.78,4.465,3.334c0.336,1.868-2.13,3.869-3.915,4.377
+ c-2.181,0.618-4.308,0.205-5.683-1.104c-0.185-0.176-0.364-0.368-0.558-0.57c-0.627-0.659-1.334-1.405-2.301-1.709
+ c-1.347-0.427-2.814,0.161-3.671,0.928c-0.735,0.661-1.07,1.479-0.969,2.361c0.159,1.401,1.395,2.667,2.545,3.305
+ c3.47,1.917,8.33,2.054,14.451,0.416c3.881-1.036,8.297-4.134,8.815-8.484c0.578-4.775-4.066-5.914-7.461-6.744
+ c-0.476-0.117-0.923-0.225-1.346-0.339c-1.201-0.327-3.317-1.071-3.959-2.365c-0.252-0.51-0.25-1.06,0.008-1.683
+ c0.848-2.061,3.841-2.931,5.852-2.302c0.743,0.23,1.438,0.76,2.173,1.318c1.413,1.071,3.013,2.287,5.056,1.076
+ C373.666,181.157,374.587,179.784,374.069,178.561z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M347.107,185.276c0.838-2.559,2.233-6.842-0.644-8.913l-0.273,0.378l0.273-0.381
+ c-2.172-1.555-5.265-1.475-7.4-1.277c-1.379,0.127-2.694,0.396-3.9,0.8l-0.27,0.09c-1.246,0.419-2.42,0.814-3.707,0.793
+ c-0.68-0.012-1.313-0.315-1.98-0.64c-0.314-0.151-0.638-0.307-0.976-0.434c-1.359-0.522-2.783-0.835-4.225-0.938
+ c-1.434-0.099-2.77,0.006-3.973,0.318c-0.513,0.132-1.015,0.305-1.498,0.473c-0.822,0.285-1.597,0.554-2.424,0.631
+ c-0.888,0.085-1.829-0.053-2.821-0.205c-1.745-0.26-3.555-0.532-5.178,0.471c-2.08,1.279-2.789,3.631-3.419,5.706
+ c-0.123,0.414-0.243,0.806-0.373,1.189l-0.715,2.152l-2.154,6.479c0,0-0.567,1.636-0.567,1.636
+ c-0.486,1.382-0.987,2.81-1.335,4.26c-0.215,0.915-0.79,3.34,0.968,4.18c1.994,0.954,4.081-0.618,5.264-2.601
+ c0.522-0.872,0.831-1.827,1.131-2.751l0.138-0.413l1.44-4.322c0.176-0.522,0.349-1.061,0.512-1.583
+ c0.571-1.813,1.164-3.685,2.087-5.318c1.573-2.787,5.328-4.991,8.656-3.695c1.48,0.577,2.222,2.113,1.892,3.915
+ c-0.164,0.891-0.488,1.788-0.8,2.656c-0.126,0.348-0.257,0.709-0.375,1.065c0-0.001-1.401,4.227-1.401,4.227l-0.218,0.664
+ c-0.337,1.037-0.683,2.111-0.997,3.175c0,0.002-0.031,0.111-0.031,0.111c-0.346,1.185-0.822,2.807-0.093,4.093
+ c0.318,0.563,0.837,0.931,1.492,1.067c1.182,0.243,2.59-0.309,3.4-0.923c1.763-1.337,2.485-3.735,3.065-5.657l0.122-0.4
+ c0.462-1.524,0.964-3.063,1.45-4.552l1.061-3.292c0.638-2.021,1.592-4.279,3.836-5.688c1.438-0.904,3.823-1.608,5.817-0.617
+ c2.174,1.083,1.719,3.6,0.988,5.918c-0.732,2.33-1.563,4.969-2.454,7.511c-0.734,2.092-1.383,4.896-0.317,6.393
+ c0.471,0.662,1.208,0.995,2.189,0.99c3.044-0.005,4.46-3.898,5.145-5.767c0.883-2.428,1.67-4.931,2.436-7.353l1.134-3.557
+ L347.107,185.276z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M303.573,170.912L303.573,170.912c0.318-0.958,0.758-2.27,0.384-3.487
+ c-0.366-1.18-1.568-1.734-3.222-1.482c-1.99,0.3-3.494,1.76-4.475,4.338c-1.388,3.639-2.576,7.433-3.73,11.1l-1.695,5.323
+ c0,0.003-2.808,8.527-2.808,8.527c-0.082,0.258-0.195,0.556-0.312,0.873c-0.595,1.588-1.414,3.764-0.416,5.264
+ c0.348,0.525,0.886,0.857,1.557,0.962c1.188,0.187,2.64-0.379,3.459-1.033c1.376-1.093,2.119-2.739,2.668-4.206
+ c0.347-0.936,0.632-1.902,0.905-2.835l0.382-1.281c0.491-1.585,1.033-3.189,1.559-4.74l0.738-2.202l3.164-9.55L303.573,170.912
+ z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M277.81,180.669c0.863-0.629,1.755-1.276,2.476-2.125l-0.358-0.301l0.358,0.3
+ c0.911-1.073,0.336-2.331-0.084-3.25c-0.059-0.129-0.115-0.256-0.167-0.375c-0.488-1.143-0.618-2.146-0.382-2.98
+ c0.305-1.075,1.21-1.617,2.17-2.19c0.991-0.592,2.014-1.204,2.471-2.429c0.338-0.916,0.052-1.52-0.249-1.865
+ c-1.092-1.256-4.009-1.08-4.948-0.874c-2.221,0.493-4.303,1.802-6.188,3.895c-0.698,0.775-1.31,1.65-1.905,2.496
+ c-0.859,1.22-1.747,2.484-2.875,3.413c-0.188,0.155-0.389,0.304-0.603,0.463c-0.722,0.538-1.54,1.147-1.945,2.065
+ c-0.516,1.162-0.032,2.259,0.392,3.227c0.098,0.223,0.19,0.435,0.269,0.639c0.667,1.755,0.507,3.067-0.026,4.873
+ c-0.423,1.43-0.904,2.874-1.368,4.27l-0.203,0.608c-0.263,0.805-0.563,1.617-0.846,2.402c-0.333,0.902-0.674,1.833-0.972,2.765
+ l-0.055,0.166c-0.501,1.555-1.433,4.441,0.079,5.865c0.47,0.443,1.09,0.663,1.785,0.636c1.309-0.053,2.718-0.966,3.472-1.796
+ c1.068-1.176,1.72-2.629,2.265-4.023c0.805-2.062,1.455-4.212,2.085-6.292c0.416-1.375,0.849-2.802,1.316-4.182
+ c0.465-1.36,0.929-2.575,1.902-3.63C276.292,181.769,277.03,181.235,277.81,180.669z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M288.105,181.76c0.083-0.25,0.202-0.528,0.324-0.823
+ c0.411-0.992,0.877-2.119,0.693-3.14h0.001c-0.124-0.724-0.484-1.281-1.042-1.606c-1.065-0.62-2.455-0.224-3.004-0.026
+ c-1.848,0.672-3.002,1.91-3.743,4.016l-1.5,4.156l-1.475,4.076l-0.869,2.563c-0.484,1.436-0.979,2.921-1.53,4.354l-0.11,0.288
+ c-0.532,1.372-1.197,3.081-0.886,4.665c0.171,0.868,0.702,1.497,1.497,1.766c1.273,0.432,2.955-0.13,3.851-0.918
+ c1.775-1.576,2.488-3.801,3.173-5.956c0.14-0.436,0.285-0.886,0.436-1.32l1.614-4.665l1.284-3.709L288.105,181.76z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M287.126,170.453l-0.06-0.033c0.801,0.536,1.919,0.518,3.075-0.053
+ c1.077-0.531,2.196-1.592,2.273-2.767c0.03-0.476-0.102-1.155-0.915-1.695c-1.119-0.745-2.646-0.381-3.702,0.207
+ c-1.235,0.688-2.013,1.726-1.981,2.654C285.834,169.261,286.073,169.956,287.126,170.453z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M263.784,171.393c-0.5-2.365-2.247-4.543-4.795-5.978v0.001
+ c-3.849-2.169-9.13-2.466-14.868-0.841c-4.233,1.202-8.194,3.629-11.456,7.019c-3.144,3.269-5.534,7.291-6.912,11.633
+ c-1.854,5.821-1.277,11.148,1.578,14.613c3.38,4.106,9.147,4.468,12.279,4.322c5.15-0.246,10.108-2.085,14.349-5.318
+ c1.531-1.168,4.385-3.341,4.204-5.813c-0.037-0.514-0.276-0.958-0.692-1.279c-0.674-0.522-1.683-0.627-2.386-0.502
+ c-1.226,0.227-2.24,1.058-3.138,1.79l-0.449,0.362c-1.908,1.507-3.986,3.035-6.548,3.733c-2.5,0.678-5.005,0.737-7.057,0.17
+ c-5.951-1.649-4.499-9.141-3.911-11.397c1.328-5.108,4.568-9.584,8.658-11.978c3.939-2.302,10.393-2.634,13.36,0.57
+ c0.397,0.433,0.725,1.006,1.04,1.56c0.81,1.421,1.727,3.034,4.082,2.331C263.346,175.725,264.317,173.904,263.784,171.393z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M218.376,165.557c-3.85-2.166-9.13-2.463-14.866-0.837
+ c-8.435,2.393-15.473,9.535-18.37,18.648c-1.854,5.823-1.276,11.152,1.58,14.616c3.381,4.105,9.145,4.468,12.277,4.32
+ c5.189-0.244,10.181-2.105,14.439-5.385c3.166-2.436,7.522-6.221,8.751-10.965c0.56-2.147,0.171-3.742-1.091-4.484
+ c-0.788-0.464-1.762-0.532-2.617-0.594c-0.191-0.013-0.373-0.026-0.547-0.044c-1.563-0.15-2.854-0.183-4.066-0.103
+ c-3.681,0.245-5.999,1.249-6.891,2.989c-1.021,2.007,0.73,3.055,2.009,3.818c0.6,0.359,1.222,0.73,1.529,1.137
+ c0.83,1.084-0.178,2.822-1.055,3.723c-1.199,1.227-2.729,2.139-4.538,2.711c-1.364,0.431-6.073,1.677-9.396-0.416
+ c-3.129-1.971-2.963-6.216-2.586-8.572c0.588-3.669,2.018-6.985,4.144-9.583l-0.363-0.296l0.363,0.295
+ c1.919-2.348,3.799-3.947,5.751-4.891c2.163-1.048,4.733-1.465,7.433-1.205c1.816,0.175,4.261,0.805,5.594,2.798
+ c0.215,0.317,0.393,0.659,0.583,1.02c0.336,0.633,0.683,1.288,1.229,1.834c1.149,1.147,2.866,0.466,3.6,0.174
+ c2.104-0.838,2.382-3.322,1.723-5.41C222.328,168.742,220.688,166.86,218.376,165.557z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M374.069,178.561c-0.518-1.209-1.943-1.804-2.892-2.197l0,0
+ c-5.054-2.121-10.609-1.918-15.247,0.558c-2.162,1.159-3.67,2.625-4.479,4.36c-1.121,2.403-0.544,4.625,1.627,6.257
+ c1.782,1.344,3.916,1.957,5.948,2.472c2.727,0.688,4.185,1.78,4.465,3.334c0.336,1.868-2.13,3.869-3.915,4.377
+ c-2.181,0.618-4.308,0.205-5.683-1.104c-0.185-0.176-0.364-0.368-0.558-0.57c-0.627-0.659-1.334-1.405-2.301-1.709
+ c-1.347-0.427-2.814,0.161-3.671,0.928c-0.735,0.661-1.07,1.479-0.969,2.361c0.159,1.401,1.395,2.667,2.545,3.305
+ c3.47,1.917,8.33,2.054,14.451,0.416c3.881-1.036,8.297-4.134,8.815-8.484c0.578-4.775-4.066-5.914-7.461-6.744
+ c-0.476-0.117-0.923-0.225-1.346-0.339c-1.201-0.327-3.317-1.071-3.959-2.365c-0.252-0.51-0.25-1.06,0.008-1.683
+ c0.848-2.061,3.841-2.931,5.852-2.302c0.743,0.23,1.438,0.76,2.173,1.318c1.413,1.071,3.013,2.287,5.056,1.076
+ C373.666,181.157,374.587,179.784,374.069,178.561z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M347.107,185.276c0.838-2.559,2.233-6.842-0.644-8.913v-0.003
+ c-2.172-1.555-5.265-1.475-7.4-1.277c-1.379,0.127-2.694,0.396-3.9,0.8l-0.27,0.09c-1.246,0.419-2.42,0.814-3.707,0.793
+ c-0.68-0.012-1.313-0.315-1.98-0.64c-0.314-0.151-0.638-0.307-0.976-0.434c-1.359-0.522-2.783-0.835-4.225-0.938
+ c-1.434-0.099-2.77,0.006-3.973,0.318c-0.513,0.132-1.015,0.305-1.498,0.473c-0.822,0.285-1.597,0.554-2.424,0.631
+ c-0.888,0.085-1.829-0.053-2.821-0.205c-1.745-0.26-3.555-0.532-5.178,0.471c-2.08,1.279-2.789,3.631-3.419,5.706
+ c-0.123,0.414-0.243,0.806-0.373,1.189l-0.715,2.152l-2.154,6.479c0,0-0.567,1.636-0.567,1.636
+ c-0.486,1.382-0.987,2.81-1.335,4.26c-0.215,0.915-0.79,3.34,0.968,4.18c1.994,0.954,4.081-0.618,5.264-2.601
+ c0.522-0.872,0.831-1.827,1.131-2.751l0.138-0.413l1.44-4.322c0.176-0.522,0.349-1.061,0.512-1.583
+ c0.571-1.813,1.164-3.685,2.087-5.318c1.573-2.787,5.328-4.991,8.656-3.695c1.48,0.577,2.222,2.113,1.892,3.915
+ c-0.164,0.891-0.488,1.788-0.8,2.656c-0.126,0.348-0.257,0.709-0.375,1.065c0-0.001-1.401,4.227-1.401,4.227l-0.218,0.664
+ c-0.337,1.037-0.683,2.111-0.997,3.175c0,0.002-0.031,0.111-0.031,0.111c-0.346,1.185-0.822,2.807-0.093,4.093
+ c0.318,0.563,0.837,0.931,1.492,1.067c1.182,0.243,2.59-0.309,3.4-0.923c1.763-1.337,2.485-3.735,3.065-5.657l0.122-0.4
+ c0.462-1.524,0.964-3.063,1.45-4.552l1.061-3.292c0.638-2.021,1.592-4.279,3.836-5.688c1.438-0.904,3.823-1.608,5.817-0.617
+ c2.174,1.083,1.719,3.6,0.988,5.918c-0.732,2.33-1.563,4.969-2.454,7.511c-0.734,2.092-1.383,4.896-0.317,6.393
+ c0.471,0.662,1.208,0.995,2.189,0.99c3.044-0.005,4.46-3.898,5.145-5.767c0.883-2.428,1.67-4.931,2.436-7.353l1.134-3.557
+ L347.107,185.276z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M303.573,170.912L303.573,170.912c0.318-0.958,0.758-2.27,0.384-3.487
+ c-0.366-1.18-1.568-1.734-3.222-1.482c-1.99,0.3-3.494,1.76-4.475,4.338c-1.388,3.639-2.576,7.433-3.73,11.1l-1.695,5.323
+ c0,0.003-2.808,8.527-2.808,8.527c-0.082,0.258-0.195,0.556-0.312,0.873c-0.595,1.588-1.414,3.764-0.416,5.264
+ c0.348,0.525,0.886,0.857,1.557,0.962c1.188,0.187,2.64-0.379,3.459-1.033c1.376-1.093,2.119-2.739,2.668-4.206
+ c0.347-0.936,0.632-1.902,0.905-2.835l0.382-1.281c0.491-1.585,1.033-3.189,1.559-4.74l0.738-2.202l3.164-9.55L303.573,170.912
+ z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M277.81,180.669c0.863-0.629,1.755-1.276,2.476-2.125v-0.001
+ c0.911-1.073,0.336-2.331-0.084-3.25c-0.059-0.129-0.115-0.256-0.167-0.375c-0.488-1.143-0.618-2.146-0.382-2.98
+ c0.305-1.075,1.21-1.617,2.17-2.19c0.991-0.592,2.014-1.204,2.471-2.429c0.338-0.916,0.052-1.52-0.249-1.865
+ c-1.092-1.256-4.009-1.08-4.948-0.874c-2.221,0.493-4.303,1.802-6.188,3.895c-0.698,0.775-1.31,1.65-1.905,2.496
+ c-0.859,1.22-1.747,2.484-2.875,3.413c-0.188,0.155-0.389,0.304-0.603,0.463c-0.722,0.538-1.54,1.147-1.945,2.065
+ c-0.516,1.162-0.032,2.259,0.392,3.227c0.098,0.223,0.19,0.435,0.269,0.639c0.667,1.755,0.507,3.067-0.026,4.873
+ c-0.423,1.43-0.904,2.874-1.368,4.27l-0.203,0.608c-0.263,0.805-0.563,1.617-0.846,2.402c-0.333,0.902-0.674,1.833-0.972,2.765
+ l-0.055,0.166c-0.501,1.555-1.433,4.441,0.079,5.865c0.47,0.443,1.09,0.663,1.785,0.636c1.309-0.053,2.718-0.966,3.472-1.796
+ c1.068-1.176,1.72-2.629,2.265-4.023c0.805-2.062,1.455-4.212,2.085-6.292c0.416-1.375,0.849-2.802,1.316-4.182
+ c0.465-1.36,0.929-2.575,1.902-3.63C276.292,181.769,277.03,181.235,277.81,180.669z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M288.105,181.76c0.083-0.25,0.202-0.528,0.324-0.823
+ c0.411-0.992,0.877-2.119,0.693-3.14h0.001c-0.124-0.724-0.484-1.281-1.042-1.606c-1.065-0.62-2.455-0.224-3.004-0.026
+ c-1.848,0.672-3.002,1.91-3.743,4.016l-1.5,4.156l-1.475,4.076l-0.869,2.563c-0.484,1.436-0.979,2.921-1.53,4.354l-0.11,0.288
+ c-0.532,1.372-1.197,3.081-0.886,4.665c0.171,0.868,0.702,1.497,1.497,1.766c1.273,0.432,2.955-0.13,3.851-0.918
+ c1.775-1.576,2.488-3.801,3.173-5.956c0.14-0.436,0.285-0.886,0.436-1.32l1.614-4.665l1.284-3.709L288.105,181.76z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M287.126,170.453l-0.06-0.033c0.801,0.536,1.919,0.518,3.075-0.053
+ c1.077-0.531,2.196-1.592,2.273-2.767c0.03-0.476-0.102-1.155-0.915-1.695c-1.119-0.745-2.646-0.381-3.702,0.207
+ c-1.235,0.688-2.013,1.726-1.981,2.654C285.834,169.261,286.073,169.956,287.126,170.453z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M263.784,171.393c-0.5-2.365-2.247-4.543-4.795-5.978v0.001
+ c-3.849-2.169-9.13-2.466-14.868-0.841c-4.233,1.202-8.194,3.629-11.456,7.019c-3.144,3.269-5.534,7.291-6.912,11.633
+ c-1.854,5.821-1.277,11.148,1.578,14.613c3.38,4.106,9.147,4.468,12.279,4.322c5.15-0.246,10.108-2.085,14.349-5.318
+ c1.531-1.168,4.385-3.341,4.204-5.813c-0.037-0.514-0.276-0.958-0.692-1.279c-0.674-0.522-1.683-0.627-2.386-0.502
+ c-1.226,0.227-2.24,1.058-3.138,1.79l-0.449,0.362c-1.908,1.507-3.986,3.035-6.548,3.733c-2.5,0.678-5.005,0.737-7.057,0.17
+ c-5.951-1.649-4.499-9.141-3.911-11.397c1.328-5.108,4.568-9.584,8.658-11.978c3.939-2.302,10.393-2.634,13.36,0.57
+ c0.397,0.433,0.725,1.006,1.04,1.56c0.81,1.421,1.727,3.034,4.082,2.331C263.346,175.725,264.317,173.904,263.784,171.393z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M218.376,165.557c-3.85-2.166-9.13-2.463-14.866-0.837
+ c-8.435,2.393-15.473,9.535-18.37,18.648c-1.854,5.823-1.276,11.152,1.58,14.616c3.381,4.105,9.145,4.468,12.277,4.32
+ c5.189-0.244,10.181-2.105,14.439-5.385c3.166-2.436,7.522-6.221,8.751-10.965c0.56-2.147,0.171-3.742-1.091-4.484
+ c-0.788-0.464-1.762-0.532-2.617-0.594c-0.191-0.013-0.373-0.026-0.547-0.044c-1.563-0.15-2.854-0.183-4.066-0.103
+ c-3.681,0.245-5.999,1.249-6.891,2.989c-1.021,2.007,0.73,3.055,2.009,3.818c0.6,0.359,1.222,0.73,1.529,1.137
+ c0.83,1.084-0.178,2.822-1.055,3.723c-1.199,1.227-2.729,2.139-4.538,2.711c-1.364,0.431-6.073,1.677-9.396-0.416
+ c-3.129-1.971-2.963-6.216-2.586-8.572c0.588-3.669,2.018-6.985,4.144-9.583l-0.363-0.296l0.363,0.295
+ c1.919-2.348,3.799-3.947,5.751-4.891c2.163-1.048,4.733-1.465,7.433-1.205c1.816,0.175,4.261,0.805,5.594,2.798
+ c0.215,0.317,0.393,0.659,0.583,1.02c0.336,0.633,0.683,1.288,1.229,1.834c1.149,1.147,2.866,0.466,3.6,0.174
+ c2.104-0.838,2.382-3.322,1.723-5.41C222.328,168.742,220.688,166.86,218.376,165.557z"/>
+
+ <linearGradient id="XMLID_159_" gradientUnits="userSpaceOnUse" x1="365.386" y1="171.939" x2="344.2614" y2="240.946" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2417 0.4947)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_159_)" d="M359.018,181.556c0.949-2.313,4.176-3.272,6.421-2.571
+ c2.354,0.732,4.128,4.052,6.852,2.441c0.854-0.505,1.794-1.634,1.348-2.683c-0.435-1.008-1.702-1.561-2.639-1.948
+ c-4.786-2.01-10.259-1.912-14.848,0.538c-1.771,0.949-3.412,2.29-4.278,4.146c-1.052,2.253-0.464,4.222,1.485,5.688
+ c1.706,1.285,3.739,1.875,5.782,2.392c0.822,0.207,1.726,0.503,2.54,0.938c3.183-0.361,6.069-0.898,8.662-1.623
+ c-1.773-1.543-4.819-2.036-7.065-2.646C361.214,185.67,357.886,184.306,359.018,181.556z"/>
+
+ <linearGradient id="XMLID_160_" gradientUnits="userSpaceOnUse" x1="332.6799" y1="161.3398" x2="311.5294" y2="230.4315" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2417 0.4947)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_160_)" d="M346.19,176.741c-1.972-1.413-4.771-1.407-7.085-1.193
+ c-1.288,0.118-2.566,0.37-3.795,0.779c-1.364,0.456-2.669,0.93-4.135,0.906c-1.128-0.019-2.087-0.716-3.11-1.104
+ c-1.31-0.502-2.694-0.809-4.093-0.907c-1.272-0.089-2.581-0.018-3.821,0.303c-1.347,0.347-2.599,0.985-3.993,1.119
+ c-2.551,0.244-5.455-1.25-7.801,0.198c-2.307,1.42-2.799,4.262-3.594,6.646c-0.255,0.77-0.51,1.536-0.763,2.305
+ c1.946,0.332,3.863,0.65,5.77,0.95c0.271-0.656,0.565-1.295,0.911-1.911c1.718-3.05,5.729-5.265,9.233-3.901
+ c1.829,0.714,2.521,2.577,2.179,4.434c-0.189,1.035-0.569,2.04-0.929,3.039c2.079,0.272,4.121,0.521,6.127,0.747
+ c0.193-0.593,0.389-1.183,0.576-1.776c0.755-2.402,1.832-4.563,4.029-5.943c1.803-1.132,4.296-1.623,6.274-0.638
+ c2.585,1.285,1.929,4.247,1.227,6.475c-0.306,0.971-0.612,1.938-0.925,2.902c2.224,0.15,4.383,0.266,6.479,0.339
+ c0.567-1.771,1.115-3.544,1.691-5.308C347.444,182.748,348.816,178.631,346.19,176.741z"/>
+
+ <linearGradient id="XMLID_161_" gradientUnits="userSpaceOnUse" x1="305.2522" y1="152.4683" x2="283.8183" y2="222.4857" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2417 0.4947)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_161_)" d="M303.511,167.562c-0.36-1.168-1.658-1.318-2.708-1.16
+ c-2.174,0.331-3.378,2.125-4.105,4.043c-1.647,4.329-3.001,8.8-4.402,13.228c2.078,0.396,4.143,0.781,6.18,1.15
+ c1.551-4.686,3.104-9.371,4.657-14.06C303.464,169.768,303.835,168.61,303.511,167.562z"/>
+
+ <linearGradient id="XMLID_162_" gradientUnits="userSpaceOnUse" x1="282.7883" y1="146.2827" x2="261.7765" y2="214.9215" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2417 0.4947)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_162_)" d="M279.927,178.243c0.826-0.975,0.095-2.17-0.32-3.141
+ c-0.439-1.024-0.714-2.195-0.402-3.291c0.683-2.417,3.825-2.43,4.651-4.655c0.899-2.427-3.341-2.408-4.659-2.118
+ c-2.379,0.526-4.335,1.965-5.941,3.75c-1.693,1.88-2.862,4.337-4.831,5.957c-0.851,0.697-1.952,1.309-2.418,2.357
+ c-0.159,0.36-0.194,0.717-0.163,1.073c3.784,0.841,7.536,1.658,11.248,2.442C278.087,179.879,279.129,179.187,279.927,178.243z
+ "/>
+
+ <linearGradient id="XMLID_163_" gradientUnits="userSpaceOnUse" x1="294.2581" y1="149.7964" x2="273.247" y2="218.4326" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2417 0.4947)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_163_)" d="M288.667,177.878c-0.3-1.753-2.064-1.77-3.43-1.273
+ c-1.848,0.669-2.814,1.892-3.462,3.73c-0.136,0.391-0.282,0.781-0.419,1.171c1.991,0.41,3.965,0.805,5.93,1.195
+ c0.127-0.365,0.251-0.729,0.375-1.092C288.038,180.528,288.873,179.048,288.667,177.878z"/>
+
+ <linearGradient id="XMLID_164_" gradientUnits="userSpaceOnUse" x1="294.8293" y1="149.333" x2="273.1385" y2="220.19" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2417 0.4947)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_164_)" d="M291.243,166.296c-2.219-1.479-7.096,2.231-3.918,3.736
+ C289.356,171.395,293.643,167.891,291.243,166.296z"/>
+
+ <linearGradient id="XMLID_165_" gradientUnits="userSpaceOnUse" x1="257.8372" y1="137.8828" x2="236.4768" y2="207.6601" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2417 0.4947)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_165_)" d="M242.406,171.526c3.845-2.247,10.615-2.931,13.935,0.658
+ c1.487,1.604,1.817,4.604,4.648,3.759c2.125-0.636,2.779-2.368,2.34-4.456c-0.527-2.486-2.408-4.449-4.566-5.666
+ c-4.369-2.46-9.845-2.12-14.514-0.796c-4.294,1.217-8.162,3.684-11.25,6.893c-1.124,1.173-2.15,2.446-3.067,3.792
+ c2.661-0.205,5.331-0.341,8.002-0.394C239.215,173.815,240.714,172.516,242.406,171.526z"/>
+
+ <linearGradient id="XMLID_166_" gradientUnits="userSpaceOnUse" x1="220.092" y1="126.3511" x2="198.8581" y2="195.7153" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2417 0.4947)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_166_)" d="M202.628,171.224c2.365-1.145,5.081-1.499,7.681-1.248
+ c2.254,0.217,4.628,1.04,5.939,3.001c0.608,0.912,0.968,1.997,1.755,2.782c0.843,0.846,2.133,0.456,3.095,0.073
+ c1.95-0.775,1.994-3.115,1.453-4.837c-0.691-2.197-2.432-3.919-4.403-5.03c-4.367-2.459-9.84-2.12-14.513-0.797
+ c-8.675,2.462-15.359,9.874-18.052,18.339c-0.124,0.4-0.238,0.807-0.346,1.218c2.617-0.811,5.346-1.61,8.161-2.383
+ c0.751-2.209,1.853-4.303,3.32-6.103C198.358,174.236,200.281,172.357,202.628,171.224z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+</switch>
+<i:pgf id="adobe_illustrator_pgf">
+ <![CDATA[
+ eJzsve16I8eRJnp+9/P0PcDH411pbVH1/SF5NQcoAJJmJUsjaTz2zng17G5Ios0muSTbtuaO5jrm
+xk5kZERm5FdVAYW22880U91ik0CiUKiKeN+INyJ+9pMvv35v/eL22eG98iJbPX3ys58N94fLx9v7
+D1b449Wn19evHh7v1Y/e+erdVV5cZOpR60+7b+mRvz7cP1zd3nyAv9O/3avnv/PZ5av7w83j6pPb
+m5vL+xfvrt6psn++fHwcrl89e1c97Jurx+sDPPDucH/18Pz27vDty8urm2+vb7+/vXj44/fvmsOB
+7beXj/DQPH+/fb/IsnpVf1C2qy8/Vw/Z3L66eXF18/3m9s8frN4rik791a+KqoY/lXrEJ1dfHR6m
+H7a9ff7qJRzxl/e3zw8PD8Pt9e39wwer4cfLm9Xnl9/Dby5Xvz1cX9/+CR69/rT+dn91fYD3+vLy
+cdXhO19/mhffbl5dXb/41auXzw5wFvK+w5+X3+J2//QA+8CW6nv8efvtpy/hR18fHh/h2ODV8AR+
+9fFmgNN++xIfCD/E9c6/fHW4+8//uIfH/+5d3vX+9u7l5f0f4Jnv5X2h/ipXRQbvK+MX/ubw8u4a
+Th++8e6iXrXwh/7PD4E3Quelyy/gBMNGZVtewFZ9e5H3fbeqisw83J6owx+vDn/6YPWr25sDnZP1
+/ePXV/+uPqsG/qMffvXq+nD/TzdXj3CY+me9Ph+f3744XMNj7ZP315d4GnDl9m96xDeX998fHuHj
+vL1+9YiXXZfx7+Ccf3b540F9ZgW9yBd3h5tvbn+NB/lemZcXdV8Vq7JuLrqma1fwXqsGjjPLqlVT
+tKsCX6uHH5T0yjn+hI9Pbac245cpS/VpfQkfyBf3V99f3XzAD22//fj+6oX9VNti1em/8M1cdOJP
+z3/omOEMPD4ebviswBU1fC6uj+zi86/Vq+5uXgy3L9XH8IB3wQFeH65cuHvot/Yf+DvY4tUdvQ/8
+wbfwqX15f3WjNn765Ff6d923X16/gl9+fH/76u7Tm+9unz55R1uCLy8ff1htrg83Lx7gVoYPDj7T
+1eHPj4f7m8Nq+69lnX9/f/lC/X/14rD6Dm6Lw4M2IvBw5/cPF5dXd+9OvNw395fP4cBWXzz7/eH5
+I2zxa/jfLRgKNAf+v+fs+KU6rfc3X9zod3L/6uGH1Te3t9fhu9GPV3f2Qb2Xl7ePV9/Bo/QPLu8f
+rx4er/7vq8Mb+6JwG814QX9n82H9jbzkcHl9fQXX1N0PV89nvOpz+/Dwld1fznn1r5/jJzv/I736
+7rtXD/YV6d9vzEupz+67q5sX8Dpfv7p6FKfm9uXd7YO6b+1J28Gr3iivv7JPm/NOtgdlF1b616k3
+sbv54+H69u4OX4i/Xx0eV2g8vkN/O/OW//rHl89ur68eXsJW5nv7NuyP5mwGdvn+YI8d/wn//+Ty
++naWJbi+BBi0wl+Eb/3LAxhiwEurFz/eXL7EK/TFf+fjVE89PP5G72xfq/4WrLy04u+99/RJm682
+N9LMfwxW9wq8BACtfwIg9vLwYvU9/Qi2CX8G/qlabV48ffIvT5/88umTal9ndVGXdV03dfv0yUf4
+03yX74tM/SnyouCfZvAj+KNXjj/N8Beb9abfdJt2U2+qTckP3xbbfJtts2E/7IYt/3S3htXj6nYd
+/rRa/ezbzb1+4Tbv8j5f50O+xYOAly/Koirqoim6oi/WxaYYim2xK/ZlBh6/LOuyASzTlX25Ljfl
+Fta+yqq8KqpS4b6qrpqqrfpqXW2qodpWu2pv3lCX9fhnk63hz4BrB4es/+yzfZ7lOf4p8E8Ff0r4
+u8zrvME/Lf7p8Kjh3eCx9/kGjl/92al3YV5NfalTyH9n+HeOJ9X9mx9R4v9Lc+Llo+BjcX5KjxQf
+y27YbfBkd7t21+zqXbUrd8Uuh3e33+622+2w3WzX237bbdtts623lf7I9Ac2DMNmWA/90A3t0Az1
+ACdzKIdiyIdss9/sNtvNsNls1vz29sU+h5Xt9rB2O3gBfP0NfeAdHYU+Dn0keCx0NPp49BGpYwK4
+hMelj0wdm/pszbW472F1uFpaDa4aV4WrpFXgyvXx6YVHqY5zp48VzpY6Xr02fNz+5UkfYZlVWZ21
+eOms9aUCn4G+NOq8dT7wDD+ckp6ln9ngH/X8Nuv4A9Of2X4Ph7XdD/vNfo3vUL2vCt+DPrfqaAdz
+Fvb4NvTj9TP4OQ2eBXz34tH68eoZW3zWQM9Uz13r5zvvGYxEdlFWed42AGHV7VYCdL6AK7MvCoS6
+bZb3Ta6wLv3sos/6DgB3saozBb3VTgrRfrt4o80DHo3+KWwCe1UtbtJ2Vak3KXq4R9UmRVkXCLv1
+o3CTPr9oa3k8S7fSRwRXARy6ejYYpFZTC3h0UVf4rKrP8N2oJ+f62aXaXhzIqTvg6xsypRb+Eqhc
+Y3dP/F49d7O1noYdyUznssqLLOZg8OfwQqVwMmQulMFQJmOD/kJ5DOUzGlg1eg7wHZtiA4YTzLG6
+GtUdqKwBWKH1Zq2+eljdGm6wdbtu1jWsal2uwSms83UG165yK9sebBZsv+7VVwergQXEsIfLqgfj
+DCZ/r6xRt+0GdQjduoOLvlNfLdDGpqu7ClbZgcMBw67u0n0Ltgts0dBu+GZq67Zs87ZoM7BpYKPg
+bazVk5u2qRtwOU0JDkLZoh1YL/UG+7oFF9vUFThbsBJgn3bgj9Tb7uHlgDaDl6rBZym/lcN9Cxay
+BHsLXm0Nvq1FL1fDXQPuEC6STFlP8IMbePPwtooW/KPykhX4S3DaYOnA74D32cLpXIN3Un8aNE/w
+5Fx9ZWC2Bvyzdk2Q8b2Z433bqP8t4IgqzwcPYKl31gvDO6vIC3fCDyvgkSP0qDT4qDs4R2s4UwOc
+sV29b7Imbwo4jxWctgbOawcf5BrOM5g/ON+7Zt9m+AmUbQWfRtO2bdf27brdwOe0hc9r32X8aalw
+AH7CPXza6jMf4NNX18AejIy6Jgq4OuDg4DppetgErppeXWxwHQ298ka7fr/O4CrL4Vor1+AK4cqr
+4RqEl4MrssercwPXqbped+v9BuAEXMcFXNElfMQ1XuUtvHAP1/4a7oAB74fdZo+gIx8KdK7lUIGj
+bWC14HbVhbyGW0Z9bcEvga0GPJUbJKW/9naxc8OVi1WIVYpVmQUXKjiImlYjVitWJ1Zv1lqsjVjw
+OZGLwUMXyzlo9eU7WvMZ4qcIK8e7scQ7s8a7tMVPVH6eW/o8M/o8S/o84RN9+gQ/0R4/UfuZ6k81
+w08VP1f6VO3n2uNnu8HPdjCfL3zCcAXwp6w+5wI/5wotGX/aLVq4Dm2d/tQ3+MkP5tNXC06UAQxr
+uiN3iDlzvFfBVMCd2yHKXKsX03cn3p8F3Jvq/mzgDgV/hdZgA3cn3J/q7nz6BP4u0NeqO7SGe7RH
+e6Lu0KHcAR7Zwz2qbI66Q2u8Q9U9usF7VOE0dWnkcI+quxRuw6dP4D6Fk4pvU92lO7xccrhLS7R6
+6kEt2sE13qsbtI2A+uBezeBezeFuVQu2ca0OWVm0sXDye/h4W7ina7i3S3xeBhejsrQDWtoeLW2D
+trYEK1HAMWRkbQc4NrBpcJQd2twabS6cIngnGdrdLVreNVreDt51A++9wvMAJ1udFbBf6gyp21dZ
+307ZXzib6kRUaINztMF7tMFbsIjqzCtL3MHn0OLnUeFno75yBOfqRtyhRYbb3XAkDbcZcDPk1qCb
+YDcsDbsZeO+MJ2U/2qIfBR8KvlZ7UeVHM/Sj7EM36EPJgzr+s0T/qT2o70PhPJIXVVZR+dEa7aTy
+peRNhT9VHpV96lo9ibxqqz2rA0T3jhWQ1mEQS9oTaWd6uWBHaZmkxWqcVTurEqt0VoF0xq7cW5m7
+dvtgia8QULcE6Kq664qK0F7OYLRm2KdBsoa/ADfhlhCQ8fQ9NGitFKxFCA4fZd7QBrUB4fD/rEPA
+WFUXcPV3qzq/AGxUiWM4fQ99DMe/h7a7yMCQLzoPvMdyAFwmAHCpoiwGAGv7hnZ5RzGLCsylQksq
+XgFWGDGfQkja9irLuydspJBRh/Z2IExUajQEGEijIUZCGgdpFMQYaE+eU/tM9pboJ514jLs2ZjEh
+3hKdl/9KLCTS81eAYdgr5CKGlApIxMIRZA8bHYvSdhAMhraAYM3I/jWGOzBz2BrW0JGlY8ag7Ruy
+BT46vp0zSfSZ7ucmTGbDZSWGAAoMAagggF4Agc3/9fcqNACeEQMEeqHjhP8jEcHV4/cdoIWe1pqW
+imTptaZoFpwcFYKDHfW/tmYppKHXls2YWurgDYTM88ysIrdf4NLgEyrMKp1VOat2VourMauzC3bU
+cTR/rYO1iaytWINeyGV20RWYdAOVc+2vI6tQodBi7KucXLW/YMfgZ7TayGomFtzssGO3eK3lgh3X
+512TO26OXWhhz7r+q+5ogpfKain7g6wE73oV8e7xXlP3iWIemnUM6NkKZBmKYWj+jxF45BTrCu5F
+5PzKq9Xk1TTXZ57PHB/4Pfm03DB7xesFq9c+DThDbVi9z+gLw/6Yy2vWxzxes73SsHjk8OAdNsTi
+mcMzi6+IxVtOJ3n8VvM4ZPJqFczlgdXXhtG3gtWvkdlrbq/Y/RYZPnN8tZQhK2ip0HeFC3bEcHit
+aBWGx9VS0Ls3a01LHdhglv2y7ldRcXBh7AgihrIQqxSrSi6AKbBjHVnN5GpTC3ZM/g5TC0cv2HHu
+Y/t5C3ac+ci/+o4h5jt5RRHkG7ejxJQO93QZp880e5Fm8hNNhk9i3MznkSF3jLFF+2VvykGld5xE
+lElH0ZKfqLxO5T0h7yr/jnTv19JZhbN8a5DZpa3Gdh+sEOTHvoZwgWUbtpvoWidXn1xgEzGFmF7t
+5Gr8BTsGP6NVn7DAosOO1eJVygU7luddkzsWxy5kdmdd/1V3NBE1ZcWUxWrRGoHdQfsyoL1Q9kDd
+6Sr1rxPt6s5R17e6djTD1vxasesGcUtF3JqZtVB4ACLiyKKOKWpGLfm0z6bhOg/ZNMYIddatpoxb
+PhIH9iLBT58oWOVEg2PxYI4IbwBvqogwx4R1VLjUUWEdFwaMqmPDOjos48MNxsdVjFhFiVWcOMM4
+sY4UbzFTp6PFKl6sI8Y6ZtxQ1LjCEFTBsWOMHu8xgswx5IEw+JpyepqJWdanOCGcR4osl8Q5c8tY
+ydVoYy2ZsGbImjszq9asu1VyBYeTM1Nn/s6snrm+/aLIgAyE6gXOVscVbKxhEPGIjYhSyNU7q5ML
+tTptsJrIqqOr8hfsyN+XkysREHAXCqRYj3OWhQqfPDvjlxerekN39OLlqFdQwgwM5LZAILVq/AJu
+yazv4B+h1uSI55CI4iIHI1K0VuehH8/qD/34urloq9wRVxz1PPVaqDhvLuo2r1ZeSD3yq8VR6rqI
+R6nh5zJKrULUOqkfpvS9hH40nb8LE/qYgrMJfT+l7yX1De3npH4krf/0iZMWzjEQUA==
+ ]]>
+ <![CDATA[
+ Ylq4xhC3TPLHUsI6xc9hga4HQmTS/IOXEtZBAh0i4KRwR0nhtUgKm5SwDhnAx5UFKWGZEO4jCWFO
+B8tU8AYliRsO4dKfLQVslTxxp4wv/slJqFigoa6MSLEimWKDRp7TyC2afw6tbkhuSXJFTi5jiCdD
+B8OhTZ1srtARNRi4bNFNrSn1PKA0ZIsuTSkNcryatNirwmuqRiFLhy5yjWKRjU5FK9kmOMs9WuQc
+r7MC3W2N11qDbrhHtzxggmSLqekM1asFOnL11WJgSYWW1iruAlegwtl79AwFXnklXXkNJqmVOkAn
+qQeTpM4pSV2bz4IloVtyYIPjvKTDYqekNX4VKf7YhZB482/DCL9ZOwpZqyNYVdxjYYYIbtjc4NnB
+QbQn5Yi69dMnR+HaGfoGwLqeviFQN8S0Da6yQeoa4BhZ1yA0Daxo0HoGrWbQWoZS6xhIw2D0CxR1
+oCiDiSdw7IAjBBwFGIjhr5mhG5Zt2TDzydyox/cYDNnS57vB2KnWSLBKosEoq1ZKqE+c1BLqc4+q
+D6X+0FcgsnoirkLUOUTWUbCSgrUUjprC0VOwogI1FUaZqDUVYEpJV1EGuoppZYVRVRyVd52x/go7
+Hv1lVHBn+1q2YyAY79FdbEnRVVDlAGu5tqSytBpLobD0ZOThl64esOJyKSzXdQ1GnE+ZaBagV/io
+xuSVO5FD3higMTCbM6YXg591qEenOoPRKgNHs74VGndWrNdmZ7u33R1rCALdu698l9p3Ur87VQm7
+3fYschxH1n7a87UEJke1u5DQXGS13k5xCE1VWAivFOGoSWc5D1AMKYVZvhfp2RVzwfch9fm9pjlW
+RC716zOfsZzMJCQ3NUpuCkFmzF3C6gutsmjp7ugxq7lBYKfLNzLUW2rFQoP3KMNjBY7hoOle5buV
+71d7x1pVtNVFWxoltdFIpuAq1HRKEiqXUrmkytVJh0pphRKsWroleLs2GVUmVyG9UgRLUyydZTV5
+VkAyVnnLultNsNbokUIVdelTLNLckuoWfN0ORcNMsZhkMc0KSVaMZgnVLWoex0lWnGK5tjQ3/5eV
+WFa1w39b/U5tlDus2mmNXqcjnc6arrXeWNe1UedYarczf+9N3RnQOrjmMkPscoq+laS3YW2NoXgY
+xesMsesp5qfp3QbjgLomADAcFfdlFDt0SR5f3Y1RnXSo/WeSt0GEuMPrHT5PhRkxTKav+wLRpI55
+jhO+nVEgO3QP7osG74YWMewa74cNJjpUejmL0r6eSJ/WJWO4AUmfOjEl3RcpdfIe7wuf+MmSLOlu
+BsoPsuOSrku6G3Ze7By5DK/BXBzjZFsAtxUFeZbhWI5jWY7kOch0UGXA2NdVCTPfcTVxhcN4Qs6j
+6ht83hNjPvGIfpT7PH2C7Gec/4wpvC3/SSu8pzhQwIJcDgSc6CQW5OiZXRWzzSf3QcmiW64o8saw
+o8kYW+DC2WGRD7YZYMnCQh6Wi2ytzchaNra2OVOfkYn8nsPI4Jrja9GysiN4mblGDS/DOuI4M5Pc
+LDfK9gg3c5kZXMUhN5tiZx43E4p3uNrBex2jevcV77GviHg8srwkO+wYSb07yvn42qQW7Biq7GOr
+H11Ch++p8kNtfria0SUrlMJVjawytWDH0lH6+ystFA2qAPSCHeMVAdHagDNVB5yLjvilotVFlyGY
+TxaTmkcsh/ZVAtpXEWifC8rbIrhK0WwNg/ySRlvQCNAdIIwE7wUJ9Bm29wjbBw1XCKq4OZAeo9Kc
+AwHADq7J5kFkaaOE7DYXUnmgXUMTnRGhnAi4z8zJjCjw7sN3LfsfWCjplc7JLAmAeAxS9kEB3U5k
+TDSk57wJw3pdINlSQR2XScIC4zjQ2hqF0p7yKZlRb2vAz6Cfgb/OsOjCO00BYKFcvzdkwBICLscb
+hBaIyAHnYUxxHlMFXHCRlrQqs2qxGrNasTqxenfBjv1m7Sz/awhWTOVklF6w4y6y0rZ77xQRDl6u
+aBfNFeWGUpSULdKEgv+uucUFUAabN2qjGSSbR9oQ0dB/bzV1xnsPaYe2m3C/xelH5RAQS0MaBGBa
+DMFUhLNOWPJIMmjOP22Fhk3XvGYOQdElkSWJMrQ4Q5dHtnjXw8LwOJOWNV0yiGJI86T1crqKNjNZ
+qxyLeQqi9SUCz0rf4EhrWkNrOqI2PV2EA60dabr2Jr/FZKfAQkz9HabFwMpUJGVRFEivntZG31T1
+QGtjVGfsMXdGM8HVAzkSJV6VWFpao+mTXT1Sqc4QKl5aloMLdtx4SjnPq4eqjjaPrJIXWMIysurx
+NaPLRjquyb1LRmKbBJ1jSalYWspPTLmpKQC+YANqryFCSNZsisqSNZumYrpGhA2sczXeBMG0QKgN
+dZMNEJi8afoGBA4+idYTZyGRo1SWpnL6SlhjKKrDq0ZfSZUUaiG1gyuS8rUDpbjWeCWzZItFW7aY
+l4VbewyVsXCLpVt4l2FbBSngkhIuK+LS7RZ8IRdLuTq6yNRtUZsy4IqsCEu6ctIKubIuLeyS0i4t
+7hICL7BerSfzqqmAmKVeVu5V2KorqT4SuHSHYR6r2t1G1hBbhqxIcmrj6AWDXoeSDk6XnxgdBTsl
+6Gg8MThFRl06WpKQkgiplyS0lNSmCi0ptbTUEtMS2y8IekoE1VLULfltTh+uyft3hqr6ZLUySKMw
+CcWcVG97Q153hF0GQ2GZxq4J93QmzchtT5jSMq2tCE1x7RTjrMyQXCa6THaZ8A6I2BjIMNTiL4KH
+hPaYDjMlrg0xZnKMCwkyL1nFZ2USkg9K/brUZg92AU4dOgeAdWtv9cGKfbW8YMc2sprxlaDyR5D2
+OFV3mmRM0vQ5FJ26Y82k6dHlEXOyCcfR9VjJvVkBlR+j7/OpfLjGyP0E4acw3LwVDQbEgwPxNS8O
+5C+wrdOPOjKFvTjx/dcPY1xkVZvVPfcXtqnIYlWW8GTUa9bAaxwl5+wnLQ12AOmIBjvUz/0GjW5x
+XWYgz17Im22BdWHyIiXlDCsiCITfAWLpkESLYYmOLDnnTjboGSmDQt1dOI/CAjrOpGgZnepEwFK6
+3gle2AAG5h5F9rEg0M5BjMYNZGD/nw0FM7Ys+DSSTxZ96m5Afj8gGdIwElBwS5mXo7S9njhPaUMZ
+oj+QIwe1PYJqii23Jl+5HhOFeoGIMiYNhUtK9AoydD6mRPfV7Oo3rs69MQLEytHFt5il1CJFq6i3
+HQXWJGVkWSMLHVm5zyJI2zdAqf2pgwDXA1B9QEliVJai6v/rjGVDvQC4A4ANJWxy+PwpZ7khqMrh
+A/33jqrx82jYoDbBApuz5ACBzltKeWpO8tTCE6h2BP1tzlLmK4Hkw53JNL9Gil87GcuBMpZ7umdz
+6qLkZiv5XsO7DO4jylcqkapLWF3844SmbMDKBrEqky9JAFDVvcqBoIOTQ3H1bTGFW5BFgTtsKo9S
+iZyhm0EZBAntbe7EEFGdRdQaSlZR6jwiZxL9GqHcIaFEQdFStSarKPOK+6BOSFYJcWYx6B2F9NLX
+WCbzi17fqGh+Ea7UmM6yjKwispL1mm6NJhCosDqTKzHDuktRU+lUTorKR6xLd6sRbdZQ0jSmapKs
+RekaUDJJ2Wwu0ZA2Imx5krBtXL0n3Uf2rvFVn/HsYjK/uG5OyjDyvTEjw2hIxxiVGF/RPGCUdBxH
+QjxKAjtOZQ6ns4cONYnmD0/PIMZIxzT5SNGNwmTq5+ULZ0N+F34HetKOlGu66XBumg431Ddbp7o4
+0RX2zbYpLlSmPX2S6toZ7Qi4rXZCUZrbkgbqV207V9u/C/FI+bfb6Tonjap9lvt3abRXrMAqnSPJ
+zlcnd3yhglTITseSx3txezFkMIJHljYYk5ESnvh9su0FLS5VwRtJeEL9xGWsz4/2efITfVou+r7I
+VTGY6ZlFXY7xO1SLOt/hU1pF7/C7roILPLaNJpncSLrsVbVfwBJtCWCSZp64AzejVuxUUUfVQrqm
+Z7dwpI1ipx33ddYHD89uqgsA5N0q7y+apuidZtQLt2Lxru4gbYS4jiK3ZdqMp1Xupt6Wqjgse0fX
+u3izxUeVned4lisUyrJJkPbGJ+2GgEsaLsm4JuQOMffyd5aWAzGHHTeUx9sacr4PyLlLzxujKJDk
+fG3ycoPJyO2cXFxI0LXOoKVAqZUKb4zWYIcCvxRFr4XugEn6mmo0jYTYNG4yigMsi/H1BmunXlOS
+9Nyp2QyrNtemwZNL0WWrp1wIi23Tp0aoAHqT7bcUPVZq7heo116SsxMN/eS/ADVi2QjTcbetn2zq
+t3Ua+jHOdxv36XL90jTrkw36uNSfG/GxfJhb8NlWe2vK5tvFGaY9VYlmlJkqDR2vsS1xQ23sekPH
+dZJCi4gpT68IkWlWLOtFZU6+JSXO2uTgMfOOf8fqReHSBV+htTm6ZnTr1YxWho5LQs50XAa88G7y
+CHnpLNlBzfYkzJx8j5vxcXM+tqhMZnyagFwcQS+w5XWMfBdOcZmVL65FDlhmgQ351ne4I+PV9FtL
+eVnMWzpZ4K0R9EbadIAVCht1rI8h4D79VjXEywh4lH5n4ZpsfZRqeARgDciy39jIp9g+yW5k06CQ
+ZGMraZ9o70aJtsyMdh7N1tNepHD3OKrdx4g2Nad2SiydbGiKaqfKLOH6ObbUMrgTxL1gkPM0NT6K
+Mhtp7aKs3pEZvnl5PkOnExm+SUluesGOJ2TxxvJyiXzcMdm0EWotyHQryPTOKdGMDcFw9aKGSlM3
+g6mOGVTeJchsJgi1T4LtOKiS/l1EvrOPLjCBIAuYdD+C2vxdm1KmJqsdSn3G1jPHUWpJp48n0FKG
+FXQGoJjizN4AxiCE1Nlext5wKXGhpSo2euo92XrEuXLqNoxQhml0p1rKODSa0m9pGo29bnxC7W7j
+0ugwz1qDzy7nMej5TybyTHwt033iM28MlJrEhGlYPOJx7rxwJyKpeD5T7LLiAlpLM2m3OHVevtni
+o8rOczznoM5tgjq3AXV2dZudWD4tXpuEl0+NBTk2WTUL512KPEKSHRH+jmmykOIXRn4qM9mdIcrr
+CFH2M9lAlJ8+cahySJRtO6MtEeXMSPPdpka2rZFPlXdJqizF97b21iPKALXGqXI9iyo7Xd2I/Prd
+3yzx5ZrZjfO9IMOmrz13mxN97G1OmihxTpS4MNlplwzj/wEI6D713J2+Nd3yrNRd0mIrcd9pGSb9
+bWjx0yck4KwoRx0SY5aybwwx3mpiTBnqHKkL0+KKugq2SIo7kqkG1Fg0Uoq1UnKIsRoEit25Y9S4
+9zLVE9TYa74r27UOZrlSx4jY0ZJf2FEKHYuAAs8F/gb6k0jR77HiZ6HtPLhUFtoIosEm9KamNZaJ
+3gs59JqE81YKrfPQToUrhvxYAM01rm6Vq1/nGuv2I4gw5noWU+GZ3XzT/XtTPXrDnrsu4fUpb2Gi
+UV5uGStTY6Q3RXvH8stIe2HHtCg4RXzdvkJuZ6Ecm8TNzjKfpL/w74D6tVLfqarScw==
+ ]]>
+ <![CDATA[
+ 0F6e9XQmypukvicSXktvA+p7LN0NSK6hvvPJ7hjVnU9uc1RGxZtBZkxtqbQpSW5t7xKDAyrqouHQ
+TzMRR/5b/qYRIXb7GySupu1eQ2F3+3cnO3K4vupoRikLeyIJWbAU8+YR2Tsu5JH+gOIkj4ylX7HY
+IuSRuQhZUnAyzSt71UgIv8trVL5nTCixwyl+h9TuTSOUPF/YGaPb8JSyjinQHEa5dCseDaxO5YrP
+JA/25XHDvXk/41xywS6nH0e28AjOQRu7BG3sAtroFPGaqkdLCy01lJnTzCGHgh4CbYxRxA6hm0sS
+ByeTmsqlwo4mmxrLp8rmS0bw7BNFhyQ2NNbW9ryVsuedIIq+6Lnpmz6s4Nb1QJPC54jsOTIelYki
+NtcMc6pzqOLGWZr++e3EN2aEmRxpZqmgGGqmmikZIpgTEeSWSixVdgeYcTt0KVRmOghUEB1p54wk
+07XPWyFbHqgCb08Vzxm9bGGkywUytIaGgbWm8VJv8qW2u66ub94HLZd4yGtFxbuGGlIdc4QcRvKm
+rWm7ZMmh32lXVx275PA4euh+9WLZkq7WJ4GJajc48ZgDCqlgCIVH2rq4ZBDuqzAvamTJwYDwKCE0
+dBCFyTguPKyQDXOjtuFRKSpjd6ImVtPBFss4YoNt/dZHsQawo82PTqCE8wazpIeveGNUzIircLxJ
+lPolhMWC/AEsG6N/XuYzJIBOVSj3aIhRwLVXFRrKjJ3cp6SAcB0fnf8cz35ib/Pp6z5GA4+R/s6g
+c7PEwfMymkTyEuLgY6TCHtWDHU8mfPEMZ6IicTTHOZ7h9OsHj89yYvebUBac6vy/Ia9hx/l5eUwc
+67cjD2G7/8tGldajc3vELvKdpWr2N7aNovudbm/bGZ0UFyx1pJXiRotww3p07ziCJzW30YQhtixL
+EDw7cpbuqVBVOyRJXZto6Ba0dBN19DsRiqOgm6F4WkRrKZ7WWCEzKNpKNSxiiqd1pjp7qChQ7Pl/
+TYrHv84qRcyYlzEd66jhLWtARyne0q2ogy+/FX0maRsr12UiabaJUrwlu5x+HNnCIzgHxesTFK/3
+KZ436EcMETYNbPzWNbWgcA01rTEV/ThB28/3RTN+oj+om/OrKOdHZA5gXjzvN0boHErn0zmAotyc
+yzbmygyh83N/EUrnEzqSTMVksn72L0HpfEIX9N9NU7qIji6YIWUzdZmTr6O501LICgSsNLWlUtLK
+06y4e1DnCFu50rQXWTwib7Aj0zcxJ5pbrAgCVxJ9q2ims83p6SnMhr7hpOPBVJ/6BK4wFail6Zrb
+YAVqaypQe7f5lJY4UvzVz++1mN/rohTOZvc8Agdk4jgKVzurEqs8ohmJbEOymaBqI6DVkDXRgRPu
+m3j+zjY0GiVsoZQVrIVXTRrJ4Y1Xk3qEDXOuct6c7VY7k7L5hA2rnOdRtlnTLsNplSlKJhryjBEz
+n5rFM3Pp6k/Oz0UrQJ38XCRDR2BtjKB5WTqHoLny1A2VExydpxvP0sGd8LopWlpSei56Nl6/OZec
+RciYQ9FOI2ZjTWOOo2WJTFyiIcsYJfMzbj4JS1Vnevk2pmBYfhSQMNt4VNCx1lCr1lArS7V687fb
+xb6j7/hnRLhwaBl3tLd97U0DSteHHEW+hF4zlVvDkoyAfNmu5s6UnDHaNanHdCkXKiKs4iFoX5am
+YMCjsyZKwRr1A3wWzuh40yiYSvooOaWdLqJ4E/XOueiITc2iYEu3IuqDpzKgLngaV2bSySQFW7DL
+6ceRLTyCM1CwKotTMPi5T8FqZ8mv1qNXvbPWXr6MMmawo5c1E1RL5M6czJnMnXVO7gyoFlAwn265
+hKty6JYkXJG2QYpwYeug3KFcbg7Nr0vcWsoVyaBVkdZB4TzJGOWa3TpIN9MnI+/5JyBcwfheb7Cv
+zoHJ7wtq41MR5WqojQ+PDa6pelDnxlqRI+OWPky0ZEufnRhJstWdK4lmcVdgTbEKmSETBKuN5sf0
+SJKt6fqrKwp5LEnpEKw2TrAc+aSC4cruVqYhQmsElHYa5S4gWI0gWBuiVztLrrDyrSJ6pUiEJ0zx
+JiNLfBXt5Gj6OK49EiWBpYWWLricO2zOkqkKRcsm/0UdYm1jnnFCFZNEptvzBIM/EvWB7vAPJFTw
+uS2kVD6hQjFvnFLVwaqCVTpLjnIPqBPsGNKnFIFahwTKo096qHtS4hhmuEb6nhr6BHYnJXOcqu+L
+yxxrCi6cTKDMNW6ub7jyvevbUKgjKu7mUKEz9N306FGyKm9+B84lfTdnyRaXtcCJ5bCIQo1QpghJ
+2pDttiQprLnzRYmGIGEAzI6OcuZUG08qKZD82+abNma8l8k/Od8NZqbzlkoXmB7x39Sn36NKpw26
+Teal4B5Ljrk1NCnMRKVJUURcGGaixNDXTgScMN9PFCnD/leCIlHLFx4wKCgS//uiz9V099jzPYqk
++riUIdVRmHomTzpuByJL1FXmIpNtTBvC9/Q+Vnzw42Rp6VZEUnRTFDm00Xk2nk+5TZwsLdjl9OPI
+Fh7BOchSniBLeUCWQgK09nJNm5AS+ZknMyABHBlRIjcDVSVokcxCOY1abB4KpzvKZi1+LqrzqJHT
+sCWWi6JJxqkRMTYbtXPq0AQ5EnVoSI1IMLaAHKWokakAY4pTmDwSrzIXrXVJEGglga2oEgMChHLA
+3soDRYaJqc/G5Jpkjmkrs0xmweFgL8hiJNPUyUwTLptn2lGeiYefYGMVcJ2lIUI1pUs517R2qNBO
+EyEv0yRpUEsdMONUKB+hQjtJhcaJkDNrR6oF7ZfbqN5tUu+SHQEHPcIzMsNNkh5bA2ZzSBhykP1I
+59CesTxSKdqihOK/SDWYN/XQnXuItAdnzdrJhycQnyTtKYIVzpvI5BJlQ7uQ2ABJGRLZIZ/eBAQn
+oDdIcHC0w1iWaJgt4iMZH8WaE0K+qIwvPS3+NTQyOQPJSVKYCZJzFL2ZJDknNh8hknPG9iMjowDO
+1H5kNNOjaYyt1+W50A6JEVmenal7L8REaAzLBmPCdmLeO48MkxOJdw5J0ROKDVHh+uo8x1nFLKxn
+rQZqNKQ1P66VJdGXkbwO1Qb7s2qNj4+I5/w8TpKyxAgL2LvGCe5QGCdJYYpCAVKkMJjVEBQG6YSW
+3HG91RtJYSrqR3mRiaREQztddPgG5zGYpTvp4yn4cWJcA5/OFZ/NSQKzZJfTjyNbeATnIDBFgsAU
+AYGRWpCdWIEldua2FU7/SJG7wSoIn6j49U+D0aN4ZCWSxamwRXxjMjk+XRkSdCVeDdWaxhkx+dwu
+2mMyJCzB0HrU9Z+HsEjNY+3QEEtHOrGYjEjpW0+EZI1jFiQtsbVLtmppJ2VwhqIUgQRO/19FxzlL
+49ITztLwlMYEPXHGxyM9waYF/jCGQRIUHMeQi1ommafpiJwIehK0uvAJynAkQZE8XzZvrczi6ViF
+m3Exs7B2Mu9i5l3ZyVZpKhKQkUgGRs/pa2bTEbdLo5+F2ZnmFKIayUjb4p0aI4TEpyPwOZ+JkES6
+E+yCJXtVDBHCYSkH3CUB7YjXDcXEaQ7xYOph5rvOmywX0I9QpBYd5xHPsozWEZ2rnYRDQI6p65lB
+JBbKyiLkIlH5My0zS5IM0QDi+E6H0QzKeAOIkwiHJhmWYjRmJu0QrelpQimZJBiAFxozv3rNQnoh
+/TZCMEkiqEKX6cSOJxRbYkGEIqNKXUMrxGChkoNzHtk4otUfUYyIcEzmRizBoNmqmFknqjFNLWIS
+sdiMy0rMuBQDVJQtY6KBwimHaKBWCokGaqks0WhNC/1OSYnq2PPfDKLBqYwMj5OeXeuWAnD0zB70
+wY8zjaVbEcRnAZqjT2u5v3xHm9tt4lRjwS6nH0e28AjOQTXKBNUofarhoNhCLH/Mc+VQisbQCY9Q
+wI4y+xGpw3GkYalqHCsPA7czmQdxJWKWWnTx+XJgTo5ptODW5dg8iJgxR80WQmIRrcpRg+kNteiD
+tTG5Cy3iGkzuwhIGK+caDGVAMRcPIObRxDKrIdrF5zTYuCKBl5R46QvAzHEDatHTAOXBbR9PNMK2
+QrBCrzqY6MatEDYIObdII3amiXxmZrrx2HaT50DHyIPad95UN00i1GxF7lOpxQREJGiqW0Gj1Gsj
+lFx7VCI6MFeMzPVH5Q4ma8FDce3wWz3olinDGGnwaYNt6m5zGNS8gO7UMeIQqYgJBFy2q506Z2Eb
+A9nZTlKHMqAOm3M2MhjCr4231s7qR6gBQA/YcYwgMEWIZScSIiy4w0Oa0G5SlSzTtSwDjcSYbjcw
+W4yFgwdiDQeSlVuLqMIIGRihCkeThBGqcAJBmNEk4OQ2AcubBCSblQfCKaIDARkwVADnweKwmYEH
+zWgtw0fcdD3zIL4F+rlpysOteSpqzsM1nzy+pKbQl8rBt6ZNDzXpcSjBzO5shgYEJMClADRkoyHJ
+IeaXKS8aFuTHhttHoT9JQz3g77Q3ga80FWiVQsjpEM5UwHRt68xjElSgLWqFCCvZ78sCeS6NH2EC
+J21ARMDAVYqBa/SuxzHDsc/kAAt2IdiNJ2llm2dr2MzlMR3/egL+L9jl9OPIFh7BOeB/lYD/VQD/
+Zc/vRqw2APecMeipRZSF9zZzoCQZPtAPob5fCSLAflgNgj2h/J5qNKdKwP02AvcH0YBbgH1M+Uvh
+U6yzWkL45AyV9gvxk2X4DuAfxNoYSdJW/JTFSVtbn2G+s2OYqdk1SpVs1UZOLa9Lyg9I6ZIP7tc0
+pnlD8iUN7VUxs5kORfA+M53OqBE2wXsX4MuRzQbeK4CPIpgCazo0wHfHNnOmYEsypp0Co56QqXEA
+voqDy6qOGRC/E0jRmem8FgDeAfEU95cw3gL5giR8EszH4LyVJHmA3oHzWI+Bztr2JAtzAa40ya/J
+CHIBTqH7Jtmu2gX1a8r4eNkABPS6wmc+qO+D1XmrdVbjCYokcAfoDjvGwLsX4yf4Hsb4I1F+rKIY
+j/THhEapSD+AeLAtLogfr6iYITZCYedEAwZnXMrxKwnCR6sgpisgIjD9hEHAE9F8hPFHRfSn4vmJ
+QvJx4L4NoHq0BJzAugvVOWpPEyFVRp8kxzTewhHOShBuobgF5Lr9iv2bIXknBLIb/TfsyB00B7pv
+7Zy9aYguI/URiO4CdC3/7PTkO7eDYaI6wZf6+MDch+UqaCD6DfZDb4C6nsFjgXqJE2oQqLsV4K2p
+++44mB88/U3A6VSIYB6vETY9p+VoOw2VGcXqC3fiabw08Ufqi1qumrYNvXiXKFxfsMnJR5Ete/1z
+YPU6gdXrAKv3Yq3F2nhLYvKdxOMuIkcEU4gSBD8EH+Jyqe7ZOdNjEZfjeI/xQHxvAvH+aJxoIB4r
+tttIiyx/kuwuwOaJnsdOxbaPzaWD2FmkzYsqpHOjxuFgOhcLFNjlseQ5rICWqgB7t1RDbVG4xOFW
+o2NmtOoprTrMjiHWAhE4FxIwEm+DUPtAWHznhNoLN9ROIwQYi3OwfZsOthssbuv2HA==
+ ]]>
+ <![CDATA[
+ JI4dvMexuCSVjVi1g7UruioLEzrPaXqRh7jh3rCY26hvxnA39QF2A+kCd2NO3UPe3rRUvyzAD6Z7
+OhxTEe30BZ6NvbdhOB2vrhT2boJVe6uS2FqsIoav9SAWL0TOGNtF2Sk1jYeykTNHg+XxcLkYWpRQ
+1YCtOHZWL2PtRH9e7EBxTqw9EvA+cQ7oSCj8qIrjWXqZoOJ4cc2xwdoj2DqFpqOh7yiallhaNVal
+uJaR5JOKRQez9d+s6XSD2jyGrBddNfQgMh5HhpEaO6M7mF09jqJlqDuKoiWGxiaVenK0Ge8Swc+J
+sHYMPTvt4DpqBkfMPI2lecBlhjM6BJY2ILszEpk3EUuTYAW8eN2YYDXDvpYbJc3B0gt38oZz0sgT
+DUPNSE3TmWkcS5++yclHkS17/XNg6SaBpZsAS8vA09ZRvssVj2PnhEgEaoY7sTLoxe9uFHY42gYx
+bTkpBLEzxn3Sce1Ur6MRGYso6B1HzxzXZvw80l5Wouci/OIYtMXENUlOrOhERqc7gZHB9hh8bDXs
+tqUrF9u6QhQ5uLEkpGzEKDi+sTNY2XYgsoW3iJYRlUm0LIc4OpM6wJLRIMcIXtaNABtPmhLgZRct
+Yy8eHy+XYhVm2evRouIwFj0QK1w7uvQYOo7HpZ1OQRGpCarU4ajD2PQUQt5FleqEj+HMHoeQJwUn
+2O/KIuQyWIW3ZKpGjr7xUTDiYJpLMYxg4RgallFnr4cPisqySCefROw5qjN3Ys+6u5XoZnXE6M6U
+1nwhJh4VgUQx8Ylo2MPEpyHhSKTZYOLlZaoG/0ZRsCkxTUo+LPLVuDd3cS+iXh07gstP+UAhQuxE
+e+6NGLO7cbDtjv7W8RGSF9LIXc5C5kWpfIHXVW0c68qYcQLrMtLVU4CUTTSYdwzf2kqTjYwME761
+eScxgUbZhjTaNUIOM6yP4G5DkeSLjruKvpFolxXHPHVAg1TVs0X1v2y5EeYcuLt0K3+whFSLNNxc
+h/XkE3j39E1OPops2eufA+8mhrtXwXB3Z/p3HqzCQ7RxlYYdj86ibD8qLJCth239genBJDycmeQ3
+q9lTbNhGhl106zSsMdiW0K2p/4xVgM6p/0SDYdBt7a2Wai0tdu0Efu1pwHhHTWJYQs0yat0yfks4
+VkR6RV2mHFGgVReNaB7TikEFqLwAdBtBsk4/TVul2TgDyVlevUEkuyccqxpaFwGSXYuObXuT08zN
++A85tVF9RF5e0eFXlnkNDlaVkdyeAsWMVy1iRcwKO7pR3TRutYoKOektwK3BAHC36Uts4lt0gIBF
+rvjJLMKuDnLN3BV0mt85a+tFaS02JXQq2vO7CNWN2IbyZl/gbGK23kS1I1GqWw+pMSpYhwUolZsM
+GZw6V4Q8E3WeMMFsIibrDLI+Co+mIrNOI5Wz1TLGGp3YGkQRf7VDe1rCoTpzycVBGGURGrmNVwsf
+Q5yysKUwdfFW+6YjC3UwQiWNPWWkNYk9qRUVdt51ap+n8WaXHHpvGSdmWzT6RMWsgz6pTQnDPYE+
+uckJldjFnu/BT+qC4aPHGr6diT+P20EDrZqDgDk9Dp9dqSlXHWpjuVJRy4XHAOjirQj66TYfngTC
+9sI3JYu8TRyBLtjl9OPIFh7BOUBoYlR0FYyKjsDLSoRNaycV3AYh1J6EmgZsYvBhFwGcjLk4nBpv
+HC+rAkmMgJWBoRxBw846WRuYmNqlQCec3GWwsxfLhkPt2ojFQdFBNIXbWXCpwAa28OUAaUHNPyzA
+rAJBQeeCTAExSVSgpmIZkElt251mIC7MlJOxNMzU7UAYZramms8FmrujgaaUy1i9AX81AkwKOEn4
+neCkBJTYlmdwxAIMKl2hroGVjmBAinXdCjwfWI4JdscaqesAdygcGOZDSwEWXcgYQkcObcrwZm9U
+1QQgYcdmBEQGMNIHktHJT7F6uRSUDCUA86vmXheYnAheBmByAYwUYPIUEJkMafqVbnPCmlH4GAeM
+fuCSx41sfMBoe+ga6LhjmGiqn7U8i0Vauu5Zg8SS0lE1juVliZape3YqhNNAUYYpk0CR5t2tregg
+kXKPhiR9gCjGBWDqIQEXK9PpTvn+StSjNYCccI7vRffmIkWOJObYqY7hHYXSWjMWdQZQXLgThU65
+QZw+mYyv8EyuqKxtFCKeuMFJr56d/rrnwISJ2bJVMFvWkQLaLx/zMe6zreUc5GexH0pQiyDg6Leb
+c8WocTlqpvEfeJx0sZg7RCjdKdtBgGZu61wM6Gcm/ca/ewoiiSCiSIdnJv9OX4ASLNprqE+DHM3D
+xVwS7w00O2VnwooC74kxPbahUe+EFrduaBELuzTmq2KhRcBGp2C+Sizbu6QQqE7iuj21VeRgYYDt
+wEO1TtCQ8Z0bOEwiPIHvKOkdmT3aB8LQoEmb6LQQBA9x6NIxGG/trd5bsjqu9UKBIZLT8/9CNDeO
+52RgMMBzNKYrLJ9yRZ1hCjsZHgSrcBymm1/cNAujRcqepgqeJgJ/1L0gHf47uvRJYbpEAHAcw+0M
+aitGw3wuZuNmorXm+sbWWZwmg3laJsQ4jXvwC7Qm2DAmVxzslhRQCryWQGvIGBVLrAxui4fxInNx
+RTg+aDdoMJueRSkwm5LGaczGtUiE2WozlMU2FvOf/2YAN5Y85jrdSXDLFBWZaYo6QzyK3JZuReAJ
+T+qKzymnqnmQienHZbaJ47cFu5x+HNnCIzgDnKsTcyrrYE6lU1ltC323QvW4i4bsbNiuFGE7O9Yk
+HbwLwJsJ3xVB+K4RFUUhfLPgLVbvPz0Dsue+wXijmw6MDM38UJyAabwKL+vrh+UwMAfwbSo4J8Jz
+FJzzc8CNHFoP9sPNA9vR9Zno1ssButaAtSGVB8b6mcbMI0WoBssbRez4UNvlmjtfW0i2oQE+HHLr
+Alhmx3fYWh2GZlaNOArOYuE3rNoZze0GIz0mAnDUqTkNzzpvucV9TQSIGSjmATGrIjwWjMXytAaK
+wR00mqudAmMhFAO7EUAx5ZxPhGOT4TIHji0EYsnKmIWqQKcKfQR+CcDVJfKqEnDVDLhsrxVH4dIY
+kNUKkNVTtxDuGWITD5aQ7grv7p6RQY0CLeqSDRTNQK4EwEpMzYwMlEnDLVPmrZOIAm6ZMeEtRcdS
+cIvjR+ydfbDE4aU03DpxB4JbjMZySgBqjMTz2FqqRpkFt5ZuxeXphM+cxGzNgsCWO0FNwK0Fu5x+
+HNnCIzgH3EpMuquDSXdWRy26VuYeoGJQJVsmWVDlxMScIQwWWm09aBUK8iohyHOKtTFf48fGUmMZ
+xrKjBlzByXXglagvyR3o5AIoG+2y8a7GhIhEzAsb4odxr70np8spGxfGvWxDI4p8YXuQvRf7qjjb
+ScnvNJyqKe4lwBT19fPhlJ10aCcjdAIwSdAkYJOJZ3nA6ekTDzrZRkM+eHJzl25kS2QvuagDPWe8
+j2gMPm3SsS3M+Ej4VHurclYpVuHFq3KO1UqYBNfvHKiUBEthLpKamY+VX4zBpUjcimiXhUtzMoZH
+ACBHjDYOhqZlaQiKRqZ6HStO28uiiQg86gkOmSmcJIG2gMiDQya7AGdZqDB86MOFaAyAuGnDnlun
+2cZpXjHXVIYwAoRoYPumMZ9xJL4UNrtKDrQwcEhlhhw4xKULOf3KoCGMCCHcwZhM7OlvBhqiFN9F
+TlN7NYShUomLlrfRBz+OhpZu5RUYy+RjzRE2oVKjXeJg6PRNTj6KbNnrnwMJJUZm1cHILDPqRwSP
+hPrLzwC6oSRfCzag4FignqDIVoaVfNxjg0prqQqLlCOM4Z4I8vFwT2NWLTRbvKzUzp6atRMo2lD4
+gkb0KR2XCBcVHsaxIaM2inJ2ZgItYxxVPiCDRr1BOUM0aBTBOVGUU5tVmcWnonCxjBcG4iydxDPA
++AyiiQWEXKm/VmT5ASGbr5Nyf7c7+lGoxsM0hbdyZ2UebrEhnp3B2xK7bKgQPIVfJhFMEO4ZaFrw
+InH+yQhmRgDHIJhlyCUlpz+uzHM8nBNDKLUZsreOTMCg1gEGqzAq2RpUYjAJFRcVRv/JjaQqPfLN
+wSmj2bAQmZjxZaZdYSQgkx6x5RRAp/EJirs1QKGgDAMUFsQTfnhzAQr3ASlIkI3PLgliXDRm+uQM
+gLJ0K4IGrJjPKaChnTu/H6GPGkUoC3Y5/TiyhUdwDpCSGLZTB8N2ekeT3HfOcqGIA0Zktw9ZE0nD
+qyUc8asj58iUEJKIQTb+hMzGASWBTMlIEPUw5T4COFzYsaGQig2u0MB7E2ApuFs03LslzS6sTcaK
+wyzcq4671W0pZ5VHZ0ySxAjc/RgEqQUA2TAAUQIHD4RkvIQn2tFyoYYFG5x7isANOKo8yEFZEbgr
+EQo7N0e6Y6DIqzwddHhzyXfO2nrAQoCL9ToOLmDHEF7MARjJrm0k7BiDGAHAUHkIAzLmZH6OCHqI
+gSLj4Y9xcY4AEzGZ9SkSHSG00eJKCSP2QVd96qhvAMWectYyR+12gpfBVKIcnjAvmeOBe8uDD2by
+qakHnDFwJ1KPyiCCOjZYEFGzGPoiZyENgYiKW5hdtNzVzH+6jyF0asRDAMyLZ2GIo3YgDMGKj0Lq
+c0qGA40ZK6fbEoxiiKVbsVhbS4vplHKshNp/XZB6x+4ShRALNjn5KLJlr38O/JCY1lEH0zoIGawF
+QtiIRI3ECbto8MJDC9gx08cLsSCGLG4TQQxEDc5MberqmRp+F8cMW2ft5CKlxd6MiWN0wD1sS8IF
+le1oQGoWRggWI8geXZmZL2EnTPAk6t4PU+juVhhasChhFk4QDVdtTmLtIYKOBrC4qECkVmwgAlNJ
+gwhGuCkWNxwRKlTc7gOIDLR9N/0H5mEDdxqbqydeewjAogA3yCBwgNe5VWCB6KyEGQkTCghOBhxO
+xANzUiBzJLpTSCAi0T01sIDv1Q0dcNdB25XFdmQxoRgx7YV9vK88s8lSuH8DQX4kiQEflOfp6z3P
+NxdpvCP6A6d9vQkGFErRIOS0VvnRmtDBG+nsGzxw5aHh/zn3eyo5OcFNhmb4+qU7sd6E3k1B23ma
+XJMWGff1C3Y5/TiyhUdwDnefaPhfBw3/hSP3HLrRYVi3Lh07BwI8147Dady6da9l0khD0OhkW5Ir
+jrp3UkvkjmqCl/2qhYqCKT432uzJ3aHjo2ErWx4V5bTctM68Nu6cJ8Jays/OvNLO3BOrbqgaNebO
+7bQ0TkLwV+W4bd9xcw6BKT3lERCqNCKX4MpLbdtLUePtum/feWPT1Cn37eLIzll2roTrpmtzTQWO
+WreVdIh7zFmHuYEkdU8JQk9y17Oc9YiE84RamoiE03PQgXv2HXJFDllWKpLQ3bhmdsZrGvmw9hqA
+7W2lnhe+CmL2eC8IR2yat7ZOFips9xQ26MdWwyl3zLKCiwLT6MIdm66JDTdWfEPdMdfNFnKke8l7
+gqOENzLTHy/dypM8FLIhZMVNB20aYNwhL9jl9OPIFh7BORxyomt4HXQNF85WSgEKJw==
+ ]]>
+ <![CDATA[
+ zM1uV5YKW1btOF8aAT3Frud25LbiSNcB184SWXPbg4eYJDPmtVHMmbJd26yFYtWlw51j7Hmn3a1x
+uHmKPbOcMeJwbcPFnFZm3OqeRAeha+0NfJAxc3CuBEdi7DgmQfQdbB+yY3C4oYNtnFWLVXlutDTX
+UB6wXuNKUYySdqdhsn0y3c6SQcehznOUc6LbXBMxK8o9P8LNIr+YAxWTYDvjMG0vUZEzI+c5kADG
+rZPKTdd36vnuOc4YazWu0kzgLMyVMDot0jawMQ5Ta+uEwzSlnhielbFqdEYmYO0/9c3wlVyvyIOQ
+tYPjMoKGy0i1fGzUVS7ciTwUF0gW8t0g9+Ugr9kh7iRP2+CkV89Of91zeMVEb+E66C0sbJr0fbWw
+gNL/ufRzHXpAumsSEeZogYAVylkSqsQnBip7ikCrCF+bIVg74+usVJ+EbFpfRzSvodZdnfF3cq6D
+nexQ0GQH6e/WRC/1bKKdKlZrPWhOR8E+jf3ahk6v9G2BdxPk0eSFHTFaRI427eEi/s1N7Mt+dI4X
+M35MkkLpx8iTUdlJ6MuOkI7RBOfuKG82x4+lBF/He7C07/I7X0u5KWFKEU7JRPbDb7SHSM7DUAGl
+M5M4TC9j88lG2nGE9Z8JX9VwhJX4jPVVpUmn6g4uIw6LDHlFI4J8d6M7zY86rNN2IIfFk4kKyntq
+N8ONRhuKm87yWEu38qO/DkfkXKQ+n5N+a8kupx9HtvAIzuHGEt1J66A7aUDUXHflx0td0hahbUZK
+xU7rFLe1FUuEtMg5sYPi6GdJHM8O6eyMi0JKhglJ6aRyGQeNuKkh6aaYOLbCFdlIZkXmqRBCJY5o
+yqov09XIdK60gqXj3VJml42UG+djHVDEBQlhkXFBYJjdCOUpbmgeWRonSsLZHNV5cSIlGBkfJhpl
+6IwBXYfWzcgaR47Jbysv7efToTqv5DjUvjLnZ7oVPLsb7VGEtzEtDAv2KextOLHX2Bne7rPfDF/D
+mSb2CfjsgvF8Y4aG4MNGXc3CnfzAJtliikbqrc1r8CZxP3PyHqceQ7bo1c/hYRK9Duug1+Ha//J9
+ySCEla4/ccdaEwmiNPlRHsWZYVKKxV9t1HswxTHD65jkYMuV6iSiUwofwX7C0hfpLWwOTGbBvDwY
+NdqRgzQmPYbxB9YnSM+wMUky3zv4+SsiKdh9Mj+7h5jlGWKi0WOJSDBix6vlJ2+wJgpNgiq3VVAQ
+wLUDU5T1t6NScMifIJTJljJJD8ARsYuiV4ZPeACMC+nHKJj9xroARr2lHBlbcN6n4VLTGS5g4U4c
+r6NOH/qEBlE2w1lGfcDpm5x8FNmy1z+DG2gSPdKaoEdaxNh7wgunMUaY/fHKRJ3+Y67Zl4ZfJoFs
+DSWrD23mZk16Rc/Q+0SBmnfrmYMbbeZp1kvelq4RMHrOraj8YBLAZt017K7EweujZUQO48Zd6mPX
+nimfYcx9sP/0iWfMjSmXE7jnAvnxlegDNQnpExPRWCH3S2w/uzfU0SGOnnu24weUsRaDB8z5Tcb1
+jMHWHZWExaYWSwBU3fE1hanrazDCHXu6Z7FFRx5rbk0/yBkG+6gNyDIRkC5l+8WCAz0N99nWRz5u
+rxfuxBRCv5dSTnwpuAyuIUW/3SVur0/f5OSjyJa9/jnsdaLJUhM0WXIroRzLLPMSMsiTKuOXOXrf
+Ppu+TEIpvhWgW1rjMsgu+LB7pxrzJu0x1+d1xu62ppFAZcIwMj8QV4iT9cW2vaH9tbWNtuaxEbZ2
+1NoG0HmNGuZj7e0sGysX2tu0ffV7haLHNp+hnJVo5n57drUSttTU7ZlzFs3wp+2piaaXFGBne2p+
+0dhxYG+gPeXqolLEhLkQ6aLmQuY59nThTgEet92GOZhAp3Lanp6+yclHkS17/XPY00SrliZo1RK1
+naVJybL1ZPs5UkHk2E+uvt3ZqlwKcevGIJVRH8kwxVqGKZL2kqMklWcdc9PJd0ftFlwLOY5Prcm3
+qenSs4a5buo3Hkpw7OFsZDkdMI7YP08a7nivDc4oR+bgnT+2c6Y2WXgIp00/2TldsyHsnJG5cGyX
+7Zyh9/oWjz39TbBzjGZK2ZmgYJRn1B360McN3dKt2PJScNixl0yNhb2kXeKW7vRNTj6KbNnrn8PS
+Jfo9NEG/BwcR1sKy+QHbtbFtUe4umhtxno3bOLZkyawtm7Zmsv/4jrCdZdd+6DRtv2x70VzaKmGt
+rL06yWLNs1K+jZJJV3MGRZcH72xoPQzVQtI7E6g0bZOMTF0XSwujZCBXbea1voFGCYV0mDXq1H3E
+z6Z/XNSm3HnaKC3eis0kKby5/Fzf0IxYah5wOmGVFuxy+nFkC4/gHIYpUUjeBIXkDrRyCapvhlR3
+SUNwTA/ZThidBISC5YlnqX3ZmoyMNTMMkxKGxnQ53gmjkoBBqrMmP+8YoBM1JFTnZt69ptut966U
+EQXTaYwHUVg2HNQ40xoOW25a8kQXMhymHcVFbVuOe88nw6EzmZW67UJRLt9tI3bjlOeT2eAmCZUs
+m+SWS7aIQx/4uNlYuhUbMjrwknpZkPUhJFSbNt28TdRsLNnl9OPIFh7BOcxGoiC1wYLUWpqNrTQG
+eJN7tzjeuvbG7cztyFeTe4M52Qpzm20xXUyGxLvZvObP9DqOEfBu/9TN3W9MQlOZL+912sKwFDMY
+LHozs7CxcurZ1BbmQLpt4ul//XvZqPud7CWnyqLZy7a7yLreuXMW7ELHwUiFi730DoxuxLwpuvKr
+6gKYZLeq8Q6s5MEs3YqPSJ+3iiQlehduc2uUJNIW5Beqw5FzKKfu4R+DKIfLdfEbPN/03E2Zk1Oe
+vtyaJKrpmua1WxPmUtEydMOQUNSYsC6BYMSxMsxmNjTPJGZtprjJetMJq9N5r98IozF0u1OsTvvW
+6sy3OvRYHpDr3yH0zSyrs3Ar3w46JoPO9Vyrc+oeo1aHrdaJVmf86cutTqJaqWlfu9Vx+2Juooim
+pqG1bIG2SQuU6M4o7ZCJr4xYo2j8JG2Tet1bTyCwDfbo8Qlcg7Og1pbsYB9B7CYk7SAL0T5K2CwS
+7kZs1vDWZk3YLKZM3OXXp0w0m8iEFkZs1tKtxrEb2xsfb00YraM3ORWvxY3W/Gcvt1mJ0pSme+02
+a2LwuGO7WGegc2ZRvZdnJVwRbuuHdxxbRjl/x6INcT6XjAqP462erBv2DHUs3Bqbn6h67iJi59RY
+4Q22Ud851s72TC2kzbN2L2L5aJCvZ/roAn9r+eZZPhMdkc05eVBdJMY8YvmWbvVmWb5j8V62CC2e
+w/IlSiaa/rVbviLooTJh/1BPoPuXaDvYUuB7M47kIr1DpmxhbbJObBN3ND8zhfICjdNcoT8NY7BD
+GGrstVhE7SNaSOx34eX1cVKotpRrbSlxwEQetZeZaW5Vu3bTyflRrfUs+4mW+i10nGtAbVZKKgdy
+7v8slAMkDEob0MVbnRj2O8qCztnlb9aEtolygzaLmFBpQH3z6RrPMdNpSxHcLpCdUdkH8ixjRLkh
+lB64oIUMdtiClq1ux0BldH5SXGilM4jgFoxhZYGRTuvLOYo7j0anTGwgJD0ShK5FA3s2tiUP6PZM
+bs+gtMnV2YKzNtTrEcO7sYYXG/NXgfk1gFU0+G9T4FUa4v8ippiJ8DJTPGsXXw9GHBN34D60tif/
+LFO8cKu3pnipKU5UErT56zLFwfjAGKIdN8gdKTbRLJM2ylYUtLPNsmxIe5px5pawbKIFAp5pomNl
+srNMdcJQ946hrthQ68annrleC3OtG6iiuYYz29d+dsc12govC6ONU1Raz3SLWANjZ9ulfQpF06Je
+fCkzzm1XTUSCS7Rq891bM54y47boQOjvuHvphSwyHTHgp2/yppru+TvEjfcxz19uvhOFC20RmG8Z
+iggDEdJ8jwYhuGzIaW4X9Fb3AhOOIs+Y8cKMLuG2q1go5mDsZMBCafQ8c+7OLI0ZdTeQ4SSo4AxY
+sz6YER0s8a/JvIf4OwhwKB3fqHlfhsc3U4bedrc25n4fMfiZMPg9fAYdnO7K74AA5yg0/Dvf8ONA
+DSNIcueQ2xmfXldw7Ak+D8dLZzDbHaDTsi7pzUX1MRW0seMxFXTMG5y8CdcGq6jHyu/AYLpX27qr
+SY+wcCc6K+y/3M6t7PTElNJRt7Bgl79tt5Co8mjL1+YWnJrS5c4BJ2Hq2v6GupXqNnA7VR9nWr8d
+6yK2Yp7UORzFzkx45HpXdhepcM24u4j19kw6jiO4Qcxp1D47CGYSxV1HKbjCRnMFdB3q08qr/RwH
+Atwh4kBw/MN21I0EPCI2WmIOp6Blpl29dSnndynUJMLpjMD1babbmWmZOeZSlu301qWcw6Uk6nPa
+6rW5lEizglmOZcq16L5fezNmmR3MWjgYl4O0jnhkP+ZizFjjcUfjB5qiyVXpakxXsfkOJylKmXQ5
+5+UrGydhmwhNBcMG1p4LClO6XsAKnRAwGNWxDf7sqsFzRWXSGWUpZ6TGK1SZ55LCtHDMKemG2NSl
+9BSeM+6i6H6JuajqrYua6aK4r0RBKWHtWWhX23l0hotauNOoi+IxFctc1Kxd/ONwXYxxclMu6qTn
+L3dRiVqwNqwFO5eLkr3KuC+e22XCOqpqRLlIjoo0Q9ZVddSsUrmsPXEi3QOvpZ53lJp2ciBJh0Uq
+JN9lif5o53BcpGuyrqvk5pimLSb3CRrJn6QdGCmlrAuLDcub6cxijown9Rzpygo3+GYGy5mZBKMO
+rRQJ840IyJWqzx22INWzNLj99Dy3plhW0q3hrKBy0rn54/zW3qwHmvQw6uIm+JceYaTXW0f3Ghwd
+Hblpq63dk2mwasc50HC6EU+3dKu3ru4cri5RqNiGhYrncnWNac/ZUyO5QXAzf+JujJs5ZUZoTmPs
+TPXp78jxbR3HVwvHp6ficjCwDIKBplTJbSUYuD7q5TzpAMeDhI1oJhhnb7WZDZBTh+hxRzih9XLb
+CQpXqHuHpSbIHh1WJHM+xe76MZdI7G4r2J0e1KOH9PAAOesYh4Rj3KJj1ExPfZXkGFV37o0ZLeWX
+fU25x3LcPeLsiOYoJ+kzQB7fx/3JJyXEgaOMuEk9SkWttMP0hu7l5BzZML51mCMOUz/fGdhnclgV
+/BTfge7xMe4uF230pjrL+TvEneUxz1/uLBP1tW1YX3suZxmOIFiPcMTJcCYZ2lRAs6ABNw2NtjGO
+k3pkW5mFYYzJLBo4TtSHBQ2RPMfpjEJY7j4xU6QYZNx9tmbIDo9aYCe6JSe6PsaJygmySSd6vBtN
+OFLRX2EsUDoknGktnGkeD5USw2zteTJXcYZOdWucqp/D25Jb7fAaIaeK4dMt800zGMsXhxQznGs1
+7VwR8BlFIHwea/x0yMlGcn+NCbOu3TCrmTpo7r+TWOmEw53tchF+WOjwlqOOulwzclC+BZ4/KAYg
+zXC6S7did0eOqSJSS+6KnJgYHzzudk/f5W/b7SZKxNuwRPxcbldgbIev9slcYhiiFQ==
+ ]]>
+ <![CDATA[
+ 7tdry5Nwv+UOzVlm3HBr3LAezBtzwxtRU+TxV2r3E5GvR9ywmUk36Yynw7m9auDjNsdPuGPJ3jy3
+bLKUR7jloD1R3C03uGqxFjloVZR/hIQmdM9NwHXzaa7LkQCcV5WPuOlGc1/jpjcUFtZOujRBYea+
+ao4lOml1NWIe2i94neeuFRue4a6rNY5ZGSbddjw7OjA3pgmOhZncRXctnB8xtWtZSFm6bt1bXV9N
+b934a3DjZta9LEzgtKgYlas7tIy68aVbvXXj53DjiX4Hbdjv4Exu3EPyVTjMTzhzb3BxLN9Kfa6s
+OGjMmW/Q5Cmjl+NgR23yGicTu6WAtCxg2IgCBpGLpf5ZyYq0iEv3hs3OYNmjjh2MlxxAPO7YpcNi
+NlmRe88d9z6MFEmYHC71+0pWwUXc+/EOPuHiE33ETuPgoZPfO05+I5y8AEXayevzNsnI467eZ+S9
+YeQVOntw9Wbc6OZkh9/Od/hwFLtqf6Lb99m6HdtMcF27fR0rW5xRTgAAjPDQ1TYCAXK8NW3wXP/m
+LQSYhgA8uaggB447sHrXyHnnIICFO72xAEC8G7vDEQDgiOcvBgBdoltH53br4AsHbx76xvh+q+pv
+R/z+1qME/kj3ePJ5G5D5gudnBCOmw0mjZl6JwAA9+lZCAmQLJbmPJadLmpwWSU8DBlAUP1afPgMP
+6BH0zhjiKVwQ128RMgC/oJFBrMrdq3PPt/aTMzHnECGkk9sjIQD4vFO18uM4ocXViFUvwQzUJuV0
+gfPgoYZuJDQgtWHJyH0sxyHQww6QA7db6XCSTqULOm3DFSrpbKyCjPCDkyhXAAKzR3pwOSIIvH68
+qX9wPRyDJDq8f0Yj/XAFGyRRZ3B0RV0mEAXX/vhpdj8D4AcTDKrA7JGr0gSLYbCF/hKf9RHJ+Ghm
+wGILXHi1BiiDE/EVjwCzmI3sY20e41vKNxVlqANejDLmbEIog5sM8KBEjQ3oyM10rV43+RpFGQt3
+GkUZ/EYEPhDndC7KmLXLsWjH7pCdhHPk85ejjEQjmi4/N8rwWYhrMdKxhkS0Ad63mzw4Fm00GJxX
+/GuIRh90Xl/GH2RmX0viRAQCp0nuRXbfKsKdGbuEOVKoo0G53Uzskcz9G/ShJrfFEg6xEUox9GG8
+px9Wj2GQMA0RlEtRx0qbisijcyoZg6RQyCk4JIpEjmjW9jrRiDynjUEjCdniAkxSGEwy4FWlMUkj
+MQmeKsYka5r23CxGJuvjkQkcL2D7vyw+0TZmFko5QTQoNC6nYhV2Sm+xyhyswhNOeYyeRhjsSps+
+y/tmJlhZutXfBFoZ3WEGWpl4/nK0kui71BXnRiuy5saXE8v8iCt2iMjzdYQEW6GGgodjMUuBfr1C
+7MKxY8QuCgsI7NIKMYQfLxFyCMAbriAi1c9vTrykx3Lus+EXeLcjgonZ+MWvELM4po9mWyZiKUFj
+2NNiKXo2ZStWk0Q0M/AMNrw6X+n4PCyTHRVZKcfUo0cimp4QTaWjLFx2LnSTLesm4SrLKcaypWtM
+XWUNYpOq9JWVp+AahZNOwDVYaZhSX6bQTVjk4OsvK9Zfmqit5lHEoQx/Ks8SiSkTkZjaRze08Lp/
+i3TOj3TM3PJczuWhEecXrQInmLHRUyrGgM7Snd7inHPgnEQjsa48N86RVsXhTEm0ky5G3KlOt8lm
+MYx3/OHRI3gH+1VxsVhFArnOoh40QBb1VGElhot6AKW0vmokEbHpZ0dsBtxtPvpJa0oQ/5jp8gr9
+yOoNWf+fVpX4+CdsUrkbQUGxSg8HBWHvZV95cno0p5tAQunIThQLndz4cxwPbQNENK5Q8fsQeNEd
+rFMaL0rVZ9jEPuC6U8jI9oSTDXlsQ9EhjPWQWNWL9WCkR8d6SMGiDkdHevDqo2uv8LvKZScjpG0M
+IWE90wRCwjZDssd5j9eT26PO176ElSqJOBBGgVrHnhFzM3ntEm1YvSgmNBIVEjGhSFToBNyEONbi
+yoTtf4ubNG7qVJpJPUlO9Sp5iLwZ+jUHOC3danzyjz6X0QbjEeB0+iZ/27gp0S2vq86Nmyr0fTFO
+NqalSappqMF3uja1FrEiX1GbQk9bRA665yf3o9EYiuPxMnJUTUWOAOu4WpuNo7wtvcZ9jKG2MzDU
+HvWXZ0NSqCVydThuHewpSErOPCudFgs70udIPNVMRZUwIyo1Or6S120oGFPyhngK028GVfnIKo2t
+EsgK2xS+rgaFp6GqJHKNoio3D8laKDzLR2MrtzsUFwIF2h54k1VM20PoSl2PlcZWeD1uz4iwdksQ
+Ftx/cCefiLPSxUUWZzXpfJuwdmTpjkZbcawVadoRIK0AZ9HCe8nHXKaBh3asMlZFk6prchZvIVcS
+ctHIVJQ2c+umsqVDNxOme/3rcci1cKs3CnIdv0G27PXPAbgSvR+7+tyAK96KIBYMT4etRJIu2jrf
+BMcnw1YR4KUKsQz06hFg6Cl7PLdDh7FaKvtgCDYos41hrDKSvBs0BPMa80sItg0gWBjGikAwVSrm
+uh4a13oMFBsTRMOn6qX1nGIppynJNBjbKTAmrxV/SPdMWJZM9nlDBcZhWRjmisAycz0rYKYzwb1Y
+KZA2Kw0o+kcf1UN6rO76LBBtuw4bcDIYZoiWaiRjwl5uU9JZQE028dyYIBj3KnPaeHLFNkmwbXpw
+sEFYDIFV5kpV1+kGr1Rfor0IrmFIbBFcQ4BazARtaZFUIo1IEqlUGtGDbGQf17Og29HALSXx9mCb
+vMPwknwL4M4P4Gh+80VOsS2Nunh+sxmU0Gt0Ngrglm71FsAtBXCJjqZdc2YAl6hR7SL8MaUPd7RW
+NKgiqraKwLhmOn6GDs+NoDUISTo06TQymeJpVVlSPE3rsHTd2kAcXMbTbE5ywMYx27gW67R4GrrF
+SESNapvPBulUux1ykmeCdNiZwI2wWajBmiO3C5tsaepXf0fibTS8I1UTd0K8DV2sG3EbB3ZHQzvs
+qj6pWp8J7vYM7GZG4PwpVX5/9f16tP9dot1uvCWRzRsTmPZg3g5hXh/G4/BqtrnO1onHbQno2Wr9
+2sTjRnVgSmdg8uzq2u3w6vV074BWlgO+3AI+mjRwNODDqtb6PLG6oCNAbWJ1o/ox0+mDe3xoLcdw
+dORuiXZ+NHZ3IgxU4xPf4sBZOJBSmzQrXWM3lo+ZDOAsGLhsp3H8pedhLoWBc3Y5/TjmAMHx5y9H
+gol2vV17biQY9iyppsJ6oZWyYT3UunJgzzYblIgw7FAUQ4RmKgxpoGM51QqxTIN2vye7r0fzZgIX
+tgIXunnW0s2zIuGnTCsO0MqdlvutCfJJjb7sacDI0Gj0TeP9RK4V/WlzJD4c0fFzJXtMyxbtQxx2
+InbnfRaowxZhP4EQd/h5DN48mHk4MZKXpT5BMjMbr1tM6f2D6aJmQECYm93gWou1KBwo5u+c0KUp
+hhn9oQOvFTE2DmKc01s6QIz6zM/CjbnAjZtJ3NgmcKMbIGTcWFCAUF/VujqFGM9rQY/FedCjauLX
+dG8mhuSEyl+oQiEeSux8DEkL7+O3ePI14El6BzzFBzeouO7SbN/r6OAonly401s8eQ48mehD3XUB
+noRPS8NJdemGeJIu3xScnG6ENxVkdEClyXpMN71KjRn0Bg3SGAkHUCorwgYOLFeOgTHlGBpyDGub
+PzYSPi6D4PzxJi7hg9OTLv9MtsuKNsuiUYY4mkLDyoJhpfKhHrTcYLno2QAmuuBSS9XPAzBxLlGQ
+V7YAc8iHDO37zkCddJ45n5b/RTOeky26xopKcYSGLSpFiKk+qpkw82igic7yqJYaU+FJMZZjHGzu
+HLhpw8LHw82O7utUz3R3srOFm2UINxnmm3a7uborCHbyaMmWYGd5LOzEK96XD+rrvaVwpSnNoCtd
+X+dcEK0oFNqS3CvdgOv8XPCz1JO5uD3pEviJQH1jgwYIQ3t32tfIIJIJGCqm56Vlh1TeYVQ+nBjS
+1hrt9JAN+aKw5gggHWsJMieweQIoRY9jgf+bWyASe67Fk+FzY5j01D0YkhJ0YrSkkaQqjcXIpB62
+OROTLtzq5FazMUx68iZ/25A00VO9688MSTvi0/PmKQXVI37tLbquWP2IG+3cedHOIpL/JmgKJzKY
+gh2FplvlNgigVuQ4lLNJCxxrp8ZkcGKfBTo47ue6DmKfpYl9diL2uRMDR0u/sxrATn/e9hhE3WEH
+8GOBarISBd1gExdAjvSKD6t6TU9YVB2IaGgSqpZDAXBVA9YdgaXNEYDVq6JAZzlVARz0cxur/4X7
+IJghHoWsA66NWIuipE5F5ang1YGu4yNrlkLXQDwZ5NZHoOvWg67+RPcAuupP4UgAa4fATgPYeiJu
+mhBWIhzlKx8BLF7129cIYys83rPBWOxcszsSzPo1hGNgtp6IqSYEmWThybYrMAurGOZ1gJmWagYR
+1mNrbOJglhbahgDYRhOQDGG0d+bWMW9xbQzXMsDi52gwyoN/Wt3YX4FRrGkexbVLt3qzcO3RG2TL
+Xv8MqLZPDArow0EBUVTLV+4kqlWAS1q1uUHXMOyKQnPqCxZVd8bDrlO5fBwcGGTzRS5/F+DbNRjD
+DeCqHRo4jXJ1GFajXD8Mm1EltezBJ2YWUMexGdXUc3P8gFk11jXBWKH/LAjnRpAu5kP3R+LdEW0o
+9jKb18VPhmbldCRPHQpI19eHRjr5KWdlMG+t6qGOQL5u5xupCcCuLNQlbUa19lxNgNY5j3cBjKLf
+ZfhXIGCc6HRk35zxAC5PdDqhc84yHDw4IdyWqoiXKga2Bgf3Cge7n8ZsPDw4eDheaKRz9CEePkJ/
+ihiXpoPgHTEgJx/y9WvHxc25cTHAwKzNF+LjZMHSDHw8Q3OA+DhjfAyWphr+Ep1/Fod+OQD8XwYv
+jz13Ll6eswfhZXpETu0PNcblcdctF5zPgcsLd3qLlpei5cTAiz4ceLEMLauWILXBzG48OCzNdOPB
+gVRBzTGcKGz3h23Hx22LwnY4kUkF7ChmbvIODK/6s0GEprFzJrBzS9h5IyLEmRMhtiXwGywU94vg
+5cQvf/pG7dVNbf0iePA1rj72OORcKcX5+fAzXBY2YnwW/AzIOV5fNYWfu6Ed4O0gji5HcXQ3J4IM
+12Sqh+TYRBBf9CBqsLDRQ0JbO4qit7gGsRbhaTEXdeGEEV4SRZ+Mpa0oJezNHbZACHsmxeL9YxPk
+wqiyjfLv/Kgy5r3wU4EbAS7zJKbuZ2HqKoKpW4OpS4GpBxFj5v7x6q7J8L6xmLrHKLPG1CrGnBGm
+xsYScHGvya75VV/b86JrPH5V7n82dI15LUTXYLfKtvrbw9holdqhW4S151SPHYe0R6LSgrmj7ZmH
+uZGqmQzyW8w9hrkZCWaqR4AJLLO2t+UmAX1f5PX48JbFW50sk56Nuuds8reMuhODW/pwcMsy1K0g
+UYnIu07Gqxl723h1UiaMbYFYKDw+ry7SDT0WsYYTOVl/Noq+S9XWGYBuC46YMfiAOg==
+ ]]>
+ <![CDATA[
+ jRwxeIkZVI3BZeeChIwY0Lftp667F2SIwct4KyrRuyARv8a5u2GV2rHx6xaeVh+NxZMy46dPKJod
+r2Sbr94wQmNA4SmpcbKbqIPG1+oii2LyjDD59hhMjj1k3Z7jC2PbOCs4rHibH9vengGXdw4qH5uU
+c0Kk+2zz/14XOq8iTOpoubLpXcHoXOHzUtnKs2H0bQKjFyRktl3me+occoSUWSFwsHwDYvQ1XIwt
+2ED1p/wLIfWOLODZkTpYuKZtXzten9XhfkoCrdomG7xea7wOqx/mtfx6rb3x58bIsUBCWqMjsDvD
+tLfYfRq780MzOJcmyt2ou0HhbQ2z50H3hTv9DSD3sQ1mIPfxpy9H7olRRH04imgZcs9g5Qa/p2Pn
+4XS0mqLnEr/DnR50j8gjsXO3LezGwe+ennpk4vQx+D3PUQCMHkxH0teE4vfovXLEjTpG1WAcvScN
+iuwzYZrJAn4XsXSB4lORdFdtzZF0obYWk6yXo/i1uv7Ph+Xh2KQy5QxYPjIh+xQsP+BHvkY8rxF9
+TYi+0IjelBWO9a8w+BDnaLlK7dG524nSwvjk7SWIXrv1rViLsL2Y6L1w9hMvgejPgetdFrbxNCzx
+mZi7tJabStIsH4tpuWd0vUhG3UuN68GSgj016L5GfF8QvrfzNVuar1maBrrbmK7Fm6+pC4y1rqU8
+oj/GJq3zpgj8gLYQDl6je/yT/wUx/vr1YXy4kfrWIOWZnm323E8sNHax/vzYfFQfTki/IqTfaqQP
+azO8oT3e5kTpaeHBBqg/hV8E6k/gl7egH0E/zQbNCJ5rrI7RdfgGO27onm7jgP/0XU4V2Mew/ql7
+nHoM01fC+LOXA/3E7Kw+nJ21COi3O1h7BPs5gn03XN8mw/W+wJzEMgBsbMB+agpEJ8Qy0fbBylTi
+sPbU+NKjAX82ZDu4Ufd5lhcI/FXwvibo36PT2+oyS4SYXGbZorjDAH+0nCihwcHoFYJY2wdED6Hm
+jvIS+LcC+MdaD7c0Bt5MkjgT8N+Cz9icAP8ThZhwjDaYHx8K5gtr3J4h6QHz6WLMNlGKGSMA+2E3
+bGENSAMWEwG4BsNZFouIAI6ud4s2lxOBZVSgd4jA3GFlM8mAGQY7SgcWEAK36MAN9YeFB4lQP3Yb
+cgtvx4Q4sVC/J8TBYfKtF+ovkRIAKYATC/b3OGJAd6OdrJEU5xAxKMV42UEI3lsSvJM4JxC8a3FO
+gXebvs+2FPbX4pwGQyYVWtFC29Rslw0eQRjOSxGoZL0RhaILKYLuppSiCGAIhnZ7IlFoXytRWB9L
+FNAi7ob933qCQNKGI4jDNB56SxzUeeurPFfAPqvarDatUXrFBBTkV+qUeh57WLzVqWdlLoWYs8ep
+x7DsmlhOIRLTd/Xw3YIJxC9RcbIm2LqhHiEYt1ZmFw0vz9AoTb/kGrtscCRbm2F3PFqG6vAc4aFW
+p9QG4irjjD4WzTMZaDLRbKTZTKOhBhPdG8g76AomHD7FRrsQhluZbm282XyDAYe1Q+ujiU7uaZNq
+Iju27+omqAvwO6963WIA0I0RntrRatoMx2YdtjIko48ZDmv4Ld2RZEcSHUtyzvyFO+b4LSAB1SoC
+FuD5DOUEGXzYGbAE+B4+Qmx23av0kUJO+HaUgGZr1l4RMNhxn+eYfSnUxWV0VJyHUXqqnnIxipQN
+VNtAeRmjr8oRnuhmgg1CC6536JA4KDCjsP6OKx9Qd1Ui0KiQerSmdrgz5E3RNzUyz17/fO03Roe1
+xvikm8ORZK6jiog1XuPYNUfNVjZ9c0qnImJNZE53zTEdc8wnWtAC3mr+n9NnkuGnI/817xM969fb
+Hec+4yPGxojHFEcdTMJKi9CYrVopGovRbImILRIxzAfbSMWTWLLkeoy5eg1tMG0bDmwWSRDiPLa1
+EDPUxuE6xHQUkhaRCD8W4UcjZsUj4KbqqJdjfIxSpE1+pIOpSEaaWIQcoWRaQpkUZE6NoLY27hCw
+WP7a4hpo6bCUzmqjx1AUYocnaIeebYfBnx0cya7SnlhlRHfYdWoHJIsgsNpUf6kLSfkB7UuUJ1L+
+S/k9tCoqe6tmY28B7IJ3VzRP2VO0xwisdyZe4l6J7nUYuRKHDFk4X41+gXk8PScmVcbaLeEwMbeQ
+ia9Qe42GgwLcRKtT0ATXcaItljdWyjTEChoCpNbmiIWjbxymE1/9jOXGamKrnVhNalG5VT2yqpFV
+hktMSC1Glt/wYCROFLnXRiNHXuzoRKbXNBddXS5jW7yH5hVFwUqqi4xaoitmpEbroHyIWzOaEuS6
+vQCEkzv0YsEmi1lGfGKhHlgoWcZf0fPmM1aBQYPCrJJWlVg1rUb485PfS+KQogdU8gvTQqWW4igG
+ag+ZchF73KTALEdFJQrt0ydUpKAg9Y6yHCVF5HqEykrWlJOgScXgNqVp+pbjf8oonvoVv0+3Qpu+
+DUyraxTZsNlAdGXMSk7mAG92dLfazfboXJVTrdCR5uhAlevcoLPs0EGCWwxNRAb3S4GBi4sC7qZc
+jS/IV5j61L+JBIDmP0fdfOom7PKLssb4CO/i/nTxTRofJqVnSZXiJkVSY9fGWQOtLeKqgcrAzaI7
+IhfEX5V56AAAl6ioMIAOBDSI2Dgc0BNV0kEBDgvYHFjGwQGcjF6KfFhD0Vw9kLOnqC6HCbY2VIDB
+Ag4X6DxZpTNlFDTQaRUOG2xM6GBHgcvMZEl1ntQPHrBcvKcpCLq1gBSNW9m4G0aQrbm8RgM6lACI
+yJY7+e0GWEweSiblbATZhrZMFD6JGQlEO12LpL8kFeWlLZNrq1y7hSED2FGHDEoMF+jVkEWrVMWD
+CSE0+HOanUVWTts5ZenwtKi6HNhxo7+DhXAW7Z8ONGCoATMT+AX/L0zQoaDMRU3W0YQe4JZsqZxL
+54R7IwrVxV0byjZuKRixwzeKW1JAojR5Y7VaGl3LS4clNsgrBl0KhvkPLSbNkXtwcIKH2nJ4gorD
+gKFsSea1x0YNOs9cYpkYZ5tbZD0cpthinmRn7lHd9KzGu7CrAZdSoELddfKOUwfgZZOpOTGvwVkb
+I83j1ZvhVMwFNBvg/FyN16LmBSVdo8QNRL7OFfHJrF2EI2AzO5cn7B2e4GbxYs1zvSwsTnqwsx5a
+YrgOx7UsFzmuZrmccWeeS1l3NSzYcF3OvVu2K+S3gu+6AlyH7yrGC/Z7d2Rzi65MtUJGzgtX7gzW
+S5zVXXVkuQ6jFKsQC6wdMV3kunqJxA+R6a39okCKuSQtCyYmDKyX+TAzYs2JNSuutngrIS9mbizZ
+8Z6Iu43XgN0xPFnGbCxb1nzZMmbLmbmgULLmrRrVKpizy53dXHbAoKNZ7Q0N5e7Td0n0HvHvEodP
+A4/2FQtCsxAUGp6yIhx7Bgs/kovTZJZpJj6PjY+x8DlcfIyFn8rD0yz8WPYdcG/Lup3pMZNqDWQ6
+BZKqGn16j4xli146J6aieEqHPtdylNzoBhzNgCoWQH85o4WeVQy81iTJMZwPeV8kwF84S5PTnB//
+mo7GPMuQWWRrW7yp1niJt3gpVngB5cSzNMdKMawtmmTNsAAEocmt0MzmaFh3RqDVG3EW9xOlimtj
+Upg9SiNhb2EbELM3lL1BZOCJLmjTQ94Pz9rQrA3MdhyY5eEsWN7mB5N0iMdOSvYiQTxUeUQ4cOIO
+FEjirHpGYR98thnt0bOQ19TmNdUFYO9ulfcXDdxYMpy0dCs8IjccpQmweYY6dJXil7G0uU9YzIbj
+o/D0JDwZsookWp00qxh1wdzSJu0MWnbwUwQ9RcYyOBHoWdb1r69cod9WuRqdw8/lMTo11kPik3F6
+eCiQOOXpSy+ERKtu3albhkVM4K0SOe42CLwpvLjTlBNpZiEkxhh+Q0rZq26xhk7uyMVlKGl1u4X0
+pmvf4MmOS3J6NZFDgB+m9zXrN/bUw491G1azwYqNQdTXZCSgY6WGkvhKEZ2V0cVUGh0FXri/LAVd
+RLilwkBLHVVnDI46o/CqTqNV+DoOgP3pxvrG+FN8rCrD6jIcKTqlniKBlEi381j4JFBmYDeK82sz
+cvo7xyBNQbqMkgIuhVFmWH1GY4LGOryir2D7d8/hFdiRlRtrc21vMLSyM39rVrYnMX0urnmr6jDK
+DrjeaxNg0eoOfSf01EFibTq/D0bjwX0sMwqs8JcKr+jRkbUZ0Knl+T3pPVj1wWJ9dd/sTHilMHPh
+bXClwztojeHutdBAbY0CpIhqQFrqxrOmcKiW9KsTDgeH1bHcmcfqQUyHTHEvFcEM+VDen6tuzZ4q
+JMxLcM5C/l8G2yrxUzdQx9eSvbroCvN+ctTXXx1mv91xYkcJ+f20S5hykZBawGnCJhJEA4AG7MLK
+hobIQUXRnpwowp7iOKxe0PEaHaUhxQJFZDAW8/RJpK6jNdRhfBiBVcaI4m4wz5nRxXB5sFXFuJoY
+d8STWwFQcAUAIDpfD9M6bX5yL04oq3JidTlDepbv5DTfWGWOrgyIK2HiUcEZOhhsei+VMGHKz4/w
++PUofUDjRJpPTL716VwuIhKh2iaptKG4pY1MTutshhGdDVyxRHFlTHFaaRPX2pDaBq73QG9j4oZz
+9DaB4kZd76l44VhEPR0rRI1YNFo4FiscayiMrZeO0eAcGf8zc5njNVEnxARhx1lancnlNlc7Sb2T
+qtTyBvHNVfPMU/XMUfdMaXxsA7hoxHG0RmwkBjlSORa/g1L3UDFSQ+Zq1rqEZs3PRIXtJYQvgfvK
+V1f2wptU3DSO/Mme/Mng5Z2ETwH4qL3KmMIyHx29aXJN2qfAKY2qK/FiSOeZ4v4EvQkAe46QbJAa
+dKbKTFGLjCjIBumKojHgvpz6uVLrSLGGbk9VdLaOrqXcWsVaUmyzodvbbKjZhnLVWFVHAF4lcfV7
+5hGLa8qvaQrQIrXWjW5yk2XbmwztQI32eiQZrDO1jbEp74aNObj1jTo3a2zQoRtld6YCVo+g4fby
+6nzpWtjc1MLuMKwwmBYeulqvp0Yeum5P07GaSJoKUzB1UzqfXN1k+EdTPfVnoNy6JoU9UkRNGVv8
+0xGpZKKpM/pIPDCAosiGjGRPwtM3Ikr/dsepHTkvobUehZDMaQrKf/A6MFTjL1AWurB3DIDuYbow
+1DRP4FqixlQRbUSsCqNUKELmGBX3Nd6aklCaLErRqN50h7TzREtTAkqdYjBlvDXln4Xp3s5ln7ro
+czfsAX7mYFVKgKU12MQWQGsP3msDSHQL4HavwpaqPAYF57UKOQA668HHbQCvblWRKBaEFljyWWNJ
+Z4dFm5u9DWRzDRXH67hE1hTJmmoqVwgVk0JxzzjRRmIigpfuHWdkUNhKwp28kq6rEvO3qUO+PsNc
+Xotd8gGgt7bzJp7xDUJ7XWq7w5rVDClAgee/RGpQ46egP4cOacQaPw34PIBE6M9khzWuGFDGz6ZA
+elIhXcGgEH5GHZKaNX1SAxIfKurlIl4svediXS7NbekT7E3BLZfX4lO9EmH7NQG9pg==
+ ]]>
+ <![CDATA[
+ oFvQDyxcUwByGoROQdmxhLoGylOwekpa78H6iDhgSlIwQUAiFMZfERnFm5Qwyqj4V+X8TNKHFep5
+TKxewv/B3kul7cl7nFzUe1E3+bK6YtpiTvLq21/d3nx5f3XzeHXz/dMnv7rD3/X6d+v7x68ff7w+
+wDbv/6+b2z/d4L9WHzx98s6/fHl5v3rxn//x3eWrx9+9u3r/V5cvD6tfwOO+vnp5d30wD8xWX1Ce
+lvKt+eo3l+onX6mT09E7gm90o9PWnFdcv1mrh5p//aj+9Q/w3e/hZ39aVavPV//yu2z14in87isl
+c4bNX8AxfHkJ72f14dMnq/e3h+/UN/ie4AyId8QnRZ6A996Tp+bLy+vD4+NBH/+Xz+Yc8Dv/8tXh
+7j//4/7y+8Pv3sV3/Jt/V2dL/PTpky+fw5+NPQLzOsd9Kp9dPTwGn0T4VvXDpt9t9CXzTP/y6x9f
+Pru9Vlv9P/xz2Mz/aeoV6MC3t89fvYTLb3v5eKmu7Pf5B+pCUf+8ev54dXtzef8j/eA3n3/2q9sX
+B/2vd376gh4Ol9vXj/AK36/e+fPL6xt4xHvqL5VifVddgz/7Nv6AP15ev+JH9Kv3P4UXdn7/+OMd
+//r99f39ZfwwXh4eL1/AOzjHUeQnH8UfL++vLp/BjXZ4fHhjjuTNOJC/9Pn40D7q+Q9X1y/uDzf8
+KP+KFg+9fIQjePbqUR3uL/TvfhF7Ux88XCqDqu6Zv8JnfcR78w5cPe3hgz9OH+87/+3m4Vv47B4+
+TDxWHnrxV/hY7FuJfUD4y5nv8vmrh8fbl2/2+3T/OXalnn5twKcN1/Kv8OxMnrhnVzcv4AH5m3rW
+5JuJXSDXt8//cHgx443e3N6kzsdf/U3ym3j918Yx99ObbzVeyxn7S+4mUdcvtIRSn0vAgPnKADi4
+A17drT67vPn+FYDc1Ze3d6/u6Akl0LH3vzpcXqvn9KsvXj3evXpcfXX58Hi4v/r3S3Usq68OD7fX
+r9S31kVtbm+v6WW+vD88HO7/eFh9c/jz42r34urx8tnV9dXjj/zo2nmJzw8PP0y9QKMaXZu30q8u
+7x+f3V7ev1g9v72+vQfcfm8u98mHfn9/OMze95m9LFVyu0s/thDHMPlQeQxAN/61rHN+x6uXtz8e
+bm4UITF3SuzT21/D53+4Odzr8/24EjZt8vWfhXebetzj/eXNw90lXH7Pf4RjvHqxerj694O9lMSH
+zNfZ6goO/PLxAFse0PKPP/oPN2CabuGK+v7+1lxzefJQw8361d3lHbzph6uXr64vxSUS3CkV7Qob
+8T4tv9kXd1cX/rX7cHf76L/e5fXVg/+zl5cPf+CbpeEL+e7yhbC3609X61ePt+aqNmawyvKLLMsq
+pSw2n+7Xv/742+H+9m5z++d/vnrx+AM/+L28L9Sji6paFVl3oaPr8Sf+5reRWzFbfWcukju+KW//
+eLi/U4TvYeIZz6+v7uBTUHD2z3Btfw/nNjgX3lPgg72+ujmsHuHGn/nQh8f72z8YC6aCQcZgyYff
+45l874+H549wAT+7vL68eX5IffKeh/j6cP3J5SPcPp/dPr+8VrfJAz4g7k/Mo+EwDvefbp3Hyt9/
+o9iLemnvw01+Rp8crr7/wTw6o8eusviTfn11+JP8YD9Ul9rz2/sXhxeRt716/1e3j+7vzecKu6mr
+8X8d7gN7Db/68vvvIj/9zWXUIeTFCq7tz9QHt75/XF3evNBGPvQI0saDAdh9+fWK41n4NG31/ae5
+L6afNuPVpk6FuU3ftz7z/bvvX/7h4uXl/R8ebr/77uLZ7SOAfc9ryoc/f3nB99Dt4w+H+3kPff7y
+RzYWRfyRcCceroy/nnGk9/Iq2r2Ca+uw+vTrL1bDLZjhF6v9Fx9/tS5auJr+6ebqOeAEvqiCI7z9
+7uraJ5neg17C8wOiKh9z/+L+4UITJT6k8VfGJ1ze3Bhbm8feMT6K7/6Hh5FzrR/56ub51GMAjsL9
+ykYanO5//kfM5Y4c+p/vLgSkjb0QPOL27sWrqUc8TO7x/Hbkc4FHKNs88YjbGzD0j9q8jr8cPVQY
+bbx7Yw8F3BK7Y2MPvQ8e2tbxR7rWPHo93OmrYeJagEcBEPIeKEyK/9gfLl8c7g8TO17nygde+oDa
+exScw0ckhOMPeqnswoM9JYkH3hy+B2jzx7GbEx4FVBsMHr/NxNEf/ni4Hnmx724eLx5ePXsYe3vq
+MS+u7+6/u3VAQ+JxwmTMMGaPt3fzH3x9+E4cZ+LRcJMfXsQs+tTjpV2d8XB75DMe7B55+EGpByPg
+fQYceeqBCovBfS3Bb/Kxd8Dvrm6+u5188Xv5duKPwXfDD7oo6uTbfnH4TmG7PwkwG9v097fP4Bp+
+fHl5F5iKCSeCrwJPf7x6NB5szlO0oxJuL/leH1QuZupBrkuJXgbP719cKMR9fXl38ce5Dxw7aepx
+j8CmDdGKem540MPz5zejt7V+0N31c8PL45ZSP+7y+mDewOQDf5h8p/ffzzgd8CDeKeY61GPubh+u
+Ju4D9TC4Hu9+uL3/94mH3d4rfDp1Yz2/vr8wLOrZ9eXzP0w8mH0xEMyxm1s9VFjPiQta3T0TcEQ9
+BA/y8kHfZ3Meeztxe5gHPrt9dfNi7P2oR744PFx9fzN5Ru/u7i8w+DB6TahH/QDm9OEwaqfxcX+a
++bgfDlNmX28nifmEpYGHiw+my4qLImoq4XFXL8E+u56q7pqLbvzx0lN1F9X4g62fmnyo8FJdlaeP
+wjlndV+n3588bVEUA48Bb3H56nrUPcKjjuEYD4/X9Pi7uxcjr64eR69uHzhjb3iwuk+vZYB7xrPU
+TQMc3D5p6pj0Ewxj8TQcY/Tu9vr6gIxYBAU/NOFZJbdY86NXIoQxxaNTd7l6PSCfE7bgHrDo/cNB
+7Xc/cgbUQx/+cHUHlvWGLWucfKIpggsXDMf38Xf5D7fPPgX0I9+jG5nAeMaMwERro8QUltCxvfd/
+rSNSG5/DiOCnevQXFO762g13BY8bVNBtoKDbV07QbW6cWG0zFhyWbwXf/tx3gg+efiP4sMXvA3cZ
+exu5jAnf3Nq45urqBsOWChn4d5r9PPwoaJb8yL4RvNg7c6O7OKdLbMJx6a9//TEqfr6xqa3C/moP
+ZEv8xgnmvbh9dsAw5t2l+aBK+1Q4V8+vHpzsDP9q9/LZ4YX+vCMbf3OAz+syOGl0NF8DTTw8Pjoh
+fv799putfwZwvz8/fnHz5WXgAmhHFY8V95h497sbMG32lT6M2CIhE/OUSuoT1BImdQD8y6dP3le/
+kD9SNm799fDpp129PShbijv//KN6+4fq77/4t4+yF//t6/8P//lR/8nf/d7+otx0Zdf87+bl//7l
+e/+2v23/ucxeiKd98u1huL//6PLm4+tf//7Z5t8+/8f1+hc3+e8+/Pv81932py9e7eBltsMn//q7
+/H+s25v6J8O7/1g9lH/3jz//+18/ez97/+efF9Uv//GDD8u//+Zxs/2u//gPn/z0q/95uf0u++1H
+5rfFz//nV80PP/nvd9/835/84offf/KTnz+/+NlPfvHti3/5yS+K/dc/eeeTB/Vu1E9+e1F+1v/k
+5x/9z7uf0cv88Fh+dPfuL+/goP/hJR305Vcb+u7f/uHv8d1cvP9Q/1/47uu74CHwDh+6/c03xTv9
+b/8OXgZOVY5v5At7bPf/+vB9By/dvfr5Rx//5L9VD8XD57xv93H5zx/+9Dv458fX8Nzfbvmtf/Zw
+f//hw/++/92HX36RvV99/Q4eLL6qehn9wh/n/1r95ofPfhF91d99v/kk+apN8fv3f5J61Wf3/+f9
+n/+zehn3helVf7V596f/dHf9WexVH376f5pN6lU/+egf25tfe6+KL4MvXL37m59/+PyLz2Ovev/q
+3z5453/87Jc/+bfYq2b77O9/mXjV5qd/1334Xa8v6MjbrX77r9n+m80/Rt/r/7u/++BnX1x9/lX0
+VT/+6e1n3qvyfYMv/N//4bPq89RJ/qf/n7337IpbidKFv89a/AfAgdiNSlk4k22wjQM2OIAxxtnG
+Jtw78+X97e9+nl1Sq9WSWh3OPXfdmQk+dEmquGvncP7uxH2EUed6dnhz+rV3I7ickc/8s55zXb4O
+ELAD787MFI7Wfxlt/uSocqs+rneP+v78/auPzytGXT4K9j59WeqMKsPkBj5svXxSOWq09PnFTPmo
+t6fmzi+WFy7KR92NDjGMBeOe5V7M3D0wFaMGX+dmVk43y0f1594v3L71K7dWDJM/2uPg2t/w6nHZ
+qM7G9rOVilHDazeCOLhXMerBEQB64+zly9LlTm9ev3Nz5/TrXumom8/iV1U7vHWzNdX+qqOuv/ux
+AUjLb/L03MXM/UVu8nzPqFtHv4K/838cGTX6Uxx15+GT93bUg9ZsYa0yTBS02286A3ct982Ks/Pr
+WVQ+6sPpq3jn4CQuHfXpz9Otzqg4m+6Bt9t//yxWjPp2wXmx8/eqfNRt73BnY+PeVNmoOJuXD789
+rFzui8fhyw9Vo645r5zDpHzUnda1l5+O5m9xVBmmuNxXh3cuKkd9NXt69Kdq1MfO69a9lbJRZRgZ
+eH3h9f34fLV0k98svjysHPX79MudlYpR34XO++MPCxyVkFZY7pO9bz+WbzxZLB318HD/qHLUs9N7
+s1/KRpVhMPBj58P6zlr5Jm/smen9y2cPy0Y9P3/SumZH/ejNFS7PQjK/7nFUGcYcT19udmOo5fMr
+b9XBqIs9oz69M/v3cH3/vox657ww6sLy2cGiHfVHMt8ZFRgaA9/4/HZaybu7cmAeduOK5876k7eb
+GLXVS2WftK7/9m7tyqirl8UdXl//3uaoPJvZ9cUCXpz5tGAxlHd9eXW7Gy+eLtyJn7zFqEu9o4Y3
+pu8cbG3JqI+mOqNiGLJZ7srTr7rce8vP2oVN/n52Z/2Hjnpvb2ene4flcL9/PSOVFc5qdzX/1L38
+NeUu//6Yshy9L1zdnPI+/fpT/tSfk8tzNzitenouEPH4W+dpAXX6b+44O/c9ly/0YvQ395yd5/f8
+qqcPnJ1P22HZUwXoN6vO46nXcdXn687Tk4fPq54eOS9Wf1xWPH276Lx4dW0q3bSSF9rOy/uPZ6ue
+Bs7e1N92+dPbU8751VRkn5bQG//tlvNqb+qOvlC8UP7bR86rL617VU93nNfXkwdlT3XT3j5xXofr
+q1Wf7zpvrkXvq55+d97vv5mvePouct5//7yYbVrvC4lzuHfLq3p63zkKj5KKp0fnpj2/HXSeFjft
+eNYkH9zHFZ9/vGZWbh5uVD19YbafTT+q3rSTM/Pkh/ut4vNPc+bg+/bN8qfB4e+Xt25fvil/6l7s
+Ts3MPXqSbpo7c3d2q/uFB1Ptrft39WkRz7mXP6du+4++556utuaf50Ww2U8vF1bOLp5kyEZlNH/x
+OXDQigDg6UqZAGpFzHvmxv2ly5nVjZf3ooO1NxsHL9ferN9uS5uzsbrSPlldXVnaXg==
+ ]]>
+ <![CDATA[
+ yEtwH278tKvxFK1moy/cvebNUB4kToOk87aD55Yex79nnKU7+1e4I28FFX6+nUmr15a+3fk4J3dp
+ev0ifra8W+Q6z6fdmTu7LSUckHRyaD0/avAVks5Z+aj+wX7ZqCBrHHh641M3Ws+PSkmnYlTha0XS
+Oa4a9QNHzQF013KnN1tJbtRPN29e64xK7j8b1SvsMFj/W+momz85Ks9GN3l6Nr9c/8X1zqgiFJp2
+5ajk/itGDa+B9X+X4zrtwNly31aOKjv8y60clax/YVQVCu3A4P4/VY16Wj1q/OTZfvWo4CPyXGdx
+k8FKHFWN+qwHoK4tL9rx+ZcF9+UyECh/9VajLv13O5XvyTBdr87t6quKOtydsFtJ1HWDN65E4p55
+u9pR15B3UzyTbq6XIRv58r5Z3DOL2T9v81K77Dn29U/+Vn1Y+I0+nmeTeCYi280zzG61oy7rjA+A
+fhTc0H9wqq/zLLAd4Wm2kDUIgBt8paCLupts7u3Kz5s37D/H+zlm2YLAs84llvffrpn19xebOWSX
+m/Td9Rv2n8XHZ7pByrSnyLmzBoHDVd3DPAh0dn9l6evp2g38I5B5z3nYmVbZnLJXKua0uK5KSPlv
+uqumTEXIjb+q3PjOrvMfu0JK1+kKOxhaF7k7lQeU8hXyn+d9zlBY5MedM6TaruwYj67m0+mrVFO2
+wrPspPucoQzT9xhvLQy4X71dcTW2t8UGvTWC+c2DP4WtzzRQA8OX89lMH/S7QenWq+a2Zvf7QWuz
+G6RE+pYzwn51Y6H2WQ8WOliE+qFrhGwLBjyRdSxkM9dBzg4ge6gATUQ0d5PgWb59B4uX9dMhnuc/
+dvuoTS2/nuvvXk2V4fHq66miTcni7pntne7r2b2+ZotrXWuw187pbvsmLQ2pMqVnpzd3f/Vf101d
+VznMH647pxc/XqdajrIja3hef7oJhlcO7pvbNy2kPS/FM+vv1pYG2puKjTk6z3Ba797cd04v95Ys
+BGUArRJMaW8fLyq7Agj07a37Apo/PRfwo/u3ftUpL9D/Am5AqfSw8gICf80IE/h4MUNPsx3Y6FKp
+yvvHG+77q5XtfqeKf+z0VUHdCyCywg4+tBi6q7fFlVk7rfzcFirg9njD+bzafluxzKfPyJUBdXZz
+Z3XH4v/tOZYf8Xk92uWpp1xnGSLqvC/r2r+oYhIasJJP82Rts4hli5Sq7pC7NvLTpjm+PrPVzdyW
+8FWNmKofyVS//brzcZZz6rIUlk3LXXmTPCqnntl0+s+J7OCP5FrltDp0pNkZ/rhedoZWIiDSvVZ/
+jLkz7Ob1GpxhnhAU98s5PT7aGw9EEKd9P301nt46BKbQFTD04L19nvm7P75N68PwDbhpn5dn34xp
+0wrYbeBNs2qwVGdzefdvQbp1V/YPK/ERuM4BOOcvW82lxS6ancdpW7DBbDXkvku5B1nSj+lxXc8t
+2Ei2BxGn56oh7cuWd/3W9s7gG5SfTootOsztEBt01G4qSNStph96aDQTJydG9ZVqKmfSBx+kM6nj
+OjEZt7F8VT0Tuf2py0gD+VHGWv5bTkcv717UkD8BFQ5TkB9pwOz2UEo/anFOHT24TOf7Q8EHx+v1
+EKnKlGyELg1IbvveX/xuoP7ooJG5wh6mDjCcVoEd6Sc1V8/p8lo/vUBTVPBwIFRgOZviIjsrbI4K
+6lYow7jvLxdmRtn4HDBUcQ8delME3gpO/97s2qWZX/m+MdAKKXiUHuPX5jezTnQXiWjz3d+CUDjC
+ftWS+o6Wo9l+1V/2SohIMXT3ZW/3XvZfj7ove4UYV6GL6lKmeNeXp6dHVDr8etStGvNyTn2Dyhz3
+zPbNJgqDTDFJZFNxp2RxZmbkxXn3Xr18nLcUVutCKkmSdz356zRYF1n1Gl3IIxnm1dnISyJz201o
+B1cS3TOPrrqxe3FjOmSt394Egykru3U7eULwqFa9U4YUulQS3Wz2veXdyw6bnaq7vXt7NxroH/uz
+2X+2y3RshXvTf/vu7ZlK1Vg1XSxXQm4XSWM5WOS55MrFkS6Oem/u7d2ZawDuVr6pgvg/20WCOAS4
+Lz+bovI+TwuHW9INv5l2sBYVbJMCjoIKlBeQvSkQv9K96c/mYoO6KV81QDdic2dk6GszOaOu/LUq
+bbOlWvK8UNjwAu6/qLdulIFFh7PpHPzm7q8yCjiMyg1dQUXb4N400NJKb93c6XAYGpfHjKLGt2eD
+w5ubHdUewF7my3pJMfQgHS0MPp1u1960o8WxrKvV6aUgezajhd29tZuxHM3sHHNzvZzo/sum5gnI
+N/30ZNLbqOQnJ3tibptHpR4f1ZbCyt38dNNdanY2eaN5HXYT0SaYK2A3aVvOsXc9/mkDYbe9pthN
+702VLVAYzvFgN24aehuTDUq6KsNugzJQUGh748ACsOuX4qWBsEDBm6IW0vp21Go6HUrSNR01wST9
+p7NUdEvoMt18PVu4k8JSOX/QfWgLlXK2KrpyFsilUt7F+pHZKwOJaL7oMyZt1Yh9QI+uVXnwsAE+
+KnJsRSvu/qtRbMLFrjKM28dfoAHPj966HCrKulJlSq33webBHwrdo7DZVsRd7PaZGqIj9lLJ9XcY
+qIYdNfSqKPTSpbPRjmol76bTKfg0lRmL6/j1Ym8N9V4d/7Ra+ng8vblQpI/H0zsNZJ5reZt0JX18
+PTj33wuqVEKOjft/97eSOBYgrQl9fPe3nvsvg5JUL5A/WjPdRD/TB/0fTz8eD1mTjhpTo1qyJh2N
+7JzEXpxm3nb9OzL1xDFzhm1yH810q87nooY4ZiJukT4uzy720Mfl2SaHUUYcexkomczby0ZeXh3X
+jsr1L8+aokEyP7cubqNzM6tMeCJI1F/y3Nk0uOfS23BMcKn64ei80T1vADTLs2Hdpg0kgMppvurD
+f3a7wVWg6f1anXcT57+8gpjTqlZmNGBCC2TKXdk/aJFMdQ9T9McYWow7KJCpopeq9Y6rdY172jWx
+r5Xq69xuFtzgKkFmtd1HeBrAtRe9NSI1VX783V2FY1OmuCsH0zcbnGaeF6jydcSBNvL0VdiolqQ/
+XhR9sarAotmcerTJeYBucM/+5K+H/OUsbRyVQrU9BE0N8xQR+Zs/Xx0fMR3MRnL9/uHGy7u764OH
+89XH8k3YcOyRw/nS6ZfH8mWbNmo4X30s34QNxx45nK981DSWLycUjhbOVx/LN2FDF0cO56uP5evI
+NyOG8y3UxvJNZKGLI4bzVe4wY/kmqkMXBwvnq39vApHF4wjnq4/ly8ueI4Xz1Ttg5+2eI4XzFRyg
+CyS8qLN5u9bIiSbH8FVHIv0tkrXm0yrOqY9zlnBAme9gn7itboXUcK6yapB8u9bNG/ffqioBeHem
+1H+9y0zUdKu6FVLVW9XZp3IL+1oP8e/xWrrWJZTVxQPCC6jbRjA8VJ3VA2jqOzhkEF/TFRY0UJhW
+QxjtO6e8KcjaCIbd+H6Krvp70yR+rx9L3QW01a69h+tDKhw7A8rcn14WQn6buZiUnMN6AwNfx9uu
+j7r5cH1w9VZncSkWkPW9uzaKG4UNu6vwLyk4XPYPuxvOv2SiECG5NrLBZr2fRNB8b2r8S8qllDqA
+bhAoViPzdDl48Xp+dM8KnEV/JXMzRPHRveqrTGkaqiRzOurjp5mP8aiPe92oNYz3UbT1KoihuXSb
+aVQqFG3dikYwwYvWZaSj+9/E3qyPzGNojFx2yTKAzutGm8ejIabwsh+LOEhM4eFVPeEcKKawH082
+n9dxVc/ptBiE06UXaBDqmJtTjef90+eFgNGJfjGF/TzvB4oprDZMD3RRe7We5Vxn8976RPgUulLV
+UHVvS+NZJhVdd171SWMwyDJLbR9Db1qfKIMBN80bZZkdfbHlOjWlZZcf1ZetfuE7jdjcLaqKC7rO
+ymtfFZnWJ24v7aDGtrbVH/fwnpu+uPrLFgNjxiMPXt6rvuR5U8RspeIVfdxsqhKoRDaXdy+cPqlc
+suOu2pb6kD3emwYnXTCs1EhEVU4WCLarNls229K7F/VCXrfsWbkjfcN15+ttYCmywZL8pkvqF0Iw
+u3ZeYC8J0BdfLgeQkCtjjdarA/R7Abo+BGowOTvjLHusuA/HowvinDoXv4xPG+Tuy1Y1ubd5+01N
+xN9AuqASJtwytw8H1QUNGKNX8ITsO610TgNpb/yziSzjWMm0hoOq3jn1ZIAZfqsaxOLWTKtbe3Pn
+sqi9QVhUA+1NHtKqtI6/Ho2svZFhvOvLs9frxdmG7PujSu1NUcvRQHvz69E4nJNkcf7syPFwBe1N
+0cI+QDzcINqbifIgWcTDDeGPXDyqTHtTo7ZrtDcNo4NyPlBVAUKyQWUBQgNFB+UVxEu9jPSf7X6h
+sY0Y6W1igVG9A+8tP+vjF5bqBRpINd69vahBMGup+qeHSG83cNTtv7i5wuK6fTmaAer24GnPJsoy
+XCLEr9oZonmIXwfjTpRktWoe4tfYY7JGjNpuGMBSEczatTv0h67WnPaN8yv4AgrCnCkaZKVtrq8n
+ZDN7W7/IvI6NoI977miReQVrVBqcN+7IvOEhbaDIvDpn2DFG5o3DGbZBZF4WfNG3o5Ei8yZyoYtN
+ommGjMyrQJ3jjsxL/QUGjhMZLDJvoj5nyrgi87Kz6Q7Oqz7k4SLz0mEKwXlD24U2X52NI/Af9K7P
+qst4iwquE701wiQNXC+lK3csLvHzD140M3rV8rAIhBwxtarKN+xo5PQb7KVbxK6MYe/f0TApAIrO
+SeyooUGwL3brZDfuEqNGcbEWLv3ufDESaP3d6p++bgnN7uNBk2S3aiPoE1DVJ8dLA14/s3hIb9VG
+1QFdoWd6BMphWPXVwV0lSll1xC+OnuqYvdjLOJKIy47K7+NgWUbY0WgpOdiLQtp4GH/O6WNpYsge
+ZNMoJw5W2OOwhLYqsXsin9uuSZDs8fTzBoETfXHa6/EFyb4ea5Ds6zEFyb77O54gWTPdGkOQrPQy
+niBZdDSWIFl0NHqQLMLouiXIglDYP8y8cFGqUsEW/JcqQ0mK9/HovPc+Hp03VYP1c+0dU1Beh6yl
+cXn/SFBe4WwGC75tHpSXY24rBfwxBOXlNy0cj+xZFpRXK3tWILEhgvImsqqL5dMaU1CeFaNycXm5
+YfoG5TXkGD+i3loNmhos+z2ir7p9LgqGlcFD/H7Uy01Fi4+y6qVGH/T2t95+1NTvcFX9BS7r09U1
+5WwOignXq6xRDTL0MpauQYa4rhzIvdYo4PalGhvQYLRC5oR85t3uPEO5u3a4+RXmICkZsOPUxyKf
+s8+vR6il/mJK2KidqVbcOpqa375lphbXnr+eWnx1+ALV1F9Ozb98EOKvXby3OtXaPgqcpf0fkSVO
+d85+5Ge8df17qoHqDrubrQm7211y8tvcFXZ3MXP9LF8FthDsF3yd/Xj9+Y+KALi5d3Vhd4etylGd
+jZXwabfDZXdQWFeptWLY3WFd2N1UUDbqRBrst7l5fpAttxgUVhMAd3vqfU0c2rP7zw==
+ ]]>
+ <![CDATA[
+ uxmoQtjdrZ97TypGDb7O3389/6cqDu2gLthPNvlL/miLYXfvt6qD/W78WHr1sWrU4/pgv01nuXLU
+84svj65Vjjr17lq4V12ncGqxrmLgw5uFo8W9bXF8/pUGBV59KntPMXT3q0+vnTbpcvrpnakG751f
+Hf24keI0padYeA+XmiqZ5fPF2QKBrZO58v69E1XZ4ArM7e7NX0Xn/KISts4PZKJPTa/uMJthaqCl
+YpRM6/7fptOqnVN1iZpyj66RyuuVMcYTJSkmRiyv13V8trZenlUfbqtmpgf06KqpFNe32kqX72B9
+LbzRK+tlXRXL6vWy6k2BoX+hldwKrfdD5bT6uqQ3m9NEkxorfTY+m1O1K/qg98b5vOO/azSnvJ70
+T4EdHEdgX7UpYqyBfWWcuNV1jjOwr0w/VqogHi2wryyqb6I6keawgX1lXiVVnpAjBPZ1LclG9U3U
+BJQNGdg3hLp7mMC+OoAeY2BfWVSfqh/GGthXdggdZDO2wL4y6TpFNt1HO1JgX+/EHtdacYcM7CuL
+6usXsTJEYF8Py5MvJjy+wL6yE+7VC4wc2Jffr5TD7vACYwvs64BKlx563IF9ZWeY80wZV2BfWVRf
+GQM1YmBfWVeZr/r4AvvqjMVjDOwri+obbdP6RgcNtGmDBfb127QxBfaVRfUpWRtrYF/Z/ZrIFRAc
+U2BfjRvcOAP7yqL6ynygRgzsKwtBKxNxRwzsK4vqK7VGjRbYV3ZKPd7dowf2lUX11cmelTvSOP6n
+0pA/hsC+sqi+lN7UCmBVtgfMqZmM2ONz2+25uXzREz40u9aX7+gN6CsVo74/7FfGs2n0VYo3mrIc
+A1TxK2ODGrEcg1XxK/PIyLEc/av4NdyqkhrAPT63Dbfqa1+K3gUHeYmgCAeVNXsHnlOPRNAIPEvn
+VFurd6I7gLnftAYK152rRjaYVrV7xmBb1ZN9tBlF6RaZvOvJj6VukelRMRFKid2zmdpsyOJ/xU0r
+r/83BL/eXfyvIBQOqmluWvyvj5bD1v8bRXHD4n9j8IduUvyviT80YvpGLP5HZNO3/l/DvakOlcpi
+PJp5twxb/K9DPevq/2WhXfXF/5rmthNKcW1UiNgeZ4zHn+2BgptUCVkVZr38bORoom0S02rvh+Yx
+fQ3cG/t6d+PgR47K1bDSZs7GdTcYNfu6qedQ4XGs2NcHddc5qXVJBNigaAQntUJI02xHnM4BNOIC
+K4jfQJQPWv1ifNlQLvEyVb+PSnkAVytKBGNztWJ6glG90V9UelkNGog5SgnOjl6AHY0a6MteSmhg
+AXU27ajuKg5QQ3JMdTi1K+FiG6DOptG+309ne6J9v5/2t0Y11ROitz6xM128QL8AtO+n840QW063
+VCx+kt/QF78bxU7nhc1al+1XZ9Yg2e21/epsLMkLVjvOKKMFxuyNtbjj3liLO+6NnsGABQRLmPsy
+JWS/QMyFwUMoStxH0dHIdmLtZQxpDLSjhhy+lW+qO6rxRhrALXbC1pBsGkXRLITi4E/hMqZ82pju
+Y1Xdv4nB4j2HrftXqh3Ml/4b8j7muzKs9T3ifWxU968vqz6eun8TtoDg6Pextu7fxKAFBIeTuLuZ
+25LSf4NHp+S6ypL6ZP7Qg/Q2eN2/cneehrEb7/42dZ2qxWnC9fWJl2/K/ExoFF4j6bJJtK+ZLq0v
+n9o9G0f7Hk+fNoj7aBKIOYZo39cF5dewHl3sqLkAXq1VZ0ejR/u+7pfbbsDo+55c3AVPyCEKnPV6
+7SBea686Pjn1HWx2H4/OhwykKidr+5WxVEMEUs3c+ThVOJuhs+eht6/V4fMTufTtTQR86e1Hg+tZ
+revs3rRaKX8A2fPonHJ+c9mzArsuz7YbBFJR8GgSSyXTqhHT+3GMxGlFpvFjj+2WbSNwjBn1tGF3
+n66qznfQYpir7RxS6DWsDBp3+/GigcUn87brF3crvY2QVavgZCG9jasY5mo7qtu0weJuV/aPmpTk
+ABaoi7s9GDzuti5zEqbVsHRDHa3oXOO7wePfnQG7PVPsOexcnJ+7l9dtwOCj5ABxhi/xz/2phZP2
+I4QYrjLOsO3tJNez47tZmJ396+h8WrFAFsFlbpznL2p3abppdzmpKP43fbMyMu/86kO7VRDYu+v/
+3Xa/VJfhqyk56B+8KYxqQSCLG/tuKkd1Nj4/eVE56k3z6OikatRPMkxdabqVF7lRu2PkLq59Pa2K
+zIu37v69/itbK9Xd3UGXpSGB6SbfqSvDlzhVUYghNu3681/uYVVIYE344/TGhV896ubih1edUYkF
+ugaeOZ2NvlYFXbbrRt2ZqRxVhjm/2Ls7VbncqfvvWy+7jvY0ScfnX/Yw5lbffPpV+Z7itPTVw6tf
+v/t2GV77e7i+/7Tve8FXC31CNS0WQJTOuwcFjjTV3sz+6iGmG1fn1Zgpo3wd8jfRU8Shm5HNWZRS
+dPp2bXDvzHLP+zXIYxsVCqlSZUpNVT6ww93yzVB6p7UGDp8T/3GjgblMTm6jNIdQUyY4z9msjey4
+1dmqgtdWrcNl/VaVOG5VmhUn+oTHzVcKYAOHx/VxBh0Aqip9wAb1GsIK+zrC966wVPBAsF2dG9gg
+c8qH/I628Q18wBrfm1vV7u92Or1+uD3JTEryex6uj0U3vV5SMWYIze3B4mUDXdhEoypYMtVX9S42
+fWTkPLJZH4OZ6KBV6qgzoD5tfUg1WFGfhpDEke3fiEfsVrqUoc5GIYmNEq9mG1NOPdfHl39yPc3O
+M0Jv3a4opmgcQgDg3wam7ybI5nhjjJL0R296FB1yl40AisSxJeqS/eqxEQyaL6mgfvkR/yl4JBR0
+khPlJV6bx9lV83ONMll0xyX2c8Tv5yDbsUn/iPukYhggNuvjVIGpy6POEptKdZxddSqGZqx617S+
+VgYJDFZtUL1Uu9D/CLGllVV/Oia85rGl54VQoQYQMVEVXI7e+okxzSeG4Is+pcoH6K0S8IfatL7R
+RANt2pD5USo2rW9N6Oa9Vda7ywhBV2+lnGNZSGLTeMRMCTlcSGLTeESuZviQxKbxiNZGMGxI4pB6
+6EFDEpvGI3ZxnYOHJFZLCZWuVsOEJPacUkU8Yt4BZoiQxKZb2qGeQ4UkNo1HrJSkm4Uk9hdZa0x4
+9SGJT/fK11VXrDCFtH+4WGEFQNcHjw1eVq5c8Bh7scJ6tV3DeOb+xQothm6yVaMUK8yzg/9gscL+
+aruxFCusj1gZW7HCiZL07f9AscIcA9V0q04rr/F9nU6DrFZDFzxsktVqDAUP66sdTgyW1aq64OEQ
+Wa2GKXjYu7h8tcNhfaB6Ch7Wq5CqeOiBCx5WBQB6Y8hq9aipN9ZEv3jP8YRhTNgIyZELHmZflFY7
+5KaNo+DhWOqt9S94WK+cmCgElA1d8LC4uG4tQJeNYJBIwmLBw2F0nUMUPOyF0ny1w4n/qC1J0bzg
+4fDOsAMVPKyvdtjP265xwcP6iJ0OQI9Y8LBv0NJ4Ch4OEB43pmD8kmqHlTaCBil6ugoejuB2PUjB
+w/pqhxNjqlM43xcExlPwsHmdwpEKHma9lFY77DV6DVnwsN6PbqJYK2LYgof1slyNd/dgBQ9ro2Ne
+lkkE/YlZ5W5WVTssMUgOV/AwDSIsr3ZYrrOpdfEuL3g4THjcEAUPqyLSTEOus2HBw3FggQYFD+tZ
+g4lOncLRQy6qqx3mQWCkgocDhpIMW/Cwvtphj6Vw2IKHpeavzFJacBkZvuBh1dL1MubI2mgFDxuF
+x41e8DALIyu9QfU4bYCCh8Ow6kMUPCwBt1y1ww4DNWxHjaqP9hFxmxc8rO9FydoYCh7Wq8vygTEj
+FTwcLgnQwAUP68XuiWKyxmELHtZXOywTcYcqeFjP/Oj1HEPBw/7ppsZS8LC+2mFHpdqsoyGVXxP/
+0VOncFRsXFbtcCiPrpKCh31C9RXSxlDwsN7tJzNFjFrwsFYNtqrG4jEUPMzC2Eql1ZSsjVzwsF66
+17MZQ8HDeuk+lW/GFXhVUe1wKNmzrOBhtexZqbwfpuBhfbXDOvXDEEG6VdUO++nTGhc8rA/StU4W
+oxc8rA/SreDTBi94WB2ki2qHjZSQjYJ0a6sdDsjZVBc8rLdMTJSlNBqm4GHPRe2qdtjPr7NxwcN6
+sJjQ5MANM7uc9pgr2VZNKyyZyOpGVWuEP+8tLxU1wtJW4zRb4u+fAnRpHGUXVP0pqLzkgHZXOwig
+Sz+28Du/CQet2YlcADNce3+v2l1Ne7NfHp2unp/fff7t/tLl7UcPTPz6hTtzd3qNryCqa2vh5e7x
++dSNdws3p6A1mpo53Po61b7z/cHCrbt/GVB2+9bzg4WX336cOevr35ec9e+tZWdj+9mas3H2bcfZ
+fJa0nJ2HT46cnV+fvzhPf55+dV489hLn5cNvr5y9i6+fnVfO5U/n1eGdK+d169Ws82Zxb855/3H6
+qXN4uP/ZOXruXYIQfPD2Z5wPj2efnZ+fry+dX7w7u3V+ZX6/Or86imcvZqKbYBKeXyLUdKb17dPW
+060nyef7r96/+TI1f/PG/u71+NbPlRu7LzYf3fz648b0dLL0ZPbaz5MbD/3k5tOP3/fXbs9P2DqF
+51cfpq4W//hPPvBYNADvwcbLlzec66efpG33rBSd2LNhvOvFBQJcd6ZaKwd+rkCmDfZbuPVzeaVi
+v5Z92ZGrv86H24dz5+dPWgs1a/Xn9hduezP3nY2V7RVn4/PJI2fz6ZNfF9cOw48TjPdMpmxJx7t/
+1xfuxE/eOksbR1OIkHzmrL+Kjlj/0Fl6erpYuFXd16irlOGH2V8dFS2VKdn6OgQpvxmXN6fmvv28
+O9X6/ezd1MJJ69nUwpvZ+1PX1+KniAp+hH9uTbUeBHNTraWZJ1OtePFIy43Kz1d4Cpv01Pzfa7Lw
+47+xhXMtNuouAJ1eN/Or5tbqt+MlgxUe3b+1M3XOo9pYdx/H8teLP2bxy5e78terv1QEOEs/ptv8
+1rue/Lp0nNn2ksXQ14ErZ+1f30/n5aOtOR3w88zfBfxcsD+XZ1v42bI/d/wl/Uwww+X6yY+/ibMU
+PHQe/DrbuXiw/fr1e8EMl7g3dqp3o7nOs/wa7t5ZyD04vr56J32w2uo8cFfe7N1LHzxc6jwQ1uzL
+g9wwT0327FBO8MZPZ2nzznynLT/05upi7kFu6M2HbdnwxXmhcu8WpJdrc+77i+9XBIHN54Yt3r29
+qStnafd+p/MjMpLStrGIV+aFGT9dIYoBhowFxe7EgqOeyuHuPl2CbnqRVFl+7rHTeR4Qh9l96y09
+fvHDk89fyhFcu30NLyzICO1fztLBTmdvPqTDfJDTD9+01paOb99c/vJ7Zm/j9rr/PYdJFc9u7j/r
+iLhdyv6UNO8kKSYdsMuy/lTXuZOk+JZdzj2KnyXx5sb9mdOXaw8/2TKesq59k4LxS3dhbfHG1cbs
+1sOH7tzPo2sWyA6O/WzpxwQyHho37ePTFnZpUbY2+i0/95bsBfi475iPOw/n5K+3Rg==
+ ]]>
+ <![CDATA[
+ eeOlj4fu3eShK+f18djjX90kcTVPAwWQuryGctdzUFTwLkMF93DtH00t/v3zVF/JUAGwALCBRQXF
+usNLN7HMWSt4COq2S3p6Os9LKbT4xTx3AtHGP5G0HaVQA4cdePderx9vHM29pZOFIIA2LvasFiU9
+vfgB7+qteXvPzfSSu9Z6uyC3+85iejbAAsJPSNtqGwzMvsre8s+c5aaDjaUOt9WBNOonBE2kIAPV
+SKofkcvrz3JdzqfZ2eX0Qi9zIbNm/XD5dtp2n/cLLMfzv/Jzo02IkGEUV7y/+Phj5ef07w2z+GfV
+WXt0+8zpxQwiq+tBCnowwi0AYT5Z4BnmuTiyMGBzs2OmUHjnT4fv4JUJijq54h1JGRLlNu68WP/k
+fLrxe+38/M5Jd/1ccCq3t19P2NBFvu+uvvzod1g0tqEq8uO0jw83in1cfdz9K3QxvtK61zffuI9y
+JJxtU3cOfqmrFfmJi72uhA0AY/9gN99HcLbRIYggnBq5T3woEPHEhX4fsLG1gL/aWduS2gi0WaBw
+8YWc2+Xsud5pIUhvchQ4XfXX+Ru3pz7kMihYJkWLX78THOVvygPT7ixdIY0x98o2HOZYg9trFy9S
+roDZGpJrJWWg0+K8sq8X0xuflhY6xa+zPAypE7maM7LK2VlShrfdmS/mc0t6e+59TJe03JUA44P/
+tzDtCVsduycHx+Xdv3rwVx/uewuditWyX2e5qnRyD9qdDrJEFUgZkUzbpZ88fUwQeHo63ZPEYuFx
+u2LmHNUextzsvbfvyw5DlnT/qrOkbj6t8WEgJ2bax7t8B7d+Pc862O90oFxnoQ/mwRwBIlRVnp9E
+52wq5tHbx9H5QAthB91adZubaZSFfL0q60Dlm1/dJarfVWxaARh3j4pw21lX13unFx1ko9lh7Ksi
+Ftze7Xr1bKqyywbL5PXcPZ/OxvqVG2vr8cFJlxD5LoOvg3f5Odkq7X8scby8twA8H3YQVYqhndPL
++zFvYYfAdHgX4St/vSO1FXJ1ECh9Xtk/IglrWcIZvLvAz6WUom/NZH/RlwNUHKR5vps0k1Iv2p+r
+bdLxdvbl0sL6q/0tTOedd+/Vn5WUevqzOS49I7U8G6G2OWa8m+TmmPGZezt30weW+FrKe3V4P32w
+kxMGOuMrD708R5qRJ/Sb9xdyzHhu6M2NDq97yFhYadtZsizP5lMHnM2CijZLm3suGWlVqVreULjp
+1QWy25Yx3H3YSinl1bwlZrs7beXIZ+7syyXbfe4Afxr55xN+7mu/3r2Xv1WWcueut+fIQJHDPHjI
+A13IyxcHT9scxluJvfjW6eHc59Wv4cbTlZ/xtTjHKfBwwWtqV0WDcM6KK10+XxpPl2l/e06nPxkm
+3LuzvPpg7+atD6tfo+0/D14++P1a2feVt/OHCsZzJ/vfUrHzpZcB2Yc8kH3cWcxx6Sq0fHzeJk8K
+9cP6u7U5ZdWPp18p095hWkXY87bAdR0IQN1+qPMFvekw42Q+rDz8IJ6xHIgC/u5Z5pkinPNCeuMO
+L1QQ/ja9ezMThC9S0bWtmmYrwQX+HF2HZJ738XN5IWUR5bplt0q+eOUoFpBrB205nL7bZGnN5mH7
+jd7CcuXqlkNFamYBvZk+2J7lhTaLzu8P6TZva14ONq/e+Jg1L9q2PYO7v93OoZ3FL3eWUtZ3x3GC
+j9swTm2b3CubK39DgZcvT8H6ClY5OGsrA3VtTlMadTQlZ/+f8Faxib3J2CTJ5NLzq5+n50/Pv335
+9ntSDvTWxH8sPXhozN7vT2cb56enL0//83Lt7OTq1+nvy8nlyaUHL1YfPoyDtdOTs0+nk4sp/9Sj
+C+3S2hEmwzfhrze3Wx82zqLXnvOpV6d3/Hvz56vvH1c+PH724MHib/P+1j3zKl679ukKoVFrq1vv
+3vPWl6hmeVluyZW+XFn7nGz+2Lr2/M7x2mfn4G7uKpHznfnz8i/0XFtI5HYDctrbqUV348XU7NYF
+VoOWAyUeKhp0WzOglOmoSwvWQjLzd8MbL25sJNeff1p9/+ja1kIS/Nl9sOV9fXb/88s/t9Zfrzx+
+JMPc/7z38smPZ9dezzzYCk+eLiRh8mbtzcbpPpe7+v7hh29U+3Tfk1mz8CNC7q6DwxRwHv/uKC06
+F1iI5s8UAhZTynRwbjHc5Sxg7OjSIl65MelfZhbaklmLXIOItxjpjh/+odjIn3JZ3p5TYuzcTpES
+M5HSycPuzNdMsbU9l3+QXB5nDxbyD3YWTrIHrc4DKtUPo9Ps2VL+oz+rX7IHhYsxr3ci17Y3m927
+J4v5B1985JzLnrWJfQVf3HcUQW21NsAuPzF6WbfuPcfPZ/nOP35ZwOY+s/f55Hq0bBG5iNmq2z5p
+3TF6b54tUUQxJ/ceYuee2X5Pnu2xXy+nLdo6Or9hqVXLh/7uZSuvVbl3/1Z2BZ6v/Gx/mX+we/IZ
++c7Xth9OvejAKM83w1c9+VxTPLHizm1t3C7rsqy/1LO3X5fPdu50LmpwuXv9dPP9m/jLgxdX17+t
+v/m062BdpgPGeS7k4BCK20yn5OdWv3YvykDmtao13bVnqxD4Xi+l0P9aOv/4Hl65r01KX15T53OG
+vzz9q8fNpkypnKKC7HoOigrWro5vIbac2GBl7uf57v2ly3BrZd19uVaBCjK004xkduglrET/GMns
+0EsZ5p8jmR16mbue4yeZHXpZ8Lqu0yN24LvHt7Lnzj3JEaLr64dBXmXzrEdl41608iqbk3i7R+1z
+OXuRdbDbq/OZ32z7Ww+oGbLapbP5Xg1V63FOPTWbHHhd6qnw2tSNletrBRVXegVEZlL9pZyEcoO3
+Wt7NW2+N0Iy1RcCBGlbZBpBpa9v7iyOPwlJ6oY8uu+yG12Yq1R2ZvA6NR5W6Y2ZEdcfC76YS7sHi
+73oVk+qXWDEgJ+HbJb2b6M5xuvB4oZmKKTpvItJruLzMTobRPjoqpvuv54/lvBY2mDmWqCPblp/F
+8p69Mz/M655EaOdJYJjew1ga8TDm8mo3aBJzZs9GykQNXRl4EgX/fkStjKDR1ICVkg70bBr3Mawm
+r+PT92HOqeijK7nt1ofFhsC4mNsYGaa2y2z6ckei53NP0lyzX5zu90z1FLFM3Jt+cLPodsZScNex
+NrdXu95bms/N6bd3azed0y+34/ww++ml4PH7F8rDZXliFVfd3XytBo8cgckpPp6e/rakdv9Hyz3a
++rQIq1NL+TmYdCyr3rZWnb1p0qKZ1Aonf8FHjqRZOfKMNCtHruaT4H5Lf76/OFVW3bt++/YHyvrO
+58P7X/LUMz/VArXNPegWUXMP9syn7EGB8n7OD5MXBlrXH37NmGs1TpvNnelMDniSlwOETGRM3ZNW
+/sGfZYDvk6WOL2zwxFFGeivcwZk/Ufua+Xh4I+v82YK+8vGPwS181srQ03V35u4sPL2etS07Hq6i
+l2cO8SeQzcnWU7bYfk/evDWptmhjIbPuKkPizoXL2d68bOswztz12HF/vrixvpjMifDmvLrexSnM
+WvON8JrKr/b4NmZeNy+XmnZZ1l+2aV1dOrkuzdK1i9sLe7fOw7t7/pMH0ftPs5Z9f/NiKjXdvnU7
+VusOkLlzV59+cOkq37xezHPpW3dw91+3LYP+5qHRC7B28tQqU9d+7rn2r6u3h2S53PW546PUr2kn
+KhiXJtKYJRGJ1flBbsYDXsX5FDZe/LGvyI1LpWB/tiMFZ3LrjJpjTr+f0l1iTs1H8J6wmqGFjEuU
+G3d/6r29WKvkcXYXqeJa+rZ/2VaW9tvi8gLxhnf91vqjsvAQ796rJ9sKSPgn1UHi2Z7l9AveFpTL
+C44WFM7vrrbUktrtXpGxvnJBoldbqx9+PICIm1fwbS7PAWQec38Fz8R6LBCTY2WQlcN9AMXRLZhm
+HxpztP77U141JM03pOnF6eXVH74SHK2cfvn2e+f4v04FGMykmXT4//pvlEwaN550g0B+BGjdEdZ+
+dvX459+r00kzN7kDBH+09OD8cu3byeW3s9/H5/81ucy2/cc7ew/XJpcn7etH8vqtyVmZlXMk78uz
+OeqljjDXI4wt7Lwzuf+/8S//fI5/HDsZ/O8+mzExV/5//7/w65H89V3a/vekP/l48u17Z/LThDyT
+b1smMe1g0nUi+VfurevE2c+d9Ke85Opv+3pPQ/bBRdVSncmlh78vJ2dfvNo8evH1+M/py//6c9q9
+uJ0Vu9uy+dzrVqvv9hvuuxyB/F9+93+efTk72lz9/O3nr4uGJ8BP/jPY6Hw2yElc4b9PB9r6IGmH
+fuxPtgK/HQROjP1nY+i40hi1HROFk63YaUciR0tL3E5MLJvvhO044IexPlrFQXiuPE70vTCKInlR
+Ona82EhT2A4EG9omN9RBjfE8/RatJpDBAmPnhO7iSHa15SftyA+NHddEPpviMHL5LaYXBPpeEofe
+JJfgYfzAbTtxMNm7UPlu5SP2cHbv9+/jX6efJr+cH3/6JndvbrLltH0/8Vycp4lkTVEkx9yOY18O
+Wva27Th+mP6nJdPy3FBWkriTJoi8RD6WOax8waqioO3JGidbrswxkpm4bd8J/IgNbhJgmbI4Garl
+ee3IRPHkPs4g9rCxAtOTrSSRTx3X7/009rxYJpHEk4nsbhzG7uTKCQ4Q++ZJl2HbDUPpsndQTMc4
+Omrs+ZMrGBS7myQuLpfbDmNjSj6MPDlGX17xnbZxnNB+6bdlzQIyRrr1XbdsmXJKATYS04tieWel
+8UJlj4K2I408Pz8RUMBCPwO6V1YqL1a+YXLpydnl89OTs/NPcta8Rk1Pcun56fHPx8eX59/+E58J
+onzwcNMCy8vPZ+e/9Fl6OeXGfjr7eHr04GGCa/vi8r9+nh51pmJfi/ojI9zj/U8Kp+4wcJohKcCi
+7lQ4OTs3uf/aIosupH2cYg7HYg4j5yFkRWiL1zaxa4AcTJy0jRdGk3LiAtzepIkjgTy5xNIQOXKM
+Jg5129KGE3wVtH3PiXIv4Rhj/PZN4stvTwAuCjBUnEREJ2iTM2BHJvRCvhTpb9+NI/6O3cDVXt1Q
+R/IF5mO83PYibEMsl8EPoklAfOBiKEdQl4zpum1P+tGhTNsL5G1pCxzZTzTEoe+hIfLYiSeoaNL1
+BJslYbomT0DelcEjE3DdIa66K3cyjDCQLNpEk56D2xiks/OAvuTW+T53z3BJHrYDh8dLIujSE3gX
+ZIlvIsFYAv+TntA3X261CWXHXRlIGtxY3jWh23aNH6MXN5E38FXotBNP8I2MFDqCko1gQLlrySSQ
+quvJ7sm9ixPZVs+0k8Az3Adpw17JOxHwgFwCfIROeHUFPwuClWuIkSJfjwmox5O5Yg1uEIMEs82N
+bFsY80OQC/kdOoJXDvCO7IHryayBukKcor1v0hDh1hs/BGYM0BD4ga7Ll40J5aG0eYnApPGlm0hf
+kgeyUF9QvoOFBjJpnxSCbQZngTZCjOy7L6cnDT4oBiYkGC12BHSkzUQGPQliMLJVMg==
+ ]]>
+ <![CDATA[
+ 68QIQTSCEbxIlxoL9WHX0uYCbeMlH1ApOFmOkmMpHHixnrF0G8hFwSqkyfd9tnk4SjQ4xtEJei56
+kdMGZpcGYkd+FQgoC17E2gPwfDKmEzm6Y1iVnJsbenwhjgTE+ZEgCVdAWjoUdB2DUWyHSeTpvssc
+jBvJNceq5OIGvgK3i78DtrkxoMUNLPiEdlUuwD/A/AhF/EhOV0AJbWEElCANQte9bJeN3J8oDLnF
+grl0VdLmOYm2ObgTuIShw64DHINrFAilVzdRKBCayQOQtsR1ZDYGdyG085UtMgZz8T09O7kHOCpp
+ixPfdoyLY+SIPMP5JR6wDxrcxDbIVvCr3Eu+IJAdbfNdwQcetg5QaIRsgGcChLhyInwD908ALQxc
+PXUZP/DknHz5b4RTN/IQnwugCzKTboTXNTG+CsCC6a4KUY4830eb7wvJNo4sKTDsRgAfDbKDIP5y
+FbjdmLXj6gqkLcHxo8EzwnVh8ASLd4RrNnhD4NLua5IIcyT3X+YjlyOcTAREgPbwWzDsZCLXOcB8
+A7n+EQcC7x0IgPgCwJHcYsGCHm6zD1ZC4Ba/5dLyN/gfGUXQtnTOVzgjwXmCFELMLAS5iWQThA3B
+1iWhSyiOIulVIEqaHE+YxEhwbSgbhhvqxfztCBbA9hu7b8J5AUPh8nlyPeWnH7r87fmy9/JbtjzE
+CSZhQCogiNZzPY5r5CQmhaI6npwlt1CANZSucJFl9VHo8PajKTbaFMQeYCOUO4mzkBuO/wKDyl3B
+79gVwBTuVi5cwv3w5BBlpvKnCwoinQSB3H3ipnjSB5sEHCo76+l/0y8EyhND6JPbZLI7CDzpxArz
+OCZgnFhhn02AT8BpTAQeJUAvAsCJkg6fSCtuu55eTCB9VzCtTMfFDgqdcDEf2Y4Y2EfwiAkVVI2S
+RLnJwqUnWKsbCvIw7NzD7zCSTo0QN7D4wOtxxE+ESpn08J0QfKWgqch19WonYN3lK0E0Qq9ljwUI
+8BX40yAE/yD7L8hAXpI9C0CFXWFPwPjLpkFSiQQLxApDLaGECYisSwiV7REsGoKfEGTpy97IbAVr
+gf10gjC02FOYXA9cu+d5Op6QPzkiuQex/JYVh4FIIYBY0FBsQkDOJiEzINwAZgDUZ+T2ypVx5YEs
+FIxOGCsQCYY2ghPxhlxV7LNQHrl82CzjgxgHkMIEkHgp7fkDuPAEzBggNBTCDyoXCxvjC2DE4E1k
+WpHL0xRqG0LMEN5arqHApSAqTy4bUBG2OwSTFctCRJiNOYi0xHKppCkiDQ+BkyKZlu+A7wkF2IQ0
+4FBdNyT7IE0ii/vYDRIz+e25gvsCvuniAnmBnLUHiDHc4FBWKVwYVuKA74lk8Y6AgVx9ApvcwQiY
+Rn4nwsfYiy3oGGfiJAL+kxH4IoAyNzYA+ogdYCRhVQLlu6JEKVxgj1F+CxcXyG+BCNly+S2sg0xQ
+YFCwJtYiSMmNgC6F8RM2YlIYNQF6AI0TO4IcBIm5iZ9w4qDTwGvyOcQWYMREgERYZUeFqFBWayYh
+3oCU+wqiJ0SewvVgENwLbxLIFKDgg6ol+BmHQt0wbeMEFt1y0UKTCAGJHLHDHoTqSXsCDiBCD6FR
+qpN4YNSxPXKxgdPBgkW+grTsieB4uxBdOz7BDoIJwbUNE5IKFwI2MFLsKDGR/UKnMkHL2woVIhcq
+O0a8gQZBvR5WI1yIEi6RH7DtIrUYpa7SRvHBA7kKgCOAyvFbeAKwK5BJwRXKLsqlVZZYYE5uCKBC
+OD0w+6CsOAUX5yjXHvSYLJvQCXL//EquIm6LYHw5QbwkSELYEAFpE6QN5O+kfzkP5e/Y5mpbCIFC
+GgJAtyGrHpJ1RJtDUtwOeNkTmbRPUUUQcMR3XAjMwgMLZ+DJCeG3i5sov2XKCRv8SNCjzF34RMsc
+OSCjLhCPkPaYzFDgCiyAA/L4FU5cpuMCliJlj6QtgVQv/xWxy51UzgzYR3C6j9+yyZ5cWvBeoEpY
+qAteSnApRR4yioESWddV3hQNviBnDCW9ujpUAIbLhXhFYo0GYbdDNAgWTdggIl+MBhFdgnQsvRrY
+6IB0E3OMAIiyMjlL5R55sYHk4yRkg5vEbCBHtqrcY5BAHsUuRoH2hDYvZpvjK9vJLZe5AtEf6DsK
+OpAXTcR9DIE7gfINWErKhwQuWVmkcqLrKmsCXA1uYqfQ5nvKH7og4WCYgEJD5WGFTxV8Bl430OEC
+HJevnGfKCCcO0KNPQsAd4d5KAyQlcuWAEKC+7KtY2VKBi5gkSugHbp2b/YbA5+JGheR+rSRBKAJJ
+9dEzWAecsaAsQVUh5Q9LlISiqHDIJt9oG7hVCqABVw7m50DfEdEJ8ouVNjyQRs+n0B76Kg2FEIPk
+MCgWr6o4FIH6GCDgULfQs2ohtOGaQdCKYrDWVgizIpsnQjUgkuQDDYlsNoV7yBK+6v9w2nGsJN13
+FWLArVCq83EJYl6G0IcUAA4HtxYNrq9TRJswdGhziRN9YDeXd0wpFAVRHA7gJYzTryicoi2yY/lg
+yynTCL9yoBPSlQrgQ5qDcKryJkQ2CsKyvCAisPJOnajcSUptiEZ0f0Lgl8iiGfBtwtiDNATAcnbt
+ID3A1FDPGuG6XBH6QQz4LkRuD3ctZXj4kWw4xE60xZBwhYcFB+BD94heArk6wtBNBsqVrFrhHlAJ
+tZ2h+sHXTQZ1IKYMIGX7JCFyuxWvC1PCCy//4hAF3woRBrKTe8uGyFWhUyiosccp7EAI6uITScm6
+hZgLkgLXkRCfUbnjya4JVQMhThU+PhQZEVRMbsiX5FgjEoxI1UaRXGoB0kx8g/pJ2CpsKGcMBQ9l
+Hh+TohbLqr7SBn4FbY2XfwkaNDdmN8RmULOhAWPFRoU+ofMOgBTqbogpaAghN8h1MgTStAFsIvCW
+/YptBrdA37HYRo+5R6OnSlQqxYGOBR3Ia65aAQBrcUweCUhUG1wyTdxwq0rHRlPXvmo/8rFrItZC
+pYvfkKcDy5tpAwYKcBbZN/nBd3ROuA2uIAxwhKD7v2wbuEW0gQDs2DZfGUdwzVmTsMNscw1V7EJl
+9LvAi20D5EY02LmDogozj7aAcwVxAtGMLM+FhkD4aTClxPQQKkA2wGlFoF4GX0HSSlRChRFFBADp
+DlwpNVAYSZqo7RPOlR3vaFtEAgHm2es0qTgMzTd+enKI+C0XQRsi/pTLkHYc436gLYQdBg2JitRg
+KPE7SSA/g89PVJaCHAdYiGLKQ5NoEHmLvfigMmgQgsShqB21X+mWxjjhmC8p+sEDqPnREDjaEEWh
+TjAG8HD8ADqdHW3jdZK20PdCfhg7ENHRIDfmQF9KhDKxLVEgYVuiWxb5MFOJbMW7AQkArC0aBFzY
+k5xNoFMQHOPqtITbsD0BrkJOS7ZHPwwNYEFwCXjZA31JppOwDToHfOjxwvloi4EaacRJIuo0iAla
+0JdBTIKSIwxVDo3blC+lSURvOUhgapAQmtnkyrUgDPO53Fo9JB+mMsgUgElBU2gQ6hWyAbfvQF+S
+K5OwzeDKQqMSuezJiQL9KoJ6HQ3Cg3NDfCKt2HatGyJtFAYwBU/1Gi0Ila6QfSxNJEDpDFRblxa4
+UUzzWwiJlQqdiIi2FUInhcW4CnGtGMjcnhpNRgnmIrcVVAQsLpYLUSkUOA0cZUtaMPbihLgi7Gvi
+K9lNleAYKxEGXxAUgNwNLHaA9sxANAbnhUtsjFIP6BNcsC0tCAtcCIiyq7bBFlh6kWuVj4Ws0QJT
+L0sBQRGEh8NGC+0PIVganTnbyKbIwUNE0hZ0b8B0ubYjB+p1MH9OlI1HFt0YpXktqBCpD5PrGEaq
+5JAJCnGGLOBa/CPSXxt8laAXYehoIhXsEohwC3IHRlxarH4IYpNMVMdDIxRzEFlwgXfSRqFWfDOI
+9VMhj9rg+lmLoB+2eJ3OiO2kkQrNFuQ6IWbkDR0otVqQGQWdBeSTYxWytdGykC5sPS1IjY4POg4w
+S8isszdXBJZJ6rmT9Gh9BanQLrTTKPsRWurK/XB8mib9ABhYOxRwADvXApPvRdaRAFsHFVsLSB1k
+P2uForQFpROIsTbFRMoyIZEwbafUgeKayT6Dv9pJW0NQBt+yNWkrLREtsClGtwz6RQOrrR8nenBy
+hjBRtQBgjlp2eOJUhraA/3GVWhCIyWW3gEuhYiGsuMSK4Coh4Sh0umBffatVixO9D2GsE1AWiJBH
+VTPUauRpFUIFoh0MArU1OAAuBFK1mvrBasNaT8mWVnfjcob4A0o2+gPI5bOXHAKP8Dv4QsgUAJtN
+YUBKZay1GJ8C8GBLcFS1yxsUQDXbEomI6j5MTgTamCSOjCYXRhkEL5Gy6KeO2rbQqnuGbZYdR2+B
+xdpAGyY0hsP6lrqyEWqBtFEvg5co1fekNwsH0M6QQnsWwysAk7J4KtQS0Kn+RhNNKumFEHAI2UoT
+EZt8qHvRJIQx1ia9VdgVwH72rePqOqgT4CA0vGK1NCyySeiz7pQgHLstUNZEMLV7sIbDHwFNJgYL
+AwshpJgWFEFxomQulSmkEZc+waeQ6rE2KJB8x1I/H7cwob9Iwhbw8orlBSHyZsCgBUZDkLrgNX3L
+QK/aSjxVVKDvjKagUVhRbfTt5Y3BtSTq0RDQewDGVkiYWFLkY/NBe5xIeSnXCh0tKP8inhamAx8R
+cEJ0MgE0ggVrRbDzkCc0yuVgGmgEdVVY9ZRyCt+XBORiZKwQWCMC0nKUn6SSGC0B8YTrZCatVmTN
+Xy0hBCIpy55FMJ6ifxiXIJTD+SIMiJc9tYxyGh6lMV426MJ3tM2NgkQdOSDz2EYy2Gzk7kZWjYer
+D5mG4BtRt+5pIxSp/BbYHrODmt4NsjYortgGxUDWGHTaWiF4MCzWoX7FVwSMVlAfaQ1iKmvQJPeW
+LxJP6rfCz/AtkdICVcKgVa6Sxx792Oe3MRCIiyaR3iCUoilyiUDakAsV4kLSUlyMVEIJYf8hwlEF
+DRpcXgS3I461Qh8cfwxsLS9zREetI/Cx8WLsYQCuHtfFpxXECjcR7LluN/JHI9hT2Fzot4RPY20Q
+EA61ITBKSaj6sX3RpIhGyJL6Gp6ixVUHrUiVGmxx1fZDPy5l0Kift5OAAcrnoKppTRtdT4+Zsjxb
+yP7A1JyoH5fccV8boABZ1e/IL7agxg0D/U5mjusonByMwmgRlBqiJZNYWzBLuCQaoOXWYyuJ1WfJ
+lImZ/CqAoQPsQEgRAw20l0YQKxydpR8mLnmnUAVdeqD5cJuSmRFuMWsy1XI2MKjqMsCsEi+52eY5
+DtipRLg4PWc5UVh4XFpY0RBCk5EQwO26YkUY0M44OMigYwOLXbAjAW9AQuWZ49ttlD6xpTQFgXYH
+kGhiP+OZ0ED3BxJmz8JYbJ0sjGouMaHYcci0RZGFE9oAjKOU5ETFbmp6ZEjyufC7o6MAhDzibD+m
+Dg3/QldIMSRWLhpthOBYRRQYVQMrhNAljU2CysNUdIiVcfVo6aQsYfR4XJ/XI1JtAw==
+ ]]>
+ <![CDATA[
+ GhxlD6AqCyEVyQQd8Cfwx4pgR6EopOg/iBwui+puClcBtLZUUio3AiMoFK3ghxyjXzmOcpwwSvEj
+ax2VNqgV8FsZZtOmepQNMH6hIVAlO9rkIRl2Ya+s7AfbCxTGLmU/r029ngssplIzADekit9SVJiJ
+DY2bZE7BIDnW+SEMEsu1OUBFtLHT54XmT08uY8iRVJ9BP6oIO2H8VJ/RpUBJ9SqQdiLYSgxupupV
+0BYaavYpi2sL1chGiUCvlHRiP5T7pfrMMP1QGCd2T8cDtgTQClEJaqKMmczPQie3V+XKZz3ikpz3
+2vwVLKfO5AM65K7BlBwR/1J0gc2Xnmwwj8VyKRRdJ5Nwi8L/0N/N0Au247GG85ID+5V6rIVB1gbX
+rQDXwrjq2kTvMzq+weSspkm0mcBae43VIkaeCjN0gEkb8lq7tC3GodJlTXoRQQ3Ga6o5OZRMfxLY
+GVTwRF3JhHYABwpaosZSZizXfVIddXLayLTBaiMxsc47vONBrpdE8TyoQ5BOMJEz8oFd1aatasRI
+UQU1wGlDlzLSttHqzw2z3WBzXDq/AZlhfa5CKMeKVbjpbHOknkidgyic1ol1BF2zJymoe5IXJHD1
+JCO96GkbhnDgUId76cL0Iw2yGbzdoTWGxYn68xCNuJwqXRtSZ4SsoesgbRskeYiu2gtURsJjEI3H
+UJJBtQYqbS2gsfXhDUkYXK7YhW9aSJTgTmarShtOFD6tyTp9yVfLR6cbaJzhli4YBrLjqlVhQxYE
+5w+HajT4EGDgJUNtQNrQtS7bhsWTZKXdYHcgSmRjYQdTwykmBGkE20yihikTILKDKJyWnuT8nj1I
+bryjzkm/tM11VMlAYy86jNVmrNRfL60qOjL3KZlGrDfQvgMLhOoXXI9X0jZ0rdi2QZyGJYi9OGQV
+RFCxY/vQO6cN9kxiWKY6L8mM3QB0L6ShmcuCIjaGB1dozz9Q5w2BFVqYdmxPoQval5BIoyFyQkOl
+TsDjDlQzljbY8U3kJl0vkdxQL+qH+YbcWrM2odFGX1KmQ/Y+or4ryCzebEjhzym8RHcRNIAccl1g
+sxLa+azZpXCsivZ5ASHDdJ228ga5045UPdE5yQia5sJpQ/yKc+9AmWLyp20bunbAtnVOO1SPr85B
+Rio9d512pMrizkvggpL8accqJXeddgxLZOG0Iw1b6Jw29Pgmf9ogBUHhtAVNUJebe4liYue0s4bc
+WrO29LQh77hB7iDtWF2nDduD53e9lNAHOzvtWLW4XaddONZmRF5DU+iE/qnbYT225J5RLtQAJ6pk
+CWNhQcDIwKEGDHyLpnPIIVge+BhqaKhjij1VD9N0AzUsGBmop6kBMjYYATrsiHongT+Y8KEnoFMV
+eLY4UXoKVUFE5tSE2gitgEaowCsdXVJ3kFhZ3LXMI82NxldJHsgeExWmyGWLB49BLCaiQAysKmes
+OpNQ5WvjqOsvdTIqN6MD1RNDxZOodlOwiOXd0ZoYK4DJp0b1V0IzoFmQ5TNyB00BNS4wC1nXGaq+
+VKuW0IXWUx0oLUCYngc3JWomhXlVBpUuDKnGLQypDvTowzNJNWRAThtuAR51nfwrYkvqKKoqR8b9
+BGpxo7oxpprHBGoioOY8cYyqEalETlWEqnGCbw6FajY5kRryVL1N/8EwPfcwVRFm2l0PTnGJakRp
+tqZajlIf1IsRlVXQ30VuOmwavQTogvWKu0IDGAZJfB66Q9ZOx4XH5olVG6rwLdPz3MRq0YWR8KzB
+MlOjU5kFA4VJVakO5s89RvAWNTpOar1zNGYrARqKOCTVy4QmFa44W4/K4kjZXjTwdiWhlW6wFyn0
+JiFdP9GmKkzcxdCqN0O4ePXczpPKeKtJESAZyyLwDKYdxicHplxHlfFZmE7L/tfQaTeAzsWDpCs7
+igAXGCLhWNKCpE7VjAvzjBOqppOHglkFdHOM6IuPWCuhIZBqKZPH8H+lDN37rfA1nmryg9gnJx4z
+CmmYcVcGGBdMhAeogSqB9xajbtTHPs3azXL9ucmlF5fn335/mZxdWXlwcnL16/nZ5TFettFGjcOk
+avb/HwmRahYG1QB86uKgIEaq+DipAXuIi/PliOFkFKZeB74w5HSA9S3YR4FK1oneA6h+EviUy/Eo
+xqTXFZwN4VBCJToQt6HRH+5dDKBzYSqOIuW/qPNwVMELLTKtH/D8MfB4sACHBtzqyAZv8CMoIHQo
+upijgR7a0DxTlenDS9TQTT6Cry6/gsJT/kYbiQF8g2Bhp8uk/qZykZ4MJvsIWicosImWfE89KNGA
+aaKBWvgIEQRWeYo2KGfRBoccanYQkxFZWobfUL/gtxNk2h9hxjhlVRTDAg4vmQiiKmxKsIBH2otx
+rIoP7kuIM4qArl3VT2FkX/XsrcCBUl4aKNEkqTKRDyPcL1AnRkrJ9oWBmmdboQvdnw91i0xBNz20
+SD90aJLFb3pQhY7agtEgZJQvYJFUXBtF8KGvnoUYSXgGkeEjtYpRlZcILFB5bU0zAaQcuLIblZKg
+qBNWI6HLCcf2I8S88VhC31GlIFYOjg3Hm/gaMGu8WCGJdgYEy8Jjk7CmDtytMFQ7KxwhSNJhHAG7
+GAGChIUENqLnO7SFiUrfYF1ouYd+ihZ961UjIB/yI0F/CdwlGQ/kpdY0o6cNq1ZIXsBJMrdVOnmQ
+KZAOXPW7T81wDOOBNxh0rKE1VwZw4gKnRdaLpnb6f8ZpxACs6aDHINtqGDaeBlRAX2dia19XH1BE
+5aVsE3Q3ntqtqbPkPGlEhd4iUWKLGHXYG01qzneszwyNkKZjXzZhos6QXhAoNeeFJ4MDCAABhlSR
+egVnfg3w2kIYFTwWEgR+uFygAx0QGkjTEfWUQmhCDaxqsMhZJbFVRgE94FQSOgWlXgH8RkDfUNkd
+KNNLNsKJ6RfH6D6eG7gt37qOpuyH5xo481kW2aGJGF7mseVkjFpKaQdOvMxg6bgIVIZN1oNzKgf0
+4IYFLhWmIS6OMSkwldOmwZnCtVmt20EQKluvLIiciocwPpjZHHhLyjuCBlUDAjObC1dTxJkkCCSG
+mU1E0oADUgaILOp2aIGI1bjKRllh1rijjQbB/3AXoKuF3FEag+CODhUTzGEh6EkIc4DjpvYrcpU+
+BAWiigghFi4CUrg3uIYqtQr8Jta6C+oDM6VDoy34jRBg75HQ+fTSgZmKEbNgFXSbBHVRKm9hpmrw
+clRt1nLpzO0R6ejCEX7NPbHWEjLa0CgrIwlLCMLW4LGpIfV0B0CcVWwvC9qSwM30izRgiGAxqdCs
+X9HyCreHJN0QR+N3gUbI5AK5JuqGQt9WLJXe3bBx+imucjWaCIIAvubgASNb1U5Ag4/LkFAIeia1
+VPlwGoMrLTzQ1FJE/13r9ocGan59Ffy4Lqj9ErU0AFcqCVNMQekZnBB9DeFPHpmUBVD3XVBdX1m6
+ALkQhCOPY19lUiIsN1BbHE0ExgadOhr0Cj6f4bCI8mI2BHhcwM0KrACCIHkD4RkuIORHqpFjAwQr
+mNMCilAFzkaVbSNGzv9fyxL6yhLCgcIhJvBxZ4Faor4sIVXJ9KFINJob/hpgBD2jGRpAjSJlq2j0
+ACGJgcaEKDJAAQIc1IeWURB6w8AvolZwATHc/JH9guK6H9BoCn4jSA3ViOxFDAiRU2iFTEBjGGmA
+KbhSEoggUOPQiXKvdAD04QMe8h3BRgytjdW1s3tRtUJZvy1sJJQBiThUrDBzSKSuNSENz/RSMXZt
+8KiME/X52VdtbyJ4HDdUmBzHXtaSj2UPgPCxV0kEfkqlMjhOw/pF91I6i5QOjDHp3LUy0JiI1xV0
+RGbPZt0YVzKK/yev1Hyl0o+CagAm4b+BoDrKFpbrO4PUlwt+YOSHkBdBHdLUrUa4J9U0BUpXLEPp
+q5NSoO48aAliqq2gEfSVxUQgDxtiDYWnuiigk3ugHixgKT1PEQsNFuAgqSaiZ17KPCU2sgWNdANM
+bPYekkTwFGhRvSK8z+HzeGJdy9QND1kM6JktI4YI5QR1pX8oVhzQLdEDGxZmrmWKbT0b1oUW3SHE
+08KFAhsaBNg8T5W/q7rJgXZFyysdy5B8iI4DMhk4BEEG8uD3S0d+iKBgPukwgG2PU/ofuxpgjxNz
+I3pnwr8gSr0bwRczzDRRdE6FNSaB3vzEatNwGEBSnp4Fp9UDC6v9tGsIh8orRxDB5wSD6NZCl1pq
+qK0pdNHT1CNfgag9npUDMz+cFOHerro1xBVTBpQ77lmvkZ5v4Q6v9lZ5K1InS6taG3jYlebDJsY6
+VgaaN6EBGv9vp1erBpz/QVb/g6z+GWSFpB6uW9DlgsNriq7o38o50YIWlNz92FepCuoCRrUqupLJ
+JwGlW+FbEWQelaIrqN5EZp5UxT1kd+COYYZdaT5snOa2gImMKeb+B18NBDu1GAvKv8Rn4Le64v2y
+yj8mdoFBkw65jLeJGInPGEtq+mhPhnUTqo5U/UfruqfK9DQUKZHzZeSzF6pii+Ia4nwRjYiro2kD
+BPP4Fh1BKIJnJNo8G6fDttDP2tBgmGUEyl1Hw1Fim32F9k9fLcxhAi0s7LUCpv9rgl7zNJgTJUP7
+AQTi4SeXe6BYRsCOic7SCAJBa8grwwB9AjO0HnQ6SnIKXmPNIZocIVXLQllnIk0apFpZeAtCXYFV
+pqpaDSL3hTwYY/XAEdNQyeuqGS6cVgP7ogf1r0PPcJOQ72ZwTVOkAv1ibKhODPwoVBwbR469zDFV
+rA7iBRPmR/PdiEjFTaC6Y4hPFGAhDJHo/dZzYImgij5QTXrAGz7MuCsDjAv7IpwKmSPCjxtjlcCJ
+o/i/DVapBp5arIIke9AlQyUJJP5L2xL6YFovDCpSIzq4M8CaSlNoIdLsDFZHGodIStWOY2S/ga6X
+BJ4OB+AZQoQA+qrt9CNrcYKmyqawgJtDmGjQZQJHsdjqpwFyIUM5glQ/7TpM06LmZuqnYamEVwkD
+oZH7B3nCXGiw4jjVTzOrJ2w/YN1aVGeFUFjDeAF1FDIKRYHaaqPUdQHGtZhGFOuTiKV6CBIH7xl5
+TPoJFAbmx2FiGuvqzcSDsl8O3UppPoPXKhJoKBkubn4THIFtcibh3gTeh96fzfkOJFX1EUdjaORl
+qKhDzs6BNzXWjiCcJKL9wTAzFVCE3HUkQwgmY9qWYMvr/dJ3As1EI5wZ0aX1Pxhm0JWmgyLUPWb6
+OGWmGyOH/yYanT5Q0ycD642jK13mA2T5PqKrkutqAkzhs3+xEVQ2pvMwbEsezftMX4iceAENOIE6
+4SN5qqOR9vJdmGiUF9IYIPKE0WNy0fyUwYT9CFYmhiOpSCGfBTYTJWDG43Cupr1DdLoTajhd7CD0
+n8k0SXp17oy3ihzNrQUCkyCqMgDaCJShza+Ow2FnkZlb/3flq25HyU67ztwkQ91pGIYSzYF3OLJF
+IQIIZkV6icOXAkYrxzAUwKFLKlIv0AQCKyv+67VlBoangqnTjEqbtoc4Pti2eZF8eA==
+ ]]>
+ <![CDATA[
+ R2lgY8iMhDDyKHW9cfRZZ15/EXy4V3mjX4SBlvWPXInZldwqmLF45efp70+7x5dfs8Tks9uV7/Sm
+N8bm6fUqB4PSC9cUDApXr3NQ2fXDuScarc5csurso/ctRLCUa139ka/Bi0LrFeBZLxLQJfgb2DAx
+3DdX6S+SbtHNMoxU34BMPR59RHAjfJpsyL5nF84Ihwf/jojGTjq2+Ey0EHuOKgHgnIf7FqpdF9N0
+1JANtxXGVDEHmjQgj4KvecW7Vpe7b2U3LI5VenI9BJE69ACM4QiKcSL4SYAD8XTX3STM/stcM3B0
+YPSaAGSCNFVwgdWdT+CL6mvAoPFcqxlARi162iQUe42mVKBHv6s50OWsZHhBURFDuLG9YWTKvhY5
+Gs6JIVI/+Mjulqj6cLixVwYaGwmmfFb/hKdDaMf9P4kbBj6WfwY9PPjH0UMZQugPtY1QAc1TSccA
+DHrsdMor0EdQ27L6CmmW9PrSFj0EfThyPhQxH46UD0XIcUB57P1/loQPRcAbcLH/Q7wrb2eeM84f
+/DiJdo9bBm4ggQ9RP4A+ZPxO71RiqOpiWn3cKd8wgpIJkXGlBJdTR5cYP7tSdMh1rWiDK8Ucqkgq
+CHmKd8pxEtwpZkjK7hTcZj2N46ETiGZKonsNr1Tg2xvlZjcKuah5o2jF8rQoCm5U6NsYhfyialTk
+XuLrbrpU5kPfmXgMi6JfPyArpk8/IQxKCwE4hvrgD436RIvDRBBwPQFLw4z0yAzG++Qi7AAngtg9
+pOGF5M70yvBCAbFBmgdmuw9UEGXREoFhBGsx4RQyJsABuPilCUNH3bRasRBOTb7NqiWo0+CGifor
+CpnqOybrhyBRF5QVyGwFf+Her5CwURrgB2LSSidIFsNcpywLk/R+FdtUKih34thSJUhGiONz6U7m
+lnyUaMoPZk5BFpuVpruiphwUd0BSN1gWxuFSQgCw56+nH+rZl578vylINwfqflr82CYmhuu7m3Sw
+g++qHjpW7OAZ3FHkGmJKB5iqWEckdROkj2ZAGQDFMghFsHgBNzA8IwzUDwvZIGKvgxtcOVXgBt/6
+3TMtHJGDr8hB+NFYsYOf0VsmiAR2iGMNAHPgXwbs4PnuZM+iarGDx410RYKJdSNjhGkmTB4I4iqi
+RqCZk5FAHVBBjSCz/vB2gT7RdRXu+qzDhLxCSMWe0lqfAdpQPIKmhshi5jJY0jD8BXnzkdARxgho
+9hQ3sIIEk9EhI20UOl7Pl0bwQlstjbQBQNFH1IDTZ6oF5LKO+49o77gJma4fllPflHzlqSc8868H
++pHPcCzkCIQisecTJtLzGFBAxSe/QXgD0CmMJphy71e+zQqALFDGTastNdgR2GwCH2lzkTkxDseE
+FpzIHrwee2APvezM/12s0BCY+yOFEKtimRTry0mkEKpxijZ9pstF0lAK+QGRQlbpyNWSRNCns5oI
+8AJSNQCGmA8IeMFlprZAndWZJcZ0+HBQNrzMqBTZWz/lGWI1ykhvoUULGdMglFfZcDoLM29h6BIt
+aBq2wrJq0YKrO4kc8LqTSIOUsK4Pjj8yyonJ/AQMARUhAlLwhwGngid033RDm9YjZBIjFfLhTO8x
+VTa8DhSOg5glFmSGUNxHHrO7MnciHBuIEwLkyDJMrg+bCDLeFD/0kRgGexYz1zPSkhIjUDVC61+S
+KP2uH483Dr7wqFnlMy1b2Szp8u2jBAMzCuo9RRypQJsL33a3d4oI8GUODZweom7tV4GPyFoaVp2y
+rxLFBZop0TOWx+i/JVruzuIElnIaE1Jw7bnrqSs0mKTkyP9dnNAMkhugBLhf4O74YdhBCQy/h7+v
+ogSDuppRltQKcUxG5UrP5mwKY82xiphiqoYiyzoyvs9XMcIgVYegBDeIO6wC/BTwchCrHgmuyzhb
+lOOArznPooASEpvlx4sdDR5ndnZk2448dXHrWlYtSjDcSPigW5Yr8LVqhW+YhDsMEeGAAgQR9IqA
+igBaA/zhIGwBj5BjCbns4dijEQ++1j5E3k/mM3XA0cruhRB2QuJxQbx0qELAJOI8XEdjIoEVQGJj
+FBJiXnaYU0o+1OzhMfGC63ZKHwIwAhI0JMNDWZP+g+LeUdaPUHIHpZHKPsLJI90sIsJdYz8SsgAT
+LPIjQyFS/h3pN4IUfS/7DsFSml8eupry76woAaAMdJaNtgYRA6wg5iLnsz8WloEwoMa4QP9DIpEw
+1qF4+P8udmgG1E3QA3hb3CNEUVr0wHQRaaJejc01SGLmsA4X0INI74zCY40pix58JANDGgkaAVDR
+BpU3gR6oUw4DLXCAJG1JkEMPEcMuExshy3yfRA+wwHusCGAUPXiZIEEYBXqIQs234ELGS5Px9yyr
+Fj2o0kYkyMTyXj5EmBgxEDTzh05M7ypk2Veg8OgeRPCIKVIkCXkrsucoaoiQyDj1KI60yJ7DylNM
+ZUarSYCgJqNZMrkfTE3gKMtAxzsEfaFQnxpfSj4MHNskE0R6DV9D5g0ycZNuwiPSazAkzeTIqiVU
+HVHW5fMMtK6Jx+p3Sv4RkWIiVn8Cdi/5yGimwYjl0lQjaWC5SFiEMkaW1d6vEJ7CCgxI5QH/rJWm
+exJa50+UEGE08ZiwgmtPPk7P3Z564cz/ZaTQDJQbIAUm/MDtgS4iQwrM2aYCXIsFSByXWQtdoyUQ
+WBYUMb9+msE01sy6yP9qjPIMrPHpM996TFcZTBY4wfM6UoTPyyRyQUicwIIXwAn0kvE006nFCZZl
+SLSqMnECU694mg0NOIEgUlxVHU6IE26kcAOOsa6W4FxjFu0KWfgK2BYhoxHgUJUKSaTAYWA8JdCE
+XqCVjBKPJeeSRFmGQKOFGQMM6xqqNjPFDFzfmAqXyRISuh4iJpWRYi7KhmgN7thqZ3s/lG0MrXI4
+SkJUenFCixXiMNI8nCyu2XdM3jm4qcc8L8cvHQ9YAdUrke8Yvoz4CgF/qK0CH3Bh43o/gruWFxMr
+uMhtY/FPiPQ+SB6DpNIlX/mIQotYlYv5HlYa70po8yWx1FDkNvLvaYAW4shNNQv25O25F0/9X0UL
+DaG5CVpAwn5cIE0eqVghoicWVXuttLRsnNn4fIavG19zVRMpQMzwWHBAs8yj2A1L5sCWiUy4QApw
+K2cgttPhFCDLMj491shkcqhEC9Q5Gk37TLSQxiogURNEVkcrhzLplGIFL3Zs0HFuUbVIIdZtNEwY
+gW00IE1IK6HF8ByjZEGE2MQKl66mbxbCgWyIeJYwC0KEgjWasMOH3YHO/CCmIn4m8GZFvDkomKvs
+jadprCPNI04Dd+Lb+FGwSMiKEqNUPNix3g8F9q0OpRUhTojpSawnv4d4IyaJdco+LY5J/hypQAwr
+dcLYVfYVKz648GJDLUr1/oeOONF6FD70Oz1fhajW5vMEYy/yLS6JY61OARmz5Bs5EuYfhjOaRQlN
+tiQIVEiFWEU5YkwYwXXtydtz10MPe4/830UJjWC5AUZgskiPWbEzfWPIb5GpPFSUECEXfWqUCHzN
+2Q/3XQCRRQmsRsXa5ZAwkHCCBT8dLcFGl1qABLNURx2UAAMbJI2Y+YA8dRUiSqC+0TDzh2IEL8UI
+BmwKMYJVNxIVBLnwua5V1eKECPvoJEJllfgL0IPbxYxYcVUobUCiIFTHs1TCgVVYPT2VeUjiEKmc
+XWBETS2JBDFyEYgWUFbDR1FNMFpqLGFsErWhekNZHR7SOVIj0BffQ5V2ZmAVYVmuPoqA9nwp15AJ
+1WH3CX2/ExwIqZulCZF53ncbDMp7ByLrsxxvktl1ur/yNX0SyhcjKAxfpSlikR4Huoner5BhCNpa
+sBqOb/kS4yMyAwFaUEb1fhQEyp8iG5xrTSXNdsVPNEe0VqppFi7ZADOw9AKPPz18e/RBycH/u8ih
+GVA3wQ7AvV6oFYAz7OAROyRpcjDkL40zCyUMUywFyGiQFDv4SCeIdCJupNlnGJYI7IB8TMwHg7Rz
+8Iv3g44YESRaWZeRgsAOcCAEdvCt6tGFPSGy8ZopekA6cqIHq3rkDQF6MImWrehaVi16CHUntcoD
+3LeQjBRZr0IGDAn37xtiBxdV1pWHZMIkqqCQh0hTvjsQsSHasbYiXaBU++hBYSIwikS+LEAH301b
+1M0PY5umM6Hxj5kqNVIHSQ7hchn58KNKkKem+KEnkKrZ4lvYLvCPvkUOcYJsUIlS5H4DEjN4Gq4q
+sw0REdb7kacaX7h54aiVy4jciGhRCEYY9X4UOirRQROIFxWbID6LNnD6uPR8FLgahIKQXN9PI4ga
+7IdvUz8yLRf4ujGhBddyiJr50IGh1qb57z3xfxctNALmJljBpkyDMilDCiHrggrfpEghcJhPODVR
+erZQKAJr/CDFCqhFTqyALHHACsx+5dOSquIiSqiB94MDYooUWDsbmddYKQS0BapmRw0JQAqsQa1I
+IeMZWE4HSCFQtyZUWgigYohVtZBfUy1GCLiJcZietxsFaumnKzTqMDj06oSG0yQKEm7o2b9CL1Qx
+wkHOI8/Y8n0GJfYiq3FEpTiP5ROhsIGLYMzsrXDF8dQgx/ByqPjhZcHAHB+8PMpbRS4qySVe2Zde
+gMyzPlEC/PgY841rgPhF8NDYJ+xE/0GJFfiQVkgDtr/kK/CIQAsiGsEkiK8SBkNZnVLJN/BYNgGN
+0AGUAYpKRDLUyCEDIb33K9+m5EMQqDWINtsT32idE9Yhc8elb4R62x69PXjfHnvJof+7WKEZQDdA
+C8zqjzsEepbhBYhOKNUQKF5gRcY4s1Pa1MQIFE/LgYShshaQGCOmizYaTgAdFjA7EAP9e4EYTNKR
+JeAnFLk6vibzdFhBUqtaATEgfWNki7GkiAHySpRG8hlPS0QCNWAbetZVixt83UrHVoeSwweHijBB
+JB82dFEk0xi6zFxNATNJCUjkR8ZKGig3DM8ul6VOWExbvZp8VnZlik2jxNvWAUwQ0x3Q5q5FtBmn
+rImDZQibHTNMaDEISj70HeZXBKJCzHQ7QQF1xQ3CNbI2gO+By+o/JnEDi9ZRvghQWaD3K2Q9BM7x
+ffVu4ldwNGG5D0H5nin5ijlPYVr29EmqzvA1Xj0MyzYFKUWB6hLNHLvSfE9QFsHQNEzsMibk4Prp
+2duTD+y5l5z6v4scmkF0E+QAkwIukW8yV2hG/Rib7hWb7SF1apJZKWEzdphhlBWSLHJgDkUkH/SZ
+/wye9Ia6R+Z8JHIwcDWAOBh1uAYgICAH6DaYFRFseuqhAuTAwt0F5KDp2hyt1ETkgHJ4QA6uzZrR
+ta5a5EAXMUdTvDmMwNJZGmqxYAClR4sgNlYkVAHCseQjRppawIiPCjU+PapQGj5AMLKr3tA+oyfU
+RxjJkwNUBmBYFgKugAKRmAPrF/EdJg7gBt+DRy/KZoUhHHyYA7PnQ2G0Qy2l2QqD0O94/uJooCqI
+4J7shP3H5C2PYPDH7JH+uewjWDI0SSTKb6fKCc9yAAKLvZ+QbYgUMSBBrbIafkCxnA==
+ ]]>
+ <![CDATA[
+ VVmDsoXB6i3QhyR60JKuNN4S2AWQYtGxYsV4UAOSMdqjtwcf6rG7JYf+76KGRvDcBDMAseIGwXcx
+wwxUDWkdNN8mgu0UgANp95mL2CARhEUMLCbsGq0/DcTAACRavhQvsB4CS+f5HbwAqGUlSSbK9LQ0
+IvGCVUD6SAiteCGTJjyUriVe8NUmEcKAFXhpmuXCqmrxgqv76PiWD0D5FwZHUgltYIA1ZB5RJC1I
+uUlLORKUpSKjBHWfD3stAqhcFKNCDRriBdSEE1YOq4Wt1meZ54B16qTzWIMI0OJ7mqmWiCFGNACS
+HmNtWluh90s/ManPRugam71dEYMI5VosCr6Q/ce0iCGGDxGkeRSG6f0qiuxWw0zsmBQzxKwRhYp6
+puSjIFHDc2SLwVopxGVFMBcFSkuXFmny2xi8SGANo402xYs10xuTS0NDPCbckLINoYWCREkCqF/P
+wf+7uKEZTPdFDolWz8Q1QjRchhxgsUw0QX4rlQqSzGLpaVYQgIOTOjeFWrUC2IGZPVh/MKYG0gG3
+APSAGGpgB890RArk9QZ2YPJv38IPsENoFZBMIcKA56TDNSSapZ+ZmIkdkIcJ2CHUXLddq6pFDvQS
+kwOnqyU20kUiEYAmuB8UTAxVoSDCWmwVkCLxKqAYmHbBb8a4lZD9Qw/civC7LKRK5BCoOZaRiALt
+vlUUYrGhhzzqsaepevAEIMb8Yy5KWsIgF8QoGwQHgt4vA09Tg2nhEEedExQ5+AxTRt7zpMmYahWE
+G2NEBzVUAOr9CppLlJslBFinI+Ikh+ntAxirS2aJzOwhSy1EbvoViIbRpNkmKPnIZ7G/EJk0PMd6
+PTbbFM8WaU9iZSbHgxt8m64GpjU9+lhPvuTY/13U0Ayim6AGJtOEPchkbtFkUXEDWVDZ0yzLSWq4
+9NQ6jcAg1HazyYASJCFwrSkBiCFCgWJ8i0BMIAYm8kGO9jAXr5yov6DWXwJmgEc2MYPVQjJJu2KG
+jG+gYxUxAxOme1o8A5jBCzRdYdeqalGDoxvpWGFB8JugVoAZcBbqHXoMpUwEIN2UW0AZC4KHiZV4
+CCMBv0voYhG35AWs6a2YIUT2o5jyOXwDfXgVQZmLmrjwz8AtZfn4wIaHEDOEDrPje5OBH0GgFim+
+90vZE3BYIGiyXnzupfKE76FgI3A3JKr+g1rU4CGCCgkIIQH1fgW+AcZqOUXHTdWXyGwY0neCASwl
+07SVvmHdCFIeBfQmADcaB7BE9n7l22wbyNPgWpfJZtviWQeuxJZQGBNuSL2bEmMPP7FH33vw/y5u
+aATSTVAD3FS8UPMXZKiBBWE1xQhQQ4ycAUlmt3S1Chsy/2WB14Gm0UceQs/YJGTwNUISTHVzMshT
+CNSAEIgMNYRUNWgxCkwfimaghsjqIUn3iRrijGnwUc+CqEElCnq5ATM4rDZSWFQdZojoLiaIJPZ0
+H0UoSSiAB27MiEqTsGpIIhO0ngyGmJF/edbpJTQI8A5RJhnlhL3Ea9NpyHINDFn04JPpQCGBVTNF
+CYNOkaQV6UzgKyI8lGKGxLcVruWRo7S2+F3ouLgmTAGRoIKPsY498A+GSs5XdNpvvJRfgNmbFWuA
+vwrfRPaaBvAgi+IUJTihrcIJRVfxGyRqk/uJoAdIoik+gOOS3B8BoN6t8JH8TShb7Gvtn5WGW+GF
+6qCRuCi2OS6HR9bO0/O2p61HnZQc9L+KCxoCcQNkwMI3uDdR0HGFRnwiLh3zNUunzHWbZOZKVz0b
+oVB2TYYM/EjdW326kUessBOqYgt6CqAD49Je6fudSGstaObCukpsEAFAiQ2s4lH4HcsoxH6KDRhj
+D2zgWsUjLdbgYCKmIy0sqxYd0FXMEfzi2bOPAU+oPx85ygSERjXQnhtaf0d499i3fQZNCAsAU5XQ
+S/Uy8hF6DHi3GgZZlZlELTmgWQ8xpaH6ikVUacXIYB7TIzQADDJGwvWBOHGrA/DRMBD2fhl6pKkB
+ypLQ3q/KBRj6WeAHJ9B3uFS5oKHZ8Iwp+QjOzK7PyAnm20h1C2rJhh2zbCiUqUHuV7hGOVGqdxR4
+guQIG0jZorBw0DQUUCehb7wdzGUjZCRxVO89JrSQHrbJDl3PPC458X8XLzSE5iaIAY5LuEFhDi8k
+xAusggy8QAfCJDNXuipKIObfzbKJsnI20EIE34KIfn50kUscTwUIZhcWtODFnUBrEQupWtAsDcAL
+yG5AvABhhSV8bFhlaKuZYmKwFkZpsgfgBWilA091nIVF1WIF9RGDzK/CgYlg8PMYXM6cXC5K4cof
+bhRahybjphxk4KpsEQQYPjKs8S6iAhy/EUJpzREuHG9cwLCNSGRS9iBNdhM7isVQnca37tBhYCxe
+9Q2XF5V8KIMxSs0w2ai1xihiQIVFlHdz6ebQf8zUHgHPURTNckq/Qiimi4wJxDhBihp8A/802bEA
+CKXnqyDSNBiIe4psRpcEYOIjhy5cLMu+YmlIxFVrMquVppsChgEoGsk94Tk1HsyQurUZK0Nah1ck
+1e099n8XMzSD6CaIARnKcYfADqWYwVdbZYDAGGAGJjphcWtybXKRPU8zplv3JpSHTmiQCMDpATE4
+nhrCqIIMGRpHN3qWH0jxAlgI4AU6GcslihE/C7wQW5VjFNp4yjDK+AWW0wReMFblSG884AU6ZBUX
+VYsZ1E1MMKFveYEA3qIucr8HMDYI4YKQCuBwQxszZRhbwL9Y15HqahpOEFQO5BmgQCM4e+IGo84Z
+cA1E0TcXKBeqqxCiFu416pVDA0imKo5sUKWgeaRdEe7NhfrALfkwjBGr4jFReRDAt82LrR9DHP//
+7b1bb2XZdaX5LkD/gS8JWA+MXvfLoyNkNVyVhg1XCchGoZDIDmXZrqpMGZJVKqPR/73XN+Zcmwye
+kzw7QpQJuJmARPIEF8/Ze68517yMOUaS0mNLHKW339NxDJWqiRBi5eqqbITXtKZLOZKCmRqSg2OZ
+4rWPCe2GhX3qgptrCJQjgMi1fO2dSrNm5Y5u3p+9J4QRK527Q2Kjv1QqsQt4cSeObT/2Kw/9dT3D
+yR19wjWkbKNyFRzh4RqKupVi4sA1lEmTQ3FAl2vQWBNCqWVjnNC/NIUDIaQYmBWsBedQumHm7Whv
+hlA6vIPgbO9WUGjzEoNGsLyDlx3lLp56h2FVx+hVxwlKp4pDYN5dXNazzsHQYrlssutYuHomgemG
+B01eBLUk1yfdjng5QN8ry75UfCo6LzDVRthWGTnQcQz+EWdVxFrb8JxJdLLF+Cl0Cb1rLKR1S4vk
+G2bCM66rgHNcxZ7LdW1Ode1FKFkGynvVfcP6RfwRhNih335LGXk159JFAlauLUo2Ve2hoHuGjApN
+0dFZrywCA8+5oFkeL1WO9XeILnE1lPAvV5Vm0qEj2vD/+7P3hGYlBa8BXdZ8qZpj3A98h47GwlGo
+kV889Nd1Did39BnnwMGMFa2M4ME5dJtyCdWcQ9YwmbSDTSJ7ira+2XSkO4cCORjOYQLKhFMVQ8A5
+aIRBUp3CWsz8EDhY3CD2OTzDCt0sn5hedZT6pjxDO/IJFHrNNSQRMwfgRZJijRY2fHJNz3oGg4ql
+MRybEHPMwvH3IsYeziYDMsS0+Rdi646DjANmIrZIg1NxcAYjylCpliNmL8/QaK+IeVHQ4CTgsQ59
+tKaMM0UhUI9GfINrWG60G1qcFg9YknltJVwl6/Kl3wWTkDqkho3OGBHzwOXUmzo2uqGHVakOGGDt
+6apg/re79LQXDsKQcjGl4X5llaJFMsdhT9q8wzrHAAZRtytXFsk5DOUUffhbnbsrGb5P+DyKoWhf
+yDskb0O1sR++Pfp65cG/rnc4uatPeIcckkYMxHq8vYMooJhXG+YdNI8Qw04goxErx2ZzUu4dEnNd
+cu2SL5mGfFIVM1pi0SWL0piJeeQfhmbAxOEuB8Huk4PwQqRxNjnn+3YQTLPhIPgc8hD8Ix5CfMVP
+r+tZD2GIsWSez7qQxlFVh9RR2hTLIFm4FFpsawQHPa04ySbuSoa3bkqyCvwuclX0juUhkGdctxAl
+vBglPJXFKN2lyDJNYgQW9ZWUZ04leYj1zbrDGkahrDuurUulYxQKmGZzdiX5h5D1VuulfOYdfaCK
+7CgzSY9c1MUicMDOkVHGkR8kT2BgsLmyCPZgopsureA9ULUOkywJnEYic7mqOHRuJG63rzpxR4SA
+BCyHxY6XQjIcCIaxn7o983Llib+uazi5nc+4hmzsiOoBHq7B+pVDnUdhy7rmeeHrNS2AJB21RL9c
+ngFi7qKjZkgPAn0koKnZxZT4DSSO1AVv/SGpUBSbjMGFObmQmyUV00uRes7yDPUIHSRpJM+QTerP
+umniBDKY0yeX9axnMLxYHGWHixC4cbUFoQpKdZXyG9sjjeaFBrX61ScOXRSQswTyGFhTopFBp3WE
+BENHC8m5jtZ1FPZMDTcCIHNKG/jMBf2A4xjwMTdAniEZyTZtRMTJXaTq6crM6HQSS02hR1idswVy
+Rwt9O52KeuJdvQ1ZNQIDv3649lkbvw0Cpdv0koUBy0knYxuFH+JyFWQeQ/zOalb6JPZYN5JVpUG1
+crlq+YfIDV7+ITmw+txtyQ6fGNkox1/IQexK5Mz76fuzv/LkX9dDnNzWZzwEVWdMaTxwRTdR9QJk
+KOYhhFZkhMbEX9YTrXa0tI12gmRsqCa5/KzFDmoo4iHMZWQrEOIh6HsdHmImY8qaNkkr+NMwlTNj
+1PPhCWLe7SCgfqQdIjYrHIRQyA60uLiqZx2EocZW6FU3lInHj/PrKijUlXEWlXJmnz40kcLuZoLP
+tQZnT4bLZXwUitQOYqj3TdTQxF7NSxT7KSbrxBO+u1tYDLFg949uHgIMGcNrcy6jpMR8uRASu7Uz
+Ae5OyhrMvTpPw6gaCSvshRNvuTsP4FCRu+XfrqwqNhnXcdN9eiBQuzhBKVe0a5cHrh6iDzrcXv5c
+d3i0ZpI66163K6sK9cch91DKcE6IMzeFIjrV6cFk/gt1Mnn8++H7o5/+4K899td1Dyc39Qn3IM1m
+jd/NB5i0qLa2Xi/BmjgFdTPkHeSbbcwsbvcAXQDeQbg0WL4YvMY7BG9ZaMAPbg4w/9s7FJvIDkVI
+V4iEmzmH5nSbzA3KO5QjfJhUsuUdVJQU4fiUdzDIw5OLetY7GG6MUY60UbDUDVcEbUCnmkfSWP6Y
+iYER9wlzI1CnTWyv1JehtvVXUB9cNsdsA+zS8g6VMXXC/JbpDqvkqjOIBgDxr4QkZ5bEUk6OlO5M
+6yhTL1WInnJtJcC2dyaXmblPwcerIIcAeBgAmtUz77lrjFmUl4DbtJUu1yVDRoxoeDcPBbLmjUoO
+TF9eWbaeD+ctQ110hY0WqvUiootcexFV/8WyghzV0Lo6N2/MqTuze/CMi9TyYl5iR44+oW8dK4GD
+L5/+6zqJk3v7jJMoGiu2ZG87iRbFzRWSz7QNYWTibmtGg6/TBRuxbi+hjgS8WxJ6hw==
+ ]]>
+ <![CDATA[
+ QGIGlSdb33w/YhGg/TUfggiUjnATlnUWm+rCT2xN+Zh2FFHq4SfoZctPuHacqDDXPpTS68V1Pecn
+mmHKSCH2HBUiz/d4rq48s4zS1cYa+uC2NaIXK1fMK3bpFdtyPEYYAzpjhR15GKZG5CeAbNqzSi0X
+gZdgV6jWKrRJUgT2qHwO192wIsRsJkQLnDGIzOJyZU+aV5ASNRxtPnnIFFMLzjOuuY8T72pFhRTt
+bhCcCrB6uQ7hIa2q/aBvkmAXb9cEBriyrBJpZBm9oN7mLGCRsDtbu8b7LxeWYoikkR4I58/dHfXW
+g66wvRRJ5HBJh7S16wwbRchyZQu8qrM4vcHPeAuzqfKIVBqeb3zFyOYrugKIuPucwXCQtJqg9nJf
+saIa8RRH0afBMg11ML6iRks4hHTAV1DX3r6C0hM0UVUA+YLLKeYrivuK7mOZXquUEyuWcAyvVfKM
+8BTN564eXdOzfsK1+tYj92cOlRN9F2JxHXUQBXRzFDkcG6P4bV8nm/W7EoydMTansQMDTP1FfoJD
+GjHp3iQyRWdI0jsKpIrA0GB+IvU1KXiZkxB3Kv4SwG5Hm+fKUqBjEO/hOSW7ONxL5OmF7ITybz3z
+ts6/Eqbxg/RQ6PRfWVh3JzFb6mf2vu6mYY2XycbrFwp3CwwQQkO27LSRpRa7sSsm6YBLriwsHsQk
+LzCcv0NF+5iV+YWUKbQXfCPsbZBsE1zZAq/rJ05v8BOOQtO7mFV+RDXdjAwyyiLyMKY1Rvit60nf
+pKl6Kb1zuYpk/QxcBezkuIosUDHysNmyD6Hul6sQacN2FU0QxHcz2o5Yx59J0gKqwlMkZqyeeArg
+m/IUXrvMdSr5UD/04qqedRb9F5vEY49ZCemtFq/I5XMXpDMQ0QYfzQSBNDajxtCBkgodt5jEgSK1
+c5IkK15GiBA4LDm525zeiVGwNY1uGUQR921tsFk2YGqqukiLNa7tL12Wa0t7QHROE48J9NCeSyRz
+8+khWIDC1cVP3tdKDYYXhNBXCIArq6gaZi0TA7HZfCtOsrkO+jSvLiwuN7SchQI+o54eQqSuheuW
+15KuLmRoYyiOMVbIz7hBxZUKhuZDXiqw2F1wVUO0FbJvhCvb4HUdxtlNfsZfVCNfLPGhVMGWRt6S
+tqV6ziDaYtxt0MDuN9U02L/cXVSwCiIX5LhnAh4SOkEzVQPLqkMwpj/jQ2DR5CwEm5K3aMVyEIli
+4S0ouchb5LrdRaSa1E1GRdtD9THchVAdTy7qWW/RfuFw2r6n8pImLaIoR5RFp5KmuYu88fipH0FG
+p5XILlFNMyaCc2YN6zpXXGYWXjZY1+41c1yMEjdX1Xfhf7NOocrHQ8UGcxYDugLB6iNC0tOluz5d
+2AbIRUmUEPNKsuoj5PTLJdsQQYFWcN5+TwsPpsj67qlVm97jxapsD31UU7Qze18WYan7hOwxXVmH
+vjYoo0G5MfuyZWlatYJhDZldrirEB1NOonnqce7GFMfgoa/dXmque0gsSY/dv1hYSRn36ZN/XQdx
+el+f8RC0+DCm8IiTmnAfF6G/jxQoHfC426EQy4mXnVJJ3h4imYMwHgZo6wlycBDNJouYQy/yEIRk
+20MstysXoWkHNO6BRchFNOt1iL7QXMThIdqY5iHYE3iIagL3OuafXtOzHqL6nezTIRDCnJgmThdQ
+ZnmDEawmj/qa7YyRt68YZRrMasB9GHOY7zojD2OydYJNZyCYGzRn6RBx4i56Q0Ke1mHtgLruKpa3
+3tdntsAKiQr2fh2402iSrqxtDf5VuNMSRCmZioj5iZKnQb5Kz0reb7+x08i3Lij7O+aD+9V14p+J
+rMsx7dAgSdbiXjJf5doycB2oD6lNGafr4jRriGGDU9iXKwu5d1EFDrmT959xg0DAZ4dk9ZdilpO8
+mO8G/1ptJ4xr++B1PcbpfX7DY0SX256GpF82phHvw28gkyTGhSK/oTiOso01SdGxCdVoxWrajgM2
+KzyHKc80ZDyzCpwmjcUhQB5dHSt1eI4mEKA2rTwHDJpDEpDWCJFUVjU6S/ccIryX5/D6ZqXKiOso
+Vt785Kqe8RzDk7p1FtDz0qYbWZ2NFHuO5jB2GDHb8ZUNQqM4VwHBoUlUIGNobMIpRqvlKOBrvE8k
+9d2ZWlG/MTQK5f2KSoMRQazzEq5Vfi9xaorw5craViCXZth6HW4dZSk7O7/kfd9/xvuWZIjbIU9/
+alzqLxTd4DYfCdC/f/+XHz/+4Ye//+2/fMcvuxWcsdXPehR/Flv9i798dCH/6R+/++fv3//P73/8
+zd999y//+Ne/3L/zH3/yd/7zv/7z959n9bf36A1j/7W9h/3vm3/lp6B3PH7DLvyOz3enT/r7X+iX
+UW38u/UpmQ8rCcmCcPw3Qgkf9F//Zfyr8Ml/JT98v5aHa/8l/9V49V/Dr/y/tXx/e/z1dPnrI7z/
+1dP/+FT+7j+1O49H8OSG/PrGgrl/8atv/6Ctefe39sUegt3mr76VuDfUmMwZMrv1g15FSzpLnVhD
+bUTBxaQGBaDmLG8SJ87GpvZBq1qzYQNNzVAgAOJOQxGAvMKsZcTi+RLIfXRfV4tT7zFtS0AuaUNS
+OjJ1CiSZXkVRZTgHEy7ns4ORjeo3r+iBsDQZrW+FLtrC+U8uTm/HLv7q2y/1tVOUPsEUlfdXMcMn
+tQv6OmTuMkCb6UohX33L7JAKlpkWPBkp07NqdsCGntVWCSQcIKWNR+wbPYiV41ITlwzumFD3zKur
+21w+sQBZTpNqxnSt7i977/ef9d5FcGkVURhLs7f9b7bZ/o287uc9lD+P0/3wwk7XbBWb31v2ZVzv
+w2NpDy5CyQ6Q7FzMoN0NMKY2jGAn9ukVs2qRVrdmYJIWdLeiifuBaBT/KdPKM41R2X8+SLumkc1S
+BhimG2R+IDJY0xhP6La1pPza2zvrTgVLBDUQs/7wx8OFrceKHkmY3edkm9gkmUK9uLZbXsCqYnEl
+ecsFBpNHp7QYbTZbn0kNufboyxzKepbDauuoZ2p0t46/+hadCLBZGE8KHjROA+yA6JGaK1pty1WN
+/m4En37DBimPd5N7JbPttV9b3UMUm1G8K4msOY7phkj8qlIKFy/I3tX3FkEZ/BQ74PrqW8D/olgH
+eSwa9cuVPvUMSGyz4Jz/0Gg8SHvV3fefwXN88zdf//qvf7m8xl/838thfPu/66++DfHbGL/9xR12
+/dcxYNK/Piz0lBLxyWf/53Ezv3wdN3PDJk45GYUsR1wSlOCt/+f/vvnjz3/2h530KVT5NFAJd/9h
+ffff12t/vCt3f3P3X/5ruPvNz9e//b2xDT8NYb4kgPmy8OXLgpcvCl3+lBTx88OWLw1a/tSQ5UsD
+lj8hXPm3TBD/PYYqf/b8MHgxaJi2DTYBpnMbOjoW0pZw6bJOk3FA4JLzI8GBYhJTbuo5Fheqazap
+X8EqYupMwGDqqidj6tTnt6mD55Y6gXi/oinbAsjWeAymXozHQ/jubeqU9hm4mt1NHVJeRNWCa5d9
+cl3PFpKL30vxAXMvYb5SWJLKyELLg4v2zVXHrh/rO9tofOIk5tzlX4oE9ixUiaB7xWQFSpmPlhg0
+C06YaoaHK0NJpLfD4KtRfa4jkBI+M6lPFy5rh5MVIrqAkDFE75geQpIp+ow21ALp5nu6VnmxSxyp
+Vkpsl4uEBhiO7zW4SxspK/BoAz74p4sK45RzN6X6diu3ry6LA9bguvvKXoLVL+9Hd3zVA8xXHt/r
+Vn1vbsoTigFqFzML/kDoJ3FiaPdFzYdlw4AyIOUx+TGNmDCDksOhJBJBTGpQpVuzP8Pznn1wTYYd
+TJQwOJ2WDFvC18Dn6z7DbT6jD0EQXRldYpftgRI8mWCAZnWwa7KiihSfHeGPr+lZq852AzNcJnb/
+ctPQ7Ao3KC+zHWY6IKv9AKf1nHxTpHzXJnyvRCzwUSdXFxJZNle1nFKUSlZ/14TkYHKopew21tXE
+FfbS7RoRlybpnMFY07i6dpk2dwLGvtBAFBe37BTK7nAODaifeGPr0jAqbn3glW2Gn/rEATFxFYmd
+a0+dEDW/InyeV1ZBSN01924V6c+4TFTHqo9Wq932Mja+x91KP766jV8+zNe18Vtb9IxQebTZD6kK
+71ZOBJqOHpebOLpkg3wyuo1DwgtCHBVBt/Gw8lWBVo04bi43U8XZadIdTSQDNtEy9rxbEQkvAiLC
+PMrEi8J0G9PHwnVyo+d3WHjL2XDqxt+rAxt9s+4H9yeX9KyJJ79/Ygq1G9iSpkByXJZio64xOXVv
+ym1DyfSdbQq4OgWLhgItOV+5bFylFkx8nT8eNPcmwB3jX+QlCpqDLGZCZOr8OgThmvsOME0pQ79c
+22Z36AQo+ZXf9ryNfJmvK1isNFiw5JvvbEZegkoEdHDj9XfFxp3EZhSn4wdAZehhJrFzvrZuWXmD
+hxF6i61OdPZKicGKUayIEPyFyLr3yKLTW/LV5UQvn+frmvnNbXrGzpsrYaQHTgwyM8ycqWTpC2v+
+x5JczSgCzACz2T3abtUmroXUGps8wdNxSYLDhIaYuUSlczvMPFmMHgzkF43MrIPWKFZEVPGwF1PD
+25aehTKPw8i0EAHH0FtzpNXja3rWzqPdQPp70W/gYNoAtGW0+LwoBrcptbrR5frONsX6mMvmATau
+CI/3rn1DwJq4+Zi+jx4ri2BFsBcQIhiN5IrIjdM2cnSOpJ0QmCEV+PNy5frL1WALOVaNhu4YfZ1K
+zEdonERsZzff19EWWb4BDo3ux/iTVUVyxer1TgIrH4R1eRFSuHL1Kks3MAgmXo5Q/dx1oudB1t2d
+dfqFTNwZrZOT7vJ1m/jTZ/m6Fn5rg57RCo7GAVHrODAZgNoknQfWGgMfEJeRahU7yBPjQtGV1tzC
+qRULAGZTJBNnLPtuZt6AaKtwAPkwb3AvmHfI+xhHrGcaCYLMOzJmUoxlZ5s3lTfIOoez5YGBlsx8
+2fLhj6/pWQsPfgMbsJEg1VmFhjRHMBWZeE1OILJi7h236zttChxbY6gMnCQYnsK0jWycSJhoEA0H
+S22HISkEpk+Ob0FrAFOb6WDKW/c6aH8vQ1rXjl+9XAo3lMH083IgsETEbeRtuOpbXJE7t/LmG5uV
+j6YKG7kTp/SVZWU6iW018VdnwxhBIZ5Il+LVdd0eLnBy4qv3n3GhWbPHBUqtWfqLWfmu3sV6fLUH
+euVxvq6Z39ylZ+y8mYB2gYFm27mo7rDVYB3BBpHekLWZ+G8EnRXFvrjtvHKcJsm7Gap7JE/KWzRO
+U3HaMATS44Olq0A+w9zneJKhi2RWhh7Ev6RQxe1cUE0Q/iOZnWvStWaTCby4pufsvE67gzWiBWV3
+sFAVkN5xNT7MIu4J4ybIe/Rc39m2oNIw1xEEHC4H/I/rgYNNg0Zq3TfSj8RcjNgsGefqluFGWgOj
+Cd5uRo4CEZWrvFwJXJPl2soVGDtfZE40PZPHsUzGzG4UTDFDHHXifQ1uGYz1XCoJfQ==
+ ]]>
+ <![CDATA[
+ XluGjYPSbCbH5HRY60lNDSCpYnFlVSObNgunhvP+/FXSUCRk6EMj6i8mubWfZjm+6km2K8/xVQ38
+9vY8pe7dn055DQ4p/gkCCdk30NYBOD8ZjFe9mkjk5bZKf380ibgVtbwYHh8eqrdunbMU9tzGfOic
+hapTeaguZSauUD116XQSU8JRwzjROEgmEqM9cOtqmjs6ERs5RPSz/PFlPWvi3pmA8b77PWw21rX8
+xeaunHtIeP35raSh72xjgGOA7rGvhCZJActbaJFJCtJMVGSin6gFvg6hUdv0MpZxOCfY39zKuTOi
+eI7r7xWLuJ8uXVbOoMt6zjmh49ud5lWJWrOJiJX4zJJOvK9Z+bom3nVZn7oYl8uWkVsfVf2pvjkx
+hz6scV2Ma8uguO7ilJPe6vvzVyldpSEiLUUtL2Tl83igx9dt5ReP8nWt/OYOPWPl9LwBG4NPcDNX
+7itJ2+nxekH+jDkZO8WRaubZ9nBI5Sw7UNmtieoTmE6pAlCLxAgjJ3/Q5EU/qm5pGk91T3Ef41HH
+uDRSzMaZzSjGNbltnHHkZePdikTZBjikAenn+CcX9ayR+5hbC1R57RYqiw2qrxqEA84i3wsjbS4y
+fWf7YiLxtvbDcmppSCPCBr4BC8jDIdKRm+3+ZmTMK4/N040NVXiI2gkQ3ci7JtnWOcZ8Wgjz2lLY
+Bo1iI5M81hgPI1+Ho9Exrxy5lHLmjc3K16aRzPk7cfJeWVag/IBQDoLSdtBir0ibWWuFbNfXQU3a
+dJhLfu39+evMXNAK1JDvKi9VdRPbsT3H46ueZr/yMF/Xym9u0VOqus1GCsCPbSsnoebfLFlmknZl
+MNqr1WZrlNIsOxc4y+089K66GwRnsnONYcnOpz01sUUwKEHJ9zB0o45UmCA7D7JzxkvNzoeV3UoM
+R9kN/ktwNr2Yma/Y2ZRvxEn39KqeNXMfVmsVltGg6QA5C4KSxiQ4WyKnfYJrDvfhO9sY4rq0wtVd
+EjVebZvYYahvgEJkLbaJh2ruTcxqw4pZIA5HM50nt/NN/o9eDlW1em3tMvT1e8yDLjug4lZ2Xp5r
+isYBs8Jx+BBOvLMZ+trgwhuQU+Eqrq4jgCAKiM4cyfQ+5+Ay9CnK5mvLqkWJ0B7sgv7ZC00IYsAs
+Bvt4e6mwve4IbSsfdi+0jCvP83VN/eY2PWPqTDhmYrfms5TVeFJMhtrj9oSlwwdXTAmzmV7FOn7T
+IWYDIIK9jZy7aAlbEzlDHtWemoRVmUZdv3JYOnexw1L1YOpZlRbroQRKANmokcORmsfaZeu1R7d1
+aBlwQb24gvbjy3rW1n3MrM3Ws9/E0kTsX1cwnE3nrKath9jCJqTXd7Yz1qcoK6WrlPwTdSOoa2Tr
+SU1+5uCXf5u2Z4loFOEYzxXkJkw9N3Uq3dThJ4Wh+R5hUXq2+dralQAxbbo+Wy4hSoFmm3qnmyZT
+7x1swYl39snprjaF1A3GTyyTfA6m3suhkNUrxqn8RKXGy3X4ePQdis3Yvf+MC00UN4LUzsZ8KZb5
+unmZjyd6WPrl03xdS7+5Sc+oVjG/mOHqTeWwdA5fzCUnA7y1GDH1omDvXixq62muJ6O2q5u6GljL
+1C2vbyqYytLROYQfaBKSYek82W3p9LlBrmXPz+F96iLrcEOHEwblVMjSt6HDSQ+BPaySMnTeWhSx
+0yhiP7mqZw3dkUWQKU+/h51CUVCd3sWJ+iFTtbZAf/SdbYxlXwXlXvoOiVIgp4OzuuWgOCOaJAab
+WJOj3I8h4BV1LThm0K2l2uuWTp0EUFIGqzkEMr5cuyyd6iTic+ucdP5Vs/SZhm3gtV8NrHLznW1g
+euXKKrKDB2P49eq6Amc9wUCOh2xu57S9R4tcMohX1iHAmdQ2t8nuz7jShARZE8ZZAyEvZOtejPNi
++661zyuP83Ut/eYuPSVcWdRgFs+fW3p0fTrnYA2mRw+P0Qx2qHd17KoBVdzSW8zSmZFktRgShofv
+6h2LbVvgGE17HJbuxO/Isbqp60zvbVrXPNapcnuM8dC3DnOqFGcMUKBQaMfwuYqf6Z9c1rOm7gCj
+vgyi+E1c9oN3r2M206arU7knmyGP+fg72xkZ6fa+AhQU05jkBwwjUycnzWbqcxjaCzosuyEr+olm
+cLQMMbgZdvyO8LskEiCcoPaYr61tqEdMctlclgGtVGIf6iWmaZ85hRT8lL3xzs6VtkxV7FDIhPzU
+Jxb2UHH/1rYD0ET/lCFzQBbX1hWr+6xPKpKE959xpQxdQ9Wgomx5sWN9V+S2ulieh7FfPNDXNfab
++/SMqBTXl2HPznUbu4hTFQUHG1mpcMJOkhdL1fUN8dZoh2pMqaZGCZBetj5Kk0ztOvmHOeiyzLVW
+oyLYxt5Mlj5pwEvGPmTsGo6RrVtJTvX4betIdUt9ItmUnWC4fK7kx/onV/WsrTvKaFDzCXc2aCjm
+xZZCT6b4K40Fo5/ZwlJp98/pIRTi9LbekSZXL6NtRmeJLAHHlXNkC5tORjBVDVWxq0FVGj7N7Zxc
+SepIRXOKKV1Zuswcb8wVPBKLIT5K04hFUoQq6cS7OjdaJF9fNp5Ew3p1mbgMifcp1ajnTh1HNTy9
+39VlxSYykXGpB9T11DUmiNJAQ2crDr2MgbddjNsqUclAjeXKc3xd+761N09pxiG/ANrhOMrR45J1
+qxqGdVNcYU+AN5EI9bJJ1AeDkyu3YqiVxGinEqtu6FhZ9zCf3Eljq5zHgWVP1YL2SOHQrLsrapfQ
+i8wbhi+eb8zHkEqAnAeMXfUhWhXW+Vw0FZ9e1bPW7QijMRjEsVsoxhx6iQIHsB+yMxTTDjiEyruj
+przg2NenQoY7KSsxqOv6Y8Nou+AKjBa0jyzCKIili/epgg2IEdGagTOsLGAIKG8NtF4uXME6k41w
+2a6bZ9LebuErZ6v6mCkJ8XD7bZ3hKKl/zVBuHD+xKrljqMEZldEXRmjhXiM5Hq48XVeOrhpDKe9P
+XyTjV4iIdI3pvtS4ymY+obuzv+pRxisP8nUt/Ob+PKPdAjUgqMWNjKkm+IwlKTLFxCl00qdW4LRM
+qRDPMFCU8yEZq+4OQvPVTFxGmqX1Zby9AkgsE48HnRkmnjRRFlRlNRPXAV5EMISJZ3vC0h/YJk77
+CHUYAbWFGe8iSF3nqZ3gj6/qWRN3dNF8uIOqGgv21xW6tXrIhIa21YSDq72tXYE2LQSvbOGEUubY
+ei1BHG2M9Whqnql/Kgps4DacWrgRMGJn/Irbd3bfRcUcdPi1pWTjQP1oHQZoq486e3Ece2Kqp555
+W6c+t0QkIano476X62hzYN/QGsi+k6s5o/oSrr+b2BCUjku05/35i+RfktHytxBeSF5hHopoLsIS
+QzsM/MmDfF3zvrE3zxg3tfPsAPRt3V3ReYQYXsaNKjcz3qLoqxpoUH1dRZsPW7qtSrrNBOahqIAO
+FusWwAjqA8bVlnUHejXbuh3gIkVns+4m6842ihRsJrVni3A/epcfoTpAtHWfjjnoAE9CUz+9rOfM
+uzi2aHZomINKuaFIJ6GvdDvJhtvRQVtnns8o2ne2K2B5LgA0qcgGdNSrmzj24ATCs4bsmPxiRF55
+etgrBuHRDIjuJl58ynedzsqHri1dJs5QsBRuKXtv+57C9pP0iDrw9nuafScrY6Ja0D07ulwXVy6g
+yD569p4yI0hDaYhZzJV1dMmmSI/Vh3l//hqTRtKLMWSnUzxnZyzcu2fBycvCdAtPV57kq9r47Q16
+RgwBHsBcJU+zrXxlrqqtS5JdZo57XlGYql6Yec5Bcfoc28gHYzEot5LAizp2eJSOsatyQtmuUnRp
+B449UY0Tis1h7MAbEQBuwR55RCUTXa24SSOwbYSuXItQNt5MXyk2P8E/uahnbdyQRZFJhei30OSB
+inp97AeN1WgnjOLJuH1nu4J9oVMI/bsV4xWaSJJlDD6jq+HpZFZTosRnKBpWA4wuX6Ge9fLUOwuv
+KFeRlq7jmatr7dradafBmdJCW2++bKJtKwchk+WLkC1M6cw7m52XqtEkpKoErLm6LlDkxs69FcYs
+Ox1CNMiEEryyKqPlNCSgUA7w27nrJOlKReQiYpR8ITOfbuajHl+3mV88ztc18xt79IyRI56NPaTN
+TF4N+q2x32TYt0rJhmJKNjGsapK/dLXdxtU8g1QyWpmNABkL157BwkFOYuGPimw0A4CwiSnALFzz
+CFFcsdl9Ss8mS7AtnJOgoUTd3cJnld5JqH6Kf3JFz1q4s/aExplhd692u38ry5Eo2Domo2ffK4OY
+D99oQ2BhSRI9qNKOATIoHcKr1sdH6NGO8BalZT6IjpOZGYUHzGxupuGJsIDhwRoR7uhX1+JK7YTL
+6wMbcsgNPGs0DwPvdmdvv7MLmtUuxl+lquXqOhAM3fL36KhYSjcqmdHHLOnqsmzc6VAN13Jk4qcu
+dD1xCcSCpmC84WUsHCkFe5Ll+GoP9MrjfF0Lv7lHT4mVBBWmGg1Dt/EKJAgb1/AfNk6bEGmD4vU2
+EfsitZwcw4ZSIr2OFE0IUXq8weP1bNV0KXFX74luQ+cPNJ8jl50X2XmoNotoOUOnU3mYOTkjKHkR
+R2QAAeOu8r6uv/7JJT1r5IYnWq6E37QbOLLJnXFTFY0/aA6sywmPv7NdIZ5eShBQ+eF7rNSWyR/Z
+SrFTG7ZjfDCDywYuUpin21w73HHS0HAjnwYIWHtfQ9hOofFk6TJydRzqMnKo2Rn0cCNfv2DFg8T0
+z5k3NhsfTdM0jP1sG3+6bJhKLjbeHRNLLX9Kp4CIvLer67If/tl0cN5/xoUiA1m1RToUfC9k4y4i
+wAbdX4PJgT59lq9r4Tc36BkLh8GJwV02g1t44/RUhzmY9FPlfEWHuXU7xwNhN1LJZR4WThqPyGET
+Yp1Mz/tlh4VHs/BOQ3xbeLRYvRpLRTRYNXqztdoTF1kAo/yxHQn5AFLfjJ1SRs5FVIIIP8k/uapn
+jbz6PWzMFQbhKsNUSxwlYIVvve7CTKgby27f2a5Yp/wKJaFMRx/WWwiy8nVsJdfNCMVDkyk+f+jP
+xdyCsVGSB41OdczMvAVv/ANcW6bqQeyTtcvMp9laHhEShrxr6nVl1lZU4lCf8cw7m1BhaHYWA5S9
+/oGH9eDJ5beCKjni1pss00tnT9chM1Zk5goX3n/GhdK8odAk/e3+Ukm54Fr2LI+v284vnufrWvqt
+XXrC0NX90oT+yIehQx6AoUt2o1DKgduRBnk1vJtAqhI9Tv2QM01ABhKyDVGW3pNn5cVhMBndGCw9
+xIfeWcyGXZuHoWsqQXDYLCqjqcYJ/fZt56gQgJLPNo5WmY1GKSP6Yf7JRT1r5wYkiimgOmd3MDf1
+xEYb07rfy5R80HQZzQ7ZywZMFCw4GSKAJEawJMO1Mguas0/Bij9NobWOqnWF9LrUbkZNgunUsDtn
+TOIrpAQCuva4sH8XS9dtDH6TB2C/7nUpARmCzWCs8EqY9Jtv7DLlkkm4l/Isz/7KMg==
+ ]]>
+ <![CDATA[
+ MXMolx9bSR3Kh6F5grpSvH59XeK4kJ2XUTeE/dyFSv0miqdYAqUvZOe7+FYevuqB1iuP83Xt/OYu
+PWPodFIyiNh89MhF3KihkGkxe6EHGk2eUmzTk8ojusXTqdsk99Ml65HlIUVB1sTkWGq1DlpCVBje
+4TQfOmihqd1djFsumoCxxgyj92OQ+ezZSoHb1OnF8tyz00jQf1ufq04/0j+5rGdNPftNXInK8JvY
+nOIvoJoiU5/q82uMK3g3zb6znVEIgJqh8OBsgUnBTB0WCRIfI7PVLl6ZdNYurtLRxOB4m2Vxqne4
+qad3SUOcecWw76yuf7lWfNM1U2IfM5vCm5l6C9WryDlHZ2m49c5m66XR5bpXDtauvivD4BIlpG63
+G+VgkeVmKXmqoHa5jmuyM11yK+8/40qFgyCMg1NqvBSwte8KXH746rZ++Txf19ZvbtMTti6ChrUl
+M1Sc29bhVaS+GbJF7wVmo7g1+wiTqVMyjgTT0QeT8BFgRUxewlc343nLXhSTrTM7UstB42K2HtT3
+zmpsmK1j6s34gPCpVogTm7Cb+org1E5TGU+mTv5SkaEJZlifXNaztm6Qorh2/Sx+ExHhDRLK8+Gz
+GBy6vn5pHwX6ThsDbBBcGAMGrqKmsQ2g5s4cgNHcl6ooJTKy0bWJbZ4EhElRCJ1jnQ+WPoUvzYPB
+zZjqtaXERgzhQ9axEoWSxh5AXRF4zK4iWmzE79Ybm6Gv+1hMxrDbuNDlsiHuEOy8RyeTAiml+85Y
+f77+bpGhYCkOpwfet3PXiXIaI3DKCMNL2fnYdbi0v9jDvPIsX9fKb23QM0aOUgTW8IBo1TigcKHd
+A/eqMrtxiBEhMzJKdWQD0TW4MyQtrnkCMTWHZrV2pfUtmJz0MusDBwtp+rS4XQ/RTHwd48vGKxgK
+2TjjxXiQTSQxjMCCSZisE0S8wBMTF/Tt6UU9a+HRb2CBbzIIdRWBX2msJuxRFIhntRHC2Oe6vrNd
+QX2S0UpiipiR6Y2eoaOCKlBphElFlAlqgayb2LibDjKBTAtbY0rXjZzmggLuoWnu62tl5CI5hlrF
+xvrcyEsqln+uo7LmeuadzcpXCqBiGO009bAv1yHzka2CtwfZNLXYVHAM0yhgLpZFS9jQFZ9t99PO
+XeiKWpSZQxMcXmz4dOxTPMzjq55ov/I8X9fOb27TE4auSYUMoDwclj6DzZmnHI0USucyt1v60kqG
+q6TBNZHupo6jZTq32Vke6api6NriGDqyaVW0NkcpzgfGY4r7KI+YeSnVoVCQmMHhEeeRoKuZ04Z0
+dmXnndqAxGv8KP/kmp419OB3cIoAygYkuLQgJJA/+RoUIQWd4I+/YVNID1wtTL5BndxF+fI0CkUA
+msFKyYJVTe3glQpb7CxKVK44PbLyCVnWPdA1iM/rtaXLaqC9W16m8F3l77iVt2DMbzCD5XnifV0P
+vFA8lVJDateXDRscVpV++mA6IdQ0I+8esDxdJkVRTFwknu8/4ypFKLmeLpxE3OEXMnHxKgU7wcNx
+kPcrT/J1Dfzm9jxj4Aw9YwykyNvAm02XJ3H9lWB8ahH9Fyo7W7MRvz1m2QYuMhluDI08ETcnT82F
+Zw/W1JauQkkPFm7RullrkXkbrzPmzcqejIPbzbuNFYdLCNhJJNSFXR9JGNiLK3rOvLPhimLhuLDb
+J9lS5uCNj2OSbppx+zhKeJhLKZx/E/6bFdFFmvfB1bsLgJRmirwzB+MviyrkVZFbWLQsWsVlLDU8
+ZOTFSLDuQbkwLZ6urZVxw1K9gslsDHlu2320om5AhqixnHljs24I73nWy9cab/LlumXdIIQo2kW3
+U/RQ1USA/Uo0iVfWRavlDjShypGQn7pQqAMZU2lwSeUXs2/z0qq67OILSg4Xz/JVrfvW7jxh2xPJ
+quyTpbJtjDKbbQt5VoLxZDMTPcUVhhRKwrRFqOmmnaaJ6YpIX2TNwxTeFFpo2IBHa5OlR9UtwqwF
+RjV71q9Zi47aetoGLthyCkcirpIak23JeSP66OqjiTX06TU9a90OJypjxOo3UIEhJOTV5xVmUCU9
+QNJdH3/Dhqiaka1ECysvYk7KsnCEn3UOJbjhtW/hWlz3gXEZT4UF9MDGWn6wbSOkYZhZr19ZKdNW
+r6KEKVXdbdrLTrLSiLVco1s339Ysu6ggel9Ey1ivLhumr45lN1d2yxT6ojnUoM7XlXUBUkbJKwnE
++v4zLtPqKQguzJcaOhv+JMvDFwkCXDzD1zXrW9vyjF0zPZadumnb9bDs26aF6GwHHdkKp+9VyVr/
+suxa1Wy367iCQ5Qbha7Ernvx9HviHbDr7HYd4kHkGJs63SP75AvzJOLycuSzqCqWXatvsu2aajwz
+bdFpIhSy12DJxMVFPWvYjiKqmYze9OkSxzRMVU3B2hQniWqtxc9v/4YdsW52gcRyfQAoG7hCmfU6
+zJTdSajCDbtIjx2WO2mTACjhPi5TaenRoZ2GRUqFyZ1Sry21Q5u53EJ+2BGTN9Pusdg41XLrGvW/
++b5m2S2K75HJMBHLX12mJIfiu/fZcoEZ3eCmfR+7T5cF+2YQzB2E6+cus4EiAv+SDaXyMrY9oz/E
+hy+6H0+f4+ua9o2NecuypXFSBfdEL31btuwK0zbMAgjooRO7wr0r05bxd02VybKhPUA0Jdtst8jX
+gwfjwjNUg6LXYuWww7BDMzhq3YKsQwd2yK6aIt6pnkzkbJs2BMK0TGK1WdKBRCINjWmV6k8u6lnL
+dvRQHZx7dgPB+UdFnMXymhDNsoFwP/6G/dBFS4usyqick5ZqF5Wyjc3AcKxg3WxMD7HaZBAS5ZsY
+GBiCh3A8GOAInsPmW/7JWsu1AROWiFrtI8uGpFbx+DqFNeh2+53NtkeQrBtxryh7rq5TBK3GWjmM
+ewxJGgUbFri2ToQ0EeNu/aEZfupKK0Ory9wICVFMeiHjzv4cH76w7548ydc17Rs784xpk/1mqB5H
+P0ybXosEC7IF4xkds2XarQqd7jq/y7TrcIDasu3Ba4nDJMm0i8hRpw0Uy7Tp1aA4WOdB7hSrBeNN
+DsHElhvEfNOHjkzcELKyNLZpi72NMdXoLBDST63Bds7FVT1r244Xaokagt3BrosjFjIWiInSi/xF
+k37h8Q1FNpFS0WXI4hMMsFrIugtzsFOjfzl7YDw0cQdEf3ruKuniFX+U1B8KaV34zxKlipHHtaUq
+lzcAdcvnSRJ223aZxTB4peQ+04n3NdNe+12j+gwG9/kTy+jByrSnc6vaDIC1BWIt8eo6Ub0r1a7t
+mCI9d51i6lw3G+7GGF8K5zKrP8aHL5i2PchyPMfXte1bO/OGcZuQ8TVV9S/SVP8yRfUv0lP/EjX1
+nxQmfmEl9S/VUf9TVdS/VEP9CxXU/xT99H9TKeN/Z1LoN2WMP1ME/YlP+PXPXdSc/5moedD7Hb9h
+l33Hp7vT5/z9L/TL6yD55u/WZyzrVCkJnxyO/0Yo4YP+67+MfxU++a/Uh+/X8nDtv+S/Wq7+a/iV
+/7eW72/3u5R8+esjvP/V0//4fX/3n9qWxwN4ckPCT+nBw1UYgJ8pqG3mWSUeGRXux6iQvtk4L6O5
+qVv0qqAkCdFv/QNGVUF1Ui+pW0qIeU1AjYBWxA4SpOtjA10fzYsX3GwWQqLd2Qv+S0acBqJt2G+A
+Tfrg4V1GtZfhuWbZx2ByjOaw0G8MLqEwAvzBhSv1kl4RyTE/QsjDC3ofAnD7EwrNPjrxd0Q4FPm6
+pupFQb8Fn21qM9mo1YAJUsnTouTNQTBwRU4Ln4UG01TWRn9L1H5hr0DfBTL1zulkLJA6NOj8dGcN
+rNwEFICir9pX0ugFwy+ekXL0Em818K1Ra9GxBTGhVdMAjaA15GPKCsEwPg4qc86VMUH19hOduQ+2
+TQqsPc311HmhE12gRh2SCdCIDUVaZNneq1ZLnyptZrWvp+niUTspXgVTPpSHaQDrtFX3m+fQBMOq
+NEUYuIMxf5hyiobRKBETwmmR490YOauewok9LWmQvdxd7PSPP33exmRgvbIWIjS4Qgpndg6ikjBJ
+GHaaz4nQwbvLTLGoCqwj0xAngk4z8UV0Ao0U40/YEFOxmoRQhbiKiDST3H+j4Ga0bGK6vUE1C6Lg
+6cqVdhcTjrhfv5SMVYqz6x44NdMOvAjc5dp71hmkQ5SlDc1xeS/JNn6NascKai+WAf/AoIEnO1v5
+qU8KuFi1ER4zQcULBMBnHsBrhr7n9tBz55zSIDXISx1I8slt08Yb0lKqsi38Jv/dffOdWXeEJqsU
+Y6fmCa2bXikskPlkawtapkqA3H08Q0THdHqTAbTEmhNUaprKiArEtKXIjanOwzcUyfAfrfsifEjX
+czbsSanmxeFKScqTssEPCeloS2sVQKSk5xcHM9R8QBET4vUUJj65rA/aPs+EZqEMOvg3QjN/lIRZ
+md4uno8mxg/2mtgGIPNVCZlYDI5IXpjONJSH/YY0EOVdqSAUuFPfSZrwPjPtWOk4gYmreiFJGpTQ
+LtiIW/ZRl0y5SulnMaIb8O9iL2O0DOhqFt4+HquEAsg2saE/HTjRfLJSmWi231AB0T/hjJJBeSd4
+By8kyRgCHvDRsUHLiqpiiPtsr+BoAPB1h/rql3mueTgXXmguI2P3QkjTMvVYaWsIQkFinJ1IV6Ap
+c/7Dh4C2bFER5lMJSoNKq8CRaiyqnzypjzc2Qg4rcbsdoz/ETesjPw6PtP2jTmaxRf1g2WCl2lpN
+6seGne40RbvJaKKsLaVqJSJYe0FILxsylSBK+5Q0qQZWl4DB8KCD92KPxTgcHOqIWuukUnTKzPpm
+Cz5Ur5d0oEO78c1M8/Knp5c0NJlRJWNhUZhCpBZsPOSDbaXA4AWDtbnYYamkurnw98WNeC5bbb/A
+TcGjHODd42+Lo7KlMn/64Bzbb1thmZFEByqrkWn/HAE1IjGqLjejCmXwmUTSqpNznXcrOAP6es8q
+E1F5ujIOkG9MlXXohkPyYeIveNP3p99U7V4AAWuHSIXtZJ4Z6kgz/sl55pkb/5oH5s1t8+xZ+WlW
+o8ylddOtHz7oHNF8nncqAUVLEVZkFoVhHc3opHs2gGNqbhmiQ8IQmp1sJuxHXSdbrRgrzBzrcJd0
+L+9CDAkpQIXvYBpTpHilK2MQsvgkhbA7QipCtY/+qfsKnyQOS7icHN6zXIBqMLx5gpobfte60xrq
+z12zUhF1FtHOJvPf6hIrSRENaLWxD18VUMfV0LSyteKw0WoM5rwgVUEK0G1nQ2nCqbhe6bZEAib8
+DP2fXuiG8xZDomddRnfqSBdlgfTHuNuMt+L8NPe0bnWhAeu5Tab3yUPTWAFGhTekmGfI9GKuar2g
+9EVuzLXtAMJnH0vWgBTMr8bRW639Tm7q54cq7clzOCWTvAefDLrsVL1U93g7PZM6TOfM6zpH7qkK
+N4I4x9Cd937pQaAbwlvToEqa2RsqVBZF3eKsnVB+yPuVKiY8YMCd4VoTWHqylHG+dw==
+ ]]>
+ <![CDATA[
+ yjXWLYapxYfOQHUP1TO5qcKeXXlXBvNNYDZ5R00IA00Qg6Ma8cpbMm1iwy/DynDvT39anZ7ghUgR
+qUK8uc3P23DPN8+Agw0l9prJ9dA3EH2CBO1Oy6BIF2BKyNaN0ZQncyLrce5wtCcb2pdKlOThg+gX
+e5TOsDdTm6FWP1qlSfhzQKpTGMlkKruUMKjlS0uDc7o1C5uVLyRL6alYDK/9Ksuwmkb9icLHRXXk
+on5ypchyUYm5rNVclnMuCz6fFoSuFY0uKktPS0/XylNXSlhPKlyPamC+4kmd7KKS9qTcdhTpntbk
+nlbtLkt7T+t/FxXCq2XEp7XGi2rklULOZbXnoh50tWjUjd4ydRvaEfFrGUqOrNLEXg6KsIO/Ey1g
+2jUAak3mmUH75fOk6E2EAGhEZ0x42Oco/iWpAUv3RUk0sLluYBI7zZKfZjstDgZeiA7oY1eHFcIY
+elxmyMfUNSo88JtO4i0CxmTbJogHmYZbsqRBkjPrPnd0b3bgQSsKFgzDhk4b+9T9mK5A9dhNPHMC
+DhtqB+sgh1RgqVF3sg6baD93AvJBybdFMiJsPPuZOV6GVWBkVWBNWrUuFmV6nYASve41iWkIbeVe
+5+XSFTJg7AgaSSUweeuZ6L7qiqdyqnr7Xd+ff9d72jiwZtFwbucID/7C71Mq/+6Psts750Zb6Nmm
+yNy/+IcvKq3FkUzNQUIuU/MccTD+GuQH5Tfi0IQ31qZhvSh13ib32kAmfEAs7slrX/MawwEZv7OC
+I2KfYbuTGg8oENqXotjMDN5NnRkR0VfAB1SmqKtAaiF1BKoocBfHqqJEwuP2aIHrCp6NeZX4HrfM
+C9Iw1rBU5s15j+EO1o6AdZraOK8xuvKBPOinzQ1NW4TjjXKUfNrstsqb6UBjg6J3+DeCKGZwh9Br
+0XOIxWr9rIHAjHoHk5Tg06NUkZiPD8bFyjtJ8wGeSdINvRPT4xWS+NaAWnDDpJYWiY2YFAPcM7Nw
+u3mkfNzBYHg/3B0/q1QKhKDqRyF6YzS+WC0JtiQ5bVazceSNLOeWB7iYGIIlBNEt7zZaE4sN9cQK
+WR4iNZkQCYW5anUtLhodIa2CZ2PorQKJZZQ0bLaBAvYnL+iiowbO2l6lij5xPfQP/GkmfcBAMCat
+EU4KH9B9jL6vSVKyFUgj27b5AJ9whYjmroeSwfY2oadsS3TPFLk4BOTZ2HaZ+0ENMJpS2lGDgEWD
+f6uCU0+o9JYlGAgTmS24gkD5qdTJqTaCv1Wyz8NpzoFtmyQbLREsHtpJwaYgxTGmVa56v2egsSoy
+Ck4WKrhsJKmlU1kb1W5Ft6oY5ybC7HoBvVrok8peM2VSCePTomETHkQ6gCG1zSd2uWItDnCX80pY
+9fRtDlY42xoqqLzQUXiV2CN0a52e29qwgDSqob25WxoPIWxjugtiugIXsrIm4LAj2BbmN7qb1KD0
+0XhpRS4QViaoXfTeGvO+8G3PllU12FN7P1tVZQdqSJhImQzhB3ttFpp6sIKCA6rdBiWou1MTZSML
+ZvnYdWqobZp/pdr2tb328Hvrvuk1ig0qhMfJTSn+JHiBViJHixQfiEAB5XCXirOOASBnrDJSxKcI
+QQCNqsVaaWkFsV/0j0TGQueSiBr3x9sXJMGbPmaDMTSWYIxafG70GmJ25nZeyG5P9GmChWqaFY+c
+yUSNkCwUeHXJoFTgj7tgvuxqvX3wt8c30FjRyZF8hyADCx0QJRUIALRKcvS6EJLk9UvZCUCIkjHL
+nSBkMcP5qmCpx3otax9JvrDqlEoZKBY8ZdlSjpksYI7wkEZ7/w6JIy8EJsxp8JL8RZKHLM5kji1z
+mRCbSNkCRu516exvlJq4dFhCeEEF3CwuYTvaUrZIjlgMYkRGSRPhqm7YeoCM/YP03g+LRcS6GKIG
+aRrnQ7fKkvIoTgVqF9H+yjqMzbfgyqXxwRnEqccBAD9e8vHJyAmxvrsTfYNV0HhNDkDhedPvmDOp
+5gx4AVgz5iw9A3YYyMgg8iqDqLHDAgc7T5fitRtCgGqCc6JYL91fE6c3IGqIUNf/kJAVSE7gueDE
+DhCzZz8VA6YoyeMIUDpCVE9UgloHrSP+qpiWq3Irsx5Y5MhPCQvIFXWtk2kWCIDQaKWkDrwHEF3y
+7ctnJTCgM4ShEgjwVHWi8VYoG3A0cWqH4jekWk2WUxr2OC5U7MlDpb8Ag7S/1qhVQXMFs2lUXbAp
+HIm0tlDWIeNK0R9Ptw0ONzR9uHXAv1O1S/VDIg6J0jSb13NHyeCynpV4t9hASYP22glE/Wx4BC3x
+v22F/7YIQvLcLBfmyBDUa/0jZxEdCqmJlWFO00Z0ea300I0/e9oiS2oJVQmoJBOun6UNrkXjndP+
+rXjAbLR2owwSRT/BYiOM0wThB7PYoI3v3J3cS50dollZt24dV/6aoMOahicW4sypQw9LCOiovZ+N
+qiSbGO6nr+kzU5NI1SiL1m36v+yXhLzmJnDeyf6J2AdYavvLXVyi6IMarT9vH/K6MlAHHfA3HxBM
+SjW6WC5M7rfSQAtz355MWIieEsEC93SwJesOoMQ1vUyjiSbRfXUCa3qHrSciHjXQumiXBHDghUYt
+HzqcYqMZvOafYx0P2fYoDV0mDqONfvFzp1xOlynIcMHQaMdCZP/BXL7UwAnPIW752l6bSFtuH8FR
+IVwOVYlWm44g2yqP4oKCE4Dl1up9nG8T8ig2LFTdHIlTgnKYvu1BoQiYBam2rQrhH5So2cogkSYn
+FRc6kT370dosKhMmFs1lzRYNXeYMOpCLmCLFEuZuCKiAbkW04E/HL3rHbFhtM9GBk83rY/uqYuAG
+xpyVJOy3qpJHj/qAmcNP+mtWFyNAkFqz2p1sTupHZEmgSoVJZHg32qS+Bvk+WpiRZ1dcrz5NpMgk
+VqLG0096YcpPu8LrBwt9yHDh66Bq9/WVCOnrF42/8PWkQNSPxhAo5OK1r+21QZBPjb7oTEuG4kXx
+VsmNEiHDZXTr8usP0UACxKGkBBPgfjPyF3BSgZJURZ7QiLx1xDQbhNKqzjkEzCIydW8kgwyUaow6
+94fUFcWprhqp7dcQTaeJQ5hG1HLq0Nor+G3Rbvd0j6ghbF3n41fWV/V/u6VedP2W+5nVBBs5wjgj
+JiiHJFumTDir9aB0vyx4nAztRaNFD8sFTT/XMBYyggloBNVPJCJH9CVNoHIUfdfJNr3NUSke8S7N
+BJCctvWjPriiBEAhbNKpiTP8nWVOAVpQGFSN5lF3DBUKFEiX/ZJLcAtFOCGeZn9hjqwTVxPoWpVd
+nCUamIAXGpYXoYNJ+nnIfLPpE7OteWAy04qitu2ogPfBu7V9rLvmbRymt8kLdpRN/JQZSPAQNomG
+bOyAp+eocE/8819f38MvZzWjWhoG6hAbWEaDXAkBEQe7D4ITlg0L8scwfajkfJnrSgbnQ1NOI8XS
+9QE/+a2ms3U47VP2zG2AH4iK8lVQZgmMDTnZkfBRf0XVXAF8IF8lsa2KYSe5ED8rol7H0rAAjY9b
+rHkrJRQIaEzghjI5A3KMRaE5244F2DqtFNKvAQ03v0HfYznf9anFB72cRTJXMIMNRwHn0faM9uE2
+gegkKcuGhAraaBNZprW3OYfgIZ3JVLPhmaSoMpNteDhmi9WqZ7DTBZSNqC+HlVuKMYhCjyMPlW3q
+gOsoiv2LpyTM3fIplmFw4I5gxS/mP5JJgKlqMbkM5r07OLCu+4D8ID9Lh55ql9We+n4Y1Vo33ftc
+gLhAzFHhIClxG2JFteiRrKsh9d7Jnkir1mPv1T5J1oCpLqHTFErqoTfSVwRHh2UoStKgGqMomKNF
+pyzJxsyu2mAxcZRiKf/AAfEnFErSDZv7XawI0C3hpiYJPoK+fFresEtqSRlOSjH5kkljROHa8ojU
+MFS78Zk4ljDLmJKpRdgHg2WWPtGQlkPmnhFxd+4FippF/kFlzmVEkFgoJe0MmCYshkm6PlRFpK7R
+k/2yJON4RMAZVdmEK8meUbQigYdZHaAjsWc26tJO6CnuoSPLWC/pOIC1MQ9723CUFCsnCIVJ0gn1
+bNbj4a9wldaqLP6+ErPkAKEChMxYhhYff8iwHRYAOss0qe3+SDMDGDWR0doO1qoHAFeTdhMVrw57
+Y7UH140OBEc0bQOKGT+6rCV6d93cebH0tTsHuNirWDF9BZHxCnGHKDA1HKlZerOKAaMzBWCgaiOa
+J08I+K0jd2jqykp02fKVATFse6i3YXrYjiTkjUa28blpkyDVbcaavLiWNZ4avJbVaYI+9ckvWqbi
+/FWa3UxR7Ad7Cd+hdieT8M6hqM+zPPP6uaQhI/L24HTkCYUQ6vazG4hGSn3rKc5uG0/T6wbF0Uv5
+eOVr/RFoH+ilMoY6m1FCie7LAoMw7HzQ3bBYQsQAVFC4fxNvaEWhvJ7RdLoyoVPdj0avCkUgV+uD
+BRNUlr+AGpi9LV+gfrEdZsQJ4AuahagDFMlUT0CInq91aqqxAn0VTsxekiIbnTXmpxmBjp7xBHGM
+EsoxMG3D8pL3spcy5Yyv9VIWa3e0Kgbj1ZxWU6gebSylKQoVrQ4OqSHpM0GU05PjKqiFkdQNioZh
+Pq5gjGpln6piX9wHpNg/gg6ajIxXU+VsH3hyt4Pa2XIuM3h+Fyxkm9HArERNyerfM4pjAr/TUL2M
+7mQQoFyvTwfncm+KMWzNbMUxWsfRtkdBd1XJQk2+Xz7ZuS8aBymybZx3Oj9+sM3WmmC8Ail/rZdW
+lm6nYrEtqr52dk2ZOaysSPDgVaY5bTYBSs6WLXbXzG6WVFvUC5RRNimDAtNg2u0lWD1PES+42WgM
+mBOVyuJ9LIuYxeBFkTavW6aY2nG2IFuI5FHuBWBHmeGj7m7FaUKtNc2U1LAgf4bCYQLvNbqHlA2t
+xksguslz1hXNYh2n7OH6kzv44SWfDked5OaaBaE/6KWkl+gAJVNbyYY+idWQNAIhE1QNbbFPXpHN
+MtJBUwZYAsTitZuoENALnD2iT4SoYn+wihbN2tEtdsN3U0tINjuvw5iwrwl2IBWSjyJclu0R6OQN
+YAzWNiFQUjM0GbCCsPujGA8HSvcScIwKiDSW5Pzx4pe1LCw2O4N4KDQcKbPpLhRXnqI4C3i/W2bC
+Ad1tlwHlaaoqBPny6hnoLvbAAGJNwVjtSjTeEix8SFnjmllVhGJjL6LkzNFYOy2X5aVkQc1Iwllr
+A0bPGGAeIDwjT7L721BFonY5TAKGyXN1xQ1Swngrhahh4xUscCEoai50Blrw0IpwJWkoa4Jf0Icy
+11tNrkOyAEOGDX374CXaYVFgQ3PeiPBAhJC8vkF72GILBn79Jc0e9SOXlu42PK5qwybjoP8ouk6F
+PLF4+E+zsSiU0PgCdNQ06cGsTkPYSikuKLxNiIWW5o34bIUXYfNtHiH0IIdDYxQhAmaQ6KrQ5c5m
+pkqXW9G4A6g1v9+ZrQaWlWSU+58M7Cqt60YRWi0mtVNZ4XrA9A2iEMMKEjjGmekV1w==
+ ]]>
+ <![CDATA[
+ araekAfc6zoJyOg89CruF6keUd8gHXpq3C8a7sDowIwXHYgsx6HzpBWbtZhq5Es/uXiQT7qtCv86
+vGDc5skx+SIeVDN+GEzVs9a8ikQj2IRIPhZVPgQ3GpKW1eZWAHM/hFXUsYgMyD09QfIdAtjYfZxe
+fR9V6OR6EBgj66rqjVGdnWLErR6Mq7a7KypTxT2KqNRku7IpoYJNpZa0Kemp8zEFH/DAGHhsHYZf
+YK8Eg4oLvW3YLggNdspDrzFLDkdtH3UR07SMVE2uJJ9EyRnStKTP7OGslWGbHeNyUUlCTVrAJKbh
+1DTBlTwH4GfiIGhFgeHxc7O9ZXqqWiJJxeQhID8zI4dtaYiwWxNfbWIrXvI5UNEjnYJp04gNFZRQ
+QRVaj3KY6uA2HUafTV0wisJV/ZJkEF7VlgQk2fAO9Z2EOGtyTgq2KP8QmeKsSJZpTnidjG8hApAr
+NMAJ85I4Ke3KbmTosDBV7+Fbcxh3oiyxuB5KNrxgTB5kJYkHqohpjT3acSBB6XVAMR1dLTbLg2ZV
+p6ONRAW5qKykU9YgVgdSOqJhzChYw1IwBu9Pgiuimo6oIjhIxDIMFrBuNBVqijWqcRVaQcsjF49o
+qQVxJuGSH/9WVXyMuqI3a1WBoREYDGZWAPzTWckq7uTqXc9k0NPMFAv1d1Iwi+nEDsnNpm3AGW0I
+VVpKQxHeyl/73XYWghFajqfTRv0LMz/cdZfitQVt7BsjtOHApUmG05enOBb0boUQKZ4woGE9+lLZ
+d14JZYItGHKFrhTBOUbYwDkNF1OJ/HGFEqpJqiFsGXk2EK5gtO6Oq4m5i/BaVARWU4zFOmhYNHuR
+iE97F6LcbhEigIMnnvRFvfQb6uwNdfbxDXX2hjp7Q529KursDWH2hjD7+IYwe0OYvSHM3hBmbwiz
+N4TZG8LsDWH2hjB7Q5i9NsLsDU72Bid7g5O9wcne4GRvcLI3ONkbnOwNTvYGJ3uDk73Byd7gZG9w
+sjc42Ruc7A1O9gYne4OTvcHJvFDfvDOOUygmpMVrKoLSxlOlnHLGzMbQq4ZeX1udMgPOh7zwo+Fw
+KHwB5lDlund75IKEUO2l7qW+TnVyfAAhsRi0xKrrAEDIPLBaRRvR6hbc52q0nbymRJaEtqmGgIBJ
+FdXkgKIcMIry22i2/9FgLioUARuIRAsS3gwOz3AgmeQ7ab01xyMl6wjrsruBrAwbwxHfBbKiOcAl
+bYjVsP3NXoTPT9C3YOCfhPaiwFzqgJnN6H2yOWbBArgAzn619jgduqF9TJh0GFLo435KSQFbEu9x
+G+ZPifGEn5tWCI3deqYfDME0INRer42mYK0KYjbgLs+6deYMCSYsQQTsYwiCYMUbnr7QV7BRN8fP
+SVULis5ujxYiWBoXVOZU11cEimFno2e+2Hkfn5FfqckEosgixAXOEbLsrpC7og8lAkOXMeR4FV97
+EH5P0UR2CkkSfNRq4JctznIdQD9wjKmLSYWBUwivgNKCqa8UiqfwQ9+vDVHsCi7Wpha9NM35T8/T
+SeThrhZTaZdBtRNv6yzy7zjWEKlLomG+XMb2zdZzPdiXz31adjzUj9JSm6dFzsIyFwQ6/2TqyduP
+7FXVWm5uuedlCp8Sk/3gEDH8CGX2HsudtYDt50acWLorAEqzLm6ImNUDkoI4ms0VxAG1N4JKWtSZ
+KJeTxtNYuuxKigT+woOXna8Ew4UIDdYtnOxtQ7TUhFVhsKu3qS5Xn1YZTIb0kqcSuCkcwC5T9cBb
+ZsEQsgO9DBLBedotmV7R8di4LnEv02BqAlusKMxBZSudL8KIqJyQvZTy0REhwajjVxA3BclYkY6R
+FVuCvLnv46NQJLoeM/qxODmS2GCYuvUPUyAd/Ta/UccD2qoYEFDdE7BEtZq/Ugs2qnubRFasmPKj
+o61CVzisqIMXUrUOxeyCetlZEIbhirIRKBPFdf3Rag46CQscDRpGCY+Qt3ZfxYNSJTwK0mURa3Ka
+Z36W4wcf0caBGFK6SahP2izEkA6m8c66srQYyWKUJswDMrRhRFkbIjgXM0kql4fOJSkzyIKNraXE
+G+wSVq5jkCE7L4LBs4QhEkrKe19ck2HVk0XmAi5n62SCY+jCqVQhLPGxpMFaVL0COi024gVtOqJJ
+KtO8oMohh5c/I9JdauSkLEJZUzWcBolbNmtQST3iZECybVL2S0CYk0E1o8B2sFonQ6FE4kdpaPpt
+L8NEVsigkio2A1RG035o8gHdAB0QVW9YpojC47AONcis9acNrjzeCT/CC0J3co7naOf0+tMIXKoA
+o5Y5gJIqVDJYVirkyZqb5DQ8PlbVbFhJOKQb9x8pY2+Fh8yOBQCuKG3ZagiO3q92w8HNqq+zjIKk
+QXI8apU98X8nTvcCSPCxq0WSdbbPO90lrqFSiMjiiawENiXiJwpJ9rGotlJc89NdUiAsWL6n2czE
+xVpic7ufkojJQEKP051QktO9iSX85tsep7tYoS0kbFfWVe+bZVcLeX/+47JhRUsNA7ggVm8H/Oft
+uucPeHJ6ekXgrPPYACcdWcUPHBAko1qt32RIwMtSeBIgofeNS1JJa72WGjcnVCt6g2uQjYdiHPAk
+y9VTJ9RwOJ7wkqk6MAnrV9ImmEswfRUqNcmR48HOaPQGBBNdf7moiJANAMGHURjK0YEs8gcD9Apd
+Q68OhAaXJThn3gMNXDhaLIDFs9Vcea3QMwO/kaP9EjFs1kEf757ewBMOotPJ/vRRdSQKPsdBZMl6
+d9RA0Oaikj8JBZbRJDs6NQBTBV9I2z/EZP2fZXDJe7RPl6YqqYOxvMMQQHse3oHy3D3wDooON99y
++4b1TshRJ8MbXi6rVutHZhOY3/vTn3TSREtSYFGf980vfN5me9YvPGX4+kFgKvWZTOncwFPqS0X7
+VbBRwSL8Ma3oO7pgJBT/EyuaD3xUi7aQqldzAPzAXqD+DqpINBGjhTb8GNe5AVSKk6sE06r6KGyU
+wnaq7evWj2FYU36sEtsWZqwoTDlwTjTJqUMhYkbkHtUqVZF5+DQYVazosKJpIHhqeiuy6C7pqkkQ
+YDSgG7K5MBeeAJuk1qbPQXS6aVHQBIXJQIg0rxKOW9Vp53PlwfIifqaPrlL6Mhz9e9IDGcnEa3tX
+LMi5CN4BpAl1XElAdYFCQJdSyWZA74OACMEHlVYgLWybek0UVsGIPXnmN11ZtOLDp2llpDl93pXR
+9aGQQRCByoQK34Uib65A2ufkIicCYxMFJvdkoVp4sPxDAGo54uXSVAFRclD02RyUvH1ZGdXqGJGa
+wc133c6s0hW/b4Dr2rUPS5dg7VcESBERfn/+w65dpb4Z+hwCNL25s8/bcM+6M7BBZlyCFRlmKTfL
+sClSU14KyYek1m9MEG9dlQcfVpkMuk4rPXCkzXXeJ6udVySjBhLQFl40R59OG6tT72iFMoO2sWWh
+UtoBO8Q2onI4bcSDNyldXbAwlm+Z2YRrqOkPQSQSo6CpWhX2gyAl6l3wG2C/1s8q7ScfbwIrLXRi
+s5FTA19p2APAYk8CTqn8OyyrenKvbnoBnkDpnzwUGinkfZ/lBaK7AQnj0tIEPJkBUhB2MVk1kKds
+dhQ8+IE6VJKcIVsyc7E2Vdo4wl3iBwINywc/gCqo/EDrJ972wREgLiNHoBjkYh1aTjSFmQbfaprn
+Pu4ARYfUE5PK9Zyo9P/vPMFzm+55T+AaU9JmtunZ6SA8hmQGBrBiVcYLduKyTEilHAaDmmlYgVck
+EBHkQCPjzK2uoKAE68k9fZubVkQvoj65oOrzxJ+RF1Tk8sgLxlReQLWVdiPlGw1ZcdRzQjUDLG4z
+Gua81r5cf1HAk4u1y4yQbFx3vc/ucmRuRivPKzpOl5Wh33Xzbbe6YqQ1THIwUyvX1jWDuJRhkOX3
+5z8uwaWp09JfTW8H6mfvumftCPhSqGqWa6z+ByGHksYaNHUJbkj5xrTWOUAhV99Wic2RQNwPZi0E
+PmtH1VuxdyP6GpKkC9WK+7RwaRRlHxHuTtpB85zZYbBCakK3o5iNMVDvy9ZO5Y8CayjBUgLhj6IA
+eZGBDT5XsggfhA8AHEgeTNU6rUgbMBd1DXKKbsNCgLfAd+yZrFJ8zmTSKlZqMYSx8iETCrNdIAB1
+6DUJ0m30IdssieoakpYVvCGY6DVNhOnZTbNWhKmIA2wxILPm8D/oI6VI9aUYWqUMkwJUqZlJqCfP
+70SwX3J92kMK8bOCfWrjFBbbtOTmXrLvQciLQvNnMAwKCKyYgZt7ygQ5aFb3QcWjI07+dOXKiQA1
+gPyfZGZlPhzygwEVKhdiY7j5pvuMH00hCaNU/doyoy5hcwAqen/6o4I45HHfW4zw5pk+d7s9X9EM
+lrqBuAFr9YOjeAysMhlZijaAS0mvG5hKwzX0DX22iRaPkLJg4Hq0oXWD5WqiCFxEkS+T8LmBcjRz
+iL1Fi9jlRhktSxbkS1kWmy7hQOUI12g5RjJ4n82z2YiB0BPO42CYHMHpJC+a1edTfyU760cOju4E
+6GQulnKB8EYAQGkWrTdhvBOfxBUAkSs29qWxGZbw/kFOTGlJtHlgfl5+W7ObGq8XWNxWAPQtKoGq
+ZXqPYi5gPz4omtaNEYE5j34bdtmQkDS4k4pB95Dh1GTICond4pgpxzIX010UXIB/m/UPEhhd+0QN
+YO4/gTr3shvjjCadP/DxosZSVPjleHmXNFcj3oC44r4n4DFOAE3tCraqQerhSEv6coR5TzfZCe+Z
+oWF5vJ3p2tbP856RzYb3XAdplBBxbz7+L+x9M1IR5uZI7Nx7MrtHJXWIuedy2QqTnB2ljylgYTpc
+Z6cje68Z2HriHbfr7LhfXGcLoV1Zlq0Ej64xD+/9yQ9arfNt0Kv05jc/c6O9jMzo6V/8mqfyl39d
+v/2rH3/z9Xf/+v3v7u/1Qv72/ff/8E8/fvjdb//59z//2R9+//3vfrP+0t3/wb/8+Fte/pvvfvc/
+fn/3P3787R9/vPvxt/9y9//waf+S//vmj9I5Rer07u/5v//Tbox0Tu+++Vd++g/ru/8O0PTuj3fl
+7m/u/st/DXe/+fn6179XqYHHNl0QHL/DD1///Gf/SRkJarwreP3h+CFN/8dff6q0qj8E/GH/Hb5/
+9GdS7Mdf8Qmvyz9CE8f/RgLRfPwJTin/C/r2uT+wr4a/8OhiWLevxb6/eimPv/9/7/7pv/kTWo/M
+n89XX/3dd//w/X/+3Xf/9D+//93Pf/YPv//uf31/992PP2I83//z+qe1A7///b/89nff3/3+H3/7
+R15h0bHgq6/+6m9/9fOf/X/OP/pG
+ ]]>
+</i:pgf>
+</svg>
diff --git a/share/gcstar/logos/about.png b/share/gcstar/logos/about.png
new file mode 100644
index 0000000..0810e23
--- /dev/null
+++ b/share/gcstar/logos/about.png
Binary files differ
diff --git a/share/gcstar/logos/bg_no.png b/share/gcstar/logos/bg_no.png
new file mode 100644
index 0000000..dedab7b
--- /dev/null
+++ b/share/gcstar/logos/bg_no.png
Binary files differ
diff --git a/share/gcstar/logos/book_no.png b/share/gcstar/logos/book_no.png
new file mode 100644
index 0000000..1214dc4
--- /dev/null
+++ b/share/gcstar/logos/book_no.png
Binary files differ
diff --git a/share/gcstar/logos/button.png b/share/gcstar/logos/button.png
new file mode 100644
index 0000000..75b22e4
--- /dev/null
+++ b/share/gcstar/logos/button.png
Binary files differ
diff --git a/share/gcstar/logos/cd_no.png b/share/gcstar/logos/cd_no.png
new file mode 100644
index 0000000..9ec486f
--- /dev/null
+++ b/share/gcstar/logos/cd_no.png
Binary files differ
diff --git a/share/gcstar/logos/film_no.png b/share/gcstar/logos/film_no.png
new file mode 100644
index 0000000..7c99a68
--- /dev/null
+++ b/share/gcstar/logos/film_no.png
Binary files differ
diff --git a/share/gcstar/logos/find.png b/share/gcstar/logos/find.png
new file mode 100644
index 0000000..ecfabc0
--- /dev/null
+++ b/share/gcstar/logos/find.png
Binary files differ
diff --git a/share/gcstar/logos/install.png b/share/gcstar/logos/install.png
new file mode 100644
index 0000000..64d019b
--- /dev/null
+++ b/share/gcstar/logos/install.png
Binary files differ
diff --git a/share/gcstar/logos/no.png b/share/gcstar/logos/no.png
new file mode 100644
index 0000000..7d3ba0a
--- /dev/null
+++ b/share/gcstar/logos/no.png
Binary files differ
diff --git a/share/gcstar/logos/no_minicars.png b/share/gcstar/logos/no_minicars.png
new file mode 100644
index 0000000..281d7f6
--- /dev/null
+++ b/share/gcstar/logos/no_minicars.png
Binary files differ
diff --git a/share/gcstar/logos/no_smartcards.png b/share/gcstar/logos/no_smartcards.png
new file mode 100644
index 0000000..e9e0aea
--- /dev/null
+++ b/share/gcstar/logos/no_smartcards.png
Binary files differ
diff --git a/share/gcstar/logos/no_stamp.png b/share/gcstar/logos/no_stamp.png
new file mode 100644
index 0000000..3abc5e8
--- /dev/null
+++ b/share/gcstar/logos/no_stamp.png
Binary files differ
diff --git a/share/gcstar/logos/periscope_main_logo.svg b/share/gcstar/logos/periscope_main_logo.svg
new file mode 100644
index 0000000..2492e09
--- /dev/null
+++ b/share/gcstar/logos/periscope_main_logo.svg
@@ -0,0 +1,1230 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Calque_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="401" height="401" viewBox="0 0 401 401"
+ overflow="visible" enable-background="new 0 0 401 401" xml:space="preserve">
+<g id="Calque_6">
+ <rect x="0.5" y="0.5" fill="none" stroke="#FFFFFF" width="400" height="400"/>
+</g>
+<g id="Calque_6_-_copie">
+ <rect x="0.5" y="0.5" fill="#FFFFFF" width="400" height="400"/>
+</g>
+<g id="Calque_10">
+
+ <linearGradient id="XMLID_37_" gradientUnits="userSpaceOnUse" x1="174.3203" y1="444.0762" x2="-0.8899" y2="465.6604" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0.0056" style="stop-color:#FFFFFF"/>
+ <stop offset="0.3072" style="stop-color:#ECF2F9"/>
+ <stop offset="0.9175" style="stop-color:#BAD2EA"/>
+ <stop offset="1" style="stop-color:#B3CDE8"/>
+ </linearGradient>
+ <path fill="url(#XMLID_37_)" d="M132.352,262.551c-0.012,2.467-21.149,4.367-47.21,4.246c-26.062-0.12-47.18-2.217-47.168-4.684
+ c0.011-2.465,21.148-4.367,47.209-4.246C111.244,257.986,132.363,260.085,132.352,262.551z"/>
+ <g>
+
+ <linearGradient id="XMLID_38_" gradientUnits="userSpaceOnUse" x1="83.4087" y1="405.668" x2="91.9835" y2="414.5602" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_38_)" d="M97.31,231.516c3.604,1.102,7.562,0.705,10.878-1.084c1.634-0.882,3.253-2.057,4.146-3.707
+ c1.082-2,1.968-4.107,2.656-6.276c-4.837,1.114-9.997,0.686-14.668-0.941c-4.639-1.614-9.51-4.573-11.822-9.071
+ c-0.322,0.945-1.533,4.672-1.948,5.563c-0.792,1.715-2.018,3.183-3.527,4.313c-1.61,1.174-3.476,1.944-5.383,2.49
+ c-1.626,0.467-3.427,0.788-4.47,2.266c-0.958,1.358-0.908,3.221,0.186,4.492c1.237,1.44,3.214,1.707,4.987,1.347
+ c2.089-0.425,4.162-1.132,6.109-1.991c1.71-0.759,3.544-1.533,4.893-2.87c1.017,1.453,2.31,2.705,3.792,3.679
+ c0.738,0.485,1.522,0.903,2.341,1.239C95.935,231.146,97.335,231.521,97.31,231.516"/>
+
+ <linearGradient id="XMLID_39_" gradientUnits="userSpaceOnUse" x1="116.2788" y1="323.1982" x2="123.2704" y2="352.1169" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0.0056" style="stop-color:#FFF7FF"/>
+ <stop offset="0.1382" style="stop-color:#CEDFFB"/>
+ <stop offset="0.3023" style="stop-color:#98C4F7"/>
+ <stop offset="0.4629" style="stop-color:#6CAEF4"/>
+ <stop offset="0.6163" style="stop-color:#499CF1"/>
+ <stop offset="0.7607" style="stop-color:#3090F0"/>
+ <stop offset="0.8924" style="stop-color:#2189EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_39_)" d="M174.477,149.37c-1.717-7.284-6.05-13.56-11.993-16.68c-3.141-1.649-6.73-2.419-10.62-1.987
+ c-0.358,0.04-0.718,0.091-1.08,0.153c-0.241,0.04-0.482,0.089-0.726,0.138c-0.106,0.023-0.212,0.042-0.323,0.065
+ c-0.308,0.069-0.622,0.148-0.937,0.23c-0.029,0.009-0.06,0.016-0.092,0.025c-0.339,0.091-0.682,0.191-1.029,0.304
+ c-1.883,0.602-3.819,1.474-5.792,2.667c-5.371,3.239-9.584,7.517-12.671,12.32c-0.152,0.237-0.292,0.48-0.44,0.719
+ c1.439-3.938,3.37-6.728,4.87-8.318c2.659-2.815,6.604-6.074,11.241-7.926c-0.966-0.153-1.872-0.265-2.698-0.336
+ c-16.258-1.986-29.712,4.876-36.667,25.514c-1.066,3.163-4.573,14.902-8.382,27.367c-6.451,0.293-15.039,1.458-19.114,5.358
+ c-0.838,0.677-1.398,1.678-1.466,2.819c-0.13,2.19,1.591,4.072,3.839,4.202c1.247,0.072,2.391-0.408,3.188-1.223l0.008,0.009
+ c1.325-1.434,5.844-2.444,11.01-2.919c-0.134,0.431-0.268,0.859-0.399,1.287c-0.441,1.39-0.881,2.781-1.317,4.173
+ c-0.603,1.913-1.202,3.826-1.813,5.737c-0.302,0.951-0.612,1.906-0.922,2.861c-0.085,2.672,1.576,5.438,4.706,7.807
+ c4.809,3.637,13.489,6.392,21.196,3.856c0.851-2.68,1.986-6.255,3.244-10.2l0.005,0.002c0.697-2.205,1.44-4.095,2.213-5.721
+ c1.443,1.313,2.871,2.75,4.133,4.143c0.805,1.016,1.03,1.549,1.744,2.242c1.937,1.873,4.544,2.156,6.218,0.459
+ c1.671-1.694,1.459-4.593-0.475-6.463c-0.093-0.093-0.189-0.174-0.286-0.253c-1.415-1.66-3.807-4.292-6.637-6.756
+ c3.407-2.961,6.873-2.732,9.403-1.859c0.031,0.018,0.059,0.039,0.089,0.055c6.104,3.575,13.035,3.278,19.316,0.277
+ c5.143-2.456,9.615-6.621,13.029-11.675c3.117-4.618,5.338-9.956,6.482-15.472C175.716,160.68,175.755,154.791,174.477,149.37z
+ M166.884,179.725c-6.431,9.186-17.595,14.081-26.032,7.7c-12.514-9.462-10.605-33.852,5.365-45.267
+ c11.919-8.522,22.916-1.749,26.048,9.716C174.663,160.647,172.356,171.909,166.884,179.725z"/>
+
+ <linearGradient id="XMLID_40_" gradientUnits="userSpaceOnUse" x1="83.479" y1="405.4453" x2="92.0916" y2="414.3767" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_40_)" d="M97.31,231.516c-0.782,0.461-1.606,0.91-2.524,1.332c-0.142,0.049-0.276,0.108-0.408,0.172
+ c-0.531,0.315-1.015,0.679-1.409,1.125c-0.443,0.567-0.74,1.264-0.818,2.035c-0.216,2.152,1.328,4.069,3.446,4.277
+ c0.693,0.07,1.36-0.053,1.954-0.321l0.012,0.024c4.804-2.143,8.223-4.848,10.657-7.501c1.381-1.556,2.579-3.251,3.618-5.048
+ C108.263,231.455,102.67,233.15,97.31,231.516z"/>
+
+ <linearGradient id="XMLID_41_" gradientUnits="userSpaceOnUse" x1="98.8281" y1="421.3633" x2="101.5017" y2="424.1357" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_41_)" d="M97.31,231.516c-0.782,0.461-1.606,0.91-2.524,1.332c-0.142,0.049-0.276,0.108-0.408,0.172
+ c-0.531,0.315-1.015,0.679-1.409,1.125c-0.443,0.567-0.74,1.264-0.818,2.035c-0.216,2.152,1.328,4.069,3.446,4.277
+ c0.693,0.07,1.36-0.053,1.954-0.321l0.012,0.024c4.804-2.143,8.223-4.848,10.657-7.501c1.381-1.556,2.579-3.251,3.618-5.048
+ C108.263,231.455,102.67,233.15,97.31,231.516z"/>
+
+ <linearGradient id="XMLID_42_" gradientUnits="userSpaceOnUse" x1="87.1963" y1="372.2148" x2="91.0126" y2="381.7556" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_42_)" d="M80.141,195.28c1.184,0.06,2.269-0.404,3.019-1.182l0.008,0.008
+ c1.96-2.155,11.404-3.377,18.993-3.167l0.376,0.009c0.003,0,0.374-0.063,0.374-0.063s2.003-1.696,1.504-4.474
+ c-0.498-2.778-2.039-3.085-2.039-3.085c-4.412-0.126-18.979-0.093-24.539,5.303c-0.792,0.65-1.317,1.603-1.372,2.689
+ C76.358,193.399,78.005,195.174,80.141,195.28z"/>
+
+ <linearGradient id="XMLID_43_" gradientUnits="userSpaceOnUse" x1="128.3442" y1="407.792" x2="128.9795" y2="390.3197" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_43_)" d="M133.314,202.32c-0.088-0.092-0.181-0.176-0.277-0.258c-1.758-2.146-5.083-5.917-8.93-8.921
+ c-0.853,2.684-1.741,5.481-2.617,8.238c1.43,1.348,2.844,2.824,4.087,4.251c0.774,1.021,0.981,1.546,1.683,2.251
+ c1.89,1.902,4.528,2.299,6.29,0.729C135.31,207.039,135.207,204.223,133.314,202.32z"/>
+ </g>
+</g>
+<g id="Calque_7">
+ <path fill="#1C86EE" d="M361.816,214.289c-0.555-1.294-2.082-1.932-3.096-2.354l0,0c-5.414-2.272-11.367-2.057-16.336,0.598
+ c-2.316,1.24-3.932,2.813-4.8,4.672c-1.2,2.574-0.581,4.955,1.743,6.704c1.91,1.438,4.195,2.097,6.374,2.647
+ c2.919,0.735,4.481,1.904,4.78,3.57c0.361,2.002-2.281,4.146-4.189,4.688c-2.339,0.664-4.615,0.223-6.09-1.183
+ c-0.199-0.188-0.395-0.396-0.602-0.61c-0.67-0.705-1.428-1.504-2.463-1.832c-1.443-0.455-3.016,0.175-3.934,0.996
+ c-0.787,0.709-1.146,1.584-1.038,2.529c0.172,1.501,1.493,2.859,2.728,3.541c3.717,2.053,8.928,2.201,15.481,0.445
+ c4.157-1.109,8.888-4.43,9.446-9.092c0.617-5.114-4.359-6.334-7.994-7.226c-0.51-0.125-0.989-0.241-1.441-0.364
+ c-1.289-0.351-3.558-1.146-4.242-2.533c-0.27-0.545-0.267-1.135,0.008-1.801c0.908-2.207,4.115-3.142,6.271-2.468
+ c0.797,0.246,1.54,0.813,2.328,1.411c1.514,1.146,3.229,2.45,5.416,1.154C361.386,217.07,362.376,215.602,361.816,214.289z"/>
+ <path fill="#1C86EE" d="M332.934,221.484c0.896-2.74,2.396-7.33-0.688-9.549l-0.293,0.404l0.292-0.406
+ c-2.327-1.668-5.641-1.58-7.93-1.369c-1.478,0.137-2.885,0.425-4.181,0.855c-0.001,0-0.288,0.098-0.288,0.098
+ c-1.332,0.447-2.592,0.873-3.971,0.851c-0.729-0.013-1.404-0.339-2.121-0.685c-0.337-0.164-0.686-0.332-1.045-0.468
+ c-1.458-0.559-2.98-0.896-4.527-1.004c-1.535-0.104-2.969,0.009-4.255,0.34c-0.55,0.144-1.086,0.328-1.604,0.509
+ c-0.881,0.306-1.713,0.594-2.598,0.678c-0.951,0.092-1.959-0.059-3.021-0.219c-1.872-0.28-3.811-0.57-5.551,0.502
+ c-2.228,1.371-2.986,3.892-3.661,6.112c-0.134,0.443-0.261,0.863-0.397,1.275l-0.767,2.305l-2.312,6.94
+ c0.002-0.002-0.604,1.755-0.604,1.755c-0.521,1.479-1.061,3.012-1.432,4.563c-0.23,0.979-0.847,3.579,1.035,4.479
+ c2.139,1.021,4.373-0.661,5.642-2.783c0.559-0.936,0.891-1.959,1.213-2.949l0.146-0.441l1.545-4.631
+ c0.188-0.561,0.371-1.139,0.547-1.695c0.613-1.94,1.248-3.946,2.234-5.696c1.688-2.985,5.711-5.351,9.276-3.959
+ c1.584,0.617,2.38,2.265,2.024,4.192c-0.176,0.955-0.521,1.916-0.856,2.847c-0.136,0.373-0.272,0.76-0.401,1.144
+ c0.001-0.002-1.502,4.526-1.502,4.526c0,0.001-0.23,0.711-0.23,0.711c-0.359,1.11-0.731,2.261-1.067,3.401
+ c0,0.002-0.034,0.117-0.034,0.117c-0.371,1.269-0.88,3.004-0.1,4.386c0.343,0.604,0.896,0.998,1.598,1.144
+ c1.268,0.262,2.779-0.328,3.646-0.988c1.888-1.434,2.66-3.998,3.283-6.062l0.129-0.43c0.496-1.632,1.033-3.28,1.556-4.876
+ l1.135-3.526c0.685-2.166,1.706-4.584,4.11-6.094c1.539-0.97,4.096-1.724,6.229-0.66c2.33,1.158,1.846,3.854,1.063,6.341
+ c-0.785,2.495-1.678,5.323-2.629,8.047c-0.785,2.239-1.48,5.246-0.34,6.85c0.506,0.71,1.293,1.066,2.344,1.063
+ c3.262-0.006,4.781-4.176,5.512-6.18c0.945-2.602,1.793-5.282,2.611-7.877l1.217-3.813L332.934,221.484z"/>
+ <path fill="#1C86EE" d="M286.293,206.096L286.293,206.096c0.343-1.027,0.813-2.433,0.409-3.736
+ c-0.392-1.264-1.681-1.856-3.45-1.587c-2.132,0.322-3.745,1.887-4.794,4.649c-1.485,3.897-2.763,7.963-3.996,11.894l-1.819,5.703
+ l-3.004,9.133c-0.09,0.276-0.209,0.598-0.337,0.937c-0.638,1.703-1.513,4.034-0.442,5.642c0.371,0.563,0.947,0.918,1.664,1.028
+ c1.274,0.199,2.832-0.405,3.709-1.106c1.474-1.172,2.271-2.934,2.855-4.504c0.374-1.004,0.678-2.039,0.971-3.039l0.409-1.371
+ c0.527-1.696,1.107-3.418,1.669-5.077l0.793-2.359l3.387-10.229L286.293,206.096z"/>
+ <path fill="#1C86EE" d="M258.689,216.548c0.924-0.672,1.881-1.366,2.649-2.274l-0.382-0.322l0.382,0.32
+ c0.978-1.148,0.361-2.498-0.087-3.479c-0.063-0.142-0.125-0.272-0.182-0.399c-0.522-1.228-0.661-2.303-0.409-3.195
+ c0.325-1.149,1.299-1.73,2.325-2.346c1.063-0.636,2.158-1.289,2.646-2.604c0.362-0.98,0.055-1.628-0.268-1.999
+ c-1.17-1.345-4.295-1.155-5.301-0.934c-2.381,0.527-4.61,1.93-6.631,4.171c-0.748,0.832-1.404,1.769-2.043,2.675
+ c-0.918,1.31-1.869,2.659-3.078,3.655c-0.201,0.166-0.416,0.326-0.646,0.496c-0.773,0.576-1.65,1.229-2.086,2.213
+ c-0.551,1.244-0.035,2.42,0.421,3.457c0.104,0.24,0.203,0.466,0.287,0.687c0.716,1.88,0.542,3.286-0.027,5.222
+ c-0.452,1.531-0.969,3.077-1.466,4.572l-0.216,0.651c-0.284,0.86-0.604,1.731-0.911,2.573c-0.354,0.968-0.719,1.963-1.039,2.963
+ l-0.057,0.179c-0.538,1.664-1.537,4.758,0.082,6.278c0.506,0.478,1.168,0.713,1.912,0.684c1.404-0.057,2.912-1.035,3.721-1.923
+ c1.145-1.263,1.843-2.817,2.427-4.312c0.863-2.209,1.562-4.514,2.233-6.742c0.445-1.474,0.906-3,1.41-4.479
+ c0.498-1.459,0.994-2.76,2.037-3.891C257.064,217.729,257.854,217.154,258.689,216.548z"/>
+ <path fill="#1C86EE" d="M269.717,217.718c0.094-0.268,0.219-0.565,0.35-0.881c0.44-1.063,0.938-2.271,0.746-3.364l0,0
+ c-0.133-0.777-0.52-1.373-1.119-1.722c-1.143-0.663-2.629-0.241-3.217-0.026c-1.979,0.719-3.215,2.045-4.009,4.301l-1.608,4.451
+ l-1.578,4.369l-0.934,2.745c-0.517,1.538-1.05,3.132-1.638,4.666c0-0.001-0.12,0.308-0.12,0.308
+ c-0.57,1.472-1.279,3.301-0.947,4.998c0.183,0.931,0.75,1.604,1.604,1.892c1.36,0.464,3.166-0.138,4.124-0.981
+ c1.904-1.688,2.666-4.072,3.4-6.381c0.149-0.469,0.306-0.949,0.465-1.415l1.729-4.997l1.375-3.975L269.717,217.718z"/>
+ <path fill="#1C86EE" d="M268.672,205.604l-0.064-0.035c0.856,0.574,2.059,0.556,3.295-0.057c1.154-0.568,2.354-1.705,2.438-2.964
+ c0.032-0.51-0.109-1.237-0.979-1.815c-1.198-0.799-2.836-0.41-3.969,0.221c-1.322,0.735-2.154,1.851-2.121,2.844
+ C267.285,204.327,267.543,205.07,268.672,205.604z"/>
+ <path fill="#1C86EE" d="M243.664,206.609c-0.536-2.534-2.408-4.866-5.137-6.403v0.001c-4.123-2.324-9.782-2.643-15.936-0.9
+ c-4.531,1.287-8.775,3.886-12.271,7.52c-3.365,3.501-5.928,7.81-7.405,12.461c-1.983,6.237-1.365,11.944,1.692,15.657
+ c3.623,4.396,9.799,4.787,13.156,4.63c5.514-0.263,10.828-2.232,15.373-5.698c1.641-1.25,4.695-3.578,4.504-6.227
+ c-0.041-0.551-0.298-1.025-0.742-1.371c-0.721-0.559-1.801-0.672-2.556-0.537c-1.313,0.24-2.401,1.132-3.362,1.917l-0.479,0.389
+ c-2.046,1.613-4.272,3.252-7.017,4c-2.678,0.726-5.363,0.789-7.562,0.183c-6.377-1.769-4.817-9.795-4.188-12.211
+ c1.424-5.474,4.892-10.271,9.272-12.834c4.22-2.465,11.136-2.82,14.313,0.611c0.431,0.465,0.779,1.077,1.117,1.67
+ c0.867,1.523,1.852,3.25,4.373,2.498C243.193,211.252,244.232,209.3,243.664,206.609z"/>
+ <path fill="#1C86EE" d="M195.014,200.358c-4.125-2.321-9.783-2.64-15.929-0.898c-9.037,2.563-16.578,10.218-19.681,19.979
+ c-1.984,6.237-1.367,11.947,1.693,15.658c3.623,4.396,9.797,4.789,13.156,4.629c5.557-0.263,10.905-2.259,15.466-5.771
+ c3.394-2.608,8.061-6.667,9.378-11.749c0.597-2.301,0.181-4.008-1.17-4.807c-0.845-0.495-1.885-0.568-2.803-0.637
+ c-0.206-0.014-0.4-0.027-0.587-0.047c-1.673-0.16-3.056-0.195-4.354-0.107c-3.946,0.262-6.429,1.339-7.382,3.201
+ c-1.097,2.149,0.78,3.272,2.152,4.092c0.641,0.385,1.305,0.781,1.638,1.217c0.889,1.164-0.19,3.023-1.131,3.988
+ c-1.286,1.313-2.922,2.291-4.861,2.904c-1.461,0.463-6.507,1.797-10.067-0.443c-3.353-2.11-3.175-6.659-2.772-9.184
+ c0.628-3.934,2.165-7.484,4.44-10.269l-0.387-0.317l0.387,0.316c2.055-2.516,4.07-4.229,6.162-5.24
+ c2.318-1.122,5.071-1.568,7.962-1.29c1.945,0.188,4.565,0.861,5.996,2.998c0.229,0.341,0.421,0.705,0.626,1.092
+ c0.359,0.679,0.731,1.382,1.315,1.966c1.229,1.229,3.069,0.5,3.854,0.188c2.255-0.897,2.553-3.56,1.848-5.798
+ C199.248,203.77,197.491,201.755,195.014,200.358z"/>
+ <path fill="#1C86EE" d="M361.816,214.289c-0.555-1.294-2.082-1.932-3.096-2.354l0,0c-5.414-2.272-11.367-2.057-16.336,0.598
+ c-2.316,1.24-3.932,2.813-4.8,4.672c-1.2,2.574-0.581,4.955,1.743,6.704c1.91,1.438,4.195,2.097,6.374,2.647
+ c2.919,0.735,4.481,1.904,4.78,3.57c0.361,2.002-2.281,4.146-4.189,4.688c-2.339,0.664-4.615,0.223-6.09-1.183
+ c-0.199-0.188-0.395-0.396-0.602-0.61c-0.67-0.705-1.428-1.504-2.463-1.832c-1.443-0.455-3.016,0.175-3.934,0.996
+ c-0.787,0.709-1.146,1.584-1.038,2.529c0.172,1.501,1.493,2.859,2.728,3.541c3.717,2.053,8.928,2.201,15.481,0.445
+ c4.157-1.109,8.888-4.43,9.446-9.092c0.617-5.114-4.359-6.334-7.994-7.226c-0.51-0.125-0.989-0.241-1.441-0.364
+ c-1.289-0.351-3.558-1.146-4.242-2.533c-0.27-0.545-0.267-1.135,0.008-1.801c0.908-2.207,4.115-3.142,6.271-2.468
+ c0.797,0.246,1.54,0.813,2.328,1.411c1.514,1.146,3.229,2.45,5.416,1.154C361.386,217.07,362.376,215.602,361.816,214.289z"/>
+ <path fill="#1C86EE" d="M332.934,221.484c0.896-2.74,2.396-7.33-0.688-9.549l-0.001-0.002c-2.327-1.668-5.641-1.58-7.93-1.369
+ c-1.478,0.137-2.885,0.425-4.181,0.855c-0.001,0-0.288,0.098-0.288,0.098c-1.332,0.447-2.592,0.873-3.971,0.851
+ c-0.729-0.013-1.404-0.339-2.121-0.685c-0.337-0.164-0.686-0.332-1.045-0.468c-1.458-0.559-2.98-0.896-4.527-1.004
+ c-1.535-0.104-2.969,0.007-4.255,0.34c-0.55,0.144-1.086,0.328-1.604,0.509c-0.881,0.306-1.713,0.594-2.598,0.678
+ c-0.951,0.092-1.959-0.061-3.021-0.219c-1.872-0.281-3.811-0.57-5.551,0.502c-2.228,1.371-2.986,3.892-3.661,6.112
+ c-0.134,0.443-0.261,0.863-0.397,1.275l-0.767,2.305l-2.312,6.94c0.002-0.002-0.604,1.755-0.604,1.755
+ c-0.521,1.479-1.061,3.012-1.432,4.563c-0.23,0.979-0.847,3.579,1.035,4.479c2.139,1.021,4.373-0.661,5.642-2.783
+ c0.559-0.936,0.891-1.959,1.213-2.949l0.146-0.441l1.545-4.631c0.188-0.561,0.371-1.139,0.547-1.695
+ c0.613-1.94,1.248-3.946,2.234-5.696c1.688-2.985,5.711-5.351,9.276-3.959c1.584,0.617,2.38,2.265,2.024,4.192
+ c-0.176,0.955-0.521,1.916-0.856,2.847c-0.136,0.373-0.272,0.76-0.401,1.144c0.001-0.002-1.502,4.526-1.502,4.526
+ c0,0.001-0.23,0.711-0.23,0.711c-0.359,1.11-0.731,2.261-1.067,3.401c0,0.002-0.034,0.117-0.034,0.117
+ c-0.371,1.269-0.88,3.004-0.1,4.386c0.343,0.604,0.896,0.998,1.598,1.144c1.268,0.262,2.779-0.328,3.646-0.988
+ c1.888-1.434,2.66-3.998,3.283-6.062l0.129-0.43c0.496-1.632,1.033-3.28,1.556-4.877l1.135-3.525
+ c0.685-2.166,1.706-4.584,4.11-6.094c1.539-0.97,4.096-1.724,6.229-0.66c2.33,1.158,1.846,3.854,1.063,6.341
+ c-0.785,2.495-1.678,5.323-2.629,8.047c-0.785,2.239-1.48,5.246-0.34,6.85c0.506,0.709,1.293,1.066,2.344,1.063
+ c3.262-0.006,4.781-4.176,5.512-6.18c0.945-2.602,1.793-5.282,2.611-7.877l1.217-3.813L332.934,221.484z"/>
+ <path fill="#1C86EE" d="M286.293,206.096L286.293,206.096c0.343-1.027,0.813-2.433,0.409-3.736
+ c-0.392-1.264-1.681-1.856-3.45-1.587c-2.132,0.322-3.745,1.887-4.794,4.649c-1.485,3.897-2.763,7.963-3.996,11.894l-1.819,5.703
+ l-3.004,9.133c-0.09,0.276-0.209,0.598-0.337,0.937c-0.638,1.703-1.513,4.034-0.442,5.642c0.371,0.563,0.947,0.918,1.664,1.028
+ c1.274,0.199,2.832-0.405,3.709-1.106c1.474-1.172,2.271-2.934,2.855-4.504c0.374-1.004,0.678-2.039,0.971-3.039l0.409-1.371
+ c0.527-1.696,1.107-3.418,1.669-5.077l0.793-2.359l3.387-10.229L286.293,206.096z"/>
+ <path fill="#1C86EE" d="M258.689,216.548c0.924-0.672,1.881-1.366,2.649-2.274v-0.002c0.978-1.148,0.361-2.498-0.087-3.479
+ c-0.063-0.142-0.125-0.272-0.182-0.399c-0.522-1.228-0.661-2.303-0.409-3.195c0.325-1.149,1.299-1.73,2.325-2.346
+ c1.063-0.636,2.158-1.289,2.646-2.604c0.362-0.98,0.055-1.628-0.268-1.999c-1.17-1.345-4.295-1.155-5.301-0.934
+ c-2.381,0.527-4.61,1.93-6.631,4.171c-0.748,0.832-1.404,1.769-2.043,2.675c-0.918,1.31-1.869,2.659-3.078,3.655
+ c-0.201,0.166-0.416,0.326-0.646,0.496c-0.773,0.576-1.65,1.229-2.086,2.213c-0.551,1.244-0.035,2.42,0.421,3.457
+ c0.104,0.24,0.203,0.466,0.287,0.687c0.716,1.88,0.542,3.286-0.027,5.222c-0.452,1.531-0.969,3.077-1.466,4.572l-0.216,0.651
+ c-0.284,0.86-0.604,1.731-0.911,2.573c-0.354,0.968-0.719,1.963-1.039,2.963l-0.057,0.179c-0.538,1.664-1.537,4.758,0.082,6.278
+ c0.506,0.478,1.168,0.713,1.912,0.684c1.404-0.057,2.912-1.035,3.721-1.923c1.145-1.263,1.843-2.817,2.427-4.312
+ c0.863-2.209,1.562-4.514,2.233-6.742c0.445-1.474,0.906-3,1.41-4.479c0.498-1.459,0.994-2.76,2.037-3.891
+ C257.064,217.729,257.854,217.154,258.689,216.548z"/>
+ <path fill="#1C86EE" d="M269.717,217.718c0.094-0.268,0.219-0.565,0.35-0.881c0.44-1.063,0.938-2.271,0.746-3.364l0,0
+ c-0.133-0.777-0.52-1.373-1.119-1.722c-1.143-0.663-2.629-0.241-3.217-0.026c-1.979,0.719-3.215,2.045-4.009,4.301l-1.608,4.451
+ l-1.578,4.369l-0.934,2.745c-0.517,1.538-1.05,3.132-1.638,4.666c0-0.001-0.12,0.308-0.12,0.308
+ c-0.57,1.472-1.279,3.301-0.947,4.998c0.183,0.931,0.75,1.604,1.604,1.892c1.36,0.464,3.166-0.138,4.124-0.981
+ c1.904-1.688,2.666-4.072,3.4-6.381c0.149-0.469,0.306-0.949,0.465-1.415l1.729-4.997l1.375-3.975L269.717,217.718z"/>
+ <path fill="#1C86EE" d="M268.672,205.604l-0.064-0.035c0.856,0.574,2.059,0.556,3.295-0.057c1.154-0.568,2.354-1.705,2.438-2.964
+ c0.032-0.51-0.109-1.237-0.979-1.815c-1.198-0.799-2.836-0.41-3.969,0.221c-1.322,0.735-2.154,1.851-2.121,2.844
+ C267.285,204.327,267.543,205.07,268.672,205.604z"/>
+ <path fill="#1C86EE" d="M243.664,206.609c-0.536-2.534-2.408-4.866-5.137-6.403v0.001c-4.123-2.324-9.782-2.643-15.936-0.9
+ c-4.531,1.287-8.775,3.886-12.271,7.52c-3.365,3.501-5.928,7.81-7.405,12.461c-1.983,6.237-1.365,11.944,1.692,15.657
+ c3.623,4.396,9.799,4.787,13.156,4.63c5.514-0.263,10.828-2.232,15.373-5.698c1.641-1.25,4.695-3.578,4.504-6.227
+ c-0.041-0.551-0.298-1.025-0.742-1.371c-0.721-0.559-1.801-0.672-2.556-0.537c-1.313,0.24-2.401,1.132-3.362,1.917l-0.479,0.389
+ c-2.046,1.613-4.272,3.252-7.017,4c-2.678,0.726-5.363,0.789-7.562,0.183c-6.377-1.769-4.817-9.795-4.188-12.211
+ c1.424-5.474,4.892-10.271,9.272-12.834c4.22-2.465,11.136-2.82,14.313,0.611c0.431,0.465,0.779,1.077,1.117,1.67
+ c0.867,1.523,1.852,3.25,4.373,2.498C243.193,211.252,244.232,209.3,243.664,206.609z"/>
+ <path fill="#1C86EE" d="M195.014,200.358c-4.125-2.321-9.783-2.64-15.929-0.898c-9.037,2.563-16.578,10.218-19.681,19.979
+ c-1.984,6.237-1.367,11.947,1.693,15.658c3.623,4.396,9.797,4.789,13.156,4.629c5.557-0.263,10.905-2.259,15.466-5.771
+ c3.394-2.608,8.061-6.667,9.378-11.749c0.597-2.301,0.181-4.008-1.17-4.807c-0.845-0.495-1.885-0.568-2.803-0.637
+ c-0.206-0.014-0.4-0.027-0.587-0.047c-1.673-0.16-3.056-0.195-4.354-0.107c-3.946,0.262-6.429,1.339-7.382,3.201
+ c-1.097,2.149,0.78,3.272,2.152,4.092c0.641,0.385,1.305,0.781,1.638,1.217c0.889,1.164-0.19,3.023-1.131,3.988
+ c-1.286,1.313-2.922,2.291-4.861,2.904c-1.461,0.463-6.507,1.797-10.067-0.443c-3.353-2.11-3.175-6.659-2.772-9.184
+ c0.628-3.934,2.165-7.484,4.44-10.269l-0.387-0.317l0.387,0.316c2.055-2.516,4.07-4.229,6.162-5.24
+ c2.318-1.122,5.071-1.568,7.962-1.29c1.945,0.188,4.565,0.861,5.996,2.998c0.229,0.341,0.421,0.705,0.626,1.092
+ c0.359,0.679,0.731,1.382,1.315,1.966c1.229,1.229,3.069,0.5,3.854,0.188c2.255-0.897,2.553-3.56,1.848-5.798
+ C199.248,203.77,197.491,201.755,195.014,200.358z"/>
+
+ <linearGradient id="XMLID_44_" gradientUnits="userSpaceOnUse" x1="352.1504" y1="401.8721" x2="329.5183" y2="475.8033" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2427 -194.2114)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_44_)" d="M345.693,217.498c1.02-2.479,4.474-3.505,6.881-2.754c2.521,0.785,4.423,4.341,7.341,2.613
+ c0.914-0.539,1.921-1.75,1.442-2.873c-0.463-1.078-1.825-1.67-2.83-2.088c-5.125-2.152-10.988-2.049-15.905,0.578
+ c-1.897,1.017-3.654,2.452-4.582,4.439c-1.126,2.415-0.497,4.521,1.59,6.094c1.83,1.379,4.009,2.012,6.197,2.563
+ c0.88,0.224,1.848,0.539,2.717,1.006c3.412-0.387,6.507-0.962,9.283-1.738c-1.899-1.652-5.162-2.181-7.567-2.834
+ C348.048,221.906,344.48,220.445,345.693,217.498z"/>
+
+ <linearGradient id="XMLID_45_" gradientUnits="userSpaceOnUse" x1="317.1084" y1="390.5186" x2="294.4502" y2="464.5356" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2427 -194.2114)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_45_)" d="M331.95,212.342c-2.112-1.515-5.112-1.507-7.591-1.279c-1.381,0.127-2.752,0.396-4.067,0.834
+ c-1.46,0.488-2.856,0.998-4.426,0.974c-1.211-0.021-2.237-0.769-3.334-1.185c-1.402-0.537-2.886-0.867-4.386-0.972
+ c-1.364-0.096-2.768-0.021-4.097,0.325c-1.438,0.371-2.782,1.055-4.278,1.197c-2.729,0.26-5.84-1.34-8.355,0.211
+ c-2.471,1.521-2.998,4.566-3.85,7.121c-0.273,0.824-0.545,1.646-0.818,2.469c2.085,0.355,4.143,0.695,6.182,1.02
+ c0.291-0.701,0.605-1.39,0.979-2.049c1.844-3.267,6.142-5.641,9.893-4.179c1.959,0.764,2.7,2.762,2.336,4.75
+ c-0.201,1.108-0.611,2.187-0.994,3.255c2.227,0.292,4.414,0.559,6.563,0.801c0.206-0.635,0.414-1.268,0.613-1.902
+ c0.813-2.572,1.968-4.89,4.32-6.366c1.93-1.214,4.604-1.738,6.721-0.687c2.771,1.377,2.068,4.551,1.314,6.938
+ c-0.328,1.039-0.658,2.075-0.99,3.106c2.381,0.162,4.696,0.285,6.94,0.362c0.606-1.896,1.194-3.797,1.813-5.688
+ C333.292,218.775,334.764,214.365,331.95,212.342z"/>
+
+ <linearGradient id="XMLID_46_" gradientUnits="userSpaceOnUse" x1="287.7227" y1="381.0137" x2="264.7614" y2="456.0205" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2427 -194.2114)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_46_)" d="M286.225,202.506c-0.387-1.25-1.774-1.41-2.896-1.242c-2.331,0.354-3.622,2.277-4.401,4.334
+ c-1.768,4.635-3.216,9.426-4.717,14.17c2.229,0.424,4.438,0.838,6.622,1.232c1.66-5.021,3.325-10.04,4.985-15.063
+ C286.175,204.871,286.572,203.63,286.225,202.506z"/>
+
+ <linearGradient id="XMLID_47_" gradientUnits="userSpaceOnUse" x1="263.6563" y1="374.3867" x2="241.1457" y2="447.9211" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2427 -194.2114)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_47_)" d="M260.959,213.949c0.884-1.045,0.1-2.323-0.345-3.365c-0.47-1.098-0.765-2.352-0.433-3.525
+ c0.732-2.59,4.102-2.604,4.983-4.985c0.964-2.6-3.578-2.58-4.992-2.271c-2.548,0.563-4.646,2.106-6.362,4.019
+ c-1.815,2.017-3.067,4.646-5.179,6.383c-0.907,0.747-2.093,1.4-2.591,2.525c-0.17,0.387-0.206,0.769-0.175,1.147
+ c4.053,0.901,8.073,1.778,12.05,2.617C258.989,215.703,260.102,214.961,260.959,213.949z"/>
+
+ <linearGradient id="XMLID_48_" gradientUnits="userSpaceOnUse" x1="275.9443" y1="378.1533" x2="253.4364" y2="451.6787" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2427 -194.2114)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_48_)" d="M270.32,213.559c-0.321-1.877-2.209-1.896-3.674-1.365c-1.979,0.721-3.017,2.029-3.707,3.998
+ c-0.146,0.418-0.304,0.836-0.451,1.254c2.135,0.439,4.25,0.863,6.354,1.279c0.134-0.39,0.271-0.779,0.402-1.17
+ C269.648,216.396,270.543,214.813,270.32,213.559z"/>
+
+ <linearGradient id="XMLID_49_" gradientUnits="userSpaceOnUse" x1="276.5596" y1="377.6504" x2="253.3182" y2="453.5727" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2427 -194.2114)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_49_)" d="M273.081,201.148c-2.376-1.583-7.599,2.393-4.195,4.004
+ C271.061,206.611,275.652,202.857,273.081,201.148z"/>
+
+ <linearGradient id="XMLID_50_" gradientUnits="userSpaceOnUse" x1="236.9277" y1="365.3828" x2="214.0403" y2="440.1483" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2427 -194.2114)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_50_)" d="M220.757,206.754c4.118-2.408,11.373-3.141,14.933,0.704c1.596,1.719,1.947,4.933,4.979,4.026
+ c2.279-0.68,2.979-2.535,2.508-4.772c-0.563-2.663-2.581-4.769-4.894-6.07c-4.682-2.636-10.549-2.271-15.553-0.853
+ c-4.6,1.304-8.742,3.947-12.051,7.384c-1.205,1.257-2.307,2.62-3.287,4.063c2.852-0.219,5.713-0.366,8.573-0.424
+ C217.34,209.206,218.945,207.814,220.757,206.754z"/>
+
+ <linearGradient id="XMLID_51_" gradientUnits="userSpaceOnUse" x1="196.4858" y1="353.0273" x2="173.7346" y2="427.3483" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2427 -194.2114)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_51_)" d="M178.143,206.43c2.533-1.227,5.443-1.605,8.228-1.338c2.413,0.232,4.957,1.115,6.364,3.217
+ c0.653,0.978,1.035,2.141,1.878,2.98c0.905,0.906,2.284,0.488,3.316,0.078c2.088-0.832,2.137-3.338,1.555-5.184
+ c-0.742-2.354-2.603-4.199-4.715-5.391c-4.68-2.634-10.543-2.271-15.548-0.853c-9.294,2.636-16.456,10.582-19.34,19.649
+ c-0.134,0.429-0.255,0.864-0.373,1.306c2.804-0.869,5.726-1.728,8.744-2.556c0.805-2.366,1.985-4.608,3.56-6.538
+ C173.564,209.657,175.625,207.645,178.143,206.43z"/>
+</g>
+<g id="Calque_8">
+ <g>
+ <g>
+
+ <radialGradient id="XMLID_52_" cx="147.7085" cy="348.5166" r="52.7762" gradientTransform="matrix(1.0169 0.0102 0.0047 1.0111 4.6242 -193.2883)" gradientUnits="userSpaceOnUse">
+ <stop offset="0.118" style="stop-color:#1C86EE"/>
+ <stop offset="0.5169" style="stop-color:#80D1FF"/>
+ <stop offset="0.6036" style="stop-color:#5BB5F9"/>
+ <stop offset="0.7215" style="stop-color:#2E93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ </radialGradient>
+ <path fill="url(#XMLID_52_)" d="M173.665,170.965c-6.073,18.438-23.024,29.468-37.183,23.018
+ c-14.01-6.38-18.025-26.629-9.83-43.751c7.479-15.64,22.729-23.224,34.717-18.086
+ C173.459,137.33,179.202,154.149,173.665,170.965z"/>
+
+ <linearGradient id="XMLID_53_" gradientUnits="userSpaceOnUse" x1="147.7441" y1="374.1729" x2="124.3015" y2="262.8594" gradientTransform="matrix(1.0119 0.009 0.0036 1.008 3.178 -192.6773)">
+ <stop offset="0" style="stop-color:#1C86EE"/>
+ <stop offset="0.118" style="stop-color:#1C86EE"/>
+ <stop offset="0.5169" style="stop-color:#7DCFFE"/>
+ <stop offset="0.5989" style="stop-color:#5BB5F8"/>
+ <stop offset="0.7199" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_53_)" d="M173.629,170.978c-6.04,18.362-22.887,29.312-36.972,22.898
+ c-13.939-6.345-18.009-26.494-9.925-43.582c7.394-15.659,22.594-23.29,34.586-18.148
+ C173.411,137.334,179.153,154.18,173.629,170.978z"/>
+
+ <linearGradient id="XMLID_54_" gradientUnits="userSpaceOnUse" x1="147.9409" y1="375.7422" x2="132.843" y2="264.589" gradientTransform="matrix(1.007 0.0077 0.0025 1.005 2.5764 -192.1149)">
+ <stop offset="0" style="stop-color:#1D86EE"/>
+ <stop offset="0.118" style="stop-color:#1D86EE"/>
+ <stop offset="0.5169" style="stop-color:#7ACCFE"/>
+ <stop offset="0.594" style="stop-color:#5BB5F9"/>
+ <stop offset="0.7182" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_54_)" d="M173.593,170.991c-6.007,18.286-22.75,29.155-36.761,22.778
+ c-13.868-6.31-17.993-26.359-10.02-43.412c7.308-15.678,22.458-23.357,34.455-18.211
+ C173.363,137.338,179.104,154.211,173.593,170.991z"/>
+
+ <linearGradient id="XMLID_55_" gradientUnits="userSpaceOnUse" x1="148.894" y1="377.998" x2="142.0136" y2="267.9479" gradientTransform="matrix(1.002 0.0064 0.0014 1.0019 1.1296 -192.3518)">
+ <stop offset="0" style="stop-color:#1D87EE"/>
+ <stop offset="0.118" style="stop-color:#1D87EE"/>
+ <stop offset="0.5169" style="stop-color:#77CAFD"/>
+ <stop offset="0.5887" style="stop-color:#5BB5F8"/>
+ <stop offset="0.7165" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_55_)" d="M173.558,171.004c-5.975,18.209-22.613,28.999-36.55,22.658
+ c-13.797-6.276-17.977-26.225-10.115-43.243c7.222-15.697,22.323-23.424,34.323-18.273
+ C173.314,137.342,179.055,154.242,173.558,171.004z"/>
+
+ <linearGradient id="XMLID_56_" gradientUnits="userSpaceOnUse" x1="149.7539" y1="380.1016" x2="150.8477" y2="272.0876" gradientTransform="matrix(0.9971 0.0051 2.000000e-004 0.9988 -0.2735 -192.5862)">
+ <stop offset="0" style="stop-color:#1E87EE"/>
+ <stop offset="0.118" style="stop-color:#1D87EE"/>
+ <stop offset="0.5169" style="stop-color:#74C8FD"/>
+ <stop offset="0.5831" style="stop-color:#5BB5F9"/>
+ <stop offset="0.7146" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_56_)" d="M173.522,171.018c-5.942,18.133-22.476,28.843-36.339,22.538
+ c-13.726-6.241-17.96-26.09-10.209-43.073c7.135-15.717,22.187-23.491,34.191-18.336
+ C173.267,137.346,179.006,154.272,173.522,171.018z"/>
+
+ <linearGradient id="XMLID_57_" gradientUnits="userSpaceOnUse" x1="150.5835" y1="382.0322" x2="159.292" y2="276.9577" gradientTransform="matrix(0.9921 0.0038 -9.000000e-004 0.9957 -1.7202 -192.8226)">
+ <stop offset="0" style="stop-color:#1E87EE"/>
+ <stop offset="0.118" style="stop-color:#1E87EE"/>
+ <stop offset="0.5169" style="stop-color:#71C5FC"/>
+ <stop offset="0.5772" style="stop-color:#5BB5F8"/>
+ <stop offset="0.7126" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_57_)" d="M173.487,171.031c-5.909,18.057-22.339,28.687-36.128,22.418
+ c-13.655-6.206-17.944-25.955-10.304-42.903c7.049-15.736,22.052-23.557,34.06-18.398
+ C173.218,137.35,178.957,154.303,173.487,171.031z"/>
+
+ <linearGradient id="XMLID_58_" gradientUnits="userSpaceOnUse" x1="150.5122" y1="382.9463" x2="166.3651" y2="281.6582" gradientTransform="matrix(0.9872 0.0025 -0.002 0.9927 -2.3233 -192.2593)">
+ <stop offset="0" style="stop-color:#1E87EE"/>
+ <stop offset="0.118" style="stop-color:#1E87EE"/>
+ <stop offset="0.5169" style="stop-color:#6EC3FC"/>
+ <stop offset="0.5686" style="stop-color:#5CB5F9"/>
+ <stop offset="0.7098" style="stop-color:#2E93F1"/>
+ <stop offset="0.7809" style="stop-color:#1D86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_58_)" d="M173.451,171.044c-5.876,17.98-22.202,28.53-35.917,22.298
+ c-13.584-6.171-17.928-25.82-10.399-42.733c6.963-15.755,21.917-23.624,33.929-18.46
+ C173.17,137.354,178.908,154.334,173.451,171.044z"/>
+
+ <linearGradient id="XMLID_59_" gradientUnits="userSpaceOnUse" x1="151.2979" y1="383.6377" x2="173.7307" y2="286.88" gradientTransform="matrix(0.9822 0.0013 -0.0031 0.9896 -3.77 -191.6517)">
+ <stop offset="0" style="stop-color:#1F88EE"/>
+ <stop offset="0.118" style="stop-color:#1E87EE"/>
+ <stop offset="0.5169" style="stop-color:#6BC1FB"/>
+ <stop offset="0.5616" style="stop-color:#5CB5F8"/>
+ <stop offset="0.7074" style="stop-color:#2E93F1"/>
+ <stop offset="0.7809" style="stop-color:#1D86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_59_)" d="M173.416,171.057c-5.844,17.904-22.065,28.374-35.707,22.178
+ c-13.513-6.136-17.912-25.685-10.494-42.564c6.877-15.774,21.781-23.69,33.797-18.522
+ C173.122,137.358,178.859,154.365,173.416,171.057z"/>
+
+ <linearGradient id="XMLID_60_" gradientUnits="userSpaceOnUse" x1="152.1089" y1="385" x2="180.4698" y2="293.4412" gradientTransform="matrix(0.9772 0 -0.0042 0.9865 -5.2167 -191.8881)">
+ <stop offset="0" style="stop-color:#1F88EE"/>
+ <stop offset="0.118" style="stop-color:#1F88EE"/>
+ <stop offset="0.5169" style="stop-color:#68BEFB"/>
+ <stop offset="0.5541" style="stop-color:#5CB5F9"/>
+ <stop offset="0.7049" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_60_)" d="M173.38,171.07c-5.811,17.828-21.928,28.218-35.495,22.058
+ c-13.442-6.102-17.896-25.55-10.589-42.395c6.792-15.794,21.646-23.758,33.666-18.585
+ C173.074,137.362,178.81,154.396,173.38,171.07z"/>
+
+ <linearGradient id="XMLID_61_" gradientUnits="userSpaceOnUse" x1="152.0825" y1="386.168" x2="185.6536" y2="300.3651" gradientTransform="matrix(0.9723 -0.0013 -0.0053 0.9834 -5.8197 -192.123)">
+ <stop offset="0" style="stop-color:#1F88EE"/>
+ <stop offset="0.118" style="stop-color:#1F88EE"/>
+ <stop offset="0.5169" style="stop-color:#65BCFA"/>
+ <stop offset="0.546" style="stop-color:#5CB5F8"/>
+ <stop offset="0.7022" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_61_)" d="M173.345,171.083c-5.778,17.751-21.791,28.062-35.284,21.938
+ c-13.371-6.067-17.879-25.416-10.684-42.225c6.706-15.813,21.51-23.824,33.535-18.647
+ C173.026,137.367,178.761,154.426,173.345,171.083z"/>
+
+ <linearGradient id="XMLID_62_" gradientUnits="userSpaceOnUse" x1="153.0029" y1="387.1455" x2="191.0197" y2="307.5345" gradientTransform="matrix(0.9673 -0.0026 -0.0064 0.9803 -7.2665 -192.3584)">
+ <stop offset="0" style="stop-color:#2088EE"/>
+ <stop offset="0.118" style="stop-color:#2088EE"/>
+ <stop offset="0.5169" style="stop-color:#62BAFA"/>
+ <stop offset="0.5373" style="stop-color:#5CB5F9"/>
+ <stop offset="0.6993" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_62_)" d="M173.309,171.097c-5.746,17.675-21.654,27.905-35.073,21.818
+ c-13.3-6.032-17.864-25.281-10.778-42.055c6.619-15.833,21.375-23.891,33.403-18.71
+ C172.978,137.371,178.712,154.457,173.309,171.097z"/>
+
+ <linearGradient id="XMLID_63_" gradientUnits="userSpaceOnUse" x1="153.1177" y1="387.0771" x2="194.7797" y2="313.9872" gradientTransform="matrix(0.9624 -0.0039 -0.0075 0.9773 -7.87 -191.796)">
+ <stop offset="0" style="stop-color:#2088EE"/>
+ <stop offset="0.118" style="stop-color:#2088EE"/>
+ <stop offset="0.5169" style="stop-color:#5FB7F9"/>
+ <stop offset="0.5279" style="stop-color:#5CB5F8"/>
+ <stop offset="0.6962" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_63_)" d="M173.273,171.11c-5.713,17.599-21.517,27.749-34.862,21.698
+ c-13.229-5.998-17.847-25.146-10.873-41.886c6.533-15.852,21.239-23.958,33.271-18.772
+ C172.93,137.375,178.663,154.488,173.273,171.11z"/>
+
+ <linearGradient id="XMLID_64_" gradientUnits="userSpaceOnUse" x1="154.2466" y1="387.6943" x2="198.7525" y2="321.3156" gradientTransform="matrix(0.9574 -0.0052 -0.0086 0.9742 -9.3167 -192.0324)">
+ <stop offset="0" style="stop-color:#2189EE"/>
+ <stop offset="0.118" style="stop-color:#2088EE"/>
+ <stop offset="0.5169" style="stop-color:#5CB5F8"/>
+ <stop offset="0.5176" style="stop-color:#5CB5F8"/>
+ <stop offset="0.6927" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_64_)" d="M173.238,171.123c-5.681,17.523-21.38,27.593-34.651,21.578
+ c-13.158-5.962-17.831-25.011-10.968-41.716c6.447-15.871,21.104-24.024,33.14-18.834
+ C172.881,137.378,178.614,154.519,173.238,171.123z"/>
+
+ <linearGradient id="XMLID_65_" gradientUnits="userSpaceOnUse" x1="155.5146" y1="388.1504" x2="202.0645" y2="328.5667" gradientTransform="matrix(0.9524 -0.0065 -0.0097 0.9711 -10.763 -192.2664)">
+ <stop offset="0" style="stop-color:#2189EE"/>
+ <stop offset="0.118" style="stop-color:#2189EE"/>
+ <stop offset="0.5169" style="stop-color:#59B3F8"/>
+ <stop offset="0.689" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_65_)" d="M173.203,171.136c-5.647,17.446-21.243,27.438-34.44,21.458
+ c-13.087-5.928-17.815-24.876-11.063-41.547c6.361-15.89,20.968-24.091,33.009-18.897
+ C172.833,137.383,178.565,154.549,173.203,171.136z"/>
+
+ <linearGradient id="XMLID_66_" gradientUnits="userSpaceOnUse" x1="156.0215" y1="387.5674" x2="203.8433" y2="334.7467" gradientTransform="matrix(0.9475 -0.0077 -0.0108 0.968 -11.3655 -191.6588)">
+ <stop offset="0" style="stop-color:#2189EE"/>
+ <stop offset="0.118" style="stop-color:#2189EE"/>
+ <stop offset="0.5169" style="stop-color:#56B0F7"/>
+ <stop offset="0.6849" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_66_)" d="M173.167,171.149c-5.615,17.37-21.105,27.28-34.229,21.338
+ c-13.016-5.894-17.799-24.741-11.158-41.377c6.275-15.91,20.833-24.158,32.877-18.959
+ C172.785,137.387,178.516,154.58,173.167,171.149z"/>
+
+ <linearGradient id="XMLID_67_" gradientUnits="userSpaceOnUse" x1="157.605" y1="386.8857" x2="205.9639" y2="340.6957" gradientTransform="matrix(0.9425 -0.009 -0.0119 0.965 -12.8123 -191.0964)">
+ <stop offset="0" style="stop-color:#2289EE"/>
+ <stop offset="0.118" style="stop-color:#2189EE"/>
+ <stop offset="0.5169" style="stop-color:#53AEF7"/>
+ <stop offset="0.6803" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_67_)" d="M173.131,171.163c-5.582,17.294-20.968,27.124-34.018,21.218
+ c-12.944-5.858-17.783-24.606-11.252-41.208c6.189-15.929,20.698-24.225,32.746-19.021
+ C172.737,137.391,178.467,154.611,173.131,171.163z"/>
+
+ <linearGradient id="XMLID_68_" gradientUnits="userSpaceOnUse" x1="158.4619" y1="386.958" x2="206.6836" y2="347.1672" gradientTransform="matrix(0.9376 -0.0103 -0.013 0.9619 -13.4163 -191.3318)">
+ <stop offset="0" style="stop-color:#228AEF"/>
+ <stop offset="0.118" style="stop-color:#2289EF"/>
+ <stop offset="0.5169" style="stop-color:#4FACF6"/>
+ <stop offset="0.6716" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_68_)" d="M173.096,171.176c-5.55,17.217-20.832,26.968-33.807,21.097
+ c-12.874-5.824-17.767-24.472-11.347-41.038c6.103-15.949,20.562-24.292,32.614-19.084
+ C172.689,137.395,178.418,154.642,173.096,171.176z"/>
+
+ <linearGradient id="XMLID_69_" gradientUnits="userSpaceOnUse" x1="160.4146" y1="386.959" x2="207.8983" y2="353.2505" gradientTransform="matrix(0.9326 -0.0116 -0.0141 0.9588 -14.8625 -191.5682)">
+ <stop offset="0" style="stop-color:#238AEF"/>
+ <stop offset="0.118" style="stop-color:#2289EF"/>
+ <stop offset="0.5169" style="stop-color:#4CAAF6"/>
+ <stop offset="0.6656" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_69_)" d="M173.061,171.189c-5.517,17.141-20.695,26.812-33.596,20.977
+ c-12.803-5.789-17.75-24.337-11.442-40.868c6.017-15.968,20.427-24.358,32.483-19.146
+ C172.641,137.399,178.37,154.672,173.061,171.189z"/>
+
+ <linearGradient id="XMLID_70_" gradientUnits="userSpaceOnUse" x1="162.5522" y1="386.9033" x2="208.7663" y2="358.9007" gradientTransform="matrix(0.9276 -0.0129 -0.0152 0.9557 -16.3092 -191.8031)">
+ <stop offset="0" style="stop-color:#238AEF"/>
+ <stop offset="0.118" style="stop-color:#2289EF"/>
+ <stop offset="0.5169" style="stop-color:#49A7F5"/>
+ <stop offset="0.6587" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_70_)" d="M173.025,171.203c-5.484,17.065-20.558,26.655-33.385,20.857
+ c-12.731-5.754-17.734-24.202-11.537-40.698c5.931-15.987,20.292-24.425,32.352-19.208
+ C172.593,137.403,178.32,154.703,173.025,171.203z"/>
+
+ <linearGradient id="XMLID_71_" gradientUnits="userSpaceOnUse" x1="163.9199" y1="385.918" x2="208.4154" y2="363.1921" gradientTransform="matrix(0.9227 -0.0142 -0.0163 0.9527 -16.9128 -191.2403)">
+ <stop offset="0" style="stop-color:#238AEF"/>
+ <stop offset="0.118" style="stop-color:#238AEF"/>
+ <stop offset="0.5169" style="stop-color:#46A5F5"/>
+ <stop offset="0.6509" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_71_)" d="M172.989,171.216c-5.451,16.988-20.42,26.499-33.174,20.737
+ c-12.661-5.72-17.718-24.067-11.632-40.529c5.845-16.006,20.156-24.492,32.22-19.271
+ C172.545,137.407,178.271,154.734,172.989,171.216z"/>
+
+ <linearGradient id="XMLID_72_" gradientUnits="userSpaceOnUse" x1="166.3784" y1="384.8955" x2="208.7956" y2="366.9797" gradientTransform="matrix(0.9177 -0.0154 -0.0174 0.9496 -18.359 -190.6317)">
+ <stop offset="0" style="stop-color:#248BEF"/>
+ <stop offset="0.118" style="stop-color:#238AEF"/>
+ <stop offset="0.5169" style="stop-color:#43A3F4"/>
+ <stop offset="0.6422" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_72_)" d="M172.954,171.229c-5.419,16.912-20.284,26.343-32.963,20.617
+ c-12.589-5.685-17.702-23.933-11.727-40.359c5.759-16.026,20.021-24.559,32.089-19.333
+ C172.497,137.411,178.223,154.765,172.954,171.229z"/>
+
+ <linearGradient id="XMLID_73_" gradientUnits="userSpaceOnUse" x1="168.0645" y1="384.7578" x2="208.1143" y2="371.1703" gradientTransform="matrix(0.9128 -0.0167 -0.0185 0.9465 -18.9621 -190.8685)">
+ <stop offset="0" style="stop-color:#248BEF"/>
+ <stop offset="0.118" style="stop-color:#238AEF"/>
+ <stop offset="0.5169" style="stop-color:#40A0F3"/>
+ <stop offset="0.6318" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_73_)" d="M172.918,171.242c-5.386,16.836-20.146,26.187-32.752,20.497
+ c-12.518-5.65-17.686-23.797-11.821-40.19c5.673-16.045,19.885-24.625,31.958-19.396
+ C172.448,137.415,178.174,154.795,172.918,171.242z"/>
+
+ <linearGradient id="XMLID_74_" gradientUnits="userSpaceOnUse" x1="170.8232" y1="384.6436" x2="208.2939" y2="374.8952" gradientTransform="matrix(0.9078 -0.018 -0.0196 0.9434 -20.4088 -191.1045)">
+ <stop offset="0" style="stop-color:#258BEF"/>
+ <stop offset="0.118" style="stop-color:#248AEF"/>
+ <stop offset="0.5169" style="stop-color:#3D9EF3"/>
+ <stop offset="0.6196" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_74_)" d="M172.883,171.255c-5.354,16.76-20.009,26.03-32.541,20.377
+ c-12.448-5.615-17.67-23.663-11.916-40.02c5.587-16.064,19.75-24.692,31.826-19.458
+ C172.4,137.419,178.125,154.826,172.883,171.255z"/>
+
+ <linearGradient id="XMLID_75_" gradientUnits="userSpaceOnUse" x1="172.7466" y1="384.5195" x2="207.4841" y2="378.1284" gradientTransform="matrix(0.9029 -0.0193 -0.0207 0.9403 -21.0128 -191.3399)">
+ <stop offset="0" style="stop-color:#258BEF"/>
+ <stop offset="0.118" style="stop-color:#248AEF"/>
+ <stop offset="0.5169" style="stop-color:#3A9CF2"/>
+ <stop offset="0.6049" style="stop-color:#2F94F0"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_75_)" d="M172.847,171.269c-5.321,16.684-19.872,25.874-32.33,20.257
+ c-12.376-5.58-17.653-23.528-12.011-39.851c5.501-16.083,19.614-24.758,31.694-19.52
+ C172.352,137.423,178.076,154.857,172.847,171.269z"/>
+
+ <linearGradient id="XMLID_76_" gradientUnits="userSpaceOnUse" x1="175.7002" y1="383.5332" x2="207.607" y2="380.029" gradientTransform="matrix(0.8979 -0.0206 -0.0218 0.9373 -22.4586 -190.7766)">
+ <stop offset="0" style="stop-color:#258BEF"/>
+ <stop offset="0.118" style="stop-color:#258BEF"/>
+ <stop offset="0.5169" style="stop-color:#3799F2"/>
+ <stop offset="0.5869" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_76_)" d="M172.812,171.282c-5.288,16.607-19.735,25.718-32.119,20.137
+ c-12.306-5.546-17.638-23.393-12.106-39.681c5.415-16.103,19.479-24.826,31.563-19.583
+ C172.304,137.427,178.027,154.888,172.812,171.282z"/>
+
+ <linearGradient id="XMLID_77_" gradientUnits="userSpaceOnUse" x1="178.7642" y1="383.4414" x2="207.7752" y2="382.3727" gradientTransform="matrix(0.8929 -0.0219 -0.0229 0.9342 -23.9053 -191.0129)">
+ <stop offset="0" style="stop-color:#268CEF"/>
+ <stop offset="0.118" style="stop-color:#258BEF"/>
+ <stop offset="0.5169" style="stop-color:#3497F1"/>
+ <stop offset="0.5645" style="stop-color:#2F94F0"/>
+ <stop offset="0.7809" style="stop-color:#1E88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_77_)" d="M172.776,171.295c-5.255,16.531-19.598,25.562-31.908,20.017
+ c-12.234-5.511-17.622-23.258-12.201-39.512c5.329-16.122,19.343-24.892,31.432-19.645
+ C172.256,137.431,177.978,154.918,172.776,171.295z"/>
+
+ <linearGradient id="XMLID_78_" gradientUnits="userSpaceOnUse" x1="180.9126" y1="382.3936" x2="206.9879" y2="383.326" gradientTransform="matrix(0.888 -0.0231 -0.024 0.9311 -24.5078 -190.4053)">
+ <stop offset="0" style="stop-color:#268CEF"/>
+ <stop offset="0.118" style="stop-color:#258BEF"/>
+ <stop offset="0.5169" style="stop-color:#3195F1"/>
+ <stop offset="0.5239" style="stop-color:#3095F1"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_78_)" d="M172.741,171.308c-5.223,16.455-19.461,25.405-31.697,19.897
+ c-12.163-5.476-17.605-23.124-12.295-39.342c5.243-16.142,19.208-24.959,31.3-19.708
+ C172.208,137.436,177.929,154.949,172.741,171.308z"/>
+
+ <linearGradient id="XMLID_79_" gradientUnits="userSpaceOnUse" x1="184.1323" y1="382.2773" x2="207.253" y2="384.7914" gradientTransform="matrix(0.883 -0.0244 -0.0251 0.928 -25.9546 -190.6402)">
+ <stop offset="0" style="stop-color:#268CEF"/>
+ <stop offset="0.118" style="stop-color:#268BEF"/>
+ <stop offset="0.5169" style="stop-color:#2E92F0"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_79_)" d="M172.705,171.321c-5.19,16.378-19.324,25.249-31.486,19.777
+ c-12.092-5.441-17.589-22.988-12.391-39.172c5.157-16.161,19.073-25.025,31.169-19.77
+ C172.16,137.439,177.88,154.98,172.705,171.321z"/>
+
+ <linearGradient id="XMLID_80_" gradientUnits="userSpaceOnUse" x1="186.4248" y1="381.1992" x2="206.5794" y2="384.8848" gradientTransform="matrix(0.8781 -0.0257 -0.0262 0.925 -26.5581 -190.0764)">
+ <stop offset="0" style="stop-color:#278CEF"/>
+ <stop offset="0.118" style="stop-color:#268BEF"/>
+ <stop offset="0.5169" style="stop-color:#2B90F0"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_80_)" d="M172.669,171.334c-5.157,16.302-19.187,25.093-31.275,19.657
+ c-12.021-5.406-17.573-22.854-12.485-39.002c5.071-16.18,18.937-25.092,31.037-19.832
+ C172.112,137.443,177.831,155.011,172.669,171.334z"/>
+
+ <linearGradient id="XMLID_81_" gradientUnits="userSpaceOnUse" x1="189.8101" y1="381.0098" x2="206.9989" y2="385.4618" gradientTransform="matrix(0.8731 -0.027 -0.0273 0.9219 -28.0053 -190.3133)">
+ <stop offset="0" style="stop-color:#278DEF"/>
+ <stop offset="0.118" style="stop-color:#268CEF"/>
+ <stop offset="0.5169" style="stop-color:#288EEF"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_81_)" d="M172.634,171.348c-5.125,16.226-19.05,24.937-31.064,19.537
+ c-11.95-5.372-17.557-22.719-12.58-38.833c4.985-16.199,18.801-25.159,30.906-19.895
+ C172.063,137.447,177.782,155.042,172.634,171.348z"/>
+
+ <linearGradient id="XMLID_82_" gradientUnits="userSpaceOnUse" x1="193.3022" y1="380.7695" x2="207.5314" y2="385.5799" gradientTransform="matrix(0.8681 -0.0283 -0.0284 0.9188 -29.452 -190.5492)">
+ <stop offset="0" style="stop-color:#288DEF"/>
+ <stop offset="0.118" style="stop-color:#278CEF"/>
+ <stop offset="0.5169" style="stop-color:#258BEF"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_82_)" d="M172.599,171.361c-5.092,16.149-18.913,24.78-30.853,19.417
+ c-11.879-5.337-17.541-22.584-12.675-38.664c4.899-16.219,18.666-25.226,30.774-19.957
+ C172.016,137.452,177.733,155.072,172.599,171.361z"/>
+
+ <linearGradient id="XMLID_83_" gradientUnits="userSpaceOnUse" x1="196.894" y1="380.4717" x2="208.1796" y2="385.2241" gradientTransform="matrix(0.8632 -0.0296 -0.0296 0.9157 -30.8542 -190.7841)">
+ <stop offset="0" style="stop-color:#288DEF"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_83_)" d="M172.563,171.374c-5.059,16.073-18.776,24.624-30.642,19.297
+ c-11.808-5.302-17.524-22.449-12.77-38.494c4.813-16.238,18.531-25.292,30.643-20.019
+ C171.967,137.456,177.684,155.103,172.563,171.374z"/>
+ </g>
+ </g>
+ <g>
+
+ <linearGradient id="bord_x5F_01_1_" gradientUnits="userSpaceOnUse" x1="128.1006" y1="345.5605" x2="167.9155" y2="362.3145" gradientTransform="matrix(1.014 -0.0058 -0.0058 1.0243 3.555 -199.5085)">
+ <stop offset="0" style="stop-color:#F5FFFD"/>
+ <stop offset="0.103" style="stop-color:#EFFCFD"/>
+ <stop offset="0.2416" style="stop-color:#DEF2FB"/>
+ <stop offset="0.4004" style="stop-color:#C2E2F9"/>
+ <stop offset="0.5743" style="stop-color:#9ACCF7"/>
+ <stop offset="0.7604" style="stop-color:#68B0F3"/>
+ <stop offset="0.954" style="stop-color:#2C8FEF"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path id="bord_x5F_01_2_" display="none" fill="url(#bord_x5F_01_1_)" d="M171.564,170.625
+ c-5.232,16.208-19.158,24.638-30.424,18.449c-10.767-5.915-14.442-22.777-8.834-37.359c5.389-14.025,17.75-21.583,28.169-17.198
+ C171.339,139.092,176.58,155.083,171.564,170.625z"/>
+ <g>
+
+ <linearGradient id="XMLID_1_" gradientUnits="userSpaceOnUse" x1="160.2134" y1="363.3564" x2="170.5038" y2="367.6898" gradientTransform="matrix(0.9353 -0.0269 -0.0269 0.9832 -11.8253 -198.981)">
+ <stop offset="0" style="stop-color:#288DEF"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_1_)" d="M173.615,170.884c-5.874,18.025-22.195,28.817-35.105,23.022c-12.847-5.768-16.046-25.47-8-42.362
+ c7.285-15.292,20.634-23.82,31.407-19.127C172.733,137.126,179.279,153.621,173.615,170.884z"/>
+
+ <linearGradient id="XMLID_2_" gradientUnits="userSpaceOnUse" x1="159.6836" y1="363.0547" x2="171.365" y2="368.0372" gradientTransform="matrix(0.9373 -0.0259 -0.0259 0.9833 -12.0883 -199.0828)">
+ <stop offset="0" style="stop-color:#2F91EF"/>
+ <stop offset="0.0169" style="stop-color:#2F91EF"/>
+ <stop offset="0.1966" style="stop-color:#2B8FEF"/>
+ <stop offset="0.6471" style="stop-color:#258BEF"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_2_)" d="M173.565,170.948c-5.882,17.946-22.134,28.634-34.979,22.834
+ c-12.769-5.766-15.983-25.353-8.017-42.167c7.23-15.269,20.574-23.789,31.354-19.099
+ C172.762,137.229,179.247,153.736,173.565,170.948z"/>
+
+ <linearGradient id="XMLID_3_" gradientUnits="userSpaceOnUse" x1="158.2686" y1="362.709" x2="171.3202" y2="368.3468" gradientTransform="matrix(0.9393 -0.0248 -0.0248 0.9833 -11.5513 -199.1414)">
+ <stop offset="0" style="stop-color:#3694F0"/>
+ <stop offset="0.0169" style="stop-color:#3694F0"/>
+ <stop offset="0.1966" style="stop-color:#3092F0"/>
+ <stop offset="0.5721" style="stop-color:#2A8FEF"/>
+ <stop offset="1" style="stop-color:#1C87EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_3_)" d="M173.516,171.013c-5.892,17.867-22.073,28.451-34.853,22.646
+ c-12.691-5.764-15.919-25.235-8.033-41.973c7.177-15.246,20.515-23.758,31.302-19.071
+ C172.792,137.332,179.214,153.851,173.516,171.013z"/>
+
+ <linearGradient id="XMLID_4_" gradientUnits="userSpaceOnUse" x1="156.8408" y1="361.5127" x2="171.2442" y2="367.813" gradientTransform="matrix(0.9413 -0.0237 -0.0237 0.9834 -11.0152 -198.4007)">
+ <stop offset="0" style="stop-color:#3D98F0"/>
+ <stop offset="0.0169" style="stop-color:#3D98F0"/>
+ <stop offset="0.1966" style="stop-color:#3595F0"/>
+ <stop offset="0.5225" style="stop-color:#2F92F0"/>
+ <stop offset="0.9596" style="stop-color:#1E88EE"/>
+ <stop offset="1" style="stop-color:#1C87EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_4_)" d="M173.466,171.077c-5.901,17.789-22.011,28.268-34.726,22.458
+ c-12.613-5.761-15.856-25.118-8.049-41.777c7.123-15.223,20.455-23.729,31.25-19.043
+ C172.821,137.435,179.182,153.966,173.466,171.077z"/>
+
+ <linearGradient id="XMLID_5_" gradientUnits="userSpaceOnUse" x1="155.4414" y1="361.1729" x2="171.1777" y2="368.1425" gradientTransform="matrix(0.9433 -0.0226 -0.0226 0.9834 -10.4797 -198.4592)">
+ <stop offset="0" style="stop-color:#449CF1"/>
+ <stop offset="0.0169" style="stop-color:#449CF1"/>
+ <stop offset="0.1966" style="stop-color:#3998F1"/>
+ <stop offset="0.4933" style="stop-color:#3394F0"/>
+ <stop offset="0.8911" style="stop-color:#228AEF"/>
+ <stop offset="1" style="stop-color:#1C87EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_5_)" d="M173.417,171.142c-5.911,17.71-21.95,28.084-34.6,22.271c-12.535-5.759-15.793-25-8.065-41.583
+ c7.069-15.201,20.395-23.698,31.197-19.015C172.851,137.538,179.149,154.081,173.417,171.142z"/>
+
+ <linearGradient id="XMLID_6_" gradientUnits="userSpaceOnUse" x1="154.0322" y1="359.9834" x2="171.0822" y2="367.6288" gradientTransform="matrix(0.9453 -0.0215 -0.0215 0.9835 -9.9436 -197.7205)">
+ <stop offset="0" style="stop-color:#4B9FF1"/>
+ <stop offset="0.0169" style="stop-color:#4B9FF1"/>
+ <stop offset="0.1966" style="stop-color:#3E9BF1"/>
+ <stop offset="0.4648" style="stop-color:#3897F0"/>
+ <stop offset="0.8243" style="stop-color:#278DEF"/>
+ <stop offset="1" style="stop-color:#1C87EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_6_)" d="M173.367,171.206c-5.919,17.631-21.888,27.901-34.473,22.083
+ c-12.458-5.757-15.73-24.883-8.082-41.388c7.015-15.178,20.334-23.667,31.144-18.987
+ C172.88,137.641,179.117,154.196,173.367,171.206z"/>
+
+ <linearGradient id="XMLID_7_" gradientUnits="userSpaceOnUse" x1="152.6333" y1="358.7979" x2="170.9788" y2="367.1256" gradientTransform="matrix(0.9473 -0.0204 -0.0204 0.9836 -9.4076 -196.9788)">
+ <stop offset="0" style="stop-color:#52A3F2"/>
+ <stop offset="0.0169" style="stop-color:#52A3F2"/>
+ <stop offset="0.1966" style="stop-color:#439DF2"/>
+ <stop offset="0.4425" style="stop-color:#3D9AF1"/>
+ <stop offset="0.772" style="stop-color:#2C91F0"/>
+ <stop offset="1" style="stop-color:#1C88EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_7_)" d="M173.318,171.271c-5.929,17.552-21.827,27.718-34.346,21.895
+ c-12.38-5.754-15.667-24.765-8.099-41.193c6.961-15.155,20.275-23.636,31.092-18.958
+ C172.909,137.744,179.084,154.312,173.318,171.271z"/>
+
+ <linearGradient id="XMLID_8_" gradientUnits="userSpaceOnUse" x1="152.1626" y1="358.4795" x2="171.7877" y2="367.497" gradientTransform="matrix(0.9492 -0.0193 -0.0193 0.9836 -9.7137 -197.0374)">
+ <stop offset="0" style="stop-color:#59A7F2"/>
+ <stop offset="0.0169" style="stop-color:#59A7F2"/>
+ <stop offset="0.1966" style="stop-color:#48A0F2"/>
+ <stop offset="0.4243" style="stop-color:#429DF1"/>
+ <stop offset="0.7295" style="stop-color:#3193F0"/>
+ <stop offset="1" style="stop-color:#1C88EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_8_)" d="M173.268,171.335c-5.938,17.474-21.766,27.535-34.22,21.707
+ c-12.302-5.751-15.604-24.647-8.115-40.998c6.907-15.132,20.215-23.606,31.039-18.931
+ C172.939,137.847,179.052,154.426,173.268,171.335z"/>
+
+ <linearGradient id="XMLID_9_" gradientUnits="userSpaceOnUse" x1="151.6733" y1="358.1885" x2="172.5605" y2="367.9024" gradientTransform="matrix(0.9512 -0.0183 -0.0183 0.9837 -9.9778 -197.1411)">
+ <stop offset="0" style="stop-color:#5FAAF3"/>
+ <stop offset="0.0169" style="stop-color:#5FAAF3"/>
+ <stop offset="0.1966" style="stop-color:#4DA3F3"/>
+ <stop offset="0.4093" style="stop-color:#47A0F2"/>
+ <stop offset="0.695" style="stop-color:#3696F1"/>
+ <stop offset="1" style="stop-color:#1C88EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_9_)" d="M173.219,171.399c-5.947,17.395-21.705,27.352-34.093,21.52
+ c-12.224-5.75-15.541-24.53-8.131-40.804c6.853-15.109,20.155-23.576,30.986-18.903
+ C172.968,137.95,179.02,154.542,173.219,171.399z"/>
+
+ <linearGradient id="XMLID_10_" gradientUnits="userSpaceOnUse" x1="150.3096" y1="357.8555" x2="172.4399" y2="368.2715" gradientTransform="matrix(0.9532 -0.0172 -0.0172 0.9837 -9.4408 -197.1987)">
+ <stop offset="0" style="stop-color:#66AEF3"/>
+ <stop offset="0.0169" style="stop-color:#66AEF3"/>
+ <stop offset="0.1966" style="stop-color:#52A6F3"/>
+ <stop offset="0.3966" style="stop-color:#4CA3F2"/>
+ <stop offset="0.6652" style="stop-color:#3B9AF1"/>
+ <stop offset="0.9717" style="stop-color:#1F8BEE"/>
+ <stop offset="1" style="stop-color:#1C89EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_10_)" d="M173.169,171.464c-5.957,17.316-21.643,27.169-33.966,21.332
+ c-12.146-5.747-15.478-24.413-8.148-40.609c6.799-15.086,20.095-23.545,30.934-18.875
+ C172.998,138.053,178.987,154.657,173.169,171.464z"/>
+
+ <linearGradient id="XMLID_11_" gradientUnits="userSpaceOnUse" x1="148.9375" y1="356.6768" x2="172.294" y2="367.8012" gradientTransform="matrix(0.9552 -0.0161 -0.0161 0.9838 -8.9037 -196.458)">
+ <stop offset="0" style="stop-color:#6DB2F4"/>
+ <stop offset="0.0169" style="stop-color:#6DB2F4"/>
+ <stop offset="0.1966" style="stop-color:#57A9F4"/>
+ <stop offset="0.3857" style="stop-color:#51A6F3"/>
+ <stop offset="0.6397" style="stop-color:#409CF2"/>
+ <stop offset="0.9294" style="stop-color:#248DEF"/>
+ <stop offset="1" style="stop-color:#1C89EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_11_)" d="M173.12,171.528c-5.966,17.237-21.582,26.985-33.84,21.144
+ c-12.068-5.745-15.415-24.295-8.164-40.415c6.745-15.063,20.035-23.514,30.881-18.846
+ C173.027,138.156,178.955,154.771,173.12,171.528z"/>
+
+ <linearGradient id="XMLID_12_" gradientUnits="userSpaceOnUse" x1="147.5771" y1="355.5" x2="172.142" y2="367.3387" gradientTransform="matrix(0.9572 -0.015 -0.015 0.9839 -8.3681 -195.7183)">
+ <stop offset="0" style="stop-color:#74B5F4"/>
+ <stop offset="0.0169" style="stop-color:#74B5F4"/>
+ <stop offset="0.1966" style="stop-color:#5CACF4"/>
+ <stop offset="0.3761" style="stop-color:#56A9F3"/>
+ <stop offset="0.6173" style="stop-color:#459FF2"/>
+ <stop offset="0.8925" style="stop-color:#2990EF"/>
+ <stop offset="1" style="stop-color:#1C89EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_12_)" d="M173.07,171.593c-5.975,17.159-21.52,26.802-33.713,20.956
+ c-11.991-5.743-15.352-24.178-8.181-40.22c6.691-15.041,19.975-23.483,30.829-18.818
+ C173.056,138.259,178.922,154.887,173.07,171.593z"/>
+
+ <linearGradient id="XMLID_13_" gradientUnits="userSpaceOnUse" x1="146.2378" y1="355.1748" x2="171.9944" y2="367.7339" gradientTransform="matrix(0.9592 -0.0139 -0.0139 0.9839 -7.8316 -195.7758)">
+ <stop offset="0" style="stop-color:#7BB9F4"/>
+ <stop offset="0.0169" style="stop-color:#7BB9F4"/>
+ <stop offset="0.1966" style="stop-color:#60AFF4"/>
+ <stop offset="0.3694" style="stop-color:#5AACF3"/>
+ <stop offset="0.6015" style="stop-color:#49A2F2"/>
+ <stop offset="0.8663" style="stop-color:#2D92EF"/>
+ <stop offset="1" style="stop-color:#1C89EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_13_)" d="M173.02,171.657c-5.984,17.08-21.458,26.619-33.587,20.768
+ c-11.913-5.74-15.288-24.06-8.197-40.024c6.637-15.019,19.915-23.453,30.776-18.791
+ C173.086,138.362,178.89,155.001,173.02,171.657z"/>
+
+ <linearGradient id="XMLID_14_" gradientUnits="userSpaceOnUse" x1="144.8911" y1="354.0039" x2="171.8237" y2="367.2899" gradientTransform="matrix(0.9612 -0.0128 -0.0128 0.984 -7.2951 -195.0351)">
+ <stop offset="0" style="stop-color:#82BDF5"/>
+ <stop offset="0.0169" style="stop-color:#82BDF5"/>
+ <stop offset="0.1966" style="stop-color:#65B2F5"/>
+ <stop offset="0.3618" style="stop-color:#5FAFF4"/>
+ <stop offset="0.5837" style="stop-color:#4EA5F3"/>
+ <stop offset="0.8368" style="stop-color:#3296F0"/>
+ <stop offset="1" style="stop-color:#1C8AEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_14_)" d="M172.971,171.722c-5.993,17.001-21.397,26.436-33.46,20.581
+ c-11.835-5.738-15.225-23.943-8.213-39.83c6.583-14.996,19.855-23.423,30.724-18.762
+ C173.115,138.465,178.857,155.117,172.971,171.722z"/>
+
+ <linearGradient id="XMLID_15_" gradientUnits="userSpaceOnUse" x1="143.5674" y1="353.6846" x2="171.6586" y2="367.7029" gradientTransform="matrix(0.9632 -0.0117 -0.0117 0.984 -6.7595 -195.0946)">
+ <stop offset="0" style="stop-color:#89C0F5"/>
+ <stop offset="0.0169" style="stop-color:#89C0F5"/>
+ <stop offset="0.1966" style="stop-color:#6AB5F5"/>
+ <stop offset="0.355" style="stop-color:#64B2F4"/>
+ <stop offset="0.5677" style="stop-color:#53A8F3"/>
+ <stop offset="0.8103" style="stop-color:#3799F0"/>
+ <stop offset="1" style="stop-color:#1C8AEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_15_)" d="M172.921,171.786c-6.002,16.922-21.336,26.253-33.333,20.393
+ c-11.757-5.736-15.162-23.825-8.23-39.635c6.529-14.973,19.795-23.392,30.671-18.734
+ C173.145,138.568,178.825,155.232,172.921,171.786z"/>
+
+ <linearGradient id="XMLID_16_" gradientUnits="userSpaceOnUse" x1="143.1123" y1="353.3994" x2="172.3497" y2="368.1578" gradientTransform="matrix(0.9652 -0.0107 -0.0107 0.9841 -7.0226 -195.1965)">
+ <stop offset="0" style="stop-color:#90C4F6"/>
+ <stop offset="0.0169" style="stop-color:#90C4F6"/>
+ <stop offset="0.1966" style="stop-color:#6FB8F6"/>
+ <stop offset="0.3489" style="stop-color:#69B5F5"/>
+ <stop offset="0.5534" style="stop-color:#58ABF4"/>
+ <stop offset="0.7867" style="stop-color:#3C9CF1"/>
+ <stop offset="1" style="stop-color:#1C8AEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_16_)" d="M172.872,171.851c-6.012,16.844-21.275,26.07-33.208,20.205
+ c-11.679-5.733-15.099-23.708-8.246-39.44c6.475-14.95,19.735-23.361,30.618-18.706
+ C173.174,138.671,178.792,155.347,172.872,171.851z"/>
+
+ <linearGradient id="XMLID_17_" gradientUnits="userSpaceOnUse" x1="142.6772" y1="352.2402" x2="173.0432" y2="367.7437" gradientTransform="matrix(0.9671 -0.0096 -0.0096 0.9842 -7.3292 -194.4557)">
+ <stop offset="0" style="stop-color:#97C8F6"/>
+ <stop offset="0.0169" style="stop-color:#97C8F6"/>
+ <stop offset="0.1966" style="stop-color:#74BAF6"/>
+ <stop offset="0.3433" style="stop-color:#6EB7F5"/>
+ <stop offset="0.5404" style="stop-color:#5DAEF4"/>
+ <stop offset="0.7662" style="stop-color:#419FF1"/>
+ <stop offset="1" style="stop-color:#1C8BEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_17_)" d="M172.822,171.916c-6.021,16.765-21.213,25.886-33.081,20.017
+ c-11.602-5.731-15.036-23.591-8.263-39.246c6.422-14.927,19.676-23.331,30.566-18.678
+ C173.204,138.775,178.76,155.462,172.822,171.916z"/>
+
+ <linearGradient id="XMLID_18_" gradientUnits="userSpaceOnUse" x1="141.3701" y1="351.9248" x2="172.8483" y2="368.1788" gradientTransform="matrix(0.9691 -0.0085 -0.0085 0.9842 -6.7932 -194.5143)">
+ <stop offset="0" style="stop-color:#9ECCF7"/>
+ <stop offset="0.0169" style="stop-color:#9ECCF7"/>
+ <stop offset="0.1966" style="stop-color:#79BDF7"/>
+ <stop offset="0.3383" style="stop-color:#73BAF6"/>
+ <stop offset="0.5286" style="stop-color:#62B1F5"/>
+ <stop offset="0.7466" style="stop-color:#46A1F2"/>
+ <stop offset="0.9837" style="stop-color:#1F8DEE"/>
+ <stop offset="1" style="stop-color:#1C8BEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_18_)" d="M172.772,171.98c-6.03,16.686-21.152,25.703-32.955,19.829
+ c-11.524-5.729-14.973-23.473-8.279-39.051c6.368-14.904,19.616-23.3,30.514-18.65
+ C173.233,138.878,178.728,155.577,172.772,171.98z"/>
+
+ <linearGradient id="XMLID_19_" gradientUnits="userSpaceOnUse" x1="140.0654" y1="350.7637" x2="172.6386" y2="367.7731" gradientTransform="matrix(0.9711 -0.0074 -0.0074 0.9843 -6.2571 -193.7746)">
+ <stop offset="0" style="stop-color:#A5CFF7"/>
+ <stop offset="0.0169" style="stop-color:#A5CFF7"/>
+ <stop offset="0.1966" style="stop-color:#7EC0F7"/>
+ <stop offset="0.3337" style="stop-color:#78BDF6"/>
+ <stop offset="0.5178" style="stop-color:#67B3F5"/>
+ <stop offset="0.7287" style="stop-color:#4BA4F2"/>
+ <stop offset="0.958" style="stop-color:#248FEF"/>
+ <stop offset="1" style="stop-color:#1C8BEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_19_)" d="M172.723,172.044c-6.04,16.607-21.09,25.52-32.828,19.641
+ c-11.446-5.726-14.91-23.355-8.296-38.856c6.314-14.881,19.556-23.27,30.461-18.622
+ C173.262,138.981,178.695,155.692,172.723,172.044z"/>
+
+ <linearGradient id="XMLID_20_" gradientUnits="userSpaceOnUse" x1="138.7705" y1="350.4512" x2="172.4257" y2="368.2228" gradientTransform="matrix(0.9731 -0.0063 -0.0063 0.9843 -5.7211 -193.8331)">
+ <stop offset="0" style="stop-color:#ACD3F8"/>
+ <stop offset="0.0169" style="stop-color:#ACD3F8"/>
+ <stop offset="0.1966" style="stop-color:#83C3F8"/>
+ <stop offset="0.3294" style="stop-color:#7DC0F7"/>
+ <stop offset="0.5078" style="stop-color:#6CB7F6"/>
+ <stop offset="0.7122" style="stop-color:#50A8F3"/>
+ <stop offset="0.9344" style="stop-color:#2993EF"/>
+ <stop offset="1" style="stop-color:#1C8CEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_20_)" d="M172.673,172.109c-6.049,16.528-21.029,25.336-32.701,19.453
+ c-11.369-5.724-14.847-23.238-8.313-38.662c6.26-14.858,19.496-23.239,30.409-18.593
+ C173.292,139.084,178.663,155.807,172.673,172.109z"/>
+
+ <linearGradient id="XMLID_21_" gradientUnits="userSpaceOnUse" x1="137.479" y1="349.2939" x2="172.1988" y2="367.8322" gradientTransform="matrix(0.9751 -0.0052 -0.0052 0.9844 -5.184 -193.0929)">
+ <stop offset="0" style="stop-color:#B3D7F8"/>
+ <stop offset="0.0169" style="stop-color:#B3D7F8"/>
+ <stop offset="0.1966" style="stop-color:#87C6F8"/>
+ <stop offset="0.3262" style="stop-color:#81C3F7"/>
+ <stop offset="0.5004" style="stop-color:#70B9F6"/>
+ <stop offset="0.6998" style="stop-color:#54AAF3"/>
+ <stop offset="0.9166" style="stop-color:#2D95F0"/>
+ <stop offset="1" style="stop-color:#1C8CEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_21_)" d="M172.624,172.173c-6.058,16.45-20.968,25.153-32.575,19.265
+ c-11.291-5.722-14.783-23.121-8.329-38.466c6.206-14.836,19.436-23.209,30.356-18.566
+ C173.321,139.187,178.63,155.922,172.624,172.173z"/>
+
+ <linearGradient id="XMLID_22_" gradientUnits="userSpaceOnUse" x1="136.1987" y1="348.1387" x2="171.9682" y2="367.449" gradientTransform="matrix(0.9771 -0.0041 -0.0041 0.9845 -4.648 -192.3512)">
+ <stop offset="0" style="stop-color:#BADAF8"/>
+ <stop offset="0.0169" style="stop-color:#BADAF8"/>
+ <stop offset="0.1966" style="stop-color:#8CC9F8"/>
+ <stop offset="0.3225" style="stop-color:#86C6F7"/>
+ <stop offset="0.4917" style="stop-color:#75BCF6"/>
+ <stop offset="0.6855" style="stop-color:#59ADF3"/>
+ <stop offset="0.896" style="stop-color:#3298F0"/>
+ <stop offset="1" style="stop-color:#1C8CEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_22_)" d="M172.574,172.238c-6.067,16.371-20.906,24.97-32.448,19.077
+ c-11.213-5.719-14.72-23.003-8.345-38.271c6.152-14.813,19.376-23.178,30.303-18.538
+ C173.351,139.29,178.598,156.037,172.574,172.238z"/>
+
+ <linearGradient id="XMLID_23_" gradientUnits="userSpaceOnUse" x1="135.7803" y1="348.709" x2="172.5899" y2="368.7997" gradientTransform="matrix(0.9791 -0.0031 -0.0031 0.9845 -4.9106 -193.2528)">
+ <stop offset="0" style="stop-color:#C1DEF9"/>
+ <stop offset="0.0169" style="stop-color:#C1DEF9"/>
+ <stop offset="0.1966" style="stop-color:#91CCF9"/>
+ <stop offset="0.3191" style="stop-color:#8BC9F8"/>
+ <stop offset="0.4836" style="stop-color:#7ABFF7"/>
+ <stop offset="0.6721" style="stop-color:#5EB0F4"/>
+ <stop offset="0.877" style="stop-color:#379BF1"/>
+ <stop offset="1" style="stop-color:#1C8CEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_23_)" d="M172.524,172.302c-6.076,16.292-20.845,24.787-32.322,18.89
+ c-11.135-5.717-14.657-22.886-8.361-38.077c6.098-14.791,19.316-23.147,30.25-18.509
+ C173.38,139.393,178.565,156.152,172.524,172.302z"/>
+
+ <linearGradient id="XMLID_24_" gradientUnits="userSpaceOnUse" x1="134.5112" y1="347.5576" x2="172.3416" y2="368.4317" gradientTransform="matrix(0.9811 -0.002 -0.002 0.9846 -4.3745 -192.5131)">
+ <stop offset="0" style="stop-color:#C8E2F9"/>
+ <stop offset="0.0169" style="stop-color:#C8E2F9"/>
+ <stop offset="0.1966" style="stop-color:#96CFF9"/>
+ <stop offset="0.3158" style="stop-color:#90CCF8"/>
+ <stop offset="0.4761" style="stop-color:#7FC2F7"/>
+ <stop offset="0.6597" style="stop-color:#63B3F4"/>
+ <stop offset="0.8591" style="stop-color:#3C9EF1"/>
+ <stop offset="1" style="stop-color:#1C8DEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_24_)" d="M172.475,172.367c-6.085,16.213-20.783,24.604-32.195,18.702
+ c-11.057-5.715-14.594-22.768-8.378-37.882c6.044-14.768,19.256-23.117,30.198-18.481
+ C173.409,139.496,178.533,156.267,172.475,172.367z"/>
+
+ <linearGradient id="XMLID_25_" gradientUnits="userSpaceOnUse" x1="133.2515" y1="347.2549" x2="172.0898" y2="368.9183" gradientTransform="matrix(0.9831 -9.000000e-004 -9.000000e-004 0.9846 -3.8385 -192.5726)">
+ <stop offset="0" style="stop-color:#CEE5FA"/>
+ <stop offset="0.0169" style="stop-color:#CEE5FA"/>
+ <stop offset="0.1966" style="stop-color:#9BD2FA"/>
+ <stop offset="0.3129" style="stop-color:#95CFF9"/>
+ <stop offset="0.4691" style="stop-color:#84C5F8"/>
+ <stop offset="0.6481" style="stop-color:#68B6F5"/>
+ <stop offset="0.8425" style="stop-color:#41A1F1"/>
+ <stop offset="1" style="stop-color:#1C8DEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_25_)" d="M172.425,172.431c-6.095,16.135-20.722,24.42-32.068,18.514
+ c-10.979-5.713-14.531-22.651-8.395-37.688c5.99-14.745,19.196-23.086,30.146-18.453
+ C173.438,139.599,178.501,156.382,172.425,172.431z"/>
+
+ <linearGradient id="XMLID_26_" gradientUnits="userSpaceOnUse" x1="132.0005" y1="346.1094" x2="171.8303" y2="368.5664" gradientTransform="matrix(0.9851 2.000000e-004 2.000000e-004 0.9847 -3.3019 -191.8309)">
+ <stop offset="0" style="stop-color:#D5E9FA"/>
+ <stop offset="0.0169" style="stop-color:#D5E9FA"/>
+ <stop offset="0.1966" style="stop-color:#A0D5FA"/>
+ <stop offset="0.31" style="stop-color:#9AD2F9"/>
+ <stop offset="0.4625" style="stop-color:#89C8F8"/>
+ <stop offset="0.6372" style="stop-color:#6DB9F5"/>
+ <stop offset="0.8269" style="stop-color:#46A4F2"/>
+ <stop offset="1" style="stop-color:#1C8DEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_26_)" d="M172.375,172.496c-6.104,16.056-20.661,24.237-31.942,18.326
+ c-10.901-5.71-14.467-22.533-8.411-37.493c5.936-14.722,19.136-23.056,30.093-18.425
+ C173.468,139.702,178.468,156.497,172.375,172.496z"/>
+
+ <linearGradient id="XMLID_27_" gradientUnits="userSpaceOnUse" x1="131.6245" y1="344.9619" x2="172.4343" y2="368.2191" gradientTransform="matrix(0.987 0.0013 0.0013 0.9848 -3.6086 -191.0907)">
+ <stop offset="0" style="stop-color:#DCEDFB"/>
+ <stop offset="0.0169" style="stop-color:#DCEDFB"/>
+ <stop offset="0.1966" style="stop-color:#A5D7FB"/>
+ <stop offset="0.3074" style="stop-color:#9FD4FA"/>
+ <stop offset="0.4564" style="stop-color:#8ECBF9"/>
+ <stop offset="0.627" style="stop-color:#72BCF6"/>
+ <stop offset="0.8135" style="stop-color:#4BA7F2"/>
+ <stop offset="1" style="stop-color:#1C8EEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_27_)" d="M172.326,172.56c-6.113,15.977-20.6,24.054-31.815,18.138
+ c-10.824-5.708-14.405-22.416-8.427-37.298c5.882-14.699,19.077-23.025,30.041-18.397
+ C173.498,139.805,178.436,156.612,172.326,172.56z"/>
+
+ <linearGradient id="XMLID_28_" gradientUnits="userSpaceOnUse" x1="130.3853" y1="344.666" x2="172.161" y2="368.7285" gradientTransform="matrix(0.989 0.0024 0.0024 0.9848 -3.072 -191.1483)">
+ <stop offset="0" style="stop-color:#E3F0FB"/>
+ <stop offset="0.0169" style="stop-color:#E3F0FB"/>
+ <stop offset="0.1966" style="stop-color:#AADAFB"/>
+ <stop offset="0.3049" style="stop-color:#A4D7FA"/>
+ <stop offset="0.4505" style="stop-color:#93CEF9"/>
+ <stop offset="0.6173" style="stop-color:#77BFF6"/>
+ <stop offset="0.7999" style="stop-color:#50AAF3"/>
+ <stop offset="0.9933" style="stop-color:#1E8FEE"/>
+ <stop offset="1" style="stop-color:#1C8EEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_28_)" d="M172.276,172.625c-6.122,15.898-20.538,23.871-31.688,17.951
+ c-10.746-5.706-14.342-22.298-8.444-37.104c5.828-14.676,19.017-22.995,29.988-18.369
+ C173.527,139.908,178.404,156.728,172.276,172.625z"/>
+
+ <linearGradient id="XMLID_29_" gradientUnits="userSpaceOnUse" x1="129.1538" y1="343.5244" x2="171.8799" y2="368.3965" gradientTransform="matrix(0.991 0.0035 0.0035 0.9849 -2.536 -190.4085)">
+ <stop offset="0" style="stop-color:#EAF4FC"/>
+ <stop offset="0.0169" style="stop-color:#EAF4FC"/>
+ <stop offset="0.1966" style="stop-color:#AEDDFC"/>
+ <stop offset="0.303" style="stop-color:#A8DAFB"/>
+ <stop offset="0.446" style="stop-color:#97D0FA"/>
+ <stop offset="0.6099" style="stop-color:#7BC1F7"/>
+ <stop offset="0.7893" style="stop-color:#54ACF3"/>
+ <stop offset="0.9793" style="stop-color:#2291EF"/>
+ <stop offset="1" style="stop-color:#1C8EEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_29_)" d="M172.227,172.689c-6.132,15.82-20.477,23.688-31.563,17.763
+ c-10.668-5.703-14.278-22.181-8.46-36.909c5.774-14.654,18.957-22.964,29.935-18.34
+ C173.556,140.011,178.371,156.842,172.227,172.689z"/>
+
+ <linearGradient id="XMLID_30_" gradientUnits="userSpaceOnUse" x1="128.7627" y1="344.0977" x2="172.4304" y2="369.787" gradientTransform="matrix(0.993 0.0045 0.0045 0.9849 -2.799 -191.3091)">
+ <stop offset="0" style="stop-color:#F1F8FC"/>
+ <stop offset="0.0169" style="stop-color:#F1F8FC"/>
+ <stop offset="0.1966" style="stop-color:#B3E0FC"/>
+ <stop offset="0.3008" style="stop-color:#ADDDFB"/>
+ <stop offset="0.4408" style="stop-color:#9CD3FA"/>
+ <stop offset="0.6013" style="stop-color:#80C4F7"/>
+ <stop offset="0.7769" style="stop-color:#59AFF4"/>
+ <stop offset="0.9628" style="stop-color:#2794EF"/>
+ <stop offset="1" style="stop-color:#1C8EEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_30_)" d="M172.177,172.753c-6.141,15.741-20.415,23.504-31.436,17.575
+ c-10.59-5.701-14.215-22.063-8.477-36.713c5.72-14.631,18.896-22.934,29.882-18.313
+ C173.586,140.114,178.339,156.958,172.177,172.753z"/>
+
+ <linearGradient id="XMLID_31_" gradientUnits="userSpaceOnUse" x1="127.5474" y1="342.9619" x2="172.1376" y2="369.4703" gradientTransform="matrix(0.995 0.0056 0.0056 0.985 -2.2625 -190.5684)">
+ <stop offset="0" style="stop-color:#F8FBFD"/>
+ <stop offset="0.0169" style="stop-color:#F8FBFD"/>
+ <stop offset="0.1966" style="stop-color:#B8E3FD"/>
+ <stop offset="0.2987" style="stop-color:#B2E0FC"/>
+ <stop offset="0.4358" style="stop-color:#A1D7FB"/>
+ <stop offset="0.593" style="stop-color:#85C7F8"/>
+ <stop offset="0.765" style="stop-color:#5EB2F4"/>
+ <stop offset="0.9471" style="stop-color:#2C98F0"/>
+ <stop offset="1" style="stop-color:#1C8FEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_31_)" d="M172.128,172.818c-6.15,15.662-20.354,23.321-31.31,17.387
+ c-10.512-5.699-14.152-21.946-8.493-36.519c5.667-14.608,18.837-22.903,29.83-18.285
+ C173.615,140.217,178.306,157.072,172.128,172.818z"/>
+
+ <linearGradient id="XMLID_32_" gradientUnits="userSpaceOnUse" x1="126.3384" y1="341.8262" x2="171.8396" y2="369.1599" gradientTransform="matrix(0.997 0.0067 0.0067 0.9851 -1.7269 -189.8292)">
+ <stop offset="0.0169" style="stop-color:#FFFFFD"/>
+ <stop offset="0.1966" style="stop-color:#BDE6FD"/>
+ <stop offset="0.2966" style="stop-color:#B7E3FC"/>
+ <stop offset="0.4311" style="stop-color:#A6D9FB"/>
+ <stop offset="0.5851" style="stop-color:#8ACAF8"/>
+ <stop offset="0.7538" style="stop-color:#63B5F5"/>
+ <stop offset="0.9323" style="stop-color:#319AF0"/>
+ <stop offset="1" style="stop-color:#1C8FEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_32_)" d="M172.078,172.882c-6.159,15.583-20.292,23.138-31.183,17.199
+ c-10.435-5.696-14.089-21.828-8.509-36.324c5.612-14.585,18.777-22.873,29.777-18.256
+ C173.645,140.32,178.274,157.188,172.078,172.882z"/>
+ </g>
+ </g>
+ <g>
+
+ <linearGradient id="XMLID_33_" gradientUnits="userSpaceOnUse" x1="166.0122" y1="393.9854" x2="150.6476" y2="353.6534" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0.0169" style="stop-color:#FFFFFF"/>
+ <stop offset="0.0405" style="stop-color:#FFF8D8"/>
+ <stop offset="0.0716" style="stop-color:#FFF0AB"/>
+ <stop offset="0.1058" style="stop-color:#FFE982"/>
+ <stop offset="0.1424" style="stop-color:#FFE35F"/>
+ <stop offset="0.182" style="stop-color:#FFDD41"/>
+ <stop offset="0.2257" style="stop-color:#FFD929"/>
+ <stop offset="0.2749" style="stop-color:#FFD617"/>
+ <stop offset="0.3331" style="stop-color:#FFD40A"/>
+ <stop offset="0.4089" style="stop-color:#FFD202"/>
+ <stop offset="0.5674" style="stop-color:#FFD200"/>
+ <stop offset="1" style="stop-color:#FF8B00"/>
+ </linearGradient>
+ <path fill="url(#XMLID_33_)" d="M147.12,187.316c4.339,0.356,8.61-1.264,12.102-3.756c2.569-1.834,4.758-4.103,6.455-6.705
+ c0.011-0.016,0.021-0.03,0.032-0.046c0.334-0.516,0.649-1.044,0.945-1.585c0.004-0.009,0.01-0.019,0.015-0.027
+ c0.595-1.095,1.106-2.24,1.528-3.428c1.909-5.384,2.465-11.116,1.254-16.729c-1.074-4.977-3.683-9.785-7.848-12.825
+ c-1.986-1.449-4.133-2.337-6.601-2.493c-2.777-0.178-5.538,0.517-8.03,1.724c-0.291,0.19-0.582,0.382-0.874,0.591
+ c-9.208,6.582-13.731,17.473-13.522,27.333c0.333,5.743,2.453,11.035,6.424,14.609C141.326,185.83,144.108,187.069,147.12,187.316
+ z"/>
+ <path fill="#1C86EE" d="M153.033,163.481c0.601-3.869-0.521-7.014-2.667-6.856c-2.315,0.169-4.756,4.057-5.247,8.465
+ c-0.463,4.199,1.087,6.847,3.287,6.146C150.457,170.583,152.462,167.19,153.033,163.481z"/>
+ <path fill="#1C86EE" d="M162.81,162.585c-0.231-0.074-0.597-0.121-1.02,0.095c-1.454,0.725-2.667,4.391-2.894,5.121
+ c-0.32,1.026-1.309,4.483-0.474,5.76c0.221,0.333,0.542,0.538,0.911,0.59c0.918,0.125,1.581-0.733,1.999-1.386
+ c0.242-0.379,0.49-0.839,0.735-1.366c0.351-0.752,0.686-1.622,0.961-2.51C163.691,166.778,164.545,163.153,162.81,162.585z"/>
+
+ <linearGradient id="XMLID_34_" gradientUnits="userSpaceOnUse" x1="158.292" y1="338.2295" x2="155.0771" y2="352.0526" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.4169" style="stop-color:#FFFFFD"/>
+ <stop offset="0.6466" style="stop-color:#FFFFF5"/>
+ <stop offset="0.8302" style="stop-color:#FFFFE7"/>
+ <stop offset="0.9894" style="stop-color:#FFFFD4"/>
+ <stop offset="1" style="stop-color:#FFFFD2"/>
+ </linearGradient>
+ <path opacity="0.75" fill="url(#XMLID_34_)" enable-background="new " d="M141.197,150.582
+ c-3.564,6.521-3.26,7.717,7.148,8.945c7.671,1.237,11.408,3.664,15.206,5.783c2.495,1.123,4.069,3.789,5.625,1.771
+ c2.162-3.917,1.603-13.092-3.004-19.532C159.075,137.994,146.837,141.746,141.197,150.582z"/>
+
+ <linearGradient id="XMLID_35_" gradientUnits="userSpaceOnUse" x1="175.8477" y1="335.4941" x2="143.9827" y2="383.2913" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0.0056" style="stop-color:#1C86EE"/>
+ <stop offset="0.3764" style="stop-color:#FCFFFC"/>
+ <stop offset="0.437" style="stop-color:#F0F9FB"/>
+ <stop offset="0.5465" style="stop-color:#D0E7F9"/>
+ <stop offset="0.6924" style="stop-color:#9DCCF6"/>
+ <stop offset="0.8669" style="stop-color:#56A6F2"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_35_)" d="M172.066,151.754c-1.554-5.689-5.05-10.209-9.63-12.295c2.69,1.774,4.897,4.443,6.389,7.706
+ c0.526,1.134,0.968,2.34,1.312,3.602c1.87,6.842,0.871,15.19-2.252,22.244c0.137-0.384,0.267-0.768,0.39-1.158
+ c-0.13,0.322-0.262,0.64-0.4,0.955c0.008-0.019,0.019-0.035,0.027-0.052c-0.986,2.718-2.313,5.294-3.936,7.556
+ c-4.164,5.813-10.433,9.758-16.543,9.778c6.986,0.858,14.452-3.611,19.266-10.485
+ C172.159,171.788,174.464,160.527,172.066,151.754z"/>
+
+ <linearGradient id="XMLID_36_" gradientUnits="userSpaceOnUse" x1="188.5327" y1="333.8271" x2="165.3142" y2="348.4286" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0" style="stop-color:#CDF0FC"/>
+ <stop offset="0.0783" style="stop-color:#C1E9FB"/>
+ <stop offset="0.2197" style="stop-color:#A1D6F9"/>
+ <stop offset="0.408" style="stop-color:#6EB7F4"/>
+ <stop offset="0.6339" style="stop-color:#278DEF"/>
+ <stop offset="0.6685" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_36_)" d="M164.347,140.85c-1.252-1.095-2.557-1.923-4.18-2.329c-1.721-0.431-3.5-0.504-5.256-0.272
+ c-2.871,0.381-5.577,1.606-7.965,3.21c2.499-1.215,5.27-1.914,8.056-1.736c2.468,0.156,4.615,1.044,6.601,2.493
+ c4.165,3.041,6.774,7.849,7.848,12.825c1.21,5.612,0.655,11.344-1.254,16.729c-0.421,1.188-0.933,2.333-1.528,3.428
+ c-0.004,0.008-0.01,0.018-0.015,0.027c-0.296,0.541-0.611,1.069-0.945,1.585c-0.011,0.016-0.021,0.03-0.032,0.046
+ c-1.697,2.602-3.886,4.871-6.455,6.705c-3.491,2.493-7.763,4.112-12.102,3.756c-3.012-0.248-5.794-1.487-8.12-3.336
+ c-4.355-3.92-6.509-9.9-6.491-16.282c-0.254,7.874,2.441,15.292,8.147,19.606c2.122,1.605,4.418,2.496,6.768,2.785
+ c3.806-0.012,7.673-1.548,11.056-4.109c4.964-3.635,8.633-9.352,10.469-14.971C172.079,161.433,172.626,148.089,164.347,140.85z"
+ />
+ </g>
+</g>
+</svg>
diff --git a/share/gcstar/logos/splash.png b/share/gcstar/logos/splash.png
new file mode 100644
index 0000000..2707231
--- /dev/null
+++ b/share/gcstar/logos/splash.png
Binary files differ
diff --git a/share/gcstar/overlays/canevas-timbre.png b/share/gcstar/overlays/canevas-timbre.png
new file mode 100644
index 0000000..97ad22a
--- /dev/null
+++ b/share/gcstar/overlays/canevas-timbre.png
Binary files differ
diff --git a/share/gcstar/overlays/cd.png b/share/gcstar/overlays/cd.png
new file mode 100644
index 0000000..c2a2ae2
--- /dev/null
+++ b/share/gcstar/overlays/cd.png
Binary files differ
diff --git a/share/gcstar/overlays/dvd.png b/share/gcstar/overlays/dvd.png
new file mode 100644
index 0000000..7793a62
--- /dev/null
+++ b/share/gcstar/overlays/dvd.png
Binary files differ
diff --git a/share/gcstar/overlays/favourite_large.png b/share/gcstar/overlays/favourite_large.png
new file mode 100644
index 0000000..c03cb06
--- /dev/null
+++ b/share/gcstar/overlays/favourite_large.png
Binary files differ
diff --git a/share/gcstar/overlays/favourite_med.png b/share/gcstar/overlays/favourite_med.png
new file mode 100644
index 0000000..73260a7
--- /dev/null
+++ b/share/gcstar/overlays/favourite_med.png
Binary files differ
diff --git a/share/gcstar/overlays/favourite_small.png b/share/gcstar/overlays/favourite_small.png
new file mode 100644
index 0000000..fdbf576
--- /dev/null
+++ b/share/gcstar/overlays/favourite_small.png
Binary files differ
diff --git a/share/gcstar/overlays/favourite_verysmall.png b/share/gcstar/overlays/favourite_verysmall.png
new file mode 100644
index 0000000..5d44db9
--- /dev/null
+++ b/share/gcstar/overlays/favourite_verysmall.png
Binary files differ
diff --git a/share/gcstar/overlays/favourite_xlarge.png b/share/gcstar/overlays/favourite_xlarge.png
new file mode 100644
index 0000000..e5910c1
--- /dev/null
+++ b/share/gcstar/overlays/favourite_xlarge.png
Binary files differ
diff --git a/share/gcstar/overlays/film.png b/share/gcstar/overlays/film.png
new file mode 100644
index 0000000..7b5baae
--- /dev/null
+++ b/share/gcstar/overlays/film.png
Binary files differ
diff --git a/share/gcstar/overlays/flip.png b/share/gcstar/overlays/flip.png
new file mode 100644
index 0000000..e81734c
--- /dev/null
+++ b/share/gcstar/overlays/flip.png
Binary files differ
diff --git a/share/gcstar/overlays/flip2.png b/share/gcstar/overlays/flip2.png
new file mode 100644
index 0000000..7c5678e
--- /dev/null
+++ b/share/gcstar/overlays/flip2.png
Binary files differ
diff --git a/share/gcstar/overlays/lend_large.png b/share/gcstar/overlays/lend_large.png
new file mode 100644
index 0000000..47778ac
--- /dev/null
+++ b/share/gcstar/overlays/lend_large.png
Binary files differ
diff --git a/share/gcstar/overlays/lend_med.png b/share/gcstar/overlays/lend_med.png
new file mode 100644
index 0000000..3a16b33
--- /dev/null
+++ b/share/gcstar/overlays/lend_med.png
Binary files differ
diff --git a/share/gcstar/overlays/lend_small.png b/share/gcstar/overlays/lend_small.png
new file mode 100644
index 0000000..b5465b7
--- /dev/null
+++ b/share/gcstar/overlays/lend_small.png
Binary files differ
diff --git a/share/gcstar/overlays/lend_verysmall.png b/share/gcstar/overlays/lend_verysmall.png
new file mode 100644
index 0000000..5b46e7e
--- /dev/null
+++ b/share/gcstar/overlays/lend_verysmall.png
Binary files differ
diff --git a/share/gcstar/overlays/lend_xlarge.png b/share/gcstar/overlays/lend_xlarge.png
new file mode 100644
index 0000000..0f76325
--- /dev/null
+++ b/share/gcstar/overlays/lend_xlarge.png
Binary files differ
diff --git a/share/gcstar/overlays/minicars.png b/share/gcstar/overlays/minicars.png
new file mode 100644
index 0000000..98cf484
--- /dev/null
+++ b/share/gcstar/overlays/minicars.png
Binary files differ
diff --git a/share/gcstar/overlays/subtle.png b/share/gcstar/overlays/subtle.png
new file mode 100644
index 0000000..3cffa1d
--- /dev/null
+++ b/share/gcstar/overlays/subtle.png
Binary files differ
diff --git a/share/gcstar/panels/Classic b/share/gcstar/panels/Classic
new file mode 100644
index 0000000..8d7e6e7
--- /dev/null
+++ b/share/gcstar/panels/Classic
@@ -0,0 +1,29 @@
+pageBg = "#ffffff"
+
+boxBg = "#e9e9e9"
+boxColor = "#000000"
+boxStyle = "weight='bold'"
+boxJustify = "center"
+
+headerBg = "#ffffff"
+headerColor = "#000000"
+headerStyle = "size='xx-large' weight='bold'"
+headerJustify = "center"
+
+subheaderBg = "#ffffff"
+subheaderColor = "#000000"
+subheaderStyle = "size='x-large' weight='bold'"
+subheaderJustify = "center"
+
+labelBg = "#e9e9e9"
+labelColor = "#000000"
+labelStyle = "weight='bold'"
+
+fieldBg = "#afafaf"
+fieldColor = "#ffffff"
+fieldStyle = ""
+
+expanderBg = "#ffffff"
+expanderColor = "#000000"
+expanderArrow = "#afafaf"
+expanderPrelight = "#e9e9e9"
diff --git a/share/gcstar/panels/Dark b/share/gcstar/panels/Dark
new file mode 100644
index 0000000..1ca4693
--- /dev/null
+++ b/share/gcstar/panels/Dark
@@ -0,0 +1,29 @@
+pageBg = "#000000"
+
+boxBg = "#333333"
+boxColor = "#eeeeee"
+boxStyle = "weight='bold'"
+boxJustify = "center"
+
+headerBg = "#000000"
+headerColor = "#ffffff"
+headerStyle = "size='xx-large' weight='bold'"
+headerJustify = "center"
+
+subheaderBg = "#000000"
+subheaderColor = "#ffffff"
+subheaderStyle = "size='x-large' weight='bold'"
+subheaderJustify = "center"
+
+labelBg = "#333333"
+labelColor = "#eeeeee"
+labelStyle = ""
+
+fieldBg = "#333333"
+fieldColor = "#eeeeee"
+fieldStyle = ""
+
+expanderBg = "#000000"
+expanderColor = "#ffffff"
+expanderArrow = "#ffffff"
+expanderPrelight = "#333333"
diff --git a/share/gcstar/panels/WebSite b/share/gcstar/panels/WebSite
new file mode 100644
index 0000000..8096d23
--- /dev/null
+++ b/share/gcstar/panels/WebSite
@@ -0,0 +1,29 @@
+pageBg = "#ffffff"
+
+boxBg = "#eeeeee"
+boxColor = "#000000"
+boxStyle = "weight='bold'"
+boxJustify = "center"
+
+headerBg = "#ffd700"
+headerColor = "#ffffff"
+headerStyle = "size='xx-large' weight='bold'"
+headerJustify = "left"
+
+subheaderBg = "#ffffff"
+subheaderColor = "#1c86ee"
+subheaderStyle = "size='x-large' weight='bold'"
+subheaderJustify = "center"
+
+labelBg = "#eeeeee"
+labelColor = "#1c86ee"
+labelStyle = "weight='bold'"
+
+fieldBg = "#778899"
+fieldColor = "#ffffff"
+fieldStyle = ""
+
+expanderBg = "#ffffff"
+expanderColor = "#000000"
+expanderArrow = "#1c86ee"
+expanderPrelight = "#eeeeee"
diff --git a/share/gcstar/schemas/gcm.xsd b/share/gcstar/schemas/gcm.xsd
new file mode 100644
index 0000000..4f6d8a7
--- /dev/null
+++ b/share/gcstar/schemas/gcm.xsd
@@ -0,0 +1,291 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Document : gcm.xsd
+ Created on : April 26, 2007, 9:32 PM
+ Author : toroman
+ Description:
+ Validates GCM files!
+-->
+
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <xs:complexType name="panelsItem">
+ <xs:sequence maxOccurs="unbounded">
+ <xs:element name="item" type="panelsItem" maxOccurs="unbounded" minOccurs="0" />
+ </xs:sequence>
+
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ <xs:attribute name="style" type="xs:string" />
+ <xs:attribute name="for" type="xs:string"/>
+ <xs:attribute name="name" type="xs:string"/>
+ <xs:attribute name="label" type="xs:string"/>
+ <xs:attribute name="editable" type="xs:string" />
+ <xs:attribute name="title" type="xs:string" />
+ <xs:attribute name="collapsed" type="xs:string" />
+ <xs:attribute name="value" type="xs:string" />
+ <xs:attribute name="values" type="xs:string" />
+ <xs:attribute name="place" type="xs:string" />
+ <xs:attribute name="tip" type="xs:string" />
+ <xs:attribute name="width" type="xs:string" />
+ <xs:attribute name="height">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[1-9]+\d*(em)?" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="row" type="xs:integer"/>
+ <xs:attribute name="col" type="xs:integer"/>
+ <xs:attribute name="rows" type="xs:integer"/>
+ <xs:attribute name="cols" type="xs:integer"/>
+ <xs:attribute name="colspan" type="xs:integer" />
+ <xs:attribute name="expand">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="true" />
+ <xs:enumeration value="false" />
+ <xs:enumeration value="default" />
+ <xs:enumeration value="horizontal" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="header" type="xs:boolean" />
+ <xs:attribute name="nomargin" type="xs:boolean" />
+ <xs:attribute name="flat" type="xs:boolean" />
+
+ <xs:attribute name="align">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="left" />
+ <xs:enumeration value="right" />
+ <xs:enumeration value="top" />
+ <xs:enumeration value="bottom" />
+ <xs:enumeration value="center" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+
+ </xs:complexType>
+
+ <xs:element name="collection">
+ <xs:complexType>
+ <xs:all>
+ <xs:element name="lang" type="xs:string" />
+ <xs:element name="options">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="defaults">
+ <xs:complexType>
+ <xs:all>
+ <xs:element name="image" type="xs:string" minOccurs="0" />
+ <xs:element name="groupby" type="xs:string" minOccurs="0" />
+ <xs:element name="listImageWidth" type="xs:integer" minOccurs="0" />
+ <xs:element name="listImageHeight" type="xs:integer" minOccurs="0" />
+ </xs:all>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="overlay">
+ <xs:complexType>
+ <xs:all>
+ <xs:element name="image" type="xs:string" minOccurs="0" />
+ <xs:element name="paddingLeft" type="xs:integer" minOccurs="0" />
+ <xs:element name="paddingRight" type="xs:integer" minOccurs="0" />
+ <xs:element name="paddingTop" type="xs:integer" minOccurs="0" />
+ <xs:element name="paddingBottom" type="xs:integer" minOccurs="0" />
+ </xs:all>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="fields">
+ <xs:complexType>
+ <xs:all>
+ <xs:element name="id" type="xs:string" />
+ <xs:element name="title" type="xs:string" />
+ <xs:element name="cover" type="xs:string" />
+ <xs:element name="url" type="xs:string" minOccurs="0" />
+ <xs:element name="play" type="xs:string" minOccurs="0" />
+ <xs:element name="search" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="field" type="xs:string" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="results" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="field" type="xs:string" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:all>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="values" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="value" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="displayed" type="xs:string" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="id" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="groups">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="group" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="label" type="xs:string" use="required"/>
+ <xs:attribute name="id" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="random">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="filter" minOccurs="0">
+ <xs:complexType>
+ <xs:attribute name="value" use="required" type="xs:integer" />
+ <xs:attribute name="numeric" use="required" type="xs:boolean" />
+ <xs:attribute name="field" use="required" type="xs:string" />
+ <xs:attribute name="comparison" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="eq"/>
+ <xs:enumeration value="contain"/>
+ <xs:enumeration value="lt"/>
+ <xs:enumeration value="le"/>
+ <xs:enumeration value="gt"/>
+ <xs:enumeration value="ge"/>
+ <xs:enumeration value="range"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="after" type="xs:integer" />
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="fields">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="field" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="values" type="xs:string" />
+ <xs:attribute name="value" type="xs:string" use="required"/>
+ <xs:attribute name="type" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="number" />
+ <xs:enumeration value="short text" />
+ <xs:enumeration value="single list" />
+ <xs:enumeration value="long text" />
+ <xs:enumeration value="button" />
+ <xs:enumeration value="yesno" />
+ <xs:enumeration value="date" />
+ <xs:enumeration value="history text" />
+ <xs:enumeration value="double list" />
+ <xs:enumeration value="options" />
+ <xs:enumeration value="file" />
+ <xs:enumeration value="image" />
+ <xs:enumeration value="checked text" />
+ <xs:enumeration value="triple list" />
+ <xs:enumeration value="formatted" />
+ <xs:enumeration value="url" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="separator" type="xs:integer" />
+ <xs:attribute name="notnull" type="xs:boolean" />
+ <xs:attribute name="min" type="xs:integer" />
+ <xs:attribute name="max" type="xs:integer"/>
+ <xs:attribute name="label3" type="xs:string" />
+ <xs:attribute name="label2" type="xs:string" />
+ <xs:attribute name="label1" type="xs:string" />
+ <xs:attribute name="label" type="xs:string" use="required"/>
+ <xs:attribute name="init" type="xs:string" use="required"/>
+ <xs:attribute name="imported" type="xs:boolean" />
+ <xs:attribute name="group" type="xs:string" use="required"/>
+ <xs:attribute name="format" type="xs:string"/>
+ <xs:attribute name="tip" type="xs:string" />
+ <xs:attribute name="step" type="xs:decimal" />
+ <xs:attribute name="history" type="xs:boolean" />
+ <xs:attribute name="default" type="xs:string" />
+ <xs:attribute name="displayed" type="xs:string" />
+ <xs:attribute name="flat" type="xs:boolean" />
+ <xs:attribute name="sorttype">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="number" />
+ <xs:enumeration value="date" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="lending" use="required" type="xs:boolean" />
+ <xs:attribute name="tags" type="xs:boolean" />
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="filters">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="group" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="filter" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="values" type="xs:string" />
+ <xs:attribute name="quick" type="xs:boolean" />
+ <xs:attribute name="preprocess" type="xs:string" />
+ <xs:attribute name="numeric" type="xs:boolean" />
+ <xs:attribute name="labelselect" type="xs:string" />
+ <xs:attribute name="labelon" type="xs:string" />
+ <xs:attribute name="labeloff" type="xs:string" />
+ <xs:attribute name="label" type="xs:string" />
+ <xs:attribute name="field" type="xs:string" use="required"/>
+ <xs:attribute name="comparison" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="label" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="panels">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="panel" maxOccurs="unbounded">
+ <xs:complexType >
+ <xs:sequence>
+ <xs:element name="item" maxOccurs="unbounded" type="panelsItem" />
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:string" use="required"/>
+ <xs:attribute name="label" type="xs:string" use="required"/>
+ <xs:attribute name="editable" type="xs:boolean" use="required" />
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:all>
+ <xs:attribute name="name" use="required" type="xs:string" />
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/share/gcstar/style/GCstar/gtkrc b/share/gcstar/style/GCstar/gtkrc
new file mode 100644
index 0000000..b4ef09d
--- /dev/null
+++ b/share/gcstar/style/GCstar/gtkrc
@@ -0,0 +1,277 @@
+# style <name> [= <name>]
+# {
+# <option>
+# }
+#
+# widget <widget_set> style <style_name>
+# widget_class <widget_class_set> style <style_name>
+
+# Here is a list of all the possible states. Note that some do not apply to
+# certain widgets.
+#
+# NORMAL - The normal state of a widget, without the mouse over top of
+# it, and not being pressed, etc.
+#
+# PRELIGHT - When the mouse is over top of the widget, colors defined
+# using this state will be in effect.
+#
+# ACTIVE - When the widget is pressed or clicked it will be active, and
+# the attributes assigned by this tag will be in effect.
+#
+# INSENSITIVE - When a widget is set insensitive, and cannot be
+# activated, it will take these attributes.
+#
+# SELECTED - When an object is selected, it takes these attributes.
+#
+# Given these states, we can set the attributes of the widgets in each of
+# these states using the following directives.
+#
+# fg - Sets the foreground color of a widget.
+# bg - Sets the background color of a widget.
+# bg_pixmap - Sets the background of a widget to a tiled pixmap.
+# font - Sets the font to be used with the given widget.
+#
+
+style "gcStocks"
+{
+ # Redefine used stock items. Each entry contains the stock item
+ # name and the file name (it should be in the same directory as
+ # this file.
+ stock["gtk-dialog-question"] =
+ {
+ {"icons/help/64x64.png", *, *, "gtk-dialog"}
+ }
+ stock["gtk-dialog-info"] =
+ {
+ {"icons/about/64x64.png", *, *, "gtk-dialog"}
+ }
+ stock["gtk-dialog-error"] =
+ {
+ {"icons/error/64x64.png", *, *, "gtk-dialog"}
+ }
+ stock["gtk-about"] =
+ {
+ {"icons/about/16x16.png", *, *, "gtk-menu"},
+ {"icons/about/16x16.png"}
+ }
+ stock["gtk-add"] =
+ {
+ {"icons/add/16x16.png", *, *, "gtk-menu"},
+ {"icons/add/16x16.png", *, *, "gtk-small-toolbar"},
+ {"icons/add/24x24.png", *, *, "gtk-button"},
+ {"icons/add/24x24.png", *, *, "gtk-large-toolbar"},
+ {"icons/add/32x32.png"}
+ }
+ stock["gtk-cancel"] =
+ {
+ {"icons/cancel/24x24.png", *, *, "gtk-button"},
+ {"icons/cancel/32x32.png"}
+ }
+ stock["gtk-no"] =
+ {
+ {"icons/cancel/24x24.png", *, *, "gtk-button"},
+ {"icons/cancel/32x32.png"}
+ }
+ stock["gtk-clear"] =
+ {
+ {"icons/clear/24x24.png", *, *, "gtk-button"},
+ {"icons/clear/32x32.png"}
+ }
+ stock["gtk-convert"] =
+ {
+ {"icons/convert/16x16.png", *, *, "gtk-menu"},
+ {"icons/convert/24x24.png", *, *, "gtk-button"},
+ {"icons/convert/32x32.png"}
+ }
+ stock["gtk-delete"] =
+ {
+ {"icons/delete/16x16.png", *, *, "gtk-menu"},
+ {"icons/delete/24x24.png", *, *, "gtk-button"},
+ {"icons/delete/32x32.png"}
+ }
+ stock["gtk-directory"] =
+ {
+ {"icons/directory/32x32.png", *, *, "gtk-large-toolbar"},
+ {"icons/directory/32x32.png"}
+ }
+ stock["gtk-dnd"] =
+ {
+ {"icons/dnd/16x16.png", *, *, "gtk-menu"}
+ }
+ stock["gtk-execute"] =
+ {
+ {"icons/execute/16x16.png", *, *, "gtk-menu"},
+ {"icons/execute/16x16.png", *, *, "gtk-small-toolbar"},
+ {"icons/execute/24x24.png", *, *, "gtk-button"},
+ {"icons/execute/24x24.png", *, *, "gtk-large-toolbar"},
+ {"icons/execute/32x32.png"}
+ }
+ stock["gtk-find"] =
+ {
+ {"icons/find/16x16.png", *, *, "gtk-menu"},
+ {"icons/find/16x16.png", *, *, "gtk-small-toolbar"},
+ {"icons/find/24x24.png", *, *, "gtk-button"},
+ {"icons/find/24x24.png", *, *, "gtk-large-toolbar"},
+ {"icons/find/32x32.png"}
+ }
+ stock["gtk-go-back"] =
+ {
+ {"icons/go-back/16x16.png", *, *, "gtk-menu"},
+ {"icons/go-back/16x16.png", *, *, "gtk-button"}
+ }
+ stock["gtk-go-down"] =
+ {
+ {"icons/go-down/16x16.png", *, *, "gtk-menu"},
+ {"icons/go-down/16x16.png", *, *, "gtk-button"}
+ }
+ stock["gtk-go-forward"] =
+ {
+ {"icons/go-forward/16x16.png", *, *, "gtk-menu"},
+ {"icons/go-forward/16x16.png", *, *, "gtk-button"}
+ }
+ stock["gtk-go-up"] =
+ {
+ {"icons/go-up/16x16.png", *, *, "gtk-menu"},
+ {"icons/go-up/16x16.png", *, *, "gtk-button"}
+ }
+ stock["gtk-sort-descending"] =
+ {
+ {"icons/go-down/16x16.png", *, *, "gtk-menu"},
+ {"icons/go-down/16x16.png", *, *, "gtk-button"}
+ }
+ stock["gtk-sort-ascending"] =
+ {
+ {"icons/go-up/16x16.png", *, *, "gtk-menu"},
+ {"icons/go-up/16x16.png", *, *, "gtk-button"}
+ }
+ stock["gtk-help"] =
+ {
+ {"icons/help/16x16.png", *, *, "gtk-menu"}
+ }
+ stock["gtk-home"] =
+ {
+ {"icons/home/32x32.png", *, *, "gtk-large-toolbar"},
+ {"icons/home/32x32.png"}
+ }
+ stock["gtk-jump-to"] =
+ {
+ {"icons/jump-to/24x24.png", *, *, "gtk-button"},
+ {"icons/jump-to/32x32.png"}
+ }
+ stock["gtk-media-play"] =
+ {
+ {"icons/media-play/16x16.png", *, *, "gtk-menu"},
+ {"icons/media-play/16x16.png", *, *, "gtk-small-toolbar"},
+ {"icons/media-play/24x24.png", *, *, "gtk-button"},
+ {"icons/media-play/24x24.png", *, *, "gtk-large-toolbar"},
+ {"icons/media-play/32x32.png"}
+ }
+ stock["gtk-media-next"] =
+ {
+ {"icons/media-next/24x24.png", *, *, "gtk-button"},
+ {"icons/media-next/32x32.png"}
+ }
+ stock["gtk-network"] =
+ {
+ {"icons/network/32x32.png", *, *, "gtk-large-toolbar"},
+ {"icons/network/32x32.png"}
+ }
+ stock["gtk-new"] =
+ {
+ {"icons/new/16x16.png", *, *, "gtk-menu"},
+ {"icons/new/16x16.png", *, *, "gtk-small-toolbar"},
+ {"icons/new/24x24.png", *, *, "gtk-button"},
+ {"icons/new/24x24.png", *, *, "gtk-large-toolbar"},
+ {"icons/new/32x32.png"}
+ }
+ stock["gtk-ok"] =
+ {
+ {"icons/ok/24x24.png", *, *, "gtk-button"},
+ {"icons/ok/32x32.png"}
+ }
+ stock["gtk-yes"] =
+ {
+ {"icons/ok/24x24.png", *, *, "gtk-button"},
+ {"icons/ok/32x32.png"}
+ }
+ stock["gtk-open"] =
+ {
+ {"icons/open/16x16.png", *, *, "gtk-menu"},
+ {"icons/open/24x24.png", *, *, "gtk-button"},
+ {"icons/open/32x32.png"}
+ }
+ stock["gtk-preferences"] =
+ {
+ {"icons/preferences/16x16.png", *, *, "gtk-menu"},
+ {"icons/preferences/16x16.png", *, *, "gtk-small-toolbar"},
+ {"icons/preferences/24x24.png", *, *, "gtk-button"},
+ {"icons/preferences/24x24.png", *, *, "gtk-large-toolbar"},
+ {"icons/preferences/32x32.png"}
+ }
+ stock["gtk-properties"] =
+ {
+ {"icons/properties/24x24.png", *, *, "gtk-button"},
+ {"icons/properties/32x32.png", *, *, "gtk-large-toolbar"},
+ {"icons/properties/32x32.png"}
+ }
+ stock["gtk-quit"] =
+ {
+ {"icons/quit/16x16.png", *, *, "gtk-menu"}
+ }
+ stock["gtk-refresh"] =
+ {
+ {"icons/refresh/16x16.png", *, *, "gtk-menu"},
+ {"icons/refresh/16x16.png", *, *, "gtk-small-toolbar"},
+ {"icons/refresh/24x24.png", *, *, "gtk-button"},
+ {"icons/refresh/24x24.png", *, *, "gtk-large-toolbar"},
+ {"icons/refresh/32x32.png"}
+ }
+ stock["gtk-remove"] =
+ {
+ {"icons/remove/24x24.png", *, *, "gtk-button"},
+ {"icons/remove/32x32.png"}
+ }
+ stock["gtk-revert-to-saved"] =
+ {
+ {"icons/revert-to-saved/16x16.png", *, *, "gtk-menu"},
+ {"icons/revert-to-saved/24x24.png", *, *, "gtk-button"},
+ {"icons/revert-to-saved/32x32.png"}
+ }
+ stock["gtk-save"] =
+ {
+ {"icons/save/16x16.png", *, *, "gtk-menu"},
+ {"icons/save/16x16.png", *, *, "gtk-small-toolbar"},
+ {"icons/save/24x24.png", *, *, "gtk-button"},
+ {"icons/save/24x24.png", *, *, "gtk-large-toolbar"},
+ {"icons/save/32x32.png"}
+ }
+ stock["gtk-save-as"] =
+ {
+ {"icons/save-as/16x16.png", *, *, "gtk-menu"},
+ {"icons/save-as/24x24.png", *, *, "gtk-button"},
+ {"icons/save-as/32x32.png"}
+ }
+ stock["gtk-select-color"] =
+ {
+ {"icons/select-color/32x32.png", *, *, "gtk-large-toolbar"},
+ {"icons/select-color/32x32.png"}
+ }
+}
+
+style "gcDefault" = "gcStocks"
+{
+}
+
+style "gcAbout" = "gcDefault"
+{
+ fg[NORMAL] = "#777777"
+ bg[NORMAL] = "#ffffff"
+ bg[PRELIGHT] = "#ffffff"
+ bg[ACTIVE] = "#ffffff"
+ GtkAboutDialog::link-color = "#777777"
+}
+
+# Default rule
+widget "*" style "gcDefault"
+#class "GtkAboutDialog" style : highest "gcAbout"
+#widget "*GtkAboutDialog.GtkVBox.GtkVBox.*" style : highest "gcAbout"
diff --git a/share/gcstar/style/GCstar/icons/about/16x16.png b/share/gcstar/style/GCstar/icons/about/16x16.png
new file mode 100644
index 0000000..59626a8
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/about/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/about/64x64.png b/share/gcstar/style/GCstar/icons/about/64x64.png
new file mode 100644
index 0000000..1a94dfc
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/about/64x64.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/add/16x16.png b/share/gcstar/style/GCstar/icons/add/16x16.png
new file mode 100644
index 0000000..ef064df
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/add/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/add/24x24.png b/share/gcstar/style/GCstar/icons/add/24x24.png
new file mode 100644
index 0000000..91f0ee5
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/add/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/add/32x32.png b/share/gcstar/style/GCstar/icons/add/32x32.png
new file mode 100644
index 0000000..d561c5f
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/add/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/cancel/24x24.png b/share/gcstar/style/GCstar/icons/cancel/24x24.png
new file mode 100644
index 0000000..a5495d8
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/cancel/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/cancel/32x32.png b/share/gcstar/style/GCstar/icons/cancel/32x32.png
new file mode 100644
index 0000000..21c1a71
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/cancel/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/clear/24x24.png b/share/gcstar/style/GCstar/icons/clear/24x24.png
new file mode 100644
index 0000000..6a0773e
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/clear/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/clear/32x32.png b/share/gcstar/style/GCstar/icons/clear/32x32.png
new file mode 100644
index 0000000..f7aae4e
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/clear/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/convert/16x16.png b/share/gcstar/style/GCstar/icons/convert/16x16.png
new file mode 100644
index 0000000..d67e770
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/convert/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/convert/24x24.png b/share/gcstar/style/GCstar/icons/convert/24x24.png
new file mode 100644
index 0000000..f234980
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/convert/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/convert/32x32.png b/share/gcstar/style/GCstar/icons/convert/32x32.png
new file mode 100644
index 0000000..3e99678
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/convert/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/delete/16x16.png b/share/gcstar/style/GCstar/icons/delete/16x16.png
new file mode 100644
index 0000000..c9bc1f0
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/delete/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/delete/24x24.png b/share/gcstar/style/GCstar/icons/delete/24x24.png
new file mode 100644
index 0000000..388b929
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/delete/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/delete/32x32.png b/share/gcstar/style/GCstar/icons/delete/32x32.png
new file mode 100644
index 0000000..fb84487
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/delete/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/directory/32x32.png b/share/gcstar/style/GCstar/icons/directory/32x32.png
new file mode 100644
index 0000000..f8b7432
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/directory/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/dnd/16x16.png b/share/gcstar/style/GCstar/icons/dnd/16x16.png
new file mode 100644
index 0000000..640b95d
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/dnd/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/error/64x64.png b/share/gcstar/style/GCstar/icons/error/64x64.png
new file mode 100644
index 0000000..e79c343
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/error/64x64.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/execute/16x16.png b/share/gcstar/style/GCstar/icons/execute/16x16.png
new file mode 100644
index 0000000..eba2657
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/execute/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/execute/24x24.png b/share/gcstar/style/GCstar/icons/execute/24x24.png
new file mode 100644
index 0000000..c90875b
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/execute/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/execute/32x32.png b/share/gcstar/style/GCstar/icons/execute/32x32.png
new file mode 100644
index 0000000..2fdb1b9
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/execute/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/find/16x16.png b/share/gcstar/style/GCstar/icons/find/16x16.png
new file mode 100644
index 0000000..54732b1
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/find/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/find/24x24.png b/share/gcstar/style/GCstar/icons/find/24x24.png
new file mode 100644
index 0000000..9306f78
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/find/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/find/32x32.png b/share/gcstar/style/GCstar/icons/find/32x32.png
new file mode 100644
index 0000000..8e5f666
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/find/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/go-back/16x16.png b/share/gcstar/style/GCstar/icons/go-back/16x16.png
new file mode 100644
index 0000000..26106c8
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/go-back/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/go-back/24x24.png b/share/gcstar/style/GCstar/icons/go-back/24x24.png
new file mode 100644
index 0000000..92aa6b0
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/go-back/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/go-down/16x16.png b/share/gcstar/style/GCstar/icons/go-down/16x16.png
new file mode 100644
index 0000000..60c5582
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/go-down/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/go-down/24x24.png b/share/gcstar/style/GCstar/icons/go-down/24x24.png
new file mode 100644
index 0000000..89c2663
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/go-down/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/go-forward/16x16.png b/share/gcstar/style/GCstar/icons/go-forward/16x16.png
new file mode 100644
index 0000000..5c08037
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/go-forward/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/go-forward/24x24.png b/share/gcstar/style/GCstar/icons/go-forward/24x24.png
new file mode 100644
index 0000000..3776ede
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/go-forward/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/go-up/16x16.png b/share/gcstar/style/GCstar/icons/go-up/16x16.png
new file mode 100644
index 0000000..8fca259
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/go-up/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/go-up/24x24.png b/share/gcstar/style/GCstar/icons/go-up/24x24.png
new file mode 100644
index 0000000..73d7d83
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/go-up/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/help/16x16.png b/share/gcstar/style/GCstar/icons/help/16x16.png
new file mode 100644
index 0000000..ff8f892
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/help/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/help/32x32.png b/share/gcstar/style/GCstar/icons/help/32x32.png
new file mode 100644
index 0000000..d795114
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/help/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/help/64x64.png b/share/gcstar/style/GCstar/icons/help/64x64.png
new file mode 100644
index 0000000..a6ff6b7
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/help/64x64.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/home/32x32.png b/share/gcstar/style/GCstar/icons/home/32x32.png
new file mode 100644
index 0000000..78e3a79
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/home/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/jump-to/24x24.png b/share/gcstar/style/GCstar/icons/jump-to/24x24.png
new file mode 100644
index 0000000..c8275d0
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/jump-to/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/jump-to/32x32.png b/share/gcstar/style/GCstar/icons/jump-to/32x32.png
new file mode 100644
index 0000000..3fb63a3
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/jump-to/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/media-next/24x24.png b/share/gcstar/style/GCstar/icons/media-next/24x24.png
new file mode 100644
index 0000000..6227a36
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/media-next/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/media-next/32x32.png b/share/gcstar/style/GCstar/icons/media-next/32x32.png
new file mode 100644
index 0000000..d0c897e
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/media-next/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/media-play/16x16.png b/share/gcstar/style/GCstar/icons/media-play/16x16.png
new file mode 100644
index 0000000..4c54071
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/media-play/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/media-play/24x24.png b/share/gcstar/style/GCstar/icons/media-play/24x24.png
new file mode 100644
index 0000000..bb39054
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/media-play/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/media-play/32x32.png b/share/gcstar/style/GCstar/icons/media-play/32x32.png
new file mode 100644
index 0000000..6836de3
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/media-play/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/network/32x32.png b/share/gcstar/style/GCstar/icons/network/32x32.png
new file mode 100644
index 0000000..33c3e56
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/network/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/new/16x16.png b/share/gcstar/style/GCstar/icons/new/16x16.png
new file mode 100644
index 0000000..8fe45b5
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/new/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/new/24x24.png b/share/gcstar/style/GCstar/icons/new/24x24.png
new file mode 100644
index 0000000..c4a5ca8
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/new/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/new/32x32.png b/share/gcstar/style/GCstar/icons/new/32x32.png
new file mode 100644
index 0000000..a40f719
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/new/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/ok/24x24.png b/share/gcstar/style/GCstar/icons/ok/24x24.png
new file mode 100644
index 0000000..4d176c0
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/ok/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/ok/32x32.png b/share/gcstar/style/GCstar/icons/ok/32x32.png
new file mode 100644
index 0000000..1f02c95
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/ok/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/open/16x16.png b/share/gcstar/style/GCstar/icons/open/16x16.png
new file mode 100644
index 0000000..79c76bc
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/open/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/open/24x24.png b/share/gcstar/style/GCstar/icons/open/24x24.png
new file mode 100644
index 0000000..072c0bb
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/open/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/open/32x32.png b/share/gcstar/style/GCstar/icons/open/32x32.png
new file mode 100644
index 0000000..099243f
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/open/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/preferences/16x16.png b/share/gcstar/style/GCstar/icons/preferences/16x16.png
new file mode 100644
index 0000000..dfbc87d
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/preferences/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/preferences/24x24.png b/share/gcstar/style/GCstar/icons/preferences/24x24.png
new file mode 100644
index 0000000..d611713
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/preferences/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/preferences/32x32.png b/share/gcstar/style/GCstar/icons/preferences/32x32.png
new file mode 100644
index 0000000..679c0e4
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/preferences/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/properties/24x24.png b/share/gcstar/style/GCstar/icons/properties/24x24.png
new file mode 100644
index 0000000..491a188
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/properties/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/properties/32x32.png b/share/gcstar/style/GCstar/icons/properties/32x32.png
new file mode 100644
index 0000000..d4cc186
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/properties/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/quit/16x16.png b/share/gcstar/style/GCstar/icons/quit/16x16.png
new file mode 100644
index 0000000..9eb7ce3
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/quit/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/quit/32x32.png b/share/gcstar/style/GCstar/icons/quit/32x32.png
new file mode 100644
index 0000000..609d987
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/quit/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/refresh/16x16.png b/share/gcstar/style/GCstar/icons/refresh/16x16.png
new file mode 100644
index 0000000..4b3a239
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/refresh/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/refresh/24x24.png b/share/gcstar/style/GCstar/icons/refresh/24x24.png
new file mode 100644
index 0000000..6c9268c
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/refresh/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/refresh/32x32.png b/share/gcstar/style/GCstar/icons/refresh/32x32.png
new file mode 100644
index 0000000..852131c
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/refresh/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/remove/24x24.png b/share/gcstar/style/GCstar/icons/remove/24x24.png
new file mode 100644
index 0000000..63adee0
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/remove/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/remove/32x32.png b/share/gcstar/style/GCstar/icons/remove/32x32.png
new file mode 100644
index 0000000..5f746bf
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/remove/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/revert-to-saved/16x16.png b/share/gcstar/style/GCstar/icons/revert-to-saved/16x16.png
new file mode 100644
index 0000000..6798f41
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/revert-to-saved/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/revert-to-saved/24x24.png b/share/gcstar/style/GCstar/icons/revert-to-saved/24x24.png
new file mode 100644
index 0000000..6da156a
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/revert-to-saved/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/revert-to-saved/32x32.png b/share/gcstar/style/GCstar/icons/revert-to-saved/32x32.png
new file mode 100644
index 0000000..9c58749
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/revert-to-saved/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/save-as/16x16.png b/share/gcstar/style/GCstar/icons/save-as/16x16.png
new file mode 100644
index 0000000..cfc18fa
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/save-as/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/save-as/24x24.png b/share/gcstar/style/GCstar/icons/save-as/24x24.png
new file mode 100644
index 0000000..ab7c071
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/save-as/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/save-as/32x32.png b/share/gcstar/style/GCstar/icons/save-as/32x32.png
new file mode 100644
index 0000000..7d3fc5f
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/save-as/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/save/16x16.png b/share/gcstar/style/GCstar/icons/save/16x16.png
new file mode 100644
index 0000000..bdafc30
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/save/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/save/24x24.png b/share/gcstar/style/GCstar/icons/save/24x24.png
new file mode 100644
index 0000000..e0e9d91
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/save/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/save/32x32.png b/share/gcstar/style/GCstar/icons/save/32x32.png
new file mode 100644
index 0000000..c93c7a3
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/save/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/select-color/32x32.png b/share/gcstar/style/GCstar/icons/select-color/32x32.png
new file mode 100644
index 0000000..b62e5fd
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/select-color/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/lend.png b/share/gcstar/style/GCstar/lend.png
new file mode 100644
index 0000000..86ed939
--- /dev/null
+++ b/share/gcstar/style/GCstar/lend.png
Binary files differ
diff --git a/share/gcstar/style/Gtk/gtkrc b/share/gcstar/style/Gtk/gtkrc
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/share/gcstar/style/Gtk/gtkrc
@@ -0,0 +1 @@
+
diff --git a/share/gcstar/style/Gtk/lend.png b/share/gcstar/style/Gtk/lend.png
new file mode 100644
index 0000000..86ed939
--- /dev/null
+++ b/share/gcstar/style/Gtk/lend.png
Binary files differ
diff --git a/share/gcstar/style/kde/active.png b/share/gcstar/style/kde/active.png
new file mode 100644
index 0000000..093464c
--- /dev/null
+++ b/share/gcstar/style/kde/active.png
Binary files differ
diff --git a/share/gcstar/style/kde/active2.png b/share/gcstar/style/kde/active2.png
new file mode 100644
index 0000000..a4f169d
--- /dev/null
+++ b/share/gcstar/style/kde/active2.png
Binary files differ
diff --git a/share/gcstar/style/kde/add.png b/share/gcstar/style/kde/add.png
new file mode 100644
index 0000000..9d9dc76
--- /dev/null
+++ b/share/gcstar/style/kde/add.png
Binary files differ
diff --git a/share/gcstar/style/kde/arrowdown.png b/share/gcstar/style/kde/arrowdown.png
new file mode 100644
index 0000000..b32645f
--- /dev/null
+++ b/share/gcstar/style/kde/arrowdown.png
Binary files differ
diff --git a/share/gcstar/style/kde/arrowleft.png b/share/gcstar/style/kde/arrowleft.png
new file mode 100644
index 0000000..e259529
--- /dev/null
+++ b/share/gcstar/style/kde/arrowleft.png
Binary files differ
diff --git a/share/gcstar/style/kde/arrowright.png b/share/gcstar/style/kde/arrowright.png
new file mode 100644
index 0000000..e1ee5f6
--- /dev/null
+++ b/share/gcstar/style/kde/arrowright.png
Binary files differ
diff --git a/share/gcstar/style/kde/arrowup.png b/share/gcstar/style/kde/arrowup.png
new file mode 100644
index 0000000..28d41da
--- /dev/null
+++ b/share/gcstar/style/kde/arrowup.png
Binary files differ
diff --git a/share/gcstar/style/kde/bghonrizontalscroll.png b/share/gcstar/style/kde/bghonrizontalscroll.png
new file mode 100644
index 0000000..90c18b7
--- /dev/null
+++ b/share/gcstar/style/kde/bghonrizontalscroll.png
Binary files differ
diff --git a/share/gcstar/style/kde/bgverticalscroll.png b/share/gcstar/style/kde/bgverticalscroll.png
new file mode 100644
index 0000000..cb93d6d
--- /dev/null
+++ b/share/gcstar/style/kde/bgverticalscroll.png
Binary files differ
diff --git a/share/gcstar/style/kde/box.png b/share/gcstar/style/kde/box.png
new file mode 100644
index 0000000..ef92f4d
--- /dev/null
+++ b/share/gcstar/style/kde/box.png
Binary files differ
diff --git a/share/gcstar/style/kde/box2.png b/share/gcstar/style/kde/box2.png
new file mode 100644
index 0000000..66b00d1
--- /dev/null
+++ b/share/gcstar/style/kde/box2.png
Binary files differ
diff --git a/share/gcstar/style/kde/box3.png b/share/gcstar/style/kde/box3.png
new file mode 100644
index 0000000..8f16b83
--- /dev/null
+++ b/share/gcstar/style/kde/box3.png
Binary files differ
diff --git a/share/gcstar/style/kde/cancel.png b/share/gcstar/style/kde/cancel.png
new file mode 100644
index 0000000..c6464d9
--- /dev/null
+++ b/share/gcstar/style/kde/cancel.png
Binary files differ
diff --git a/share/gcstar/style/kde/cdrom.png b/share/gcstar/style/kde/cdrom.png
new file mode 100644
index 0000000..fe53dd8
--- /dev/null
+++ b/share/gcstar/style/kde/cdrom.png
Binary files differ
diff --git a/share/gcstar/style/kde/checked.png b/share/gcstar/style/kde/checked.png
new file mode 100644
index 0000000..143a472
--- /dev/null
+++ b/share/gcstar/style/kde/checked.png
Binary files differ
diff --git a/share/gcstar/style/kde/clear.png b/share/gcstar/style/kde/clear.png
new file mode 100644
index 0000000..0d29007
--- /dev/null
+++ b/share/gcstar/style/kde/clear.png
Binary files differ
diff --git a/share/gcstar/style/kde/delete.png b/share/gcstar/style/kde/delete.png
new file mode 100644
index 0000000..1de7a6f
--- /dev/null
+++ b/share/gcstar/style/kde/delete.png
Binary files differ
diff --git a/share/gcstar/style/kde/display.png b/share/gcstar/style/kde/display.png
new file mode 100644
index 0000000..bde85be
--- /dev/null
+++ b/share/gcstar/style/kde/display.png
Binary files differ
diff --git a/share/gcstar/style/kde/exec.png b/share/gcstar/style/kde/exec.png
new file mode 100644
index 0000000..f05e3e4
--- /dev/null
+++ b/share/gcstar/style/kde/exec.png
Binary files differ
diff --git a/share/gcstar/style/kde/export.png b/share/gcstar/style/kde/export.png
new file mode 100644
index 0000000..5dbf6bc
--- /dev/null
+++ b/share/gcstar/style/kde/export.png
Binary files differ
diff --git a/share/gcstar/style/kde/find.png b/share/gcstar/style/kde/find.png
new file mode 100644
index 0000000..b1a6617
--- /dev/null
+++ b/share/gcstar/style/kde/find.png
Binary files differ
diff --git a/share/gcstar/style/kde/gtkrc b/share/gcstar/style/kde/gtkrc
new file mode 100644
index 0000000..61407a9
--- /dev/null
+++ b/share/gcstar/style/kde/gtkrc
@@ -0,0 +1,746 @@
+# style <name> [= <name>]
+# {
+# <option>
+# }
+#
+# widget <widget_set> style <style_name>
+# widget_class <widget_class_set> style <style_name>
+
+# Here is a list of all the possible states. Note that some do not apply to
+# certain widgets.
+#
+# NORMAL - The normal state of a widget, without the mouse over top of
+# it, and not being pressed, etc.
+#
+# PRELIGHT - When the mouse is over top of the widget, colors defined
+# using this state will be in effect.
+#
+# ACTIVE - When the widget is pressed or clicked it will be active, and
+# the attributes assigned by this tag will be in effect.
+#
+# INSENSITIVE - When a widget is set insensitive, and cannot be
+# activated, it will take these attributes.
+#
+# SELECTED - When an object is selected, it takes these attributes.
+#
+# Given these states, we can set the attributes of the widgets in each of
+# these states using the following directives.
+#
+# fg - Sets the foreground color of a widget.
+# fg - Sets the background color of a widget.
+# bg_pixmap - Sets the background of a widget to a tiled pixmap.
+# font - Sets the font to be used with the given widget.
+#
+
+style "gcStocks"
+{
+ # Redefine used stock items. Each entry contains the stock item
+ # name and the file name (it should be in the same directory as
+ # this file.
+ stock["gtk-preferences"] =
+ {
+ {"preferences.png"}
+ }
+ stock["gtk-properties"] =
+ {
+ {"properties.png"}
+ }
+ stock["gtk-find"] =
+ {
+ {"find.png"}
+ }
+ stock["gtk-new"] =
+ {
+ {"new.png"}
+ }
+ stock["gtk-home"] =
+ {
+ {"home.png"}
+ }
+ stock["gtk-save"] =
+ {
+ {"save.png"}
+ }
+ stock["gtk-save-as"] =
+ {
+ {"saveas.png"}
+ }
+ stock["gtk-open"] =
+ {
+ {"open.png"}
+ }
+ stock["gtk-directory"] =
+ {
+ {"paths.png"}
+ }
+ stock["gtk-refresh"] =
+ {
+ {"refresh.png"}
+ }
+ stock["gtk-select-color"] =
+ {
+ {"display.png"}
+ }
+ stock["gtk-execute"] =
+ {
+ {"tonight.png"}
+ }
+ stock["gtk-quit"] =
+ {
+ {"quit.png"}
+ }
+ stock["gtk-help"] =
+ {
+ {"help.png"}
+ }
+ stock["gtk-delete"] =
+ {
+ {"delete.png"}
+ }
+ stock["gtk-ok"] =
+ {
+ {"ok.png"}
+ }
+ stock["gtk-yes"] =
+ {
+ {"ok.png"}
+ }
+ stock["gtk-cancel"] =
+ {
+ {"cancel.png"}
+ }
+ stock["gtk-no"] =
+ {
+ {"cancel.png"}
+ }
+ stock["gtk-network"] =
+ {
+ {"internet.png"}
+ }
+ stock["gtk-clear"] =
+ {
+ {"clear.png"}
+ }
+ stock["gtk-convert"] =
+ {
+ {"import.png"}
+ }
+ stock["gtk-paste"] =
+ {
+ {"export.png"}
+ }
+ stock["gtk-cdrom"] =
+ {
+ {"cdrom.png"}
+ }
+ stock["gtk-harddisk"] =
+ {
+ {"harddisk.png"}
+ }
+ stock["gtk-add"] =
+ {
+ {"add.png"}
+ }
+ stock["gtk-remove"] =
+ {
+ {"remove.png"}
+ }
+ stock["gtk-sort-descending"] =
+ {
+ {"sortdown.png"}
+ }
+ stock["gtk-sort-ascending"] =
+ {
+ {"sortup.png"}
+ }
+ stock["gtk-go-up"] =
+ {
+ {"arrowup.png"}
+ }
+ stock["gtk-go-down"] =
+ {
+ {"arrowdown.png"}
+ }
+ stock["gtk-go-back"] =
+ {
+ {"arrowleft.png"}
+ }
+ stock["gtk-go-forward"] =
+ {
+ {"arrowright.png"}
+ }
+ stock["gtk-jump-to"] =
+ {
+ {"sortdown.png"}
+ }
+}
+
+# Default theme that will use as a base for other ones
+style "gcDefault" = "gcStocks"
+{
+ # Menu bar shadows drawn around it
+ GtkMenuBar::shadow_type = GTK_SHADOW_ETCHED_IN
+ # Tool bar shadows drawn around it
+ GtkToolbar::shadow_type = GTK_SHADOW_ETCHED_IN
+ # Frame bar shadows drawn around it
+ GtkFrame::shadow_type = GTK_SHADOW_ETCHED_IN
+ # Notebook shadows drawn around it
+ GtkNotebook::shadow_type = GTK_SHADOW_ETCHED_IN
+ # How toolbar buttons should be displayed
+ GtkToolbar::button_relief = GTK_RELIEF_NONE
+ # Background color for even rows in lists
+ GtkTreeView::even_row_color = "#ffffff"
+ # Background color for odd rows in lists
+ GtkTreeView::odd_row_color = "#f0f0f0"
+ # Sized for the handle used to resize the panel
+ GtkPaned::handle_size = 8
+ xthickness = 2
+ ythickness = 2
+
+ # Define default background colors for all states
+ bg[NORMAL] = "#f0f0f0"
+ bg[PRELIGHT] = "#999999"
+ bg[ACTIVE] = "#999999"
+ bg[INSENSITIVE] = "#f0f0f0"
+ bg[SELECTED] = "#999999"
+
+ # Define default foreground colors for all states
+ fg[NORMAL] = "#000000"
+ fg[PRELIGHT] = "#000000"
+ fg[ACTIVE] = "#000000"
+ fg[INSENSITIVE] = "#ffffff"
+ fg[SELECTED] = "#ffffff"
+
+ # Define default text (in edit boxes) colors for all states
+ text[SELECTED] = "#000000"
+
+ # Define default background (in edit boxes) colors for all states
+ base[NORMAL] = "#ffffff"
+ base[ACTIVE] = "#d3d3d3"
+ base[SELECTED] = "#d3d3d3"
+ base[PRELIGHT] = "#d3d3d3"
+ base[INSENSITIVE] = "#ffffff"
+
+ # This engine is used to replace various widgets with pictures
+ engine "pixmap"
+ {
+ # Will replace all boxes with this picture
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ file = "box.png"
+ border = { 1,1,1,1 }
+ stretch = TRUE
+ }
+ # Will replace all shadows with this picture
+ image
+ {
+ function = SHADOW
+ recolorable = TRUE
+ file = "box.png"
+ border = { 1,1,1,1 }
+ stretch = TRUE
+ }
+
+ # Replaces all the arrows used in widgets with these pictures.
+ image
+ {
+ function = ARROW
+ recolorable = TRUE
+ overlay_file = "arrowup.png"
+ overlay_border = { 0, 0, 0, 0 }
+ overlay_stretch = FALSE
+ arrow_direction = UP
+ }
+ image
+ {
+ function = ARROW
+ recolorable = TRUE
+ overlay_file = "arrowdown.png"
+ overlay_border = { 0, 0, 0, 0 }
+ overlay_stretch = FALSE
+ arrow_direction = DOWN
+ }
+ image
+ {
+ function = ARROW
+ recolorable = TRUE
+ overlay_file = "arrowleft.png"
+ overlay_border = { 0, 0, 0, 0 }
+ overlay_stretch = FALSE
+ arrow_direction = LEFT
+ }
+ image
+ {
+ function = ARROW
+ recolorable = TRUE
+ overlay_file = "arrowright.png"
+ overlay_border = { 0, 0, 0, 0 }
+ overlay_stretch = FALSE
+ arrow_direction = RIGHT
+ }
+
+ }
+
+}
+# Used for menu bar
+style "gcMenubar" = "gcDefault"
+{
+ bg[NORMAL] = "#f0f0f0"
+}
+# Used for tool bar
+style "gcToolbar" = "gcDefault"
+{
+ bg[NORMAL] = "#d7d7ed"
+}
+# Used for tool bar buttons
+style "gcToolbarButton" = "gcDefault"
+{
+ bg[PRELIGHT] = "#d7d7ed"
+ bg[ACTIVE] = "#d3d3d3"
+ bg[NORMAL] = "#d7d7ed"
+ engine "pixmap"
+ {
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = PRELIGHT
+ shadow = OUT
+ file = "box.png"
+ border = {1, 1, 1, 1}
+ stretch = TRUE
+ }
+ }
+}
+style "gcToolbarToggleButton" = "toolbarButton"
+{
+ bg[PRELIGHT] = "#e7e7ff"
+}
+# Used for all displayed buttons
+style "gcButton" = "gcDefault"
+{
+ fg[ACTIVE] = "#000000"
+
+ # Different pictures for different states
+ engine "pixmap"
+ {
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = NORMAL
+ shadow = OUT
+ file = "box2.png"
+ border = {4, 4, 3, 3}
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = PRELIGHT
+ shadow = IN
+ file = "box3.png"
+ border = {4, 4, 3, 3}
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = PRELIGHT
+ shadow = OUT
+ file = "box3.png"
+ border = {4, 4, 3, 3}
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = ACTIVE
+ shadow = IN
+ file = "active.png"
+ border = {4, 4, 3, 3}
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = SELECTED
+ shadow = IN
+ file = "active.png"
+ border = {4, 4, 3, 3}
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = INSENSITIVE
+ shadow = OUT
+ file = "active.png"
+ border = {4, 4, 3, 3}
+ stretch = TRUE
+ }
+ }
+}
+style "gcCheckButton" = "gcButton"
+{
+ fg[PRELIGHT] = "#000000"
+ fg[NORMAL] = "#000000"
+ fg[ACTIVE] = "#000000"
+ fg[SELECTED] = "#000000"
+
+ bg[PRELIGHT] = "#d3d3d3"
+
+ # Use defined pictures for check boxes
+ engine "pixmap"
+ {
+ image
+ {
+ function = CHECK
+ recolorable = TRUE
+ shadow = OUT
+ overlay_file = "unchecked.png"
+ overlay_stretch = FALSE
+ }
+ image
+ {
+ function = CHECK
+ recolorable = TRUE
+ shadow = IN
+ overlay_file = "checked.png"
+ overlay_stretch = FALSE
+ }
+ }
+}
+
+# For radio button
+style "gcRadioButton" = "gcButton"
+{
+ fg[PRELIGHT] = "#2e3766"
+ fg[NORMAL] = "#732c7c"
+ fg[ACTIVE] = "#732c7c"
+ fg[SELECTED] = "#732c7c"
+
+ bg[PRELIGHT] = "#cccce5"
+
+ # Use defined pictures for check boxes
+ engine "pixmap"
+ {
+ image
+ {
+ function = OPTION
+ recolorable = TRUE
+ shadow = OUT
+ overlay_file = "radiounchecked.png"
+ overlay_stretch = FALSE
+ }
+ image
+ {
+ function = OPTION
+ recolorable = TRUE
+ shadow = IN
+ overlay_file = "radiochecked.png"
+ overlay_stretch = FALSE
+ }
+ image
+ {
+ function = FLAT_BOX
+ recolorable = TRUE
+ file = "box.png"
+ border = {0,0,0,0}
+ stretch = TRUE
+ }
+ }
+}
+
+style "gcLabel" = "gcDefault"
+{
+ fg[NORMAL] = "#000000"
+ font_name = "Sans Bold"
+}
+# Notebooks are defined with this style
+style "gcTabs" = "gcDefault"
+{
+ bg[NORMAL] = "#f0f0f0"
+ #bg[ACTIVE] = "#f0f0f0"
+ bg[ACTIVE] = "#f0f0f0"
+ fg[ACTIVE] = "#999999"
+
+ engine "pixmap"
+ {
+ # top background tabs
+ image
+ {
+ function = EXTENSION
+ state = ACTIVE
+ gap_side = BOTTOM
+ file = "box2.png"
+ border = {2,2,2,2}
+ stretch = TRUE
+ }
+ # top foreground tab
+ image
+ {
+ function = EXTENSION
+ gap_side = BOTTOM
+ file = "box2.png"
+ border = {2,2,2,2}
+ stretch = TRUE
+ }
+ # left background tabs
+ image
+ {
+ function = EXTENSION
+ state = ACTIVE
+ gap_side = RIGHT
+ file = "active.png"
+ border = {0,0,0,0}
+ stretch = TRUE
+ }
+ # left foreground tab
+ image
+ {
+ function = EXTENSION
+ gap_side = RIGHT
+ file = "vertical.png"
+ border = {2,2,0,0}
+ stretch = TRUE
+ }
+
+ # tabs on top
+ image
+ {
+ function = BOX_GAP
+ gap_side = TOP
+ file = "tab_corner.png"
+ border = {1,1,1,1}
+ stretch = TRUE
+ }
+ # tabs on left
+ image
+ {
+ function = BOX_GAP
+ gap_side = LEFT
+ file = "tab_corner.png"
+ border = {1,1,1,1}
+ stretch = TRUE
+ }
+ }
+}
+style "gcFrame" = "gcDefault"
+{
+ bg[INSENSITIVE] = "#f3f3f3"
+ bg[NORMAL] = "#999999"
+ bg[ACTIVE] = "#f3f3f3"
+ bg[SELECTED] = "#f3f3f3"
+ bg[PRELIGHT] = "#f3f3f3"
+ # Remove all global theme definition
+ engine ""
+ {
+ }
+}
+# Redefine horizontal scrollbars
+style "gcHscroll" = "gcFrame"
+{
+ engine "pixmap"
+ {
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = NORMAL
+ shadow = OUT
+ file = "horizontal.png"
+ border = {2, 2, 2, 2}
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = PRELIGHT
+ shadow = OUT
+ file = "horizontal_hover.png"
+ border = {2, 2, 2, 2}
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = ACTIVE
+ shadow = IN
+ file = "bghonrizontalscroll.png"
+ border = {4, 4, 4, 4}
+ stretch = TRUE
+ }
+ }
+}
+# Redefine vertical scrollbars
+style "gcVscroll" = "gcFrame"
+{
+ engine "pixmap"
+ {
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = NORMAL
+ shadow = OUT
+ file = "vertical.png"
+ border = {2, 2, 2, 2}
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = PRELIGHT
+ shadow = OUT
+ file = "vertical_hover.png"
+ border = {2, 2, 2, 2}
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = ACTIVE
+ shadow = IN
+ file = "bgverticalscroll.png"
+ border = {0, 0, 0, 0}
+ stretch = TRUE
+ }
+ }
+}
+# Used for lists
+style "gcTreeView" = "default"
+{
+ text[NORMAL] = "#000000"
+ text[SELECTED] = "#000000"
+ text[ACTIVE] = "#000000"
+ text[INSENSITIVE] = "#000000"
+ text[PRELIGHT] = "#000000"
+ base[NORMAL] = "#ffffff"
+ base[SELECTED] = "#d3d3d3"
+ base[ACTIVE] = "#ffffff"
+ base[INSENSITIVE] = "#ffffff"
+ base[PRELIGHT] = "#ffffff"
+}
+# Used for spin buttons
+style "gcSpin" = "default"
+{
+ engine "pixmap"
+ {
+ image
+ {
+ function = ARROW
+ recolorable = TRUE
+ overlay_file = "spinup.png"
+ overlay_border = { 0, 0, 0, 0 }
+ overlay_stretch = FALSE
+ arrow_direction = UP
+ }
+ image
+ {
+ function = ARROW
+ recolorable = TRUE
+ overlay_file = "spindown.png"
+ overlay_border = { 0, 0, 0, 0 }
+ overlay_stretch = FALSE
+ arrow_direction = DOWN
+ }
+
+ }
+}
+
+
+style "gctooltips" = "default"
+{
+ bg[NORMAL] = "#ffffdc"
+}
+
+
+
+#For sliders
+style "gcSlider" = "default"
+{
+ engine "pixmap" {
+ # TROUGH NORMAL
+ image {
+ function = BOX
+ recolorable = FALSE
+ detail = "trough"
+ file = "box.png"
+ border = {1,1,1,1}
+ stretch = TRUE
+ orientation = HORIZONTAL
+ }
+ # SLIDER NORMAL
+ image {
+ function = SLIDER
+ recolorable = FALSE
+ state = NORMAL
+ file = "box2.png"
+ border = {2,2,2,2}
+ stretch = TRUE
+ orientation = HORIZONTAL
+ }
+ # SLIDER PRELIGHT
+ image {
+ function = SLIDER
+ recolorable = FALSE
+ state = PRELIGHT
+ file = "box3.png"
+ border = {2,2,2,2}
+ stretch = TRUE
+ orientation = HORIZONTAL
+ }
+ # SLIDER INSENSITIVE
+ image {
+ function = SLIDER
+ recolorable = FALSE
+ state = INSENSITIVE
+ file = "active.png"
+ border = {0,0,0,0}
+ stretch = TRUE
+ orientation = HORIZONTAL
+ }
+ }
+}
+
+# Associates previously defined styles to widgets
+
+# Default rule
+widget "*" style "gcDefault"
+
+widget "*GCMenubar" style "gcMenubar"
+widget "*GCToolbar" style "gcToolbar"
+widget "*GCToolbar.*GtkButton" style : highest "gcToolbarButton"
+widget "*GCToolbar.*GtkToggleButton" style "gcToolbarToggleButton"
+class "GtkImage" style "gcStocks"
+class "GtkButton" style : highest "gcButton"
+widget "*GtkButton.*" style : highest "gcButton"
+class "*Scale*" style : highest "gcSlider"
+widget "*GCMoviesTextList" style : highest "gcTreeView"
+widget "*GCMoviesDetailsList" style : highest "gcTreeView"
+widget "*GtkTreeView.*GtkButton" style :highest "gcButton"
+class "GtkCheckButton" style : highest "gcCheckButton"
+class "GtkCheckMenuItem" style : highest "gcCheckButton"
+widget "*GtkCheckButton.*" style : highest "gcCheckButton"
+class "GtkRadioButton" style : highest "gcRadioButton"
+class "GtkRadioMenuItem" style : highest "gcRadioButton"
+class "GtkPaned" style "gcFrame"
+class "GtkFrame" style : highest "gcFrame"
+class "GtkNotebook" style : highest "gcTabs"
+widget "*GCInfoTabs.*GtkLabel" style "gcLabel"
+class "GtkHScrollbar" style : highest "gcHscroll"
+class "GtkVScrollbar" style : highest "gcVscroll"
+class "GtkSpinButton" style : highest "gcSpin"
+widget "gtk-tooltips" style "gctooltips" \ No newline at end of file
diff --git a/share/gcstar/style/kde/gtkrcold b/share/gcstar/style/kde/gtkrcold
new file mode 100644
index 0000000..2c50492
--- /dev/null
+++ b/share/gcstar/style/kde/gtkrcold
@@ -0,0 +1,253 @@
+style "gcStocks"
+{
+ # Redefine used stock items. Each entry contains the stock item
+ # name and the file name (it should be in the same directory as
+ # this file.
+ stock["gtk-preferences"] =
+ {
+ {"preferences.png"}
+ }
+ stock["gtk-properties"] =
+ {
+ {"properties.png"}
+ }
+ stock["gtk-find"] =
+ {
+ {"find.png"}
+ }
+ stock["gtk-new"] =
+ {
+ {"new.png"}
+ }
+ stock["gtk-home"] =
+ {
+ {"home.png"}
+ }
+ stock["gtk-save"] =
+ {
+ {"save.png"}
+ }
+ stock["gtk-save-as"] =
+ {
+ {"saveas.png"}
+ }
+ stock["gtk-open"] =
+ {
+ {"open.png"}
+ }
+ stock["gtk-directory"] =
+ {
+ {"paths.png"}
+ }
+ stock["gtk-refresh"] =
+ {
+ {"refresh.png"}
+ }
+ stock["gtk-select-color"] =
+ {
+ {"display.png"}
+ }
+ stock["gtk-execute"] =
+ {
+ {"tonight.png"}
+ }
+ stock["gtk-quit"] =
+ {
+ {"quit.png"}
+ }
+ stock["gtk-help"] =
+ {
+ {"help.png"}
+ }
+ stock["gtk-delete"] =
+ {
+ {"delete.png"}
+ }
+ stock["gtk-ok"] =
+ {
+ {"ok.png"}
+ }
+ stock["gtk-yes"] =
+ {
+ {"ok.png"}
+ }
+ stock["gtk-cancel"] =
+ {
+ {"cancel.png"}
+ }
+ stock["gtk-no"] =
+ {
+ {"cancel.png"}
+ }
+ stock["gtk-network"] =
+ {
+ {"internet.png"}
+ }
+ stock["gtk-clear"] =
+ {
+ {"clear.png"}
+ }
+ stock["gtk-convert"] =
+ {
+ {"import.png"}
+ }
+ stock["gtk-paste"] =
+ {
+ {"export.png"}
+ }
+ stock["gtk-cdrom"] =
+ {
+ {"cdrom.png"}
+ }
+ stock["gtk-harddisk"] =
+ {
+ {"harddisk.png"}
+ }
+ stock["gtk-add"] =
+ {
+ {"add.png"}
+ }
+ stock["gtk-remove"] =
+ {
+ {"remove.png"}
+ }
+ stock["gtk-sort-descending"] =
+ {
+ {"sortdown.png"}
+ }
+ stock["gtk-sort-ascending"] =
+ {
+ {"sortup.png"}
+ }
+ stock["gtk-go-up"] =
+ {
+ {"arrowup.png"}
+ }
+ stock["gtk-go-down"] =
+ {
+ {"arrowdown.png"}
+ }
+ stock["gtk-go-back"] =
+ {
+ {"arrowleft.png"}
+ }
+ stock["gtk-go-forward"] =
+ {
+ {"arrowright.png"}
+ }
+}
+
+style "galaxy-default"
+{
+ GtkButton::default_border = {1, 2, 1, 2}
+ GtkButton::default_outside_border = {1, 2, 1, 2}
+ GtkWidget::interior_focus = 1
+ GtkButton::default_spacing = 6
+ GtkCheckButton::indicator_size = 15
+ GtkPaned::handle_size = 6
+ GtkRange::trough_border = 0
+ GtkRange::slider_width = 15
+ GtkRange::stepper_size = 15
+ GtkRange::stepper_spacing = 0
+ GtkScrollbar::min_slider_length = 20
+ GtkTreeView::even_row_color = "#FFFFFF"
+ GtkTreeView::odd_row_color = "#EFEFEF"
+
+ fg[NORMAL] = "#000000"
+ fg[ACTIVE] = "#000000"
+ fg[INSENSITIVE] = "#949694"
+ fg[PRELIGHT] = "#000000"
+ fg[SELECTED] = "#FFFFFF"
+
+ bg[ACTIVE] = "#CECECE"
+ bg[NORMAL] = "#E6E7E6"
+ bg[INSENSITIVE] = "#CECECE"
+ bg[PRELIGHT] = "#EFEFEF"
+ bg[SELECTED] = "#21459C"
+
+ base[NORMAL] = "#ffffff"
+ base[ACTIVE] = "#7382BD"
+ base[INSENSITIVE] = "#E6E7E6"
+ base[PRELIGHT] = "#EFEFEF"
+ base[SELECTED] = "#2145AC"
+
+ text[NORMAL] = "#000000"
+ text[ACTIVE] = "#ffffff"
+ text[PRELIGHT] = "#ffffff"
+ text[SELECTED] = "#ffffff"
+ text[INSENSITIVE] = "#949694"
+
+ engine "galaxy"
+ {
+ }
+}
+
+
+style "galaxy-button" = "galaxy-default"
+{
+ xthickness = 4
+ ythickness = 4
+}
+
+style "galaxy-thin" = "galaxy-default"
+{
+ xthickness = 1
+ ythickness = 1
+}
+
+style "galaxy-verythin" = "galaxy-thin"
+{
+ xthickness = 0
+ ythickness = 0
+}
+
+
+style "galaxy-menu" = "galaxy-default"
+{
+ fg[PRELIGHT] = "#ffffff"
+}
+
+style "galaxy-bar" = "galaxy-menu"
+{
+ xthickness = 1
+ ythickness = 1
+}
+
+
+style "galaxy-tasklist" = "galaxy-default"
+{
+ xthickness = 2
+ ythickness = 2
+ GtkWidget::focus-line-width = 0
+ GtkWidget::focus-padding = 0
+}
+
+style "galaxy-comboboxtext" = "galaxy-default"
+{
+ text[PRELIGHT] = "#000000"
+}
+
+style "galaxy-tooltips" = "galaxy-default"
+{
+ bg[NORMAL] = "#ffffdc"
+}
+
+class "GtkWidget" style "galaxy-default"
+class "ECanvas" style "galaxy-thin"
+class "GtkButton" style "galaxy-button"
+widget_class "*Notebook.GtkHBox.GtkButton" style "galaxy-verythin"
+class "EComboButton" style "galaxy-thin"
+widget_class "*GtkComboBox.GtkCellView" style "galaxy-comboboxtext"
+widget_class "*.EShortcutsView.GtkButton" style "galaxy-thin"
+widget_class "*.GtkHTMLEmbedded.*GtkButton" style "galaxy-thin"
+widget_class "*Tree*GtkButton" style "galaxy-verythin"
+widget_class "*List*GtkButton" style "galaxy-verythin"
+widget_class "*EphyBookmarksEditor*GtkButton" style "galaxy-verythin"
+class "GtkProgressBar" style "galaxy-bar"
+widget_class "*MenuItem*" style "galaxy-menu"
+widget_class "*.PanelApplet.*" style "galaxy-tasklist"
+widget "*.tasklist-button" style "galaxy-tasklist"
+class "GtkNotebook" style "galaxy-thin"
+widget "gtk-tooltips" style "galaxy-tooltips"
+widget_class "*GtkPathBar*" style "galaxy-thin"
+class "GtkImage" style "gcStocks"
diff --git a/share/gcstar/style/kde/harddisk.png b/share/gcstar/style/kde/harddisk.png
new file mode 100644
index 0000000..739f4cf
--- /dev/null
+++ b/share/gcstar/style/kde/harddisk.png
Binary files differ
diff --git a/share/gcstar/style/kde/help.png b/share/gcstar/style/kde/help.png
new file mode 100644
index 0000000..93bf094
--- /dev/null
+++ b/share/gcstar/style/kde/help.png
Binary files differ
diff --git a/share/gcstar/style/kde/home.png b/share/gcstar/style/kde/home.png
new file mode 100644
index 0000000..6790272
--- /dev/null
+++ b/share/gcstar/style/kde/home.png
Binary files differ
diff --git a/share/gcstar/style/kde/horizontal.png b/share/gcstar/style/kde/horizontal.png
new file mode 100644
index 0000000..234c021
--- /dev/null
+++ b/share/gcstar/style/kde/horizontal.png
Binary files differ
diff --git a/share/gcstar/style/kde/horizontal_hover.png b/share/gcstar/style/kde/horizontal_hover.png
new file mode 100644
index 0000000..74128d8
--- /dev/null
+++ b/share/gcstar/style/kde/horizontal_hover.png
Binary files differ
diff --git a/share/gcstar/style/kde/import.png b/share/gcstar/style/kde/import.png
new file mode 100644
index 0000000..58378b1
--- /dev/null
+++ b/share/gcstar/style/kde/import.png
Binary files differ
diff --git a/share/gcstar/style/kde/internet.png b/share/gcstar/style/kde/internet.png
new file mode 100644
index 0000000..3f7323c
--- /dev/null
+++ b/share/gcstar/style/kde/internet.png
Binary files differ
diff --git a/share/gcstar/style/kde/khelpcenter.png b/share/gcstar/style/kde/khelpcenter.png
new file mode 100644
index 0000000..24582cf
--- /dev/null
+++ b/share/gcstar/style/kde/khelpcenter.png
Binary files differ
diff --git a/share/gcstar/style/kde/lend.png b/share/gcstar/style/kde/lend.png
new file mode 100644
index 0000000..303d8b3
--- /dev/null
+++ b/share/gcstar/style/kde/lend.png
Binary files differ
diff --git a/share/gcstar/style/kde/new.png b/share/gcstar/style/kde/new.png
new file mode 100644
index 0000000..feba5e4
--- /dev/null
+++ b/share/gcstar/style/kde/new.png
Binary files differ
diff --git a/share/gcstar/style/kde/ok.png b/share/gcstar/style/kde/ok.png
new file mode 100644
index 0000000..230de53
--- /dev/null
+++ b/share/gcstar/style/kde/ok.png
Binary files differ
diff --git a/share/gcstar/style/kde/open.png b/share/gcstar/style/kde/open.png
new file mode 100644
index 0000000..503a004
--- /dev/null
+++ b/share/gcstar/style/kde/open.png
Binary files differ
diff --git a/share/gcstar/style/kde/paths.png b/share/gcstar/style/kde/paths.png
new file mode 100644
index 0000000..67984a2
--- /dev/null
+++ b/share/gcstar/style/kde/paths.png
Binary files differ
diff --git a/share/gcstar/style/kde/preferences.png b/share/gcstar/style/kde/preferences.png
new file mode 100644
index 0000000..4f5e273
--- /dev/null
+++ b/share/gcstar/style/kde/preferences.png
Binary files differ
diff --git a/share/gcstar/style/kde/properties.png b/share/gcstar/style/kde/properties.png
new file mode 100644
index 0000000..02bca4f
--- /dev/null
+++ b/share/gcstar/style/kde/properties.png
Binary files differ
diff --git a/share/gcstar/style/kde/quit.png b/share/gcstar/style/kde/quit.png
new file mode 100644
index 0000000..86d9c47
--- /dev/null
+++ b/share/gcstar/style/kde/quit.png
Binary files differ
diff --git a/share/gcstar/style/kde/radiochecked.png b/share/gcstar/style/kde/radiochecked.png
new file mode 100644
index 0000000..722f88f
--- /dev/null
+++ b/share/gcstar/style/kde/radiochecked.png
Binary files differ
diff --git a/share/gcstar/style/kde/radiounchecked.png b/share/gcstar/style/kde/radiounchecked.png
new file mode 100644
index 0000000..33c732b
--- /dev/null
+++ b/share/gcstar/style/kde/radiounchecked.png
Binary files differ
diff --git a/share/gcstar/style/kde/refresh.png b/share/gcstar/style/kde/refresh.png
new file mode 100644
index 0000000..b987c58
--- /dev/null
+++ b/share/gcstar/style/kde/refresh.png
Binary files differ
diff --git a/share/gcstar/style/kde/remove.png b/share/gcstar/style/kde/remove.png
new file mode 100644
index 0000000..342ac95
--- /dev/null
+++ b/share/gcstar/style/kde/remove.png
Binary files differ
diff --git a/share/gcstar/style/kde/save.png b/share/gcstar/style/kde/save.png
new file mode 100644
index 0000000..dd00abd
--- /dev/null
+++ b/share/gcstar/style/kde/save.png
Binary files differ
diff --git a/share/gcstar/style/kde/saveas.png b/share/gcstar/style/kde/saveas.png
new file mode 100644
index 0000000..61a080e
--- /dev/null
+++ b/share/gcstar/style/kde/saveas.png
Binary files differ
diff --git a/share/gcstar/style/kde/sortdown.png b/share/gcstar/style/kde/sortdown.png
new file mode 100644
index 0000000..cd92e2e
--- /dev/null
+++ b/share/gcstar/style/kde/sortdown.png
Binary files differ
diff --git a/share/gcstar/style/kde/sortup.png b/share/gcstar/style/kde/sortup.png
new file mode 100644
index 0000000..a5b0944
--- /dev/null
+++ b/share/gcstar/style/kde/sortup.png
Binary files differ
diff --git a/share/gcstar/style/kde/spindown.png b/share/gcstar/style/kde/spindown.png
new file mode 100644
index 0000000..44a782f
--- /dev/null
+++ b/share/gcstar/style/kde/spindown.png
Binary files differ
diff --git a/share/gcstar/style/kde/spinup.png b/share/gcstar/style/kde/spinup.png
new file mode 100644
index 0000000..f4cc4c8
--- /dev/null
+++ b/share/gcstar/style/kde/spinup.png
Binary files differ
diff --git a/share/gcstar/style/kde/tab_corner.png b/share/gcstar/style/kde/tab_corner.png
new file mode 100644
index 0000000..d2fb07d
--- /dev/null
+++ b/share/gcstar/style/kde/tab_corner.png
Binary files differ
diff --git a/share/gcstar/style/kde/tonight.png b/share/gcstar/style/kde/tonight.png
new file mode 100644
index 0000000..9ae5c96
--- /dev/null
+++ b/share/gcstar/style/kde/tonight.png
Binary files differ
diff --git a/share/gcstar/style/kde/unchecked.png b/share/gcstar/style/kde/unchecked.png
new file mode 100644
index 0000000..8ea6c45
--- /dev/null
+++ b/share/gcstar/style/kde/unchecked.png
Binary files differ
diff --git a/share/gcstar/style/kde/vertical.png b/share/gcstar/style/kde/vertical.png
new file mode 100644
index 0000000..721e6f9
--- /dev/null
+++ b/share/gcstar/style/kde/vertical.png
Binary files differ
diff --git a/share/gcstar/style/kde/vertical_hover.png b/share/gcstar/style/kde/vertical_hover.png
new file mode 100644
index 0000000..e390e82
--- /dev/null
+++ b/share/gcstar/style/kde/vertical_hover.png
Binary files differ
diff --git a/share/gcstar/xml_models/GCfilms/Ant_Movie_Catalog b/share/gcstar/xml_models/GCfilms/Ant_Movie_Catalog
new file mode 100644
index 0000000..ba5926e
--- /dev/null
+++ b/share/gcstar/xml_models/GCfilms/Ant_Movie_Catalog
@@ -0,0 +1,31 @@
+[HEADER]
+<?xml version="1.0" encoding="UTF-8"?>
+<AntMovieCatalog Format="33" Version="3.4.3 (2004-22-12)" Date="23/03/2005 14:12:54">
+ <Catalog>
+ <Properties/>
+ <Contents>
+[/HEADER]
+[ITEM]
+<Movie
+ Number="${id}"
+ Date="${data}"
+ Rating="${rating}"
+ OriginalTitle="${original}"
+ TranslatedTitle="${title}"
+ Director="${director}"
+ Country="${country}"
+ Category="${type}"
+ Year="${year}"
+ Length="${length}"
+ Actors="${actors}"
+ URL="${url}"
+ Description="${synopsis}"
+ Comments="${comment}"
+ Picture="${image}"
+ Checked="True"/>
+[/ITEM]
+[FOOTER]
+ </Contents>
+ </Catalog>
+</AntMovieCatalog>
+[/FOOTER] \ No newline at end of file
diff --git a/share/gcstar/xml_models/GCfilms/DVDProfiler b/share/gcstar/xml_models/GCfilms/DVDProfiler
new file mode 100644
index 0000000..d00b3cf
--- /dev/null
+++ b/share/gcstar/xml_models/GCfilms/DVDProfiler
@@ -0,0 +1,151 @@
+[HEADER]
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- DVD Profiler Version 2.3.1 Collection Export -->
+<Collection>
+[/HEADER]
+[ITEM]
+<DVD>
+ <ID>${id}</ID>
+ <UPC></UPC>
+ <ProfileTimestamp></ProfileTimestamp>
+ <Title>${title}</Title>
+ <SortTitle>${title}</SortTitle>
+ <Description></Description>
+ <Regions></Regions>
+ <CollectionType></CollectionType>
+ <CollectionNumber></CollectionNumber>
+ <Locks>
+ <Entire>False</Entire>
+ <Covers>False</Covers>
+ <Title>False</Title>
+ <Credits>False</Credits>
+ <DiscInformation>False</DiscInformation>
+ <Overview>False</Overview>
+ <Regions>False</Regions>
+ <AudioSubtitles>False</AudioSubtitles>
+ <Genres>False</Genres>
+ <SRP>False</SRP>
+ <Studios>False</Studios>
+ </Locks>
+ <Rating>U</Rating>
+ <ProductionYear>${year}</ProductionYear>
+ <Released>${date}</Released>
+ <RunningTime>${length}</RunningTime>
+ <CaseType></CaseType>
+ <Genres>
+ [LOOP genre]
+ <Genre>$$</Genre>
+ [/LOOP]
+ </Genres>
+ <Format>
+ <FormatAspectRatio></FormatAspectRatio>
+ <FormatVideoStandard></FormatVideoStandard>
+ <FormatLetterBox></FormatLetterBox>
+ <FormatPanAndScan></FormatPanAndScan>
+ <FormatFullFrame></FormatFullFrame>
+ <Format16X9></Format16X9>
+ <FormatDualSided></FormatDualSided>
+ <FormatDualLayered></FormatDualLayered>
+ <FormatFlipper></FormatFlipper>
+ </Format>
+ <Features>
+ <FeatureSceneAccess>True</FeatureSceneAccess>
+ <FeatureCommentary>True</FeatureCommentary>
+ <FeatureTrailer>False</FeatureTrailer>
+ <FeaturePhotoGallery>False</FeaturePhotoGallery>
+ <FeatureDeletedScenes>False</FeatureDeletedScenes>
+ <FeatureMakingOf>True</FeatureMakingOf>
+ <FeatureProductionNotes>True</FeatureProductionNotes>
+ <FeatureGame>False</FeatureGame>
+ <FeatureDVDROMContent>True</FeatureDVDROMContent>
+ <FeatureMultiAngle>False</FeatureMultiAngle>
+ <FeatureMusicVideos>False</FeatureMusicVideos>
+ <FeatureClosedCaptioned>False</FeatureClosedCaptioned>
+ <FeatureTHXCertified>False</FeatureTHXCertified>
+ </Features>
+ <Studios>
+ <Studio></Studio>
+ </Studios>
+ <Audio>
+ [LOOP audio]
+ <AudioFormat>
+ <AudioLanguage>$$</AudioLanguage>
+ <AudioCompression></AudioCompression>
+ <AudioChannels></AudioChannels>
+ </AudioFormat>
+ [/LOOP]
+ </Audio>
+ <Subtitles>
+ [LOOP subt]
+ <Subtitle>$$</Subtitle>
+ [/LOOP]
+ </Subtitles>
+ <Actors>
+ [LOOP actors]
+ [SPLIT value=$$ sep= ]
+ <Actor>
+ <FirstName>$0</FirstName>
+ <LastName>$1$2</LastName>
+ <Role></Role>
+ </Actor>
+ [/SPLIT]
+ [/LOOP]
+ </Actors>
+ <Credits>
+ <Credit>
+ [SPLIT value=director sep= ]
+ <FirstName>$0</FirstName>
+ <LastName>$1$2</LastName>
+ <CreditType>Direction</CreditType>
+ <CreditSubtype>Director</CreditSubtype>
+ [/SPLIT]
+ </Credit>
+ </Credits>
+ <Review>
+ <ReviewFilm>${rating}</ReviewFilm>
+ <ReviewVideo></ReviewVideo>
+ <ReviewAudio></ReviewAudio>
+ <ReviewExtras></ReviewExtras>
+ </Review>
+ <SRPInfo>
+ <SRP></SRP>
+ <SRPCurrencyID></SRPCurrencyID>
+ <SRPCurrencyName></SRPCurrencyName>
+ </SRPInfo>
+ <PurchaseInfo>
+ <PurchasePriceInfo>
+ <PurchasePriceCurrencyID></PurchasePriceCurrencyID>
+ <PurchasePriceCurrencyName></PurchasePriceCurrencyName>
+ </PurchasePriceInfo>
+ <PurchaseDate></PurchaseDate>
+ </PurchaseInfo>
+ <Events>
+ [LOOP history]
+ <Event>
+ [SPLIT value=$$ sep=:]
+ <User>
+ <FirstName>$0</FirstName>
+ <LastName></LastName>
+ <PhoneNumber></PhoneNumber>
+ <EmailAddress></EmailAddress>
+ </User>
+ <EventType>Borrowing</EventType>
+ <Timestamp>$2</Timestamp>
+ [/SPLIT]
+ </Event>
+ [/LOOP]
+ </Events>
+ <LoanInfo>
+ <LoanedTo>${borrower}</LoanedTo>
+ <LoanedDue>${lendDate}</LoanedDue>
+ </LoanInfo>
+ <Tags>
+ </Tags>
+ <Overview>${synopsis}</Overview>
+ <EasterEggs></EasterEggs>
+ <LastEdited></LastEdited>
+</DVD>
+[/ITEM]
+[FOOTER]
+</Collection>
+[/FOOTER] \ No newline at end of file
diff --git a/share/gcstar/xslt/applyXSLT.pl b/share/gcstar/xslt/applyXSLT.pl
new file mode 100644
index 0000000..28e83d1
--- /dev/null
+++ b/share/gcstar/xslt/applyXSLT.pl
@@ -0,0 +1,13 @@
+#!/usr/bin/perl
+
+use XML::LibXSLT;
+
+my $xslfile = $ARGV[0];
+my $xmlfile = $ARGV[1];
+
+my $xslt = XML::XSLT->new($xslfile, warnings => 1);
+
+$xslt->transform($xmlfile);
+print $xslt->toString;
+
+$xslt->dispose;
diff --git a/share/gcstar/xslt/createGCSValidator.xsl b/share/gcstar/xslt/createGCSValidator.xsl
new file mode 100644
index 0000000..2df922a
--- /dev/null
+++ b/share/gcstar/xslt/createGCSValidator.xsl
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ Document : ConvertGCMtoXSD.xsl
+ Created on : April 26, 2007, 9:41 PM
+ Version : The first one ;)
+ Author : toroman
+ Description:
+ Transforms GCM into XSD which can validate GCS files.
+-->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">
+
+ <xsl:output method="xml" indent="yes" />
+
+ <xsl:template match="/">
+ <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <xs:complexType name="itemType">
+ <xs:sequence>
+ <xsl:apply-templates select="/collection/fields/field" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="collection">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="information">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="name" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="item" maxOccurs="unbounded" type="itemType" />
+ </xs:sequence>
+ <xs:attribute name="type" type="xs:string" />
+ <xs:attribute name="items" type="xs:integer" />
+ </xs:complexType>
+ </xs:element>
+ </xs:schema>
+ </xsl:template>
+
+ <xsl:template match="/collection/fields/field">
+ <xsl:choose>
+ <xsl:when test="@type='file'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:string" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='number'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:integer" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='options'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:integer" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='age'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:integer" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='short text'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:string" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='image'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:string" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='long text'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:string" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='button'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:string" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='yesno'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:boolean" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='date'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[
+ <xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="\d\d/\d\d/\d\d\d\d" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='single list'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[
+ <xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[">
+ <xs:complexType>
+ <xs:sequence maxOccurs="unbounded">
+ <xs:element name="line" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence minOccurs="1" maxOccurs="1">
+ <xs:element name="col" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='double list'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[
+ <xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[">
+ <xs:complexType>
+ <xs:sequence maxOccurs="unbounded">
+ <xs:element name="line" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence minOccurs="2" maxOccurs="2">
+ <xs:element name="col" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='history text'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:string" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <xsl:text>Unknown Type - this should trigger error on XSD validation! </xsl:text>
+ <xsl:value-of select="@type" />
+ </p><![CDATA[
+ ]]>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/templates/GCExportTemplate.pm b/templates/GCExportTemplate.pm
new file mode 100644
index 0000000..d1ca4c4
--- /dev/null
+++ b/templates/GCExportTemplate.pm
@@ -0,0 +1,264 @@
+# Replace Template with your exporter name.
+# The package name must exactly match the file name (.pm)
+package GCExport::GCExportTemplate;
+
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ # Replace Template with your exporter name
+ # It must be the same name as the one used for file and main package name
+ package GCExport::GCExporterTemplate;
+
+ use base qw(GCExport::GCExportBaseClass);
+
+ # Add your needed use clauses here
+
+ # new
+ # Constructor
+ # Returns reference to current object.
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ # Do your initialization stuff here
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ # getName
+ # Used to create Export menu.
+ # If you need a string that depends on language, do NOT define
+ # this method and provide a member called Name in languages files
+ # Returns a string containing the name.
+ sub getName
+ {
+ my $self = shift;
+
+ # Should return the exporter name as it will be displayed in Export menu.
+
+ return "Template";
+ }
+
+ # getOptions
+ # Used to create export dialog window.
+ # Returns an array with needed options.
+ sub getOptions
+ {
+ my $self = shift;
+
+ # Should return an array of associative arrays.
+ # Here is an example.
+
+ return [
+ {
+ name => 'withJs',
+ type => 'checkBox',
+ label => 'ExportHTMLWithJS',
+ default => '1'
+ },
+
+ {
+ name => 'title',
+ type => 'shortText',
+ label => 'ExportHTMLTitle',
+ default => 'Movies list'
+ },
+
+ ]
+
+ # For each entry, you have to specify:
+ #
+ # - name: A unique name that will be used to retrieve the option value
+ # - type: One out of checkBox, shortText, longText, number, list, fileSelection, colorSelection
+ # - label: a member of lang files (lib/gcstar/GCLang/*.pm) that will be used to display an informative label
+ # - default: Default value (for the first time exporter is used in a session).
+ #
+ # There are other values that are only valid for some types.
+ #
+ # - min: Minimum value allowed (for number only).
+ # - max: Maximum value (for number only).
+ # - height: Height of the widget displayed in pixels (for longText only).
+ # - valuesList: A comma separated list of values to be used (for list only).
+ # - buttonLabel: Label for a button that will be displayed next to the option
+ # (only for shortText, longText, number, list)
+ # - buttonCallback: Callback to be called when clicking on the button. It will
+ # get button as first parameter while the second one will
+ # a reference to an array containing dialog and option handles.
+ # (only used if buttonLabel is specified).
+
+ # In all processing functions below, values entered by user are accessible through:
+ #
+ # $self->{options}->{name}
+ #
+ # Where name should be replaced with specified name above.
+
+
+ }
+
+ # In there processing functions, you can use options fields specified through getOptions
+ # But there is also some predifined values:
+ #
+ # - $self->{options}->{file} File name used to export data.
+ # - $self->{options}->{collection} File name of the one containing movies list.
+ # - $self->{options}->{collectionDirectory} Directory where movies list file is.
+ # - $self->{options}->{movies} A reference to the array containing the information.
+ # - $self->{options}->{lang} A reference to the hash containing current language translations.
+ # - $self->{options}->{fields} A reference to an array containing fields user choosed
+ # (wantsFieldsSelection must return a true value for this to be used).
+
+ # wantsFieldsSelection
+ # This function lets a plugin decide if it wants the user to specify fields to be used
+ # Returns a true value when fields selection is needed.
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ # needsUTF8
+ # With this method, a plugin may ask the output file to be in UTF-8 mode
+ # Returns a true value when UTF-8 is needed.
+ sub needsUTF8
+ {
+ return 0;
+ }
+
+ # preProcess
+ # Use this function if you need to do special stuff before movies list processing.
+ # Returns nothing
+ sub preProcess
+ {
+ my $self = shift;
+
+ # Your code here
+ }
+
+ # getHeader
+ # Should create the beginning of the exported file.
+ # $number is the total movies number.
+ # Returns a string containing what have to be included on the top of the file.
+ sub getHeader
+ {
+ my ($self, $number) = @_;
+ my $result;
+
+ # Your code here
+ # Append data to $result;
+
+ return $result;
+ }
+
+ # getItem
+ # Called for each movie.
+ # $movie is an associative array containing the movie information. They are:
+ #
+ # - $movie->{title}
+ # - $movie->{date}
+ # - $movie->{year}
+ # - $movie->{time}
+ # - $movie->{director}
+ # - $movie->{country}
+ # - $movie->{age}
+ # - $movie->{type}
+ # - $movie->{image}
+ # - $movie->{original}
+ # - $movie->{actors}
+ # - $movie->{comment}
+ # - $movie->{synopsis}
+ # - $movie->{seen}
+ # - $movie->{number}
+ # - $movie->{rating}
+ # - $movie->{format}
+ # - $movie->{url}
+ # - $movie->{place}
+ # - $movie->{video}
+ # - $movie->{audio}
+ # - $movie->{audioEncoding}
+ # - $movie->{subt}
+ # - $movie->{borrower}
+ # - $movie->{lendDate}
+ # - $movie->{history}
+ #
+ # $number is the movie index
+ # Returns the item string.
+ sub getItem
+ {
+ my ($self, $movie, $number) = @_;
+ my $result;
+
+ # Your code here
+ # Append data to $result;
+
+ return $result;
+ }
+
+ # getFooter
+ # Should create the end of the exported file.
+ # Returns a string containing what have to be included on the end of the file.
+ sub getFooter
+ {
+ my $self = shift;
+ my $result;
+
+ # Your code here
+ # Append data to $result;
+
+ return $result;
+ }
+
+ # postProcess
+ # Called after all processing. Use it if you need to perform extra stuff on the header.
+ # $header is a reference to the header string.
+ # $body is a reference to the content string.
+ sub postProcess
+ {
+ my ($self, $header, $body) = @_;
+
+ # Your code here
+ # As header is a reference, it can be modified on place with $$header
+ # The same for $$body
+ }
+
+ # getEndInfo
+ # Used to display some information to user when export is ended.
+ # To localize your message, use $self->{options}->{lang}.
+ # Returns a string that will be displayed in a message box.
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+
+ # Your code here
+ # Don't do put anything in message if you don't want information to be displayed.
+
+ return $message;
+ }
+}
+
+1; \ No newline at end of file
diff --git a/templates/GCImportTemplate.pm b/templates/GCImportTemplate.pm
new file mode 100644
index 0000000..b0e5e76
--- /dev/null
+++ b/templates/GCImportTemplate.pm
@@ -0,0 +1,212 @@
+# Replace Template with your importer name.
+# The package name must exactly match the file name (.pm)
+package GCImport::GCImportTemplate;
+
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCImport::GCImportBase;
+
+{
+ # Replace Template with your importer name
+ # It must be the same name as the one used for file and main package name
+ package GCImport::GCImporterTemplate;
+
+ use base qw(GCImport::GCImportBaseClass);
+
+ # Add your needed use clauses here
+
+ # new
+ # Constructor
+ # Returns reference to current object.
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ # Do your initialization stuff here
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ # wantsFieldsSelection
+ # This function lets a plugin decide if it wants the user to specify fields to be used
+ # Returns a true value when fields selection is needed.
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ # wantsFileSelection
+ # Some plugins doens't need a file (they can get their information
+ # from a database as an example. This function specify if a file
+ # is needed or not.
+ # Returns true if a file is needed.
+ sub wantsFileSelection
+ {
+ return 1;
+ }
+
+
+ # getName
+ # Used to create Import menu.
+ # If you need a string that depends on language, do NOT define
+ # this method and provide a member called Name in languages files
+ # Returns a string containing the name.
+ sub getName
+ {
+ my $self = shift;
+
+ # Should return the importer name as it will be displayed in Import menu.
+
+ return "Template";
+ }
+
+ # getFilePatterns
+ # Used to add filters in file selection dialog box.
+ # A *.* filter is always added also.
+ # Returns the file as a list of array references.
+ sub getFilePatterns
+ {
+ return (['Description 1', '*.ext1'], ['Description 2', '*.ext2']);
+ }
+
+ # getOptions
+ # Used to create import dialog window.
+ # Returns an array with needed options.
+ sub getOptions
+ {
+ my $self = shift;
+
+ # Should return an array of associative arrays.
+ # Here is an example.
+
+ return [
+ {
+ name => 'withJs',
+ type => 'checkBox',
+ label => 'ImportHTMLWithJS',
+ default => '1'
+ },
+
+ {
+ name => 'title',
+ type => 'shortText',
+ label => 'ImportHTMLTitle',
+ default => 'Movies list'
+ },
+
+ ]
+
+ # For each entry, you have to specify:
+ #
+ # - name: A unique name that will be used to retrieve the option value
+ # - type: One out of checkBox, shortText, longText, number, list, fileSelection, colorSelection
+ # - label: a member of lang files (lib/gcstar/GCLang/*.pm) that will be used to display an informative label
+ # - default: Default value (for the first time exporter is used in a session).
+ #
+ # There are other values that are only valid for some types.
+ #
+ # - min: Minimum value allowed (for number only).
+ # - max: Maximum value (for number only).
+ # - height: Height of the widget displayed in pixels (for longText only).
+ # - valuesList: A comma separated list of values to be used (for list only).
+
+ # In all processing functions below, values entered by user are accessible through:
+ #
+ # $self->{options}->{name}
+ #
+ # Where name should be replaced with specified name above.
+
+
+ }
+
+ # In there processing functions, you can use options fields specified through getOptions
+ # But there is also some predifined values:
+ #
+ # - $self->{options}->{file} File name used to export data.
+ # - $self->{options}->{movies} A reference to the array containing the information.
+ # - $self->{options}->{lang} A reference to the hash containing current language translations.
+
+ # getMoviesArray
+ # Called to generate the movies array.
+ # Each item of this array have to be an associative array with these fields:
+ #
+ # - $movie->{title}
+ # - $movie->{date}
+ # - $movie->{time}
+ # - $movie->{director}
+ # - $movie->{country}
+ # - $movie->{age}
+ # - $movie->{type}
+ # - $movie->{image}
+ # - $movie->{original}
+ # - $movie->{actors}
+ # - $movie->{comment}
+ # - $movie->{synopsis}
+ # - $movie->{seen}
+ # - $movie->{number}
+ # - $movie->{rating}
+ # - $movie->{format}
+ # - $movie->{url}
+ # - $movie->{place}
+ # - $movie->{video}
+ # - $movie->{audio}
+ # - $movie->{subt}
+ # - $movie->{borrower}
+ # - $movie->{lendDate}
+ # - $movie->{history}
+ #
+ # Returns the movies array.
+ sub getMoviesArray
+ {
+ my ($self, $file) = @_;
+ my @result;
+
+ # Your code here
+ # Add movies to results;
+
+ return \@result;
+ }
+
+
+ # getEndInfo
+ # Used to display some information to user when export is ended.
+ # To localize your message, use $self->{options}->{lang}.
+ # Returns a string that will be displayed in a message box.
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+
+ # Your code here
+ # Don't do put anything in message if you don't want information to be displayed.
+
+ return $message;
+ }
+}
+
+1; \ No newline at end of file
diff --git a/templates/GCSiteTemplate.pm b/templates/GCSiteTemplate.pm
new file mode 100644
index 0000000..4bc6038
--- /dev/null
+++ b/templates/GCSiteTemplate.pm
@@ -0,0 +1,271 @@
+#
+# More information here: http://wiki.gcstar.org/en/websites_plugins
+#
+# GCcollection should be replaced with the kind of collection your
+# plugin deals with. e.g. GCfilms, GCgames, GCbooks,...
+
+# Replace SiteTemplate with your plugin name.
+# The package name must exactly match the file name (.pm)
+package GCPlugins::GCcollection::GCSiteTemplate;
+
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar 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.
+#
+# GCstar is distributed in the hope that 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 GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCcollection::GCcollectionCommon;
+
+{
+ # Replace SiteTemplate with your exporter name
+ # It must be the same name as the one used for file and main package name
+ package GCPlugins::GCcollection::GCPluginSiteTemplate;
+
+ use base 'GCPlugins::GCcollection::GCcollectionPluginsBase';
+
+ # getSearchUrl
+ # Used to get the URL that to be used to perform searches.
+ # $word is the query
+ # Returns the full URL.
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ my $url;
+
+ # Your code here
+
+ return $url;
+ }
+
+ # getItemUrl
+ # Used to get the full URL of an item page.
+ # Useful when url on results pages are relative.
+ # $url is the URL as found with a search.
+ # Returns the absolute URL.
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ my $absUrl;
+
+ # Your code here
+
+ return $absUrl;
+ }
+
+ # getCharset
+ # Used to convert charset in web pages.
+ # Returns the charset as specified in pages.
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ # getName
+ # Used to display plugin name in GUI.
+ # Returns the plugin name.
+ sub getName
+ {
+ return "SiteTemplate";
+ }
+
+ # getAuthor
+ # Used to display the plugin author in GUI.
+ # Returns the plugin author name.
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ # getLang
+ # Used to fill in plugin list with user language plugins
+ # Return the language used for this site (2 letters code).
+ sub getLang
+ {
+ return 'EN';
+ }
+ # getExtra
+ # Used if the plugin wants an extra column to be displayed in search results
+ # Return the column title or empty string to hide the column.
+ sub getExtra
+ {
+ return 'Extra';
+ }
+
+ # getNumberPasses
+ # Used to set the number of search "passes" the plugin requires. This defaults to
+ # a single pass, but for some sites 2 or more searches are required. See the GCTvdb
+ # plugin for an example of such a site
+ sub getNumberPasses
+ {
+ return 1;
+ }
+
+ # changeUrl
+ # Can be used to change URL if item URL and the one used to
+ # extract information are different.
+ # Return the modified URL.
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ # In processing functions below, self->{parsingList} can be used.
+ # If true, we are processing a search results page
+ # If false, we are processing a item information page.
+
+ # $self->{inside}->{tagname} (with correct value for tagname) can be used to test
+ # if we are in the corresponding tag.
+
+ # You have a counter $self->{itemIdx} that have to be used when processing search results.
+ # It is your responsability to increment it!
+
+ # When processing search results, you have to fill the available fields for results
+ #
+ # $self->{itemsList}[$self->{movieIdx}]->{field_name}
+ #
+ # When processing a movie page, you need to fill the fields (if available)
+ # in $self->{curInfo}.
+ #
+ # $self->{curInfo}->{field_name}
+
+ # start
+ # Called each time a new HTML tag begins.
+ # $tagname is the tag name.
+ # $attr is reference to an associative array of tag attributes.
+ # $attrseq is an array reference containing all the attributes name.
+ # $origtext is the tag text as found in source file
+ # Returns nothing
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ # Your code for processing search results here
+ }
+ else
+ {
+ # Your code for processing movie information here
+ }
+ }
+
+ # end
+ # Called each time a HTML tag ends.
+ # $tagname is the tag name.
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+
+ if ($self->{parsingList})
+ {
+ # Your code for processing search results here
+ }
+ else
+ {
+ # Your code for processing movie information here
+ }
+ }
+
+ # text
+ # Called each time some plain text (between tags) is processed.
+ # $origtext is the read text.
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ # Your code for processing search results here
+ }
+ else
+ {
+ # Your code for processing movie information here
+ }
+ }
+
+ # new
+ # Constructor.
+ # Returns object reference.
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ # This member should be initialized as a reference
+ # to a hash. Each keys is a field that could be
+ # in results with value 1 or 0 if it is returned
+ # or not. For the list of keys, check the model file
+ # (.gcm) and search for tags <field> in
+ # /collection/options/fields/results
+ $self->{hasField} = {
+ key1 => 1,
+ key2 => 0,
+ };
+
+ # Do your init stuff here
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ # getFields
+ # Called on each pass, by plugins with getNumberPasses > 1
+ # to get the columns return by the plugin during that pass
+ sub getReturnedFields
+ {
+ my $self = shift;
+
+ # This member should be initialized as a reference
+ # to a hash. Each keys is a field that could be
+ # in results with value 1 or 0 if it is returned
+ # or not. For the list of keys, check the model file
+ # (.gcm) and search for tags <field> in
+ # /collection/options/fields/results
+ $self->{hasField} = {
+ key1 => 1,
+ key2 => 0,
+ };
+ }
+
+ # preProcess
+ # Called before each page is processed. You can use it to do some substitutions.
+ # $html is the page content.
+ # Returns modified version of page content.
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ # Your code to modify $html here.
+
+ return $html;
+ }
+
+}
+
+1;