freshrss.pot 241 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764
  1. # SOME DESCRIPTIVE TITLE
  2. # Copyright (C) YEAR Free Software Foundation, Inc.
  3. # This file is distributed under the same license as the PACKAGE package.
  4. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
  5. #
  6. #, fuzzy
  7. msgid ""
  8. msgstr ""
  9. "Project-Id-Version: PACKAGE VERSION\n"
  10. "Report-Msgid-Bugs-To: https://github.com/FreshRSS/FreshRSS/issues\n"
  11. "POT-Creation-Date: 2023-05-11 00:12+0200\n"
  12. "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
  13. "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
  14. "Language-Team: LANGUAGE <LL@li.org>\n"
  15. "Language: \n"
  16. "MIME-Version: 1.0\n"
  17. "Content-Type: text/plain; charset=UTF-8\n"
  18. "Content-Transfer-Encoding: 8bit\n"
  19. #. type: Title ##
  20. #: en/./contributing.md:1
  21. #, markdown-text, no-wrap
  22. msgid "Report a bug"
  23. msgstr ""
  24. #. type: Plain text
  25. #: en/./contributing.md:4
  26. #, markdown-text
  27. msgid ""
  28. "Have you found a bug? Don’t panic, here are some steps to report it with "
  29. "ease:"
  30. msgstr ""
  31. #. type: Bullet: '1. '
  32. #: en/./contributing.md:8
  33. #, markdown-text
  34. msgid ""
  35. "Search for it on [the bug "
  36. "tracker](https://github.com/FreshRSS/FreshRSS/issues) (don’t forget to use "
  37. "the search bar)."
  38. msgstr ""
  39. #. type: Bullet: '2. '
  40. #: en/./contributing.md:8
  41. #, markdown-text
  42. msgid ""
  43. "If you find a similar bug, don’t hesitate to post a comment to add more "
  44. "importance to the related ticket."
  45. msgstr ""
  46. #. type: Bullet: '3. '
  47. #: en/./contributing.md:8
  48. #, markdown-text
  49. msgid ""
  50. "If you didn’t find it, [open a new "
  51. "ticket](https://github.com/FreshRSS/FreshRSS/issues/new)."
  52. msgstr ""
  53. #. type: Plain text
  54. #: en/./contributing.md:10
  55. #, markdown-text
  56. msgid ""
  57. "If you have to create a new ticket, please try to keep in mind the following "
  58. "advice:"
  59. msgstr ""
  60. #. type: Bullet: '* '
  61. #: en/./contributing.md:13
  62. #, markdown-text
  63. msgid "Give an explicit title to the ticket so it will be easier to find it later."
  64. msgstr ""
  65. #. type: Bullet: '* '
  66. #: en/./contributing.md:13
  67. #, markdown-text
  68. msgid ""
  69. "Be as exhaustive as possible in the description: what did you do? What is "
  70. "the bug? What are the steps to reproduce the bug?"
  71. msgstr ""
  72. #. type: Plain text
  73. #: en/./contributing.md:15
  74. #, markdown-text
  75. msgid "We also need some information:"
  76. msgstr ""
  77. #. type: Bullet: '* '
  78. #: en/./contributing.md:20
  79. #, markdown-text
  80. msgid "Your FreshRSS version (on the about page or in the `constants.php` file)"
  81. msgstr ""
  82. #. type: Bullet: '* '
  83. #: en/./contributing.md:20
  84. #, markdown-text
  85. msgid "Your server configuration: the type of hosting and the PHP version"
  86. msgstr ""
  87. #. type: Bullet: '* '
  88. #: en/./contributing.md:20
  89. #, markdown-text
  90. msgid "Your storage system (SQLite, MySQL, MariaDB, PostgreSQL)"
  91. msgstr ""
  92. #. type: Bullet: '* '
  93. #: en/./contributing.md:20
  94. #, markdown-text
  95. msgid ""
  96. "If possible, the related logs (PHP logs and FreshRSS logs under "
  97. "`data/users/your_user/log.txt`)"
  98. msgstr ""
  99. #. type: Plain text
  100. #: en/./contributing.md:22
  101. #, markdown-text
  102. msgid ""
  103. "For a more detailed guide on writing bug reports, please refer to [the "
  104. "in-depth guide on reporting bugs](developers/06_Reporting_Bugs)."
  105. msgstr ""
  106. #. type: Title ##
  107. #: en/./contributing.md:23
  108. #, markdown-text, no-wrap
  109. msgid "Fix a bug"
  110. msgstr ""
  111. #. type: Plain text
  112. #: en/./contributing.md:26
  113. #, markdown-text
  114. msgid ""
  115. "Would you like to fix a bug? For optimum coordination between collaborators, "
  116. "you should follow these indications:"
  117. msgstr ""
  118. #. type: Bullet: '1. '
  119. #: en/./contributing.md:31
  120. #, markdown-text
  121. msgid ""
  122. "Be sure the bug is associated with a ticket and indicate that you’ll work on "
  123. "it."
  124. msgstr ""
  125. #. type: Bullet: '2. '
  126. #: en/./contributing.md:31
  127. #, markdown-text
  128. msgid ""
  129. "[Fork the project "
  130. "repository](https://help.github.com/articles/fork-a-repo/)."
  131. msgstr ""
  132. #. type: Bullet: '3. '
  133. #: en/./contributing.md:31
  134. #, markdown-text
  135. msgid ""
  136. "[Create a new "
  137. "branch](https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/). "
  138. "The name of the branch should be clear, and ideally prefixed by the related "
  139. "ticket id. For instance, `783-contributing-file` to fix [ticket "
  140. "#783](https://github.com/FreshRSS/FreshRSS/issues/783)."
  141. msgstr ""
  142. #. type: Bullet: '4. '
  143. #: en/./contributing.md:31
  144. #, markdown-text
  145. msgid ""
  146. "Make your changes to your fork and [send a pull "
  147. "request](https://help.github.com/articles/using-pull-requests/)."
  148. msgstr ""
  149. #. type: Plain text
  150. #: en/./contributing.md:33
  151. #, markdown-text
  152. msgid ""
  153. "If you have to write code, please follow [our coding style "
  154. "recommendations](developers/02_First_steps.md)."
  155. msgstr ""
  156. #. type: Plain text
  157. #: en/./contributing.md:35
  158. #, markdown-text, no-wrap
  159. msgid ""
  160. "**Tip:** if you’re searching for easy-to-fix bugs, please have a look at the "
  161. "“[good first "
  162. "issue](https://github.com/FreshRSS/FreshRSS/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)” "
  163. "ticket label.\n"
  164. msgstr ""
  165. #. type: Title ##
  166. #: en/./contributing.md:36
  167. #, markdown-text, no-wrap
  168. msgid "Submit an idea"
  169. msgstr ""
  170. #. type: Plain text
  171. #: en/./contributing.md:39
  172. #, markdown-text
  173. msgid ""
  174. "You have great ideas, yes! Don’t be shy and open [a new "
  175. "ticket](https://github.com/FreshRSS/FreshRSS/issues/new) on our bug tracker "
  176. "to ask if we can implement it. The greatest ideas often come from the shyest "
  177. "suggestions!"
  178. msgstr ""
  179. #. type: Plain text
  180. #: en/./contributing.md:41
  181. #, markdown-text
  182. msgid "If your idea is nice, we’ll have a look at it."
  183. msgstr ""
  184. #. type: Title ##
  185. #: en/./contributing.md:42
  186. #, markdown-text, no-wrap
  187. msgid "Contribute to internationalization (i18n)"
  188. msgstr ""
  189. #. type: Plain text
  190. #: en/./contributing.md:45
  191. #, markdown-text
  192. msgid ""
  193. "Learn how to contribute to translations in [the dedicated "
  194. "documentation](./internationalization.md)."
  195. msgstr ""
  196. #. type: Title ##
  197. #: en/./contributing.md:46
  198. #, markdown-text, no-wrap
  199. msgid "Contribute to documentation"
  200. msgstr ""
  201. #. type: Plain text
  202. #: en/./contributing.md:49
  203. #, markdown-text
  204. msgid ""
  205. "The documentation needs a lot of improvements in order to be more useful to "
  206. "new contributors and we are working on it. If you want to give some help, "
  207. "meet us in the main repositories [docs "
  208. "directory](https://github.com/FreshRSS/FreshRSS/tree/edge/docs)!"
  209. msgstr ""
  210. #. type: Title #
  211. #: en/./developers/01_Index.md:1
  212. #, markdown-text, no-wrap
  213. msgid "FreshRSS Development"
  214. msgstr ""
  215. #. type: Title ##
  216. #: en/./developers/01_Index.md:3
  217. #, markdown-text, no-wrap
  218. msgid "First Steps"
  219. msgstr ""
  220. #. type: Plain text
  221. #: en/./developers/01_Index.md:6
  222. #, markdown-text
  223. msgid ""
  224. "Start by creating your development environment. A guide to setting up "
  225. "FreshRSS’s development environment can be found on [the appropriate "
  226. "page](02_First_steps.md)."
  227. msgstr ""
  228. #. type: Title ##
  229. #: en/./developers/01_Index.md:7
  230. #, markdown-text, no-wrap
  231. msgid "After That"
  232. msgstr ""
  233. #. type: Bullet: '* '
  234. #: en/./developers/01_Index.md:16
  235. #, markdown-text
  236. msgid "[Github Branching and Pushing](02_Github.md)"
  237. msgstr ""
  238. #. type: Bullet: '* '
  239. #: en/./developers/01_Index.md:16
  240. #, markdown-text
  241. msgid "[Running tests](03_Running_tests.md)"
  242. msgstr ""
  243. #. type: Bullet: '* '
  244. #: en/./developers/01_Index.md:16
  245. #, markdown-text
  246. msgid "[Creating a pull request](04_Pull_requests.md)"
  247. msgstr ""
  248. #. type: Bullet: '* '
  249. #: en/./developers/01_Index.md:16
  250. #, markdown-text
  251. msgid "[Releasing a new version](05_Release_new_version.md)"
  252. msgstr ""
  253. #. type: Bullet: '* '
  254. #: en/./developers/01_Index.md:16
  255. #, markdown-text
  256. msgid "[Reporting bugs](06_Reporting_Bugs.md)"
  257. msgstr ""
  258. #. type: Bullet: '* '
  259. #: en/./developers/01_Index.md:16
  260. #, markdown-text
  261. msgid "[Fever API](06_Fever_API.md)"
  262. msgstr ""
  263. #. type: Bullet: '* '
  264. #: en/./developers/01_Index.md:16
  265. #, markdown-text
  266. msgid "[GoogleReader API](06_GoogleReader_API.md)"
  267. msgstr ""
  268. #. type: Title ##
  269. #: en/./developers/01_Index.md:17
  270. #, markdown-text, no-wrap
  271. msgid "Backend Development"
  272. msgstr ""
  273. #. type: Bullet: '* '
  274. #: en/./developers/01_Index.md:22
  275. #, markdown-text
  276. msgid "[Making extensions for FreshRSS](03_Backend/05_Extensions.md)"
  277. msgstr ""
  278. #. type: Bullet: '* '
  279. #: en/./developers/01_Index.md:22
  280. #, markdown-text
  281. msgid "[Database Schema](03_Backend/01_Database_schema.md)"
  282. msgstr ""
  283. #. type: Bullet: '* '
  284. #: en/./developers/01_Index.md:22
  285. #, markdown-text
  286. msgid "[External libraries](03_Backend/03_External_libraries.md)"
  287. msgstr ""
  288. #. type: Title ##
  289. #: en/./developers/01_Index.md:23
  290. #, markdown-text, no-wrap
  291. msgid "Frontend Development"
  292. msgstr ""
  293. #. type: Bullet: '* '
  294. #: en/./developers/01_Index.md:27
  295. #, markdown-text
  296. msgid "[View files](04_Frontend/01_View_files.md)"
  297. msgstr ""
  298. #. type: Bullet: '* '
  299. #: en/./developers/01_Index.md:27
  300. #, markdown-text
  301. msgid "[Design (Themes/Theming)](04_Frontend/02_Design.md)"
  302. msgstr ""
  303. #. type: Title ##
  304. #: en/./developers/01_Index.md:28
  305. #, markdown-text, no-wrap
  306. msgid "Namespaces"
  307. msgstr ""
  308. #. type: Bullet: '* '
  309. #: en/./developers/01_Index.md:31
  310. #, markdown-text
  311. msgid "[OPML FreshRSS namespace](OPML.md)"
  312. msgstr ""
  313. #. type: Title ##
  314. #: en/./developers/01_Index.md:32
  315. #, markdown-text, no-wrap
  316. msgid "Minz"
  317. msgstr ""
  318. #. type: Plain text
  319. #: en/./developers/01_Index.md:34
  320. #, markdown-text
  321. msgid ""
  322. "Minz is the homemade PHP framework used by FreshRSS. More information can be "
  323. "found [here](Minz/index.md)."
  324. msgstr ""
  325. #. type: Title #
  326. #: en/./developers/02_First_steps.md:1
  327. #, markdown-text, no-wrap
  328. msgid "Environment configuration (Docker)"
  329. msgstr ""
  330. #. type: Plain text
  331. #: en/./developers/02_First_steps.md:4
  332. #, markdown-text
  333. msgid ""
  334. "FreshRSS is built with PHP and uses a homemade framework, Minz. The "
  335. "dependencies are directly included in the source code, so you don’t need "
  336. "Composer."
  337. msgstr ""
  338. #. type: Plain text
  339. #: en/./developers/02_First_steps.md:6
  340. #, markdown-text
  341. msgid ""
  342. "There are various ways to configure your development environment. The "
  343. "easiest and most supported method is based on Docker, which is the solution "
  344. "documented below. If you already have a working PHP environment, you "
  345. "probably don’t need it."
  346. msgstr ""
  347. #. type: Plain text
  348. #: en/./developers/02_First_steps.md:8
  349. #, markdown-text
  350. msgid ""
  351. "We assume here that you use a GNU/Linux distribution, capable of running "
  352. "Docker. Otherwise, you’ll have to adapt the commands accordingly."
  353. msgstr ""
  354. #. type: Plain text
  355. #: en/./developers/02_First_steps.md:10
  356. #, markdown-text
  357. msgid ""
  358. "The commands that follow have to be executed in a console. They start by `$` "
  359. "when commands need to be executed as normal user, and by `#` when they need "
  360. "to be executed as root user. You don’t have to type these characters. A path "
  361. "may be indicated before these characters to help you identify where they "
  362. "need to be executed. For instance, `app$ echo 'Hello World'` indicates that "
  363. "you have to execute `echo` command in the `app/` directory."
  364. msgstr ""
  365. #. type: Plain text
  366. #: en/./developers/02_First_steps.md:12
  367. #, markdown-text
  368. msgid ""
  369. "First, you need to install "
  370. "[Docker](https://docs.docker.com/install/linux/docker-ce/ubuntu/)."
  371. msgstr ""
  372. #. type: Plain text
  373. #: en/./developers/02_First_steps.md:14
  374. #, markdown-text
  375. msgid "Once you’re done, clone the repository with:"
  376. msgstr ""
  377. #. type: Fenced code block (sh)
  378. #: en/./developers/02_First_steps.md:15
  379. #, no-wrap
  380. msgid ""
  381. "git clone https://github.com/FreshRSS/FreshRSS.git\n"
  382. "cd FreshRSS\n"
  383. msgstr ""
  384. #. type: Plain text
  385. #: en/./developers/02_First_steps.md:21
  386. #, markdown-text
  387. msgid ""
  388. "Note that, if you want to contribute, you have to fork the repository first "
  389. "and clone your fork instead of the \"root\" one. Adapt the commands in "
  390. "consequence."
  391. msgstr ""
  392. #. type: Plain text
  393. #: en/./developers/02_First_steps.md:23
  394. #, markdown-text
  395. msgid "Then, the only command you need to know is the following:"
  396. msgstr ""
  397. #. type: Fenced code block (sh)
  398. #: en/./developers/02_First_steps.md:24
  399. #, no-wrap
  400. msgid "make start\n"
  401. msgstr ""
  402. #. type: Plain text
  403. #: en/./developers/02_First_steps.md:29
  404. #, markdown-text
  405. msgid ""
  406. "This might take some time while Docker downloads the image. If your user "
  407. "isn’t in the `docker` group, you’ll need to prepend the command with `sudo`."
  408. msgstr ""
  409. #. type: Plain text
  410. #: en/./developers/02_First_steps.md:31
  411. #, markdown-text, no-wrap
  412. msgid ""
  413. "**You can now access FreshRSS at "
  414. "[http://localhost:8080](http://localhost:8080).** Just follow the install "
  415. "process and select the SQLite database.\n"
  416. msgstr ""
  417. #. type: Plain text
  418. #: en/./developers/02_First_steps.md:33
  419. #, markdown-text, no-wrap
  420. msgid ""
  421. "You can stop the containers by typing <kbd>Control</kbd> + <kbd>c</kbd> or "
  422. "with the following command, in another terminal:\n"
  423. msgstr ""
  424. #. type: Fenced code block (sh)
  425. #: en/./developers/02_First_steps.md:34
  426. #, no-wrap
  427. msgid "make stop\n"
  428. msgstr ""
  429. #. type: Plain text
  430. #: en/./developers/02_First_steps.md:39
  431. #, markdown-text
  432. msgid ""
  433. "If you’re interested in the configuration, the `make` commands are defined "
  434. "in the [`Makefile`](/Makefile)."
  435. msgstr ""
  436. #. type: Plain text
  437. #: en/./developers/02_First_steps.md:41
  438. #, markdown-text
  439. msgid ""
  440. "If you need to use a different tag image (default is `alpine`), you can set "
  441. "the `TAG` environment variable:"
  442. msgstr ""
  443. #. type: Fenced code block (sh)
  444. #: en/./developers/02_First_steps.md:42
  445. #, no-wrap
  446. msgid "TAG=arm make start\n"
  447. msgstr ""
  448. #. type: Plain text
  449. #: en/./developers/02_First_steps.md:47
  450. #, markdown-text
  451. msgid ""
  452. "You can find the full list of available tags [on the Docker "
  453. "hub](https://hub.docker.com/r/freshrss/freshrss/tags)."
  454. msgstr ""
  455. #. type: Plain text
  456. #: en/./developers/02_First_steps.md:49
  457. #, markdown-text
  458. msgid ""
  459. "If you want to build the Docker image yourself, you can use the following "
  460. "command:"
  461. msgstr ""
  462. #. type: Fenced code block (sh)
  463. #: en/./developers/02_First_steps.md:50
  464. #, no-wrap
  465. msgid ""
  466. "make build\n"
  467. "# or\n"
  468. "TAG=arm make build\n"
  469. msgstr ""
  470. #. type: Plain text
  471. #: en/./developers/02_First_steps.md:57
  472. #, markdown-text
  473. msgid ""
  474. "The `TAG` variable can be anything (e.g. `local`). You can target a specific "
  475. "architecture by adding `-alpine` or `-arm` at the end of the tag "
  476. "(e.g. `local-arm`)."
  477. msgstr ""
  478. #. type: Title ##
  479. #: en/./developers/02_First_steps.md:58
  480. #, markdown-text, no-wrap
  481. msgid "Project architecture"
  482. msgstr ""
  483. #. type: Bullet: '- '
  484. #: en/./developers/02_First_steps.md:61
  485. #, markdown-text
  486. msgid "the PHP framework: [Minz](Minz/index.md)"
  487. msgstr ""
  488. #. type: Title #
  489. #: en/./developers/02_First_steps.md:62 en/./users/05_Configuration.md:178
  490. #, markdown-text, no-wrap
  491. msgid "Extensions"
  492. msgstr ""
  493. #. type: Plain text
  494. #: en/./developers/02_First_steps.md:65
  495. #, markdown-text
  496. msgid ""
  497. "If you want to create your own FreshRSS extension, take a look at the "
  498. "[extension documentation](03_Backend/05_Extensions.md)."
  499. msgstr ""
  500. #. type: Title ##
  501. #: en/./developers/02_First_steps.md:66
  502. #, markdown-text, no-wrap
  503. msgid "Coding style"
  504. msgstr ""
  505. #. type: Plain text
  506. #: en/./developers/02_First_steps.md:69
  507. #, markdown-text
  508. msgid ""
  509. "If you want to contribute to the source code, it’s important to follow the "
  510. "project’s coding style. The actual code doesn’t always follow it throughout "
  511. "the project, but we should fix it every time an opportunity presents itself."
  512. msgstr ""
  513. #. type: Plain text
  514. #: en/./developers/02_First_steps.md:71
  515. #, markdown-text
  516. msgid ""
  517. "Contributions which don’t follow the coding style will be rejected as long "
  518. "as the coding style is not fixed."
  519. msgstr ""
  520. #. type: Title ##
  521. #: en/./developers/02_First_steps.md:72
  522. #, markdown-text, no-wrap
  523. msgid "GitHub Actions"
  524. msgstr ""
  525. #. type: Plain text
  526. #: en/./developers/02_First_steps.md:76
  527. #, markdown-text
  528. msgid ""
  529. "The code will be checked for every pull request commit on GitHub via [GitHub "
  530. "Actions](https://github.com/FreshRSS/FreshRSS/actions). See the "
  531. "configuration file [`tests.yml`](../../../.github/workflows/tests.yml)."
  532. msgstr ""
  533. #. type: Title ##
  534. #: en/./developers/02_First_steps.md:77
  535. #, markdown-text, no-wrap
  536. msgid "Running fixes & tests"
  537. msgstr ""
  538. #. type: Plain text
  539. #: en/./developers/02_First_steps.md:80
  540. #, markdown-text
  541. msgid ""
  542. "Tests can be run locally, e.g. by running `make test-all`, and several "
  543. "problems can be automatically fixed by running `make fix-all`."
  544. msgstr ""
  545. #. type: Fenced code block (sh)
  546. #: en/./developers/02_First_steps.md:81
  547. #, no-wrap
  548. msgid ""
  549. "make fix-all\n"
  550. "make test-all\n"
  551. msgstr ""
  552. #. type: Plain text
  553. #: en/./developers/02_First_steps.md:87
  554. #, markdown-text
  555. msgid ""
  556. "This requires `make` and `npm` in addition to the FreshRSS requirements. See "
  557. "below for the precise requirements for a few platforms."
  558. msgstr ""
  559. #. type: Title ###
  560. #: en/./developers/02_First_steps.md:88
  561. #, markdown-text, no-wrap
  562. msgid "Debian / Ubuntu"
  563. msgstr ""
  564. #. type: Plain text
  565. #: en/./developers/02_First_steps.md:91
  566. #, markdown-text, no-wrap
  567. msgid ""
  568. "> ℹ️ Also applies to [Microsoft "
  569. "Windows](https://docs.microsoft.com/windows/wsl/install-win10) thanks to "
  570. "[WSL](https://ubuntu.com/wsl).\n"
  571. msgstr ""
  572. #. type: Plain text
  573. #: en/./developers/02_First_steps.md:93
  574. #, markdown-text
  575. msgid ""
  576. "Here are the dependencies that need to be manually installed prior to "
  577. "running the fixes & tests."
  578. msgstr ""
  579. #. type: Fenced code block (sh)
  580. #: en/./developers/02_First_steps.md:94
  581. #, no-wrap
  582. msgid ""
  583. "sudo apt update && sudo apt install --no-install-recommends -y make npm "
  584. "php-cli php-curl php-mbstring php-xml unzip wget\n"
  585. msgstr ""
  586. #. type: Title ###
  587. #: en/./developers/02_First_steps.md:98
  588. #, markdown-text, no-wrap
  589. msgid "Fedora / Red Hat"
  590. msgstr ""
  591. #. type: Fenced code block (sh)
  592. #: en/./developers/02_First_steps.md:100
  593. #, no-wrap
  594. msgid ""
  595. "yum install -y git make npm php-cli php-curl php-mbstring php-xml php-pdo "
  596. "unzip wget\n"
  597. msgstr ""
  598. #. type: Title ###
  599. #: en/./developers/02_First_steps.md:104
  600. #, markdown-text, no-wrap
  601. msgid "Alpine Linux"
  602. msgstr ""
  603. #. type: Fenced code block (sh)
  604. #: en/./developers/02_First_steps.md:106
  605. #, no-wrap
  606. msgid ""
  607. "apk add git make npm php-cli php-curl php-ctype php-dom php-mbstring "
  608. "php-openssl php-phar php-simplexml php-xml php-pdo php-tokenizer "
  609. "php-xmlreader php-xmlwriter unzip wget\n"
  610. msgstr ""
  611. #. type: Title ###
  612. #: en/./developers/02_First_steps.md:110
  613. #, markdown-text, no-wrap
  614. msgid "Partial fixes & tests"
  615. msgstr ""
  616. #. type: Bullet: '- '
  617. #: en/./developers/02_First_steps.md:114
  618. #, markdown-text
  619. msgid ""
  620. "composer-based: `npm run fix && npm test` or see the [`scripts` section of "
  621. "`composer.json`](../../../composer.json) for individual tests or fixes such "
  622. "as `composer phpstan`"
  623. msgstr ""
  624. #. type: Bullet: '- '
  625. #: en/./developers/02_First_steps.md:114
  626. #, markdown-text
  627. msgid ""
  628. "npm-based: `npm run fix && npm test` or see the [`scripts` section of "
  629. "`package.json`](../../../package.json) for individual tests or fixes such as "
  630. "`npm run rtlcss`"
  631. msgstr ""
  632. #. type: Title ###
  633. #: en/./developers/02_First_steps.md:115
  634. #, markdown-text, no-wrap
  635. msgid "Tests summary"
  636. msgstr ""
  637. #. type: Plain text
  638. #: en/./developers/02_First_steps.md:118
  639. #, markdown-text
  640. msgid "A short (not complete) summary:"
  641. msgstr ""
  642. #. type: Title ####
  643. #: en/./developers/02_First_steps.md:119
  644. #, markdown-text, no-wrap
  645. msgid "PHP"
  646. msgstr ""
  647. #. type: Bullet: '- '
  648. #: en/./developers/02_First_steps.md:127
  649. #, markdown-text
  650. msgid "Syntax of `php` and `phtml` files is checked."
  651. msgstr ""
  652. #. type: Bullet: '- '
  653. #: en/./developers/02_First_steps.md:127
  654. #, markdown-text
  655. msgid ""
  656. "translation files (`i18n`) are checked ([more information about i18n "
  657. "files](internationalization.html))."
  658. msgstr ""
  659. #. type: Bullet: '- '
  660. #: en/./developers/02_First_steps.md:127
  661. #, markdown-text
  662. msgid "unit test (`tests`) are run by [PHPunit](https://phpunit.de/)."
  663. msgstr ""
  664. #. type: Bullet: '- '
  665. #: en/./developers/02_First_steps.md:127 en/./developers/02_First_steps.md:134
  666. #: en/./developers/02_First_steps.md:139 en/./developers/02_First_steps.md:144
  667. #, markdown-text
  668. msgid "Linter:"
  669. msgstr ""
  670. #. type: Bullet: ' - '
  671. #: en/./developers/02_First_steps.md:127 en/./developers/02_First_steps.md:134
  672. #, markdown-text
  673. msgid "[PHP_Codesniffer (phpcs)](https://github.com/squizlabs/PHP_CodeSniffer)"
  674. msgstr ""
  675. #. type: Bullet: ' - '
  676. #: en/./developers/02_First_steps.md:127
  677. #, markdown-text
  678. msgid "[PHPstan](https://github.com/phpstan/phpstan)"
  679. msgstr ""
  680. #. type: Title ###
  681. #: en/./developers/02_First_steps.md:128
  682. #, markdown-text, no-wrap
  683. msgid "CSS"
  684. msgstr ""
  685. #. type: Bullet: ' - '
  686. #: en/./developers/02_First_steps.md:134
  687. #, markdown-text
  688. msgid "via npm `.styleintrc.json`"
  689. msgstr ""
  690. #. type: Bullet: ' - '
  691. #: en/./developers/02_First_steps.md:134
  692. #, markdown-text
  693. msgid "check that RTL (right-to-left) CSS files match to standard CSS files"
  694. msgstr ""
  695. #. type: Title ###
  696. #: en/./developers/02_First_steps.md:135
  697. #, markdown-text, no-wrap
  698. msgid "JavaScript"
  699. msgstr ""
  700. #. type: Bullet: ' - '
  701. #: en/./developers/02_First_steps.md:139
  702. #, markdown-text
  703. msgid ""
  704. "via npm `.styleintrc.json` ([ECMAScript "
  705. "2017](https://en.wikipedia.org/wiki/ECMAScript#8th_Edition_%E2%80%93_ECMAScript_2017))"
  706. msgstr ""
  707. #. type: Title ###
  708. #: en/./developers/02_First_steps.md:140
  709. #, markdown-text, no-wrap
  710. msgid "Markdown"
  711. msgstr ""
  712. #. type: Bullet: ' - '
  713. #: en/./developers/02_First_steps.md:144
  714. #, markdown-text
  715. msgid "via npm `.markdownlint.json`"
  716. msgstr ""
  717. #. type: Title ##
  718. #: en/./developers/02_First_steps.md:145
  719. #, markdown-text, no-wrap
  720. msgid "Spaces, tabs and other whitespace characters"
  721. msgstr ""
  722. #. type: Title ###
  723. #: en/./developers/02_First_steps.md:147
  724. #, markdown-text, no-wrap
  725. msgid "Indentation"
  726. msgstr ""
  727. #. type: Plain text
  728. #: en/./developers/02_First_steps.md:150
  729. #, markdown-text
  730. msgid "Code indentation must use tabs."
  731. msgstr ""
  732. #. type: Title ###
  733. #: en/./developers/02_First_steps.md:151
  734. #, markdown-text, no-wrap
  735. msgid "Alignment"
  736. msgstr ""
  737. #. type: Plain text
  738. #: en/./developers/02_First_steps.md:154
  739. #, markdown-text
  740. msgid ""
  741. "Once the code has been correctly indented, it might be useful to align it "
  742. "for ease of reading. In that case, please use spaces."
  743. msgstr ""
  744. #. type: Fenced code block (php)
  745. #: en/./developers/02_First_steps.md:155
  746. #, no-wrap
  747. msgid ""
  748. "$result = a_function_with_a_really_long_name($param1, $param2,\n"
  749. " $param3, $param4);\n"
  750. msgstr ""
  751. #. type: Title ###
  752. #: en/./developers/02_First_steps.md:160
  753. #, markdown-text, no-wrap
  754. msgid "End of line"
  755. msgstr ""
  756. #. type: Plain text
  757. #: en/./developers/02_First_steps.md:163
  758. #, markdown-text
  759. msgid ""
  760. "The newline character must be a line feed (LF), which is the default line "
  761. "ending on *NIX systems. This character must not follow other white space."
  762. msgstr ""
  763. #. type: Plain text
  764. #: en/./developers/02_First_steps.md:165
  765. #, markdown-text
  766. msgid ""
  767. "You can verify if there is any unintended white space at the end of line "
  768. "with the following Git command:"
  769. msgstr ""
  770. #. type: Fenced code block (sh)
  771. #: en/./developers/02_First_steps.md:166
  772. #, no-wrap
  773. msgid ""
  774. "# command to check files before adding them in the Git index\n"
  775. "git diff --check\n"
  776. "# command to check files after adding them in the Git index\n"
  777. "git diff --check --cached\n"
  778. msgstr ""
  779. #. type: Title ###
  780. #: en/./developers/02_First_steps.md:173
  781. #, markdown-text, no-wrap
  782. msgid "End of file"
  783. msgstr ""
  784. #. type: Plain text
  785. #: en/./developers/02_First_steps.md:176
  786. #, markdown-text
  787. msgid "Every file must end by an empty line."
  788. msgstr ""
  789. #. type: Title ###
  790. #: en/./developers/02_First_steps.md:177
  791. #, markdown-text, no-wrap
  792. msgid "Commas, dots and semi-columns"
  793. msgstr ""
  794. #. type: Plain text
  795. #: en/./developers/02_First_steps.md:180
  796. #, markdown-text
  797. msgid ""
  798. "There should no space before those characters, but there should be one "
  799. "after."
  800. msgstr ""
  801. #. type: Title ###
  802. #: en/./developers/02_First_steps.md:181
  803. #, markdown-text, no-wrap
  804. msgid "Operators"
  805. msgstr ""
  806. #. type: Plain text
  807. #: en/./developers/02_First_steps.md:184
  808. #, markdown-text
  809. msgid "There should be a space before and after every operator."
  810. msgstr ""
  811. #. type: Fenced code block (php)
  812. #: en/./developers/02_First_steps.md:185
  813. #, no-wrap
  814. msgid ""
  815. "if ($a == 10) {\n"
  816. "\t// do something\n"
  817. "}\n"
  818. "\n"
  819. "echo $a ? 1 : 0;\n"
  820. msgstr ""
  821. #. type: Title ###
  822. #: en/./developers/02_First_steps.md:193
  823. #, markdown-text, no-wrap
  824. msgid "Parentheses"
  825. msgstr ""
  826. #. type: Plain text
  827. #: en/./developers/02_First_steps.md:196
  828. #, markdown-text
  829. msgid ""
  830. "There should be no spaces in between brackets. There should be no spaces "
  831. "before the opening bracket, except if it’s after a keyword. There shouldn’t "
  832. "be any spaces after the closing bracket, except if it’s followed by a curly "
  833. "bracket."
  834. msgstr ""
  835. #. type: Fenced code block (php)
  836. #: en/./developers/02_First_steps.md:197
  837. #, no-wrap
  838. msgid ""
  839. "if ($a == 10) {\n"
  840. "\t// do something\n"
  841. "}\n"
  842. "\n"
  843. "if ((int)$a == 10) {\n"
  844. "\t// do something\n"
  845. "}\n"
  846. msgstr ""
  847. #. type: Title ###
  848. #: en/./developers/02_First_steps.md:207
  849. #, markdown-text, no-wrap
  850. msgid "With chained functions"
  851. msgstr ""
  852. #. type: Plain text
  853. #: en/./developers/02_First_steps.md:210
  854. #, markdown-text
  855. msgid ""
  856. "It happens most of the time in JavaScript files. When there are chained "
  857. "functions with closures and call-back functions, it’s hard to understand the "
  858. "code if not properly formatted. In those cases, we add a new indent level "
  859. "for the complete instruction and reset the indent for a new instruction on "
  860. "the same level."
  861. msgstr ""
  862. #. type: Fenced code block (javascript)
  863. #: en/./developers/02_First_steps.md:211
  864. #, no-wrap
  865. msgid ""
  866. "// First instruction\n"
  867. "shortcut.add(shortcuts.mark_read, function () {\n"
  868. "\t\t//...\n"
  869. "\t}, {\n"
  870. "\t\t'disable_in_input': true\n"
  871. "\t});\n"
  872. "// Second instruction\n"
  873. "shortcut.add(\"shift+\" + shortcuts.mark_read, function () {\n"
  874. "\t\t//...\n"
  875. "\t}, {\n"
  876. "\t\t'disable_in_input': true\n"
  877. "\t});\n"
  878. msgstr ""
  879. #. type: Title ##
  880. #: en/./developers/02_First_steps.md:226
  881. #, markdown-text, no-wrap
  882. msgid "Line length"
  883. msgstr ""
  884. #. type: Plain text
  885. #: en/./developers/02_First_steps.md:229
  886. #, markdown-text
  887. msgid ""
  888. "Lines should strive to be shorter than 80 characters. However, this limit "
  889. "may be extended to 100 characters when strictly necessary."
  890. msgstr ""
  891. #. type: Plain text
  892. #: en/./developers/02_First_steps.md:231
  893. #, markdown-text
  894. msgid "With functions, parameters can be declared on multiple lines."
  895. msgstr ""
  896. #. type: Fenced code block (php)
  897. #: en/./developers/02_First_steps.md:232
  898. #, no-wrap
  899. msgid ""
  900. "function my_function($param_1, $param_2,\n"
  901. " $param_3, $param_4) {\n"
  902. "\t// do something\n"
  903. "}\n"
  904. msgstr ""
  905. #. type: Title ##
  906. #: en/./developers/02_First_steps.md:239
  907. #, markdown-text, no-wrap
  908. msgid "Naming"
  909. msgstr ""
  910. #. type: Plain text
  911. #: en/./developers/02_First_steps.md:242
  912. #, markdown-text
  913. msgid ""
  914. "All code elements (functions, classes, methods and variables) must describe "
  915. "their usage succinctly."
  916. msgstr ""
  917. #. type: Title ###
  918. #: en/./developers/02_First_steps.md:243
  919. #, markdown-text, no-wrap
  920. msgid "Functions and variables"
  921. msgstr ""
  922. #. type: Plain text
  923. #: en/./developers/02_First_steps.md:246
  924. #, markdown-text
  925. msgid "Functions and variables must follow the \"snake case\" naming convention."
  926. msgstr ""
  927. #. type: Fenced code block (php)
  928. #: en/./developers/02_First_steps.md:247
  929. #, no-wrap
  930. msgid ""
  931. "// a function\n"
  932. "function function_name() {\n"
  933. "\t// do something\n"
  934. "}\n"
  935. "// a variable\n"
  936. "$variable_name;\n"
  937. msgstr ""
  938. #. type: Title ###
  939. #: en/./developers/02_First_steps.md:256
  940. #, markdown-text, no-wrap
  941. msgid "Methods"
  942. msgstr ""
  943. #. type: Plain text
  944. #: en/./developers/02_First_steps.md:259
  945. #, markdown-text
  946. msgid "Methods must follow the \"lower camel case\" naming convention."
  947. msgstr ""
  948. #. type: Fenced code block (php)
  949. #: en/./developers/02_First_steps.md:260
  950. #, no-wrap
  951. msgid ""
  952. "private function methodName() {\n"
  953. "\t// do something\n"
  954. "}\n"
  955. msgstr ""
  956. #. type: Title ###
  957. #: en/./developers/02_First_steps.md:266
  958. #, markdown-text, no-wrap
  959. msgid "Classes"
  960. msgstr ""
  961. #. type: Plain text
  962. #: en/./developers/02_First_steps.md:269
  963. #, markdown-text
  964. msgid "Classes must follow the \"upper camel case\" naming convention."
  965. msgstr ""
  966. #. type: Fenced code block (php)
  967. #: en/./developers/02_First_steps.md:270
  968. #, no-wrap
  969. msgid "abstract class ClassName {}\n"
  970. msgstr ""
  971. #. type: Title ##
  972. #: en/./developers/02_First_steps.md:274
  973. #, markdown-text, no-wrap
  974. msgid "Encoding"
  975. msgstr ""
  976. #. type: Plain text
  977. #: en/./developers/02_First_steps.md:277
  978. #, markdown-text
  979. msgid "Files must be encoded with the UTF-8 character set."
  980. msgstr ""
  981. #. type: Title ##
  982. #: en/./developers/02_First_steps.md:278
  983. #, markdown-text, no-wrap
  984. msgid "PHP compatibility"
  985. msgstr ""
  986. #. type: Plain text
  987. #: en/./developers/02_First_steps.md:281
  988. #, markdown-text
  989. msgid ""
  990. "Please ensure that your code works with the oldest PHP version officially "
  991. "supported by FreshRSS."
  992. msgstr ""
  993. #. type: Title ###
  994. #: en/./developers/02_First_steps.md:282 en/./developers/OPML.md:47
  995. #, markdown-text, no-wrap
  996. msgid "Miscellaneous"
  997. msgstr ""
  998. #. type: Title ###
  999. #: en/./developers/02_First_steps.md:284
  1000. #, markdown-text, no-wrap
  1001. msgid "Operators on multiple lines"
  1002. msgstr ""
  1003. #. type: Plain text
  1004. #: en/./developers/02_First_steps.md:287
  1005. #, markdown-text
  1006. msgid ""
  1007. "Operators must be at the end of the line if a condition is split over more "
  1008. "than one line."
  1009. msgstr ""
  1010. #. type: Fenced code block (php)
  1011. #: en/./developers/02_First_steps.md:288
  1012. #, no-wrap
  1013. msgid ""
  1014. "if ($a == 10 ||\n"
  1015. " $a == 20) {\n"
  1016. "\t// do something\n"
  1017. "}\n"
  1018. msgstr ""
  1019. #. type: Title ###
  1020. #: en/./developers/02_First_steps.md:295
  1021. #, markdown-text, no-wrap
  1022. msgid "End of PHP file"
  1023. msgstr ""
  1024. #. type: Plain text
  1025. #: en/./developers/02_First_steps.md:298
  1026. #, markdown-text
  1027. msgid "If the file contains only PHP code, the PHP closing tag must be omitted."
  1028. msgstr ""
  1029. #. type: Title ###
  1030. #: en/./developers/02_First_steps.md:299
  1031. #, markdown-text, no-wrap
  1032. msgid "Arrays"
  1033. msgstr ""
  1034. #. type: Plain text
  1035. #: en/./developers/02_First_steps.md:302
  1036. #, markdown-text
  1037. msgid ""
  1038. "If an array declaration runs on more than one line, each element must be "
  1039. "followed by a comma, including the last one."
  1040. msgstr ""
  1041. #. type: Fenced code block (php)
  1042. #: en/./developers/02_First_steps.md:303
  1043. #, no-wrap
  1044. msgid ""
  1045. "$variable = [\n"
  1046. "\t\"value 1\",\n"
  1047. "\t\"value 2\",\n"
  1048. "\t\"value 3\",\n"
  1049. "];\n"
  1050. msgstr ""
  1051. #. type: Title #
  1052. #: en/./developers/02_Github.md:1
  1053. #, markdown-text, no-wrap
  1054. msgid "Branching"
  1055. msgstr ""
  1056. #. type: Title ##
  1057. #: en/./developers/02_Github.md:3
  1058. #, markdown-text, no-wrap
  1059. msgid "Basic"
  1060. msgstr ""
  1061. #. type: Plain text
  1062. #: en/./developers/02_Github.md:6
  1063. #, markdown-text
  1064. msgid "If you are new to Git, here are some of the resources you might find useful:"
  1065. msgstr ""
  1066. #. type: Bullet: '* '
  1067. #: en/./developers/02_Github.md:11
  1068. #, markdown-text
  1069. msgid "[GitHub’s blog post](https://github.com/blog/120-new-to-git)"
  1070. msgstr ""
  1071. #. type: Bullet: '* '
  1072. #: en/./developers/02_Github.md:11
  1073. #, markdown-text
  1074. msgid "<http://try.github.com/>"
  1075. msgstr ""
  1076. #. type: Bullet: '* '
  1077. #: en/./developers/02_Github.md:11
  1078. #, markdown-text
  1079. msgid "<http://sixrevisions.com/resources/git-tutorials-beginners/>"
  1080. msgstr ""
  1081. #. type: Bullet: '* '
  1082. #: en/./developers/02_Github.md:11
  1083. #, markdown-text
  1084. msgid "<http://rogerdudler.github.io/git-guide/>"
  1085. msgstr ""
  1086. #. type: Title ##
  1087. #: en/./developers/02_Github.md:12
  1088. #, markdown-text, no-wrap
  1089. msgid "Getting the latest code from the FreshRSS repository"
  1090. msgstr ""
  1091. #. type: Plain text
  1092. #: en/./developers/02_Github.md:15
  1093. #, markdown-text
  1094. msgid "First you need to add the official repo to your remote repo list:"
  1095. msgstr ""
  1096. #. type: Fenced code block (sh)
  1097. #: en/./developers/02_Github.md:16
  1098. #, no-wrap
  1099. msgid "git remote add upstream git@github.com:FreshRSS/FreshRSS.git\n"
  1100. msgstr ""
  1101. #. type: Plain text
  1102. #: en/./developers/02_Github.md:21
  1103. #, markdown-text
  1104. msgid "You can verify the remote repo is successfully added by using:"
  1105. msgstr ""
  1106. #. type: Fenced code block (sh)
  1107. #: en/./developers/02_Github.md:22
  1108. #, no-wrap
  1109. msgid "git remote -v show\n"
  1110. msgstr ""
  1111. #. type: Plain text
  1112. #: en/./developers/02_Github.md:27
  1113. #, markdown-text
  1114. msgid "Now you can pull the latest development code:"
  1115. msgstr ""
  1116. #. type: Fenced code block (sh)
  1117. #: en/./developers/02_Github.md:28
  1118. #, no-wrap
  1119. msgid ""
  1120. "git checkout edge\n"
  1121. "git pull upstream edge\n"
  1122. msgstr ""
  1123. #. type: Title ##
  1124. #: en/./developers/02_Github.md:33
  1125. #, markdown-text, no-wrap
  1126. msgid "Starting a new development branch"
  1127. msgstr ""
  1128. #. type: Fenced code block (sh)
  1129. #: en/./developers/02_Github.md:35
  1130. #, no-wrap
  1131. msgid "git checkout -b my-development-branch\n"
  1132. msgstr ""
  1133. #. type: Title ##
  1134. #: en/./developers/02_Github.md:39
  1135. #, markdown-text, no-wrap
  1136. msgid "Sending a patch"
  1137. msgstr ""
  1138. #. type: Fenced code block (sh)
  1139. #: en/./developers/02_Github.md:41
  1140. #, no-wrap
  1141. msgid ""
  1142. "# Add the changed file, here actualize_script.php\n"
  1143. "git add app/actualize_script.php\n"
  1144. "# Commit the change and write a proper commit message\n"
  1145. "git commit\n"
  1146. "# Double check all looks well\n"
  1147. "git show\n"
  1148. "# Push it to your fork\n"
  1149. "git push\n"
  1150. msgstr ""
  1151. #. type: Plain text
  1152. #: en/./developers/02_Github.md:53
  1153. #, markdown-text
  1154. msgid "Now you can create a PR based on your branch."
  1155. msgstr ""
  1156. #. type: Title ##
  1157. #: en/./developers/02_Github.md:54
  1158. #, markdown-text, no-wrap
  1159. msgid "How to write a commit message"
  1160. msgstr ""
  1161. #. type: Plain text
  1162. #: en/./developers/02_Github.md:57
  1163. #, markdown-text
  1164. msgid ""
  1165. "A commit message should succinctly describe the changes on the first "
  1166. "line. For example:"
  1167. msgstr ""
  1168. #. type: Plain text
  1169. #: en/./developers/02_Github.md:59
  1170. #, markdown-text, no-wrap
  1171. msgid "> Fix broken icon\n"
  1172. msgstr ""
  1173. #. type: Plain text
  1174. #: en/./developers/02_Github.md:61
  1175. #, markdown-text
  1176. msgid "If necessary, this can be followed by a blank line and a longer explanation."
  1177. msgstr ""
  1178. #. type: Plain text
  1179. #: en/./developers/02_Github.md:62
  1180. #, markdown-text
  1181. msgid "For further tips, see [here](https://chris.beams.io/posts/git-commit/)."
  1182. msgstr ""
  1183. #. type: Title #
  1184. #: en/./developers/03_Backend/01_Database_schema.md:1
  1185. #, markdown-text, no-wrap
  1186. msgid "Database Schema"
  1187. msgstr ""
  1188. #. type: Plain text
  1189. #: en/./developers/03_Backend/01_Database_schema.md:4
  1190. #: en/./developers/03_Backend/05_Extensions.md:169
  1191. #: en/./developers/04_Frontend/01_View_files.md:6
  1192. #: en/./developers/04_Frontend/01_View_files.md:10
  1193. #: en/./developers/04_Frontend/01_View_files.md:14
  1194. #: en/./developers/04_Frontend/01_View_files.md:17
  1195. #: en/./users/05_Configuration.md:185
  1196. #, markdown-text, no-wrap
  1197. msgid "> **TODO**\n"
  1198. msgstr ""
  1199. #. type: Title ##
  1200. #: en/./developers/03_Backend/01_Database_schema.md:5
  1201. #, markdown-text, no-wrap
  1202. msgid "See also"
  1203. msgstr ""
  1204. #. type: Bullet: '* '
  1205. #: en/./developers/03_Backend/01_Database_schema.md:7
  1206. #, markdown-text
  1207. msgid "[Database configuration](../../admins/DatabaseConfig.md)"
  1208. msgstr ""
  1209. #. type: Title #
  1210. #: en/./developers/03_Backend/03_External_libraries.md:1
  1211. #, markdown-text, no-wrap
  1212. msgid "External Libraries"
  1213. msgstr ""
  1214. #. type: Title #
  1215. #: en/./developers/03_Backend/05_Extensions.md:1
  1216. #, markdown-text, no-wrap
  1217. msgid "Writing extensions for FreshRSS"
  1218. msgstr ""
  1219. #. type: Title ##
  1220. #: en/./developers/03_Backend/05_Extensions.md:3
  1221. #, markdown-text, no-wrap
  1222. msgid "About FreshRSS"
  1223. msgstr ""
  1224. #. type: Plain text
  1225. #: en/./developers/03_Backend/05_Extensions.md:6
  1226. #, markdown-text
  1227. msgid ""
  1228. "FreshRSS is an RSS / Atom feed aggregator written in PHP dating back to "
  1229. "October 2012. The official site is located at "
  1230. "[freshrss.org](https://freshrss.org) and the official repository is hosted "
  1231. "on Github: "
  1232. "[github.com/FreshRSS/FreshRSS](https://github.com/FreshRSS/FreshRSS)."
  1233. msgstr ""
  1234. #. type: Title ##
  1235. #: en/./developers/03_Backend/05_Extensions.md:7
  1236. #, markdown-text, no-wrap
  1237. msgid "The problem"
  1238. msgstr ""
  1239. #. type: Plain text
  1240. #: en/./developers/03_Backend/05_Extensions.md:10
  1241. #, markdown-text
  1242. msgid "FreshRSS is limited in its technical possibilities by various factors:"
  1243. msgstr ""
  1244. #. type: Bullet: '* '
  1245. #: en/./developers/03_Backend/05_Extensions.md:14
  1246. #, markdown-text
  1247. msgid "The number of developers"
  1248. msgstr ""
  1249. #. type: Bullet: '* '
  1250. #: en/./developers/03_Backend/05_Extensions.md:14
  1251. #, markdown-text
  1252. msgid "The will to integrate certain changes"
  1253. msgstr ""
  1254. #. type: Bullet: '* '
  1255. #: en/./developers/03_Backend/05_Extensions.md:14
  1256. #, markdown-text
  1257. msgid "The level of \"hacking\" required to integrate marginal features"
  1258. msgstr ""
  1259. #. type: Plain text
  1260. #: en/./developers/03_Backend/05_Extensions.md:16
  1261. #, markdown-text
  1262. msgid ""
  1263. "While the first limitation can, in theory, be lifted by the participation of "
  1264. "new contributors to the project, it depends on the willingness of "
  1265. "contributors to take an interest in the source code of the entire "
  1266. "project. In order to remove the other two limitations, most of the time it "
  1267. "will be necessary to create a \"fork\"."
  1268. msgstr ""
  1269. #. type: Plain text
  1270. #: en/./developers/03_Backend/05_Extensions.md:18
  1271. #, markdown-text
  1272. msgid ""
  1273. "Another solution consists of an extension system. By allowing users to write "
  1274. "their own extension without taking an interest in the core of the basic "
  1275. "software, we allow for:"
  1276. msgstr ""
  1277. #. type: Bullet: '1. '
  1278. #: en/./developers/03_Backend/05_Extensions.md:22
  1279. #, markdown-text
  1280. msgid "Reducing the amount of source code a new contributor has to take in"
  1281. msgstr ""
  1282. #. type: Bullet: '2. '
  1283. #: en/./developers/03_Backend/05_Extensions.md:22
  1284. #, markdown-text
  1285. msgid "Unofficial integration of novelties"
  1286. msgstr ""
  1287. #. type: Bullet: '3. '
  1288. #: en/./developers/03_Backend/05_Extensions.md:22
  1289. #, markdown-text
  1290. msgid "No forking or main developer approval required."
  1291. msgstr ""
  1292. #. type: Plain text
  1293. #: en/./developers/03_Backend/05_Extensions.md:24
  1294. #, markdown-text
  1295. msgid ""
  1296. "Note: it is quite conceivable that the functionalities of an extension can "
  1297. "later be officially integrated into the FreshRSS code. Extensions make it "
  1298. "easy to propose a proof of concept."
  1299. msgstr ""
  1300. #. type: Title #
  1301. #: en/./developers/03_Backend/05_Extensions.md:25
  1302. #: en/./developers/Minz/index.md:1
  1303. #, markdown-text, no-wrap
  1304. msgid "Minz Framework"
  1305. msgstr ""
  1306. #. type: Plain text
  1307. #: en/./developers/03_Backend/05_Extensions.md:28
  1308. #, markdown-text
  1309. msgid "see [Minz documentation](/docs/en/developers/Minz/index.md)"
  1310. msgstr ""
  1311. #. type: Title ##
  1312. #: en/./developers/03_Backend/05_Extensions.md:29
  1313. #, markdown-text, no-wrap
  1314. msgid "Write an extension for FreshRSS"
  1315. msgstr ""
  1316. #. type: Plain text
  1317. #: en/./developers/03_Backend/05_Extensions.md:32
  1318. #, markdown-text
  1319. msgid ""
  1320. "Here we are! We’ve talked about the most useful features of Minz and how to "
  1321. "run FreshRSS correctly and it’s about time to address the extensions "
  1322. "themselves."
  1323. msgstr ""
  1324. #. type: Plain text
  1325. #: en/./developers/03_Backend/05_Extensions.md:34
  1326. #, markdown-text
  1327. msgid ""
  1328. "An extension allows you to easily add functionality to FreshRSS without "
  1329. "having to touch the core of the project directly."
  1330. msgstr ""
  1331. #. type: Title ###
  1332. #: en/./developers/03_Backend/05_Extensions.md:35
  1333. #, markdown-text, no-wrap
  1334. msgid "Make it work in Docker"
  1335. msgstr ""
  1336. #. type: Plain text
  1337. #: en/./developers/03_Backend/05_Extensions.md:38
  1338. #, markdown-text
  1339. msgid ""
  1340. "When working on an extension, it’s easier to see it working directly in its "
  1341. "environment. With Docker, you can leverage the use of the ```volume``` "
  1342. "option when starting the container. Hopefully, you can use it without "
  1343. "Docker-related knowledge by using the Makefile rule:"
  1344. msgstr ""
  1345. #. type: Fenced code block (sh)
  1346. #: en/./developers/03_Backend/05_Extensions.md:38
  1347. #, no-wrap
  1348. msgid ""
  1349. "make start extensions=\"/full/path/to/extension/1 "
  1350. "/full/path/to/extension/2\"\n"
  1351. msgstr ""
  1352. #. type: Title ###
  1353. #: en/./developers/03_Backend/05_Extensions.md:42
  1354. #, markdown-text, no-wrap
  1355. msgid "Basic files and folders"
  1356. msgstr ""
  1357. #. type: Plain text
  1358. #: en/./developers/03_Backend/05_Extensions.md:47
  1359. #, markdown-text
  1360. msgid ""
  1361. "The first thing to note is that **all** extensions **must** be located in "
  1362. "the `extensions` directory, at the base of the FreshRSS tree. An extension "
  1363. "is a directory containing a set of mandatory (and optional) files and "
  1364. "subdirectories. The convention requires that the main directory name be "
  1365. "preceded by an \"x\" to indicate that it is not an extension included by "
  1366. "default in FreshRSS."
  1367. msgstr ""
  1368. #. type: Plain text
  1369. #: en/./developers/03_Backend/05_Extensions.md:49
  1370. #, markdown-text
  1371. msgid ""
  1372. "The main directory of an extension must contain at least two **mandatory** "
  1373. "files:"
  1374. msgstr ""
  1375. #. type: Bullet: '* '
  1376. #: en/./developers/03_Backend/05_Extensions.md:52
  1377. #, markdown-text
  1378. msgid ""
  1379. "A `metadata.json` file that contains a description of the extension. This "
  1380. "file is written in JSON."
  1381. msgstr ""
  1382. #. type: Bullet: '* '
  1383. #: en/./developers/03_Backend/05_Extensions.md:52
  1384. #, markdown-text
  1385. msgid ""
  1386. "An `extension.php` file containing the entry point of the extension (which "
  1387. "is a class that inherits Minz_Extension)."
  1388. msgstr ""
  1389. #. type: Plain text
  1390. #: en/./developers/03_Backend/05_Extensions.md:56
  1391. #, markdown-text
  1392. msgid ""
  1393. "Please note that there is a not a required link between the directory name "
  1394. "of the extension and the name of the class inside `extension.php`, but you "
  1395. "should follow our best practice: If you want to write a `HelloWorld` "
  1396. "extension, the directory name should be `xExtension-HelloWorld` and the base "
  1397. "class name `HelloWorldExtension`."
  1398. msgstr ""
  1399. #. type: Plain text
  1400. #: en/./developers/03_Backend/05_Extensions.md:58
  1401. #, markdown-text
  1402. msgid ""
  1403. "In the file `freshrss/extensions/xExtension-HelloWorld/extension.php` you "
  1404. "need the structure:"
  1405. msgstr ""
  1406. #. type: Fenced code block (php)
  1407. #: en/./developers/03_Backend/05_Extensions.md:58
  1408. #, no-wrap
  1409. msgid ""
  1410. "class HelloWorldExtension extends Minz_Extension {\n"
  1411. "\tpublic function init() {\n"
  1412. "\t\t// your code here\n"
  1413. "\t}\n"
  1414. "}\n"
  1415. msgstr ""
  1416. #. type: Plain text
  1417. #: en/./developers/03_Backend/05_Extensions.md:67
  1418. #, markdown-text
  1419. msgid ""
  1420. "There is an example HelloWorld extension that you can download from [our "
  1421. "GitHub repo](https://github.com/FreshRSS/xExtension-HelloWorld)."
  1422. msgstr ""
  1423. #. type: Plain text
  1424. #: en/./developers/03_Backend/05_Extensions.md:69
  1425. #, markdown-text
  1426. msgid ""
  1427. "You may also need additional files or subdirectories depending on your "
  1428. "needs:"
  1429. msgstr ""
  1430. #. type: Bullet: '* '
  1431. #: en/./developers/03_Backend/05_Extensions.md:75
  1432. #, markdown-text
  1433. msgid ""
  1434. "`configure.phtml` is the file containing the form to parameterize your "
  1435. "extension"
  1436. msgstr ""
  1437. #. type: Bullet: '* '
  1438. #: en/./developers/03_Backend/05_Extensions.md:75
  1439. #, markdown-text
  1440. msgid ""
  1441. "A `static/` directory containing CSS and JavaScript files that you will need "
  1442. "for your extension (note that if you need to write a lot of CSS it may be "
  1443. "more interesting to write a complete theme)"
  1444. msgstr ""
  1445. #. type: Bullet: '* '
  1446. #: en/./developers/03_Backend/05_Extensions.md:75
  1447. #, markdown-text
  1448. msgid "A `Controllers` directory containing additional controllers"
  1449. msgstr ""
  1450. #. type: Bullet: '* '
  1451. #: en/./developers/03_Backend/05_Extensions.md:75
  1452. #, markdown-text
  1453. msgid "An `i18n` directory containing additional translations"
  1454. msgstr ""
  1455. #. type: Bullet: '* '
  1456. #: en/./developers/03_Backend/05_Extensions.md:75
  1457. #, markdown-text
  1458. msgid ""
  1459. "`layout` and `views` directories to define new views or to overwrite the "
  1460. "current views"
  1461. msgstr ""
  1462. #. type: Plain text
  1463. #: en/./developers/03_Backend/05_Extensions.md:77
  1464. #, markdown-text
  1465. msgid ""
  1466. "In addition, it is good to have a `LICENSE` file indicating the license "
  1467. "under which your extension is distributed and a `README` file giving a "
  1468. "detailed description of it."
  1469. msgstr ""
  1470. #. type: Title ###
  1471. #: en/./developers/03_Backend/05_Extensions.md:78
  1472. #, markdown-text, no-wrap
  1473. msgid "The metadata.json file"
  1474. msgstr ""
  1475. #. type: Plain text
  1476. #: en/./developers/03_Backend/05_Extensions.md:81
  1477. #, markdown-text
  1478. msgid ""
  1479. "The `metadata.json` file defines your extension through a number of "
  1480. "important elements. It must contain a valid JSON array containing the "
  1481. "following entries:"
  1482. msgstr ""
  1483. #. type: Bullet: '* '
  1484. #: en/./developers/03_Backend/05_Extensions.md:89
  1485. #, markdown-text
  1486. msgid "`name`: the name of your extension"
  1487. msgstr ""
  1488. #. type: Bullet: '* '
  1489. #: en/./developers/03_Backend/05_Extensions.md:89
  1490. #, markdown-text
  1491. msgid ""
  1492. "`author`: your name, your e-mail address … but there is no specific format "
  1493. "to adopt"
  1494. msgstr ""
  1495. #. type: Bullet: '* '
  1496. #: en/./developers/03_Backend/05_Extensions.md:89
  1497. #, markdown-text
  1498. msgid "`description`: a description of your extension"
  1499. msgstr ""
  1500. #. type: Bullet: '* '
  1501. #: en/./developers/03_Backend/05_Extensions.md:89
  1502. #, markdown-text
  1503. msgid "`version`: the current version number of the extension"
  1504. msgstr ""
  1505. #. type: Plain text
  1506. #: en/./developers/03_Backend/05_Extensions.md:89
  1507. #, markdown-text, no-wrap
  1508. msgid ""
  1509. "* `entrypoint`: Indicates the entry point of your extension. It must match "
  1510. "the name of the class contained in the file `extension.php` without the "
  1511. "suffix `Extension`\n"
  1512. "(so if the entry point is `HelloWorld`, your class will be called "
  1513. "`HelloWorldExtension`)\n"
  1514. "* `type`: Defines the type of your extension. There are two types: `system` "
  1515. "and `user`. We will study this difference right after.\n"
  1516. msgstr ""
  1517. #. type: Plain text
  1518. #: en/./developers/03_Backend/05_Extensions.md:91
  1519. #, markdown-text
  1520. msgid "Only the `name` and `entrypoint` fields are required."
  1521. msgstr ""
  1522. #. type: Title ###
  1523. #: en/./developers/03_Backend/05_Extensions.md:92
  1524. #, markdown-text, no-wrap
  1525. msgid "Choosing between `system` and `user`"
  1526. msgstr ""
  1527. #. type: Plain text
  1528. #: en/./developers/03_Backend/05_Extensions.md:95
  1529. #, markdown-text
  1530. msgid ""
  1531. "A *user* extension can be enabled by some users and not by others (typically "
  1532. "for user preferences)."
  1533. msgstr ""
  1534. #. type: Plain text
  1535. #: en/./developers/03_Backend/05_Extensions.md:97
  1536. #, markdown-text
  1537. msgid "A *system* extension in comparison is enabled for every account."
  1538. msgstr ""
  1539. #. type: Title ###
  1540. #: en/./developers/03_Backend/05_Extensions.md:98
  1541. #, markdown-text, no-wrap
  1542. msgid "Writing your own extension.php"
  1543. msgstr ""
  1544. #. type: Plain text
  1545. #: en/./developers/03_Backend/05_Extensions.md:102
  1546. #, markdown-text
  1547. msgid ""
  1548. "This file is the core of your extension. It must define some key elements "
  1549. "to be loaded by the extension system:"
  1550. msgstr ""
  1551. #. type: Bullet: '1. '
  1552. #: en/./developers/03_Backend/05_Extensions.md:106
  1553. #, markdown-text
  1554. msgid ""
  1555. "The class name must be the `entrypoint` value defined in the `metadata.json` "
  1556. "file suffixed by `Extension` (if your `entrypoint` value is `HelloWorld`, "
  1557. "your class name will be `HelloWorldExtension`)."
  1558. msgstr ""
  1559. #. type: Bullet: '1. '
  1560. #: en/./developers/03_Backend/05_Extensions.md:106
  1561. #, markdown-text
  1562. msgid ""
  1563. "The class must extend the `Minz_Extension` abstract class which defines the "
  1564. "core methods and properties of a FreshRSS extension."
  1565. msgstr ""
  1566. #. type: Bullet: '1. '
  1567. #: en/./developers/03_Backend/05_Extensions.md:106
  1568. #, markdown-text
  1569. msgid ""
  1570. "The class must define the `init` method. This method is called **only** if "
  1571. "the extension is loaded. Its purpose is to initialize the extension and its "
  1572. "behavior during every page load."
  1573. msgstr ""
  1574. #. type: Plain text
  1575. #: en/./developers/03_Backend/05_Extensions.md:111
  1576. #, markdown-text
  1577. msgid ""
  1578. "The `Minz_Extension` abstract class defines a set of methods that can be "
  1579. "overridden to fit your needs: * the `install` method is called when the user "
  1580. "enables the extension in the configuration page. It must return `true` when "
  1581. "successful and a string containing an error message when not. Its purpose is "
  1582. "to prepare FreshRSS for the extension (adding a table to the database, "
  1583. "creating a folder tree, …). * the `uninstall` method is called when the "
  1584. "user disables the extension in the configuration page. It must return `true` "
  1585. "when successful and a string containing an error message when not. Its "
  1586. "purpose is to clean FreshRSS (removing a table from the database, deleting a "
  1587. "folder tree, …). Usually it reverts changes introduced by the `install` "
  1588. "method. * the `handleConfigureAction` method is called when a user loads "
  1589. "the extension configuration panel. It contains the logic to validate and "
  1590. "store the submitted values defined in the `configure.phtml` file."
  1591. msgstr ""
  1592. #. type: Plain text
  1593. #: en/./developers/03_Backend/05_Extensions.md:113
  1594. #, markdown-text, no-wrap
  1595. msgid ""
  1596. "> If your extension code is scattered in different classes, you need to load "
  1597. "their source before using them. Of course you could include the files "
  1598. "manually, but it’s more efficient to load them automatically. To do so, you "
  1599. "just need to define the `autoload` method which will include them when "
  1600. "needed. This method will be registered automatically when the extension is "
  1601. "enabled.\n"
  1602. msgstr ""
  1603. #. type: Plain text
  1604. #: en/./developers/03_Backend/05_Extensions.md:127
  1605. #, markdown-text, no-wrap
  1606. msgid ""
  1607. "The `Minz_Extension` abstract class defines another set of methods that "
  1608. "should not be overridden:\n"
  1609. "* the `getName`, `getEntrypoint`, `getPath`, `getAuthor`, `getDescription`, "
  1610. "`getVersion`, and `getType` methods return the extension internal "
  1611. "properties. Those properties are extracted from the `metadata.json` file.\n"
  1612. "* the `getFileUrl` returns the URL of the selected file. The file must exist "
  1613. "in the `static` folder of the extension.\n"
  1614. "* the `registerController` method register an extension controller in "
  1615. "FreshRSS. The selected controller must be defined in the extension "
  1616. "*Controllers* folder, its file name must be `\\<name\\>Controller.php`, and "
  1617. "its class name must be `FreshExtension_\\<name\\>_Controller`.\n"
  1618. "* the `registerViews` method registers the extension views in FreshRSS.\n"
  1619. "* the `registerTranslates` method registers the extension translation files "
  1620. "in FreshRSS.\n"
  1621. "* the `registerHook` method registers hook actions in different part of the "
  1622. "application.\n"
  1623. "* the `getSystemConfiguration` method retrieves the extension configuration "
  1624. "for the system.\n"
  1625. "* the `setSystemConfiguration` method stores the extension configuration for "
  1626. "the system.\n"
  1627. "* the `removeSystemConfiguration` method removes the extension configuration "
  1628. "for the system.\n"
  1629. "* the `getUserConfiguration` method retrieves the extension configuration "
  1630. "for the current user.\n"
  1631. "* the `setUserConfiguration` method stores the extension configuration for "
  1632. "the current user.\n"
  1633. "* the `removeUserConfiguration` method removes the extension configuration "
  1634. "for the current user.\n"
  1635. msgstr ""
  1636. #. type: Plain text
  1637. #: en/./developers/03_Backend/05_Extensions.md:129
  1638. #, markdown-text, no-wrap
  1639. msgid ""
  1640. "> Note that if you modify the later set of methods, you might break the "
  1641. "extension system. Thus making FreshRSS unusable. So it’s highly recommended "
  1642. "to let those unmodified.\n"
  1643. msgstr ""
  1644. #. type: Title ###
  1645. #: en/./developers/03_Backend/05_Extensions.md:130
  1646. #, markdown-text, no-wrap
  1647. msgid "The \"hooks\" system"
  1648. msgstr ""
  1649. #. type: Plain text
  1650. #: en/./developers/03_Backend/05_Extensions.md:133
  1651. #, markdown-text
  1652. msgid ""
  1653. "You can register at the FreshRSS event system in an extensions `init()` "
  1654. "method, to manipulate data when some of the core functions are executed."
  1655. msgstr ""
  1656. #. type: Fenced code block (html)
  1657. #: en/./developers/03_Backend/05_Extensions.md:134
  1658. #, no-wrap
  1659. msgid ""
  1660. "class HelloWorldExtension extends Minz_Extension\n"
  1661. "{\n"
  1662. "\tpublic function init() {\n"
  1663. "\t\t$this->registerHook('entry_before_display', array($this, "
  1664. "'renderEntry'));\n"
  1665. "\t}\n"
  1666. "\tpublic function renderEntry($entry) {\n"
  1667. "\t\t$entry->_content('<h1>Hello World</h1>' . $entry->content());\n"
  1668. "\t\treturn $entry;\n"
  1669. "\t}\n"
  1670. "}\n"
  1671. msgstr ""
  1672. #. type: Plain text
  1673. #: en/./developers/03_Backend/05_Extensions.md:148
  1674. #, markdown-text
  1675. msgid "The following events are available:"
  1676. msgstr ""
  1677. #. type: Bullet: '* '
  1678. #: en/./developers/03_Backend/05_Extensions.md:164
  1679. #, markdown-text
  1680. msgid ""
  1681. "`check_url_before_add` (`function($url) -> Url | null`): will be executed "
  1682. "every time a URL is added. The URL itself will be passed as parameter. This "
  1683. "way a website known to have feeds which doesn’t advertise it in the header "
  1684. "can still be automatically supported."
  1685. msgstr ""
  1686. #. type: Bullet: '* '
  1687. #: en/./developers/03_Backend/05_Extensions.md:164
  1688. #, markdown-text
  1689. msgid ""
  1690. "`entry_before_display` (`function($entry) -> Entry | null`): will be "
  1691. "executed every time an entry is rendered. The entry itself (instance of "
  1692. "FreshRSS\\_Entry) will be passed as parameter."
  1693. msgstr ""
  1694. #. type: Bullet: '* '
  1695. #: en/./developers/03_Backend/05_Extensions.md:164
  1696. #, markdown-text
  1697. msgid ""
  1698. "`entry_before_insert` (`function($entry) -> Entry | null`): will be executed "
  1699. "when a feed is refreshed and new entries will be imported into the "
  1700. "database. The new entry (instance of FreshRSS\\_Entry) will be passed as "
  1701. "parameter."
  1702. msgstr ""
  1703. #. type: Bullet: '* '
  1704. #: en/./developers/03_Backend/05_Extensions.md:164
  1705. #, markdown-text
  1706. msgid ""
  1707. "`feed_before_actualize` (`function($feed) -> Feed | null`): will be executed "
  1708. "when a feed is updated. The feed (instance of FreshRSS\\_Feed) will be "
  1709. "passed as parameter."
  1710. msgstr ""
  1711. #. type: Bullet: '* '
  1712. #: en/./developers/03_Backend/05_Extensions.md:164
  1713. #, markdown-text
  1714. msgid ""
  1715. "`feed_before_insert` (`function($feed) -> Feed | null`): will be executed "
  1716. "when a new feed is imported into the database. The new feed (instance of "
  1717. "FreshRSS\\_Feed) will be passed as parameter."
  1718. msgstr ""
  1719. #. type: Bullet: '* '
  1720. #: en/./developers/03_Backend/05_Extensions.md:164
  1721. #, markdown-text
  1722. msgid ""
  1723. "`freshrss_init` (`function() -> none`): will be executed at the end of the "
  1724. "initialization of FreshRSS, useful to initialize components or to do "
  1725. "additional access checks."
  1726. msgstr ""
  1727. #. type: Bullet: '* '
  1728. #: en/./developers/03_Backend/05_Extensions.md:164
  1729. #, markdown-text
  1730. msgid ""
  1731. "`freshrss_user_maintenance` (`function() -> none`): will be executed for "
  1732. "each user during the `actualize_script`, useful to run some maintenance "
  1733. "tasks on the user."
  1734. msgstr ""
  1735. #. type: Bullet: '* '
  1736. #: en/./developers/03_Backend/05_Extensions.md:164
  1737. #, markdown-text
  1738. msgid ""
  1739. "`js_vars` (`function($vars = array) -> array | null`): will be executed if "
  1740. "the `jsonVars` in the header will be generated."
  1741. msgstr ""
  1742. #. type: Bullet: '* '
  1743. #: en/./developers/03_Backend/05_Extensions.md:164
  1744. #, markdown-text
  1745. msgid ""
  1746. "`menu_admin_entry` (`function() -> string`): add an entry at the end of the "
  1747. "\"Administration\" menu, the returned string must be valid HTML (e.g. `<li "
  1748. "class=\"item active\"><a href=\"url\">New entry</a></li>`)."
  1749. msgstr ""
  1750. #. type: Bullet: '* '
  1751. #: en/./developers/03_Backend/05_Extensions.md:164
  1752. #, markdown-text
  1753. msgid ""
  1754. "`menu_configuration_entry` (`function() -> string`): add an entry at the end "
  1755. "of the \"Configuration\" menu, the returned string must be valid HTML "
  1756. "(e.g. `<li class=\"item active\"><a href=\"url\">New entry</a></li>`)."
  1757. msgstr ""
  1758. #. type: Bullet: '* '
  1759. #: en/./developers/03_Backend/05_Extensions.md:164
  1760. #, markdown-text
  1761. msgid ""
  1762. "`menu_other_entry` (`function() -> string`): add an entry at the end of the "
  1763. "header dropdown menu (i.e. after the \"About\" entry), the returned string "
  1764. "must be valid HTML (e.g. `<li class=\"item active\"><a href=\"url\">New "
  1765. "entry</a></li>`)."
  1766. msgstr ""
  1767. #. type: Bullet: '* '
  1768. #: en/./developers/03_Backend/05_Extensions.md:164
  1769. #, markdown-text
  1770. msgid ""
  1771. "`nav_menu` (`function() -> string`): will be executed if the navigation was "
  1772. "built."
  1773. msgstr ""
  1774. #. type: Bullet: '* '
  1775. #: en/./developers/03_Backend/05_Extensions.md:164
  1776. #, markdown-text
  1777. msgid ""
  1778. "`nav_reading_modes` (`function($reading_modes) -> array | null`): **TODO** "
  1779. "add documentation."
  1780. msgstr ""
  1781. #. type: Bullet: '* '
  1782. #: en/./developers/03_Backend/05_Extensions.md:164
  1783. #, markdown-text
  1784. msgid "`post_update` (`function(none) -> none`): **TODO** add documentation."
  1785. msgstr ""
  1786. #. type: Bullet: '* '
  1787. #: en/./developers/03_Backend/05_Extensions.md:164
  1788. #, markdown-text
  1789. msgid ""
  1790. "`simplepie_before_init` (`function($simplePie, $feed) -> none`): **TODO** "
  1791. "add documentation."
  1792. msgstr ""
  1793. #. type: Title ###
  1794. #: en/./developers/03_Backend/05_Extensions.md:165
  1795. #, markdown-text, no-wrap
  1796. msgid "Writing your own configure.phtml"
  1797. msgstr ""
  1798. #. type: Plain text
  1799. #: en/./developers/03_Backend/05_Extensions.md:168
  1800. #, markdown-text
  1801. msgid ""
  1802. "When you want to support user configurations for your extension or simply "
  1803. "display some information, you have to create the `configure.phtml` file."
  1804. msgstr ""
  1805. #. type: Title #
  1806. #: en/./developers/03_Running_tests.md:1
  1807. #, markdown-text, no-wrap
  1808. msgid "Running tests"
  1809. msgstr ""
  1810. #. type: Plain text
  1811. #: en/./developers/03_Running_tests.md:4
  1812. #, markdown-text
  1813. msgid ""
  1814. "FreshRSS is tested with [PHPUnit](https://phpunit.de/). No code should be "
  1815. "merged in `edge` if the tests don’t pass."
  1816. msgstr ""
  1817. #. type: Title ##
  1818. #: en/./developers/03_Running_tests.md:5
  1819. #, markdown-text, no-wrap
  1820. msgid "Locally"
  1821. msgstr ""
  1822. #. type: Plain text
  1823. #: en/./developers/03_Running_tests.md:8
  1824. #, markdown-text
  1825. msgid ""
  1826. "As a developer, you can run the test suite on your PC easily with `make` "
  1827. "commands. You can run the test suite with:"
  1828. msgstr ""
  1829. #. type: Fenced code block (sh)
  1830. #: en/./developers/03_Running_tests.md:9
  1831. #, no-wrap
  1832. msgid "make test\n"
  1833. msgstr ""
  1834. #. type: Plain text
  1835. #: en/./developers/03_Running_tests.md:14
  1836. #, markdown-text
  1837. msgid ""
  1838. "This command downloads the PHPUnit binary and verifies its checksum. If the "
  1839. "verification fails, the file is deleted. In this case, you should [open an "
  1840. "issue on GitHub](https://github.com/FreshRSS/FreshRSS/issues/new) to let "
  1841. "maintainers know about the problem."
  1842. msgstr ""
  1843. #. type: Plain text
  1844. #: en/./developers/03_Running_tests.md:16
  1845. #, markdown-text
  1846. msgid ""
  1847. "Then, it executes PHPUnit in a Docker container. If you don’t use Docker, "
  1848. "you can run the command directly with:"
  1849. msgstr ""
  1850. #. type: Fenced code block (sh)
  1851. #: en/./developers/03_Running_tests.md:17
  1852. #, no-wrap
  1853. msgid "NO_DOCKER=true make test\n"
  1854. msgstr ""
  1855. #. type: Plain text
  1856. #: en/./developers/03_Running_tests.md:22
  1857. #, markdown-text
  1858. msgid "The linter can be run with a `make` command as well:"
  1859. msgstr ""
  1860. #. type: Fenced code block (sh)
  1861. #: en/./developers/03_Running_tests.md:23
  1862. #, no-wrap
  1863. msgid ""
  1864. "make lint # to execute the linter on the PHP files\n"
  1865. "make lint-fix # or, to fix the errors detected by the linter\n"
  1866. msgstr ""
  1867. #. type: Plain text
  1868. #: en/./developers/03_Running_tests.md:29
  1869. #, markdown-text
  1870. msgid ""
  1871. "Similarly to PHPUnit, it downloads a "
  1872. "[PHP\\_CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer) binary "
  1873. "(i.e. `phpcs` or `phpcbf` depending on the command) and verifies its "
  1874. "checksum."
  1875. msgstr ""
  1876. #. type: Title ##
  1877. #: en/./developers/03_Running_tests.md:30
  1878. #, markdown-text, no-wrap
  1879. msgid "GitHub Actions for Continuous Integration"
  1880. msgstr ""
  1881. #. type: Plain text
  1882. #: en/./developers/03_Running_tests.md:35
  1883. #, markdown-text
  1884. msgid ""
  1885. "Tests are automatically run when you open a pull request on GitHub. They "
  1886. "are performed with [GitHub "
  1887. "Actions](https://github.com/FreshRSS/FreshRSS/actions). This ensures your "
  1888. "code will not introduce some kind of regression. We will not merge a PR if "
  1889. "tests fail so we will ask you to fix any bugs before reviewing your code."
  1890. msgstr ""
  1891. #. type: Plain text
  1892. #: en/./developers/03_Running_tests.md:37
  1893. #, markdown-text
  1894. msgid ""
  1895. "If you are interested, you can take a look at [the configuration "
  1896. "file](https://github.com/FreshRSS/FreshRSS/blob/edge/.github/workflows/tests.yml)."
  1897. msgstr ""
  1898. #. type: Title ##
  1899. #: en/./developers/03_Running_tests.md:38
  1900. #, markdown-text, no-wrap
  1901. msgid "Using feed snapshots"
  1902. msgstr ""
  1903. #. type: Plain text
  1904. #: en/./developers/03_Running_tests.md:42
  1905. #, markdown-text
  1906. msgid ""
  1907. "As feed data is volatile, it’s better to work with snapshots when debugging "
  1908. "some issues. You can find the description to retrieve a snapshot "
  1909. "[here](06_Reporting_Bugs.md#how-to-provide-feed-data)."
  1910. msgstr ""
  1911. #. type: Plain text
  1912. #: en/./developers/03_Running_tests.md:46
  1913. #, markdown-text
  1914. msgid ""
  1915. "To serve those snapshots, you can use a mock server. Here we will "
  1916. "demonstrate how to work with [WireMock](https://wiremock.org/) but other "
  1917. "solutions exist. Here are the steps to start using the WireMock mock "
  1918. "server:"
  1919. msgstr ""
  1920. #. type: Plain text
  1921. #: en/./developers/03_Running_tests.md:76
  1922. #, markdown-text, no-wrap
  1923. msgid ""
  1924. "1. Go to the mock server home folder.\n"
  1925. "If you do not have one, you need to create one.\n"
  1926. "1. Inside the mock server home folder, create the ___file_ and _mappings_ "
  1927. "folders.\n"
  1928. "1. Copy or move your snapshots in the ___file_ folder.\n"
  1929. "1. Create the _feed.json_ file in the _mappings_ folder with the following "
  1930. "content:\n"
  1931. "\t```js\n"
  1932. "\t{\n"
  1933. "\t\t\"request\": {\n"
  1934. "\t\t\t\"method\": \"GET\",\n"
  1935. "\t\t\t\"urlPathPattern\": \"/.*\"\n"
  1936. "\t\t},\n"
  1937. "\t\t\"response\": {\n"
  1938. "\t\t\t\"status\": 200,\n"
  1939. "\t\t\t\"bodyFileName\": \"{{request.pathSegments.[0]}}\",\n"
  1940. "\t\t\t\"transformers\": [\"response-template\"],\n"
  1941. "\t\t\t\"headers\": {\n"
  1942. "\t\t\t\t\"Content-Type\": \"application/rss+xml\"\n"
  1943. "\t\t\t}\n"
  1944. "\t\t}\n"
  1945. "\t}\n"
  1946. "\t```\n"
  1947. "1. Launch the containerized server with the following command:\n"
  1948. "\t```bash\n"
  1949. "\t# <PORT> is the port used on the host to communicate with the server\n"
  1950. "\t# <NETWORK> is the name of the docker network used (by default, it’s "
  1951. "freshrss-network)\n"
  1952. "\tdocker run -it --rm -p <PORT>:8080 --name wiremock --network <NETWORK> -v "
  1953. "$PWD:/home/wiremock wiremock/wiremock:latest-alpine "
  1954. "--local-response-templating\n"
  1955. "\t```\n"
  1956. "1. You can access the `<RSS>` mock file directly:\n"
  1957. " * from the host by sending a GET request to "
  1958. "`http://localhost:<PORT>/<RSS>`,\n"
  1959. " * from any container connected on the same network by sending a GET "
  1960. "request to `http://wiremock:8080/<RSS>`.\n"
  1961. msgstr ""
  1962. #. type: Title #
  1963. #: en/./developers/04_Frontend/01_View_files.md:1
  1964. #, markdown-text, no-wrap
  1965. msgid "View files"
  1966. msgstr ""
  1967. #. type: Title ##
  1968. #: en/./developers/04_Frontend/01_View_files.md:3
  1969. #, markdown-text, no-wrap
  1970. msgid "The .phtml files"
  1971. msgstr ""
  1972. #. type: Title ##
  1973. #: en/./developers/04_Frontend/01_View_files.md:7
  1974. #, markdown-text, no-wrap
  1975. msgid "Writing a URL"
  1976. msgstr ""
  1977. #. type: Title ##
  1978. #: en/./developers/04_Frontend/01_View_files.md:11
  1979. #, markdown-text, no-wrap
  1980. msgid "Displaying an icon"
  1981. msgstr ""
  1982. #. type: Title ##
  1983. #: en/./developers/04_Frontend/01_View_files.md:15
  1984. #, markdown-text, no-wrap
  1985. msgid "Internationalisation"
  1986. msgstr ""
  1987. #. type: Title #
  1988. #: en/./developers/04_Frontend/02_Design.md:1
  1989. #, markdown-text, no-wrap
  1990. msgid "Writing a new theme"
  1991. msgstr ""
  1992. #. type: Plain text
  1993. #: en/./developers/04_Frontend/02_Design.md:4
  1994. #, markdown-text, no-wrap
  1995. msgid ""
  1996. "**Note: Currently personal themes are not officially supported and may be "
  1997. "overwritten when updating. Be sure to keep backups!**\n"
  1998. msgstr ""
  1999. #. type: Plain text
  2000. #: en/./developers/04_Frontend/02_Design.md:6
  2001. #, markdown-text, no-wrap
  2002. msgid ""
  2003. "**As of writing (02-02-2021), support for themes as extensions is under "
  2004. "development.**\n"
  2005. msgstr ""
  2006. #. type: Plain text
  2007. #: en/./developers/04_Frontend/02_Design.md:8
  2008. #, markdown-text
  2009. msgid ""
  2010. "The easiest way to create a theme is by copying and modifying the base theme "
  2011. "(or another of the pre-installed themes). The base theme can be found in "
  2012. "[/p/themes/base-theme](https://github.com/FreshRSS/FreshRSS/tree/edge/p/themes/base-theme). "
  2013. "Themes require:"
  2014. msgstr ""
  2015. #. type: Bullet: '- '
  2016. #: en/./developers/04_Frontend/02_Design.md:13
  2017. #, markdown-text
  2018. msgid "a **metadata.json** file to describe the theme."
  2019. msgstr ""
  2020. #. type: Bullet: '- '
  2021. #: en/./developers/04_Frontend/02_Design.md:13
  2022. #, markdown-text
  2023. msgid ""
  2024. "a **loader.gif** file to use as a loading icon (assuming .loading’s "
  2025. "background has not been overridden)"
  2026. msgstr ""
  2027. #. type: Bullet: '- '
  2028. #: en/./developers/04_Frontend/02_Design.md:13
  2029. #, markdown-text
  2030. msgid ""
  2031. "an **icons** folder containing .svg, .ico, and .png files to override "
  2032. "existing icons"
  2033. msgstr ""
  2034. #. type: Bullet: '- '
  2035. #: en/./developers/04_Frontend/02_Design.md:13
  2036. #, markdown-text
  2037. msgid ""
  2038. "a **thumbs** folder containing a file, **original.png** that will be used as "
  2039. "the preview for the theme"
  2040. msgstr ""
  2041. #. type: Plain text
  2042. #: en/./developers/04_Frontend/02_Design.md:15
  2043. #, markdown-text
  2044. msgid ""
  2045. "\"_frss.css\" is normally added to the metadata file as a fallback for "
  2046. "missing aspects. The file is taken from the base theme. If submitting a pull "
  2047. "request for a theme, please know that [pull request themes must include this "
  2048. "file.](https://github.com/FreshRSS/FreshRSS/pull/2938#issuecomment-624085450)"
  2049. msgstr ""
  2050. #. type: Title ##
  2051. #: en/./developers/04_Frontend/02_Design.md:16
  2052. #, markdown-text, no-wrap
  2053. msgid "RTL Support"
  2054. msgstr ""
  2055. #. type: Plain text
  2056. #: en/./developers/04_Frontend/02_Design.md:19
  2057. #, markdown-text
  2058. msgid ""
  2059. "RTL (right-to-left) support for languages such as Hebrew and Arabic is "
  2060. "handled through CSSJanus. To generate an RTL CSS file from your standard "
  2061. "file, use `make rtl`. Be sure to commit the resulting file "
  2062. "(filename.rtl.css)."
  2063. msgstr ""
  2064. #. type: Title ##
  2065. #: en/./developers/04_Frontend/02_Design.md:20
  2066. #, markdown-text, no-wrap
  2067. msgid "Overriding icons"
  2068. msgstr ""
  2069. #. type: Plain text
  2070. #: en/./developers/04_Frontend/02_Design.md:23
  2071. #, markdown-text
  2072. msgid ""
  2073. "To replace the default icons, add an \"icons\" folder to your theme’s "
  2074. "folder. Use files with the same name as the default icon to override them."
  2075. msgstr ""
  2076. #. type: Title ##
  2077. #: en/./developers/04_Frontend/02_Design.md:24
  2078. #, markdown-text, no-wrap
  2079. msgid "Template file"
  2080. msgstr ""
  2081. #. type: Plain text
  2082. #: en/./developers/04_Frontend/02_Design.md:27
  2083. #, markdown-text
  2084. msgid "`metadata.json`"
  2085. msgstr ""
  2086. #. type: Fenced code block (json)
  2087. #: en/./developers/04_Frontend/02_Design.md:28
  2088. #, no-wrap
  2089. msgid ""
  2090. "{\n"
  2091. "\t\"name\": \"Theme name\",\n"
  2092. "\t\"author\": \"Theme author\",\n"
  2093. "\t\"description\": \"Theme description\",\n"
  2094. "\t\"version\": 0.1,\n"
  2095. "\t\"files\": [\"_frss.css\", \"file1.css\", \"file2.css\"]\n"
  2096. "}\n"
  2097. msgstr ""
  2098. #. type: Plain text
  2099. #: en/./developers/04_Frontend/02_Design.md:38
  2100. #, markdown-text
  2101. msgid ""
  2102. "An example of a css theme file can be found at "
  2103. "[/p/themes/base-theme/base.css](https://github.com/FreshRSS/FreshRSS/blob/edge/p/themes/base-theme/base.css)"
  2104. msgstr ""
  2105. #. type: Title #
  2106. #: en/./developers/04_Pull_requests.md:1
  2107. #, markdown-text, no-wrap
  2108. msgid "Opening a pull request"
  2109. msgstr ""
  2110. #. type: Plain text
  2111. #: en/./developers/04_Pull_requests.md:4
  2112. #, markdown-text
  2113. msgid ""
  2114. "So you want to propose a patch to the community? It’s time to open a [pull "
  2115. "request](https://github.com/FreshRSS/FreshRSS/pulls)!"
  2116. msgstr ""
  2117. #. type: Plain text
  2118. #: en/./developers/04_Pull_requests.md:6
  2119. #, markdown-text
  2120. msgid ""
  2121. "When you open a PR, your message will be prefilled with a message based on "
  2122. "[a "
  2123. "template](https://github.com/FreshRSS/FreshRSS/blob/edge/docs/pull_request_template.md). "
  2124. "It contains a checklist to make sure you didn’t forget anything. It is very "
  2125. "important to verify you did everything mentioned so documentation is "
  2126. "up-to-date, the commit history stays clear and the code is always stable."
  2127. msgstr ""
  2128. #. type: Plain text
  2129. #: en/./developers/04_Pull_requests.md:8
  2130. #, markdown-text
  2131. msgid "The rest of this document explains specific points."
  2132. msgstr ""
  2133. #. type: Title ##
  2134. #: en/./developers/04_Pull_requests.md:9
  2135. #, markdown-text, no-wrap
  2136. msgid "How to rebase your branch on `edge`"
  2137. msgstr ""
  2138. #. type: Plain text
  2139. #: en/./developers/04_Pull_requests.md:12
  2140. #, markdown-text, no-wrap
  2141. msgid ""
  2142. "**TODO:** Update this section. With GitHub’s *squash and merge*, rebasing "
  2143. "(and other forms of history rewriting) is more dangerous and annoying "
  2144. "(e.g. breaking review mechanism) than useful.\n"
  2145. msgstr ""
  2146. #. type: Plain text
  2147. #: en/./developers/04_Pull_requests.md:14
  2148. #, markdown-text
  2149. msgid ""
  2150. "Rebasing a branch is useful to make sure your code is based on the most "
  2151. "recent version of FreshRSS and there are no conflicts. You have two ways to "
  2152. "do that."
  2153. msgstr ""
  2154. #. type: Plain text
  2155. #: en/./developers/04_Pull_requests.md:16
  2156. #, markdown-text
  2157. msgid ""
  2158. "If you have any doubt, please let us know and we’ll help you! We all began "
  2159. "with Git one day and it’s not an easy thing to work with."
  2160. msgstr ""
  2161. #. type: Title ###
  2162. #: en/./developers/04_Pull_requests.md:17
  2163. #, markdown-text, no-wrap
  2164. msgid "Rebasing"
  2165. msgstr ""
  2166. #. type: Plain text
  2167. #: en/./developers/04_Pull_requests.md:20
  2168. #, markdown-text
  2169. msgid ""
  2170. "Rebasing is the cleanest method because the Git history will be completely "
  2171. "linear and consequently easier to read and navigate. It might also be more "
  2172. "difficult if you’re not at ease with Git since conflicts are harder to "
  2173. "resolve."
  2174. msgstr ""
  2175. #. type: Plain text
  2176. #: en/./developers/04_Pull_requests.md:22
  2177. #, markdown-text
  2178. msgid ""
  2179. "Note that you should never rebase a branch if someone else is working on "
  2180. "it. Otherwise, since it rewrites the history, it can be a real mess to sort "
  2181. "it out."
  2182. msgstr ""
  2183. #. type: Plain text
  2184. #: en/./developers/04_Pull_requests.md:24
  2185. #, markdown-text
  2186. msgid "To rebase a branch:"
  2187. msgstr ""
  2188. #. type: Fenced code block (sh)
  2189. #: en/./developers/04_Pull_requests.md:25
  2190. #, no-wrap
  2191. msgid ""
  2192. "git checkout edge # go on edge branch\n"
  2193. "git pull upstream edge # pull the last version of edge\n"
  2194. "git checkout - # go back to your branch\n"
  2195. "git rebase edge # rebase your branch on edge\n"
  2196. msgstr ""
  2197. #. type: Plain text
  2198. #: en/./developers/04_Pull_requests.md:33
  2199. #, markdown-text
  2200. msgid ""
  2201. "If you feel confident, you can use `git rebase -i edge` to rewrite your "
  2202. "history and make it clearer."
  2203. msgstr ""
  2204. #. type: Title ###
  2205. #: en/./developers/04_Pull_requests.md:34
  2206. #, markdown-text, no-wrap
  2207. msgid "Merging"
  2208. msgstr ""
  2209. #. type: Plain text
  2210. #: en/./developers/04_Pull_requests.md:37
  2211. #, markdown-text
  2212. msgid ""
  2213. "If you prefer, you can simply merge `edge` into your own branch. Conflicts "
  2214. "might be easier to resolve, but your Git history will be less "
  2215. "readable. Don’t worry, we will take care of it before merging your PR back "
  2216. "into `edge`."
  2217. msgstr ""
  2218. #. type: Plain text
  2219. #: en/./developers/04_Pull_requests.md:39
  2220. #, markdown-text
  2221. msgid "To merge `edge`:"
  2222. msgstr ""
  2223. #. type: Fenced code block (sh)
  2224. #: en/./developers/04_Pull_requests.md:40
  2225. #, no-wrap
  2226. msgid ""
  2227. "git checkout edge # go on edge branch\n"
  2228. "git pull upstream edge # pull the last version of edge\n"
  2229. "git checkout - # go back to your branch\n"
  2230. "git merge edge # merge edge into your branch\n"
  2231. msgstr ""
  2232. #. type: Title ##
  2233. #: en/./developers/04_Pull_requests.md:47
  2234. #, markdown-text, no-wrap
  2235. msgid "How to write a Git commit message"
  2236. msgstr ""
  2237. #. type: Plain text
  2238. #: en/./developers/04_Pull_requests.md:50
  2239. #, markdown-text
  2240. msgid ""
  2241. "It’s important to have proper commit messages in order to facilitate later "
  2242. "debugging, so please read the following advice. Commit messages should "
  2243. "explain the choices made in the past (the “why?”)"
  2244. msgstr ""
  2245. #. type: Plain text
  2246. #: en/./developers/04_Pull_requests.md:52
  2247. #, markdown-text
  2248. msgid ""
  2249. "The first line should start with a verb (e.g., “Add”) and explain the "
  2250. "objective of the commit in few words. It’s usually less than 50 characters "
  2251. "so it remains concise. You can consider this line the subject of your "
  2252. "commit. Think of it as the second part of a sentence that starts with the "
  2253. "words “This commit will.”"
  2254. msgstr ""
  2255. #. type: Bullet: '* '
  2256. #: en/./developers/04_Pull_requests.md:54
  2257. #, markdown-text
  2258. msgid "This commit will *add feature X*"
  2259. msgstr ""
  2260. #. type: Plain text
  2261. #: en/./developers/04_Pull_requests.md:56
  2262. #, markdown-text
  2263. msgid ""
  2264. "Then, insert a blank line, and start to write the body. It’s usually wrapped "
  2265. "at 72 characters, but you are pretty free in the tone of the message. The "
  2266. "body is the place where you can clarify the context of your patch. For "
  2267. "instance, you can explain what you were doing when you identified a bug, or "
  2268. "the problem you had before your patch. Providing this information helps "
  2269. "other developers understand why a specific choice was made, especially when "
  2270. "a patch introduces a bug that is identified months later."
  2271. msgstr ""
  2272. #. type: Plain text
  2273. #: en/./developers/04_Pull_requests.md:58
  2274. #, markdown-text
  2275. msgid ""
  2276. "You also can add references (e.g., the URL to the initial ticket in the bug "
  2277. "tracker, or a reference to some forum explaining a point)."
  2278. msgstr ""
  2279. #. type: Plain text
  2280. #: en/./developers/04_Pull_requests.md:60
  2281. #, markdown-text
  2282. msgid ""
  2283. "You can find more information about commit messages [on this blog "
  2284. "post](https://chris.beams.io/posts/git-commit/)."
  2285. msgstr ""
  2286. #. type: Title ##
  2287. #: en/./developers/04_Pull_requests.md:61
  2288. #, markdown-text, no-wrap
  2289. msgid "How to write tests"
  2290. msgstr ""
  2291. #. type: Plain text
  2292. #: en/./developers/04_Pull_requests.md:64
  2293. #, markdown-text
  2294. msgid ""
  2295. "FreshRSS has few tests for now, but we’re working on it. We added this point "
  2296. "to the checklist to help us to write more tests, and we would really "
  2297. "appreciate it if you wrote a test that ensures your patch is working."
  2298. msgstr ""
  2299. #. type: Plain text
  2300. #: en/./developers/04_Pull_requests.md:66
  2301. #, markdown-text
  2302. msgid ""
  2303. "We use [PHPUnit](https://phpunit.de/) version 7.5 "
  2304. "([documentation](https://phpunit.readthedocs.io/en/7.5/))."
  2305. msgstr ""
  2306. #. type: Plain text
  2307. #: en/./developers/04_Pull_requests.md:68
  2308. #, markdown-text
  2309. msgid ""
  2310. "You’ll find more information on how to run tests [in this "
  2311. "document](03_Running_tests.md)."
  2312. msgstr ""
  2313. #. type: Plain text
  2314. #: en/./developers/04_Pull_requests.md:70
  2315. #, markdown-text
  2316. msgid ""
  2317. "Feel free to ask us for assistance. Not everything will be easy to test, so "
  2318. "don’t spend too much time on this."
  2319. msgstr ""
  2320. #. type: Title ##
  2321. #: en/./developers/04_Pull_requests.md:71
  2322. #, markdown-text, no-wrap
  2323. msgid "Why you should write documentation"
  2324. msgstr ""
  2325. #. type: Plain text
  2326. #: en/./developers/04_Pull_requests.md:74
  2327. #, markdown-text
  2328. msgid ""
  2329. "A friendly project should have correct and complete documentation, so "
  2330. "newcomers don’t have to ask too many questions, and users can find answers "
  2331. "to their problems. The documentation should not be written “later” or "
  2332. "chances are it’ll never be."
  2333. msgstr ""
  2334. #. type: Plain text
  2335. #: en/./developers/04_Pull_requests.md:75
  2336. #, markdown-text
  2337. msgid ""
  2338. "Our documentation can still be improved quite a bit, so you’re very welcome "
  2339. "if you want to help."
  2340. msgstr ""
  2341. #. type: Title #
  2342. #: en/./developers/05_Release_new_version.md:1
  2343. #, markdown-text, no-wrap
  2344. msgid "Preparing the release"
  2345. msgstr ""
  2346. #. type: Plain text
  2347. #: en/./developers/05_Release_new_version.md:5
  2348. #, markdown-text
  2349. msgid ""
  2350. "In order to get as much feedback as possible before a release, it’s "
  2351. "preferable to announce it on GitHub by creating a dedicated ticket ([see "
  2352. "examples](https://github.com/FreshRSS/FreshRSS/search?utf8=%E2%9C%93&q=Call+for+testing&type=Issues)). "
  2353. "This should be done **at least one week in advance**."
  2354. msgstr ""
  2355. #. type: Plain text
  2356. #: en/./developers/05_Release_new_version.md:7
  2357. #, markdown-text
  2358. msgid "It’s also recommended to make the announcement on mailing@freshrss.org."
  2359. msgstr ""
  2360. #. type: Title ##
  2361. #: en/./developers/05_Release_new_version.md:8
  2362. #, markdown-text, no-wrap
  2363. msgid "Check the dev status"
  2364. msgstr ""
  2365. #. type: Plain text
  2366. #: en/./developers/05_Release_new_version.md:11
  2367. #, markdown-text
  2368. msgid ""
  2369. "Before releasing a new version of FreshRSS, you must ensure that the code is "
  2370. "stable and free of major bugs. Ideally, our tests should be automated and "
  2371. "executed before any publication."
  2372. msgstr ""
  2373. #. type: Plain text
  2374. #: en/./developers/05_Release_new_version.md:13
  2375. #, markdown-text
  2376. msgid ""
  2377. "You must also **make sure that the CHANGELOG file is up to date** with the "
  2378. "updates of the version to be released."
  2379. msgstr ""
  2380. #. type: Title ##
  2381. #: en/./developers/05_Release_new_version.md:14
  2382. #, markdown-text, no-wrap
  2383. msgid "Git process"
  2384. msgstr ""
  2385. #. type: Fenced code block (console)
  2386. #: en/./developers/05_Release_new_version.md:16
  2387. #, no-wrap
  2388. msgid ""
  2389. "$ git checkout edge\n"
  2390. "$ git pull\n"
  2391. "$ vim constants.php\n"
  2392. "# Update version number x.y.y.z of FRESHRSS_VERSION\n"
  2393. "$ git commit -a\n"
  2394. "Version x.y.z\n"
  2395. "$ git tag -a x.y.z\n"
  2396. "Version x.y.z\n"
  2397. "$ git push && git push --tags\n"
  2398. msgstr ""
  2399. #. type: Title ##
  2400. #: en/./developers/05_Release_new_version.md:28
  2401. #, markdown-text, no-wrap
  2402. msgid "Updating `update.freshrss.org`"
  2403. msgstr ""
  2404. #. type: Plain text
  2405. #: en/./developers/05_Release_new_version.md:31
  2406. #, markdown-text
  2407. msgid ""
  2408. "It’s important to update update.freshrss.org since this is the default "
  2409. "service for automatic FreshRSS updates."
  2410. msgstr ""
  2411. #. type: Plain text
  2412. #: en/./developers/05_Release_new_version.md:33
  2413. #, markdown-text
  2414. msgid ""
  2415. "The repository managing the code is located on GitHub: "
  2416. "[FreshRSS/update.freshrss.org](https://github.com/FreshRSS/update.freshrss.org/)."
  2417. msgstr ""
  2418. #. type: Title ##
  2419. #: en/./developers/05_Release_new_version.md:34
  2420. #, markdown-text, no-wrap
  2421. msgid "Writing the update script"
  2422. msgstr ""
  2423. #. type: Plain text
  2424. #: en/./developers/05_Release_new_version.md:37
  2425. #, markdown-text
  2426. msgid ""
  2427. "The scripts are located in the `./scripts/` directory and must take the form "
  2428. "`update_to_x.y.z.z.php`. This directory also contains `update_to_dev.php` "
  2429. "intended for updates of the `edge` branch (this script must not include code "
  2430. "specific to a particular version!) and `update_util.php`, which contains a "
  2431. "list of functions useful for all scripts."
  2432. msgstr ""
  2433. #. type: Plain text
  2434. #: en/./developers/05_Release_new_version.md:39
  2435. #, markdown-text
  2436. msgid ""
  2437. "In order to write a new script, it’s better to copy/paste the last version "
  2438. "or to start from `update_to_dev.php`. The first thing to do is to define the "
  2439. "URL from which the FreshRSS package will be downloaded (`PACKAGE_URL`). The "
  2440. "URL is in the form of "
  2441. "`https://codeload.github.com/FreshRSS/FreshRSS/zip/x.y.z`."
  2442. msgstr ""
  2443. #. type: Plain text
  2444. #: en/./developers/05_Release_new_version.md:41
  2445. #, markdown-text
  2446. msgid "There are then 5 functions that have to be executed:"
  2447. msgstr ""
  2448. #. type: Bullet: '* '
  2449. #: en/./developers/05_Release_new_version.md:47
  2450. #, markdown-text
  2451. msgid ""
  2452. "`apply_update()` takes care of saving the directory containing the data, "
  2453. "checking its structure, downloading the FreshRSS package, deploying it and "
  2454. "cleaning it all up. This function is pre-filled but adjustments can be made "
  2455. "if necessary (e.g., reorganization of the `./data` structure). It returns "
  2456. "`true` if no problem has occurred or a string indicating a problem;"
  2457. msgstr ""
  2458. #. type: Bullet: '* '
  2459. #: en/./developers/05_Release_new_version.md:47
  2460. #, markdown-text
  2461. msgid ""
  2462. "`need_info_update()` returns `true` if the user must intervene during the "
  2463. "update or `false` if not;"
  2464. msgstr ""
  2465. #. type: Bullet: '* '
  2466. #: en/./developers/05_Release_new_version.md:47
  2467. #, markdown-text
  2468. msgid ""
  2469. "`ask_info_update()` displays a form to the user if `need_info_update()` has "
  2470. "returned `true`;"
  2471. msgstr ""
  2472. #. type: Bullet: '* '
  2473. #: en/./developers/05_Release_new_version.md:47
  2474. #, markdown-text
  2475. msgid ""
  2476. "`save_info_update()` is responsible for saving the information filled out by "
  2477. "the user (from the `ask_info_update()` form);"
  2478. msgstr ""
  2479. #. type: Bullet: '* '
  2480. #: en/./developers/05_Release_new_version.md:47
  2481. #, markdown-text
  2482. msgid ""
  2483. "`do_post_update()` is executed at the end of the update and takes into "
  2484. "account the code of the new version (e.g., if the new version changes the "
  2485. "`Minz_Configuration` object, you will benefit from these improvements)."
  2486. msgstr ""
  2487. #. type: Title ##
  2488. #: en/./developers/05_Release_new_version.md:48
  2489. #, markdown-text, no-wrap
  2490. msgid "Updating the versions file"
  2491. msgstr ""
  2492. #. type: Plain text
  2493. #: en/./developers/05_Release_new_version.md:51
  2494. #, markdown-text
  2495. msgid ""
  2496. "Once the script has been written and versioned, it’s necessary to update the "
  2497. "`./versions.php' file which contains a mapping table indicating which "
  2498. "versions are updated to which other versions."
  2499. msgstr ""
  2500. #. type: Plain text
  2501. #: en/./developers/05_Release_new_version.md:53
  2502. #, markdown-text
  2503. msgid "Here’s an example of a `versions.php` file:"
  2504. msgstr ""
  2505. #. type: Fenced code block (php)
  2506. #: en/./developers/05_Release_new_version.md:54
  2507. #, no-wrap
  2508. msgid ""
  2509. "<?php\n"
  2510. "return array(\n"
  2511. "\t// STABLE\n"
  2512. "\t'0.8.0' => '1.0.0',\n"
  2513. "\t'0.8.1' => '1.0.0',\n"
  2514. "\t'1.0.0' => '1.0.1', // doesn’t exist (yet)\n"
  2515. "\t// DEV\n"
  2516. "\t'1.1.2-dev' => 'dev',\n"
  2517. "\t'1.1.3-dev' => 'dev',\n"
  2518. "\t'1.1.4-dev' => 'dev',\n"
  2519. ");\n"
  2520. msgstr ""
  2521. #. type: Plain text
  2522. #: en/./developers/05_Release_new_version.md:69
  2523. #, markdown-text
  2524. msgid "And here’s how this table works:"
  2525. msgstr ""
  2526. #. type: Bullet: '* '
  2527. #: en/./developers/05_Release_new_version.md:75
  2528. #, markdown-text
  2529. msgid "on the left you can find the N version, on the right the N+1 version;"
  2530. msgstr ""
  2531. #. type: Bullet: '* '
  2532. #: en/./developers/05_Release_new_version.md:75
  2533. #, markdown-text
  2534. msgid "the `x.y.z.z-dev` versions are **all** updated to `edge`;"
  2535. msgstr ""
  2536. #. type: Bullet: '* '
  2537. #: en/./developers/05_Release_new_version.md:75
  2538. #, markdown-text
  2539. msgid "stable versions are updated to stable versions;"
  2540. msgstr ""
  2541. #. type: Bullet: '* '
  2542. #: en/./developers/05_Release_new_version.md:75
  2543. #, markdown-text
  2544. msgid ""
  2545. "it’s possible to skip several versions at once, provided that the update "
  2546. "scripts support it;"
  2547. msgstr ""
  2548. #. type: Bullet: '* '
  2549. #: en/./developers/05_Release_new_version.md:75
  2550. #, markdown-text
  2551. msgid ""
  2552. "it’s advisable to indicate the correspondence of the current version to its "
  2553. "potential future version by specifying that this version does not yet "
  2554. "exist. As long as the corresponding script does not exist, nothing will "
  2555. "happen."
  2556. msgstr ""
  2557. #. type: Plain text
  2558. #: en/./developers/05_Release_new_version.md:77
  2559. #, markdown-text
  2560. msgid ""
  2561. "It’s**very strongly** recommended to keep this file organized according to "
  2562. "version numbers by separating stable and dev versions."
  2563. msgstr ""
  2564. #. type: Title ##
  2565. #: en/./developers/05_Release_new_version.md:78
  2566. #, markdown-text, no-wrap
  2567. msgid "Deployment"
  2568. msgstr ""
  2569. #. type: Plain text
  2570. #: en/./developers/05_Release_new_version.md:81
  2571. #, markdown-text
  2572. msgid ""
  2573. "Before updating update.freshrss.org, it’s better to test with "
  2574. "dev.update.freshrss.org, which corresponds to pre-production. So update "
  2575. "dev.update.freshrss.org and change the `FRESHRSS_UPDATE_WEBSITE` URL of your "
  2576. "FreshRSS instance. Start the update and check that it’s running correctly."
  2577. msgstr ""
  2578. #. type: Plain text
  2579. #: en/./developers/05_Release_new_version.md:83
  2580. #, markdown-text
  2581. msgid ""
  2582. "When you’re satisfied, update update.freshrss.org with the new script, test "
  2583. "it again, and then move on."
  2584. msgstr ""
  2585. #. type: Title ##
  2586. #: en/./developers/05_Release_new_version.md:84
  2587. #, markdown-text, no-wrap
  2588. msgid "Updating the FreshRSS services"
  2589. msgstr ""
  2590. #. type: Plain text
  2591. #: en/./developers/05_Release_new_version.md:87
  2592. #, markdown-text
  2593. msgid "Two services need to be updated immediately after the update."
  2594. msgstr ""
  2595. #. type: Bullet: '* '
  2596. #: en/./developers/05_Release_new_version.md:90
  2597. #, markdown-text
  2598. msgid "rss.freshrss.org;"
  2599. msgstr ""
  2600. #. type: Bullet: '* '
  2601. #: en/./developers/05_Release_new_version.md:90
  2602. #, markdown-text
  2603. msgid "demo.freshrss.org (public login: `demo` / `demodemo`)."
  2604. msgstr ""
  2605. #. type: Title ##
  2606. #: en/./developers/05_Release_new_version.md:91
  2607. #, markdown-text, no-wrap
  2608. msgid "Publicly announce the release"
  2609. msgstr ""
  2610. #. type: Plain text
  2611. #: en/./developers/05_Release_new_version.md:94
  2612. #, markdown-text
  2613. msgid "When everything’s working, it’s time to announce the release to the world!"
  2614. msgstr ""
  2615. #. type: Bullet: '* '
  2616. #: en/./developers/05_Release_new_version.md:99
  2617. #, markdown-text
  2618. msgid ""
  2619. "on GitHub by creating[a new "
  2620. "release](https://github.com/FreshRSS/FreshRSS/releases/new)"
  2621. msgstr ""
  2622. #. type: Bullet: '* '
  2623. #: en/./developers/05_Release_new_version.md:99
  2624. #, markdown-text
  2625. msgid ""
  2626. "on the freshrss.org blog, at least for stable versions (write the article "
  2627. "on[FreshRSS/freshrss.org](https://github.com/FreshRSS/freshrss.org))"
  2628. msgstr ""
  2629. #. type: Bullet: '* '
  2630. #: en/./developers/05_Release_new_version.md:99
  2631. #, markdown-text
  2632. msgid "on Twitter ([@FreshRSS](https://twitter.com/FreshRSS) account)"
  2633. msgstr ""
  2634. #. type: Bullet: '* '
  2635. #: en/./developers/05_Release_new_version.md:99
  2636. #, markdown-text
  2637. msgid "and on mailing@freshrss.org"
  2638. msgstr ""
  2639. #. type: Title ##
  2640. #: en/./developers/05_Release_new_version.md:100
  2641. #, markdown-text, no-wrap
  2642. msgid "Starting the next development version"
  2643. msgstr ""
  2644. #. type: Fenced code block (console)
  2645. #: en/./developers/05_Release_new_version.md:102
  2646. #, no-wrap
  2647. msgid ""
  2648. "$ git checkout edge\n"
  2649. "$ vim constants.php\n"
  2650. "# Update the FRESHRSS_VERSION\n"
  2651. "$ vim CHANGELOG.md\n"
  2652. "# Prepare the changelog for the next version\n"
  2653. "$ git add CHANGELOG.md && git commit && git push\n"
  2654. msgstr ""
  2655. #. type: Plain text
  2656. #: en/./developers/05_Release_new_version.md:111
  2657. #, markdown-text
  2658. msgid ""
  2659. "Also remember to update update.freshrss.org so that it takes the current "
  2660. "development version into account."
  2661. msgstr ""
  2662. #. type: Title #
  2663. #: en/./developers/06_Fever_API.md:1
  2664. #, markdown-text, no-wrap
  2665. msgid "FreshRSS - Fever API implementation"
  2666. msgstr ""
  2667. #. type: Plain text
  2668. #: en/./developers/06_Fever_API.md:5
  2669. #, markdown-text
  2670. msgid ""
  2671. "See [Mobile access](../users/06_Mobile_access.md) for general aspects of API "
  2672. "access. Additionally [page about our Google Reader compatible "
  2673. "API](06_GoogleReader_API.md) for another possibility."
  2674. msgstr ""
  2675. #. type: Title ##
  2676. #: en/./developers/06_Fever_API.md:7 en/./developers/06_GoogleReader_API.md:7
  2677. #, markdown-text, no-wrap
  2678. msgid "RSS clients"
  2679. msgstr ""
  2680. #. type: Plain text
  2681. #: en/./developers/06_Fever_API.md:12
  2682. #, markdown-text
  2683. msgid ""
  2684. "There are many RSS clients that support the Fever API, but they seem to "
  2685. "understand the Fever API a bit differently. If your favourite client "
  2686. "doesn’t work properly with this API, please create an issue and we’ll have a "
  2687. "look. But we can **only** do that for free clients."
  2688. msgstr ""
  2689. #. type: Title ##
  2690. #: en/./developers/06_Fever_API.md:13 en/./developers/06_GoogleReader_API.md:13
  2691. #, markdown-text, no-wrap
  2692. msgid "Usage & Authentication"
  2693. msgstr ""
  2694. #. type: Plain text
  2695. #: en/./developers/06_Fever_API.md:17 en/./developers/06_GoogleReader_API.md:17
  2696. #, markdown-text
  2697. msgid ""
  2698. "Before you can start using this API, you have to enable and setup API "
  2699. "access, which is [documented here](../users/06_Mobile_access.md), and then "
  2700. "reset the user’s API password."
  2701. msgstr ""
  2702. #. type: Plain text
  2703. #: en/./developers/06_Fever_API.md:19
  2704. #, markdown-text
  2705. msgid ""
  2706. "Then point your mobile application to the `fever.php` address "
  2707. "(e.g. `https://freshrss.example.net/api/fever.php`)."
  2708. msgstr ""
  2709. #. type: Title ##
  2710. #: en/./developers/06_Fever_API.md:20 en/./developers/06_GoogleReader_API.md:20
  2711. #, markdown-text, no-wrap
  2712. msgid "Compatible clients"
  2713. msgstr ""
  2714. #. type: Plain text
  2715. #: en/./developers/06_Fever_API.md:31
  2716. #, markdown-text, no-wrap
  2717. msgid ""
  2718. "| App "
  2719. "| Platform | License "
  2720. "|\n"
  2721. "|:----------------------------------------------------------------------------------:|:-------------------:|:--------------------------------------------------------:|\n"
  2722. "|[Fluent Reader](https://hyliu.me/fluent-reader/) "
  2723. "|Windows, Linux, "
  2724. "macOS|[BSD-3-Clause](https://github.com/yang991178/fluent-reader/blob/master/LICENSE)|\n"
  2725. "|[Fluent Reader lite](https://hyliu.me/fluent-reader-lite/) "
  2726. "|Android, iOS "
  2727. "|[BSD-3-Clause](https://github.com/yang991178/fluent-reader-lite)|\n"
  2728. "|[Fiery "
  2729. "Feeds](https://apps.apple.com/app/fiery-feeds-rss-reader/id1158763303) "
  2730. "|iOS |Closed Source "
  2731. "|\n"
  2732. "|[Newsflash](https://gitlab.com/news-flash/news_flash_gtk/) "
  2733. "|Linux "
  2734. "|[GPLv3](https://gitlab.com/news-flash/news_flash_gtk/)|\n"
  2735. "|[Unread](https://apps.apple.com/app/unread-rss-reader/id1252376153) "
  2736. "|iOS |Closed Source "
  2737. "|\n"
  2738. "|[Reeder](https://www.reederapp.com/) "
  2739. "|iOS |Closed Source "
  2740. "|\n"
  2741. "|[ReadKit](https://apps.apple.com/app/readkit/id588726889) "
  2742. "|macOS |Closed Source "
  2743. "|\n"
  2744. msgstr ""
  2745. #. type: Title ##
  2746. #: en/./developers/06_Fever_API.md:32 en/./index.md:7
  2747. #, markdown-text, no-wrap
  2748. msgid "Features"
  2749. msgstr ""
  2750. #. type: Plain text
  2751. #: en/./developers/06_Fever_API.md:35
  2752. #, markdown-text
  2753. msgid "The following features are implemented:"
  2754. msgstr ""
  2755. #. type: Bullet: '* '
  2756. #: en/./developers/06_Fever_API.md:45
  2757. #, markdown-text
  2758. msgid "fetching categories"
  2759. msgstr ""
  2760. #. type: Bullet: '* '
  2761. #: en/./developers/06_Fever_API.md:45
  2762. #, markdown-text
  2763. msgid "fetching feeds"
  2764. msgstr ""
  2765. #. type: Bullet: '* '
  2766. #: en/./developers/06_Fever_API.md:45
  2767. #, markdown-text
  2768. msgid ""
  2769. "fetching RSS items (new, favorites, unread, by_id, by_feed, by_category, "
  2770. "since)"
  2771. msgstr ""
  2772. #. type: Bullet: '* '
  2773. #: en/./developers/06_Fever_API.md:45
  2774. #, markdown-text
  2775. msgid "fetching favicons"
  2776. msgstr ""
  2777. #. type: Bullet: '* '
  2778. #: en/./developers/06_Fever_API.md:45
  2779. #, markdown-text
  2780. msgid "setting read marker for item(s)"
  2781. msgstr ""
  2782. #. type: Bullet: '* '
  2783. #: en/./developers/06_Fever_API.md:45
  2784. #, markdown-text
  2785. msgid "setting starred marker for item(s)"
  2786. msgstr ""
  2787. #. type: Bullet: '* '
  2788. #: en/./developers/06_Fever_API.md:45
  2789. #, markdown-text
  2790. msgid "setting read marker for feed"
  2791. msgstr ""
  2792. #. type: Bullet: '* '
  2793. #: en/./developers/06_Fever_API.md:45
  2794. #, markdown-text
  2795. msgid "setting read marker for category"
  2796. msgstr ""
  2797. #. type: Bullet: '* '
  2798. #: en/./developers/06_Fever_API.md:45
  2799. #, markdown-text
  2800. msgid "supports FreshRSS extensions, which use the `entry_before_display` hook"
  2801. msgstr ""
  2802. #. type: Plain text
  2803. #: en/./developers/06_Fever_API.md:47
  2804. #, markdown-text
  2805. msgid "The following features are not supported:"
  2806. msgstr ""
  2807. #. type: Bullet: '* '
  2808. #: en/./developers/06_Fever_API.md:49
  2809. #, markdown-text
  2810. msgid ""
  2811. "**Hot Links** aka **hot** as there is nothing in FreshRSS yet that is "
  2812. "similar or could be used to simulate it."
  2813. msgstr ""
  2814. #. type: Title ##
  2815. #: en/./developers/06_Fever_API.md:50
  2816. #, markdown-text, no-wrap
  2817. msgid "Testing and debugging"
  2818. msgstr ""
  2819. #. type: Plain text
  2820. #: en/./developers/06_Fever_API.md:53
  2821. #, markdown-text
  2822. msgid ""
  2823. "If this API does not work as expected in your RSS reader, you can test it "
  2824. "manually with a tool like [Postman](https://www.getpostman.com/)."
  2825. msgstr ""
  2826. #. type: Plain text
  2827. #: en/./developers/06_Fever_API.md:55
  2828. #, markdown-text
  2829. msgid ""
  2830. "Configure a POST request to the URL "
  2831. "<https://freshrss.example.net/api/fever.php?api> which should give you the "
  2832. "result:"
  2833. msgstr ""
  2834. #. type: Fenced code block (json)
  2835. #: en/./developers/06_Fever_API.md:55
  2836. #, no-wrap
  2837. msgid ""
  2838. "{\n"
  2839. "\t\"api_version\": 3,\n"
  2840. "\t\"auth\": 0\n"
  2841. "}\n"
  2842. msgstr ""
  2843. #. type: Plain text
  2844. #: en/./developers/06_Fever_API.md:62
  2845. #, markdown-text
  2846. msgid "Great, the base setup seems to work!"
  2847. msgstr ""
  2848. #. type: Plain text
  2849. #: en/./developers/06_Fever_API.md:65
  2850. #, markdown-text
  2851. msgid ""
  2852. "Now lets try an authenticated call. Fever uses an `api_key`, which is the "
  2853. "MD5 hash of `\"$username:$apiPassword\"`. Assuming the user is `kevin` and "
  2854. "the password `freshrss`, here is a command-line example to compute the "
  2855. "resulting `api_key`"
  2856. msgstr ""
  2857. #. type: Fenced code block (sh)
  2858. #: en/./developers/06_Fever_API.md:66
  2859. #, no-wrap
  2860. msgid "api_key=`echo -n \"kevin:freshrss\" | md5sum | cut -d' ' -f1`\n"
  2861. msgstr ""
  2862. #. type: Plain text
  2863. #: en/./developers/06_Fever_API.md:71
  2864. #, markdown-text
  2865. msgid ""
  2866. "Add a body to your POST request encoded as `form-data` and one key named "
  2867. "`api_key` with the value `your-password-hash`:"
  2868. msgstr ""
  2869. #. type: Fenced code block (sh)
  2870. #: en/./developers/06_Fever_API.md:72
  2871. #, no-wrap
  2872. msgid ""
  2873. "curl -s -F \"api_key=$api_key\" "
  2874. "'https://freshrss.example.net/api/fever.php?api'\n"
  2875. msgstr ""
  2876. #. type: Plain text
  2877. #: en/./developers/06_Fever_API.md:77
  2878. #, markdown-text
  2879. msgid "This should give:"
  2880. msgstr ""
  2881. #. type: Fenced code block (json)
  2882. #: en/./developers/06_Fever_API.md:77
  2883. #, no-wrap
  2884. msgid ""
  2885. "{\n"
  2886. "\t\"api_version\": 3,\n"
  2887. "\t\"auth\": 1,\n"
  2888. "\t\"last_refreshed_on_time\": \"1520013061\"\n"
  2889. "}\n"
  2890. msgstr ""
  2891. #. type: Plain text
  2892. #: en/./developers/06_Fever_API.md:85
  2893. #, markdown-text
  2894. msgid ""
  2895. "Perfect, you’re now authenticated and you can start testing the more "
  2896. "advanced features. To do so, change the URL and append the possible API "
  2897. "actions to your request parameters. Please refer to the [original Fever "
  2898. "documentation](https://feedafever.com/api) for more information."
  2899. msgstr ""
  2900. #. type: Plain text
  2901. #: en/./developers/06_Fever_API.md:87
  2902. #, markdown-text
  2903. msgid "Some basic calls are:"
  2904. msgstr ""
  2905. #. type: Bullet: '* '
  2906. #: en/./developers/06_Fever_API.md:97
  2907. #, markdown-text
  2908. msgid "<https://freshrss.example.net/api/fever.php?api&items>"
  2909. msgstr ""
  2910. #. type: Bullet: '* '
  2911. #: en/./developers/06_Fever_API.md:97
  2912. #, markdown-text
  2913. msgid "<https://freshrss.example.net/api/fever.php?api&feeds>"
  2914. msgstr ""
  2915. #. type: Bullet: '* '
  2916. #: en/./developers/06_Fever_API.md:97
  2917. #, markdown-text
  2918. msgid "<https://freshrss.example.net/api/fever.php?api&groups>"
  2919. msgstr ""
  2920. #. type: Bullet: '* '
  2921. #: en/./developers/06_Fever_API.md:97
  2922. #, markdown-text
  2923. msgid "<https://freshrss.example.net/api/fever.php?api&unread_item_ids>"
  2924. msgstr ""
  2925. #. type: Bullet: '* '
  2926. #: en/./developers/06_Fever_API.md:97
  2927. #, markdown-text
  2928. msgid "<https://freshrss.example.net/api/fever.php?api&saved_item_ids>"
  2929. msgstr ""
  2930. #. type: Bullet: '* '
  2931. #: en/./developers/06_Fever_API.md:97
  2932. #, markdown-text
  2933. msgid "<https://freshrss.example.net/api/fever.php?api&items&since_id=some_id>"
  2934. msgstr ""
  2935. #. type: Bullet: '* '
  2936. #: en/./developers/06_Fever_API.md:97
  2937. #, markdown-text
  2938. msgid "<https://freshrss.example.net/api/fever.php?api&items&max_id=some_id>"
  2939. msgstr ""
  2940. #. type: Bullet: '* '
  2941. #: en/./developers/06_Fever_API.md:97
  2942. #, markdown-text
  2943. msgid "<https://freshrss.example.net/api/fever.php?api&mark=item&as=read&id=some_id>"
  2944. msgstr ""
  2945. #. type: Bullet: '* '
  2946. #: en/./developers/06_Fever_API.md:97
  2947. #, markdown-text
  2948. msgid "<https://freshrss.example.net/api/fever.php?api&mark=item&as=unread&id=some_id>"
  2949. msgstr ""
  2950. #. type: Plain text
  2951. #: en/./developers/06_Fever_API.md:99
  2952. #, markdown-text
  2953. msgid ""
  2954. "Replace `some_id` with a real ID from your `freshrss_username_entry` "
  2955. "database."
  2956. msgstr ""
  2957. #. type: Title ###
  2958. #: en/./developers/06_Fever_API.md:100
  2959. #, markdown-text, no-wrap
  2960. msgid "Debugging"
  2961. msgstr ""
  2962. #. type: Plain text
  2963. #: en/./developers/06_Fever_API.md:103
  2964. #, markdown-text
  2965. msgid ""
  2966. "If nothing helps and your client is still misbehaving, you can add the "
  2967. "following lines to the beginning of the `fever.api` file to determine the "
  2968. "cause of the problems:"
  2969. msgstr ""
  2970. #. type: Fenced code block (php)
  2971. #: en/./developers/06_Fever_API.md:104
  2972. #, no-wrap
  2973. msgid ""
  2974. "file_put_contents(__DIR__ . '/fever.log', $_SERVER['HTTP_USER_AGENT'] . ': ' "
  2975. ". json_encode($_REQUEST) . PHP_EOL, FILE_APPEND);\n"
  2976. msgstr ""
  2977. #. type: Plain text
  2978. #: en/./developers/06_Fever_API.md:109
  2979. #, markdown-text
  2980. msgid ""
  2981. "Then use your RSS client to query the API and afterwards check the file "
  2982. "`fever.log`."
  2983. msgstr ""
  2984. #. type: Title ##
  2985. #: en/./developers/06_Fever_API.md:110
  2986. #, markdown-text, no-wrap
  2987. msgid "Credits"
  2988. msgstr ""
  2989. #. type: Plain text
  2990. #: en/./developers/06_Fever_API.md:112
  2991. #, markdown-text
  2992. msgid ""
  2993. "This plugin was inspired by the "
  2994. "[tinytinyrss-fever-plugin](https://github.com/dasmurphy/tinytinyrss-fever-plugin)."
  2995. msgstr ""
  2996. #. type: Title #
  2997. #: en/./developers/06_GoogleReader_API.md:1
  2998. #, markdown-text, no-wrap
  2999. msgid "FreshRSS - Google Reader compatible API implementation"
  3000. msgstr ""
  3001. #. type: Plain text
  3002. #: en/./developers/06_GoogleReader_API.md:4
  3003. #, markdown-text
  3004. msgid ""
  3005. "See [Mobile access](../users/06_Mobile_access.md) for general aspects of API "
  3006. "access."
  3007. msgstr ""
  3008. #. type: Plain text
  3009. #: en/./developers/06_GoogleReader_API.md:6
  3010. #, markdown-text
  3011. msgid ""
  3012. "See also the [page about our Fever compatible API](06_Fever_API.md) for "
  3013. "another possibility (less powerful)."
  3014. msgstr ""
  3015. #. type: Plain text
  3016. #: en/./developers/06_GoogleReader_API.md:12
  3017. #, markdown-text
  3018. msgid ""
  3019. "There are many RSS clients that support the Fever API, but they might "
  3020. "understand the API a bit differently. If your favourite client doesn’t work "
  3021. "properly with this API, please create an issue and we’ll have a look. But "
  3022. "we can **only** do that for free clients."
  3023. msgstr ""
  3024. #. type: Plain text
  3025. #: en/./developers/06_GoogleReader_API.md:19
  3026. #, markdown-text
  3027. msgid ""
  3028. "Then point your mobile application to the `greader.php` address "
  3029. "(e.g. `https://freshrss.example.net/api/greader.php`)."
  3030. msgstr ""
  3031. #. type: Bullet: '1. '
  3032. #: en/./developers/06_GoogleReader_API.md:24
  3033. #, markdown-text
  3034. msgid ""
  3035. "On the same FreshRSS API page, note the address given under “Your API "
  3036. "address”, like `https://freshrss.example.net/api/greader.php`"
  3037. msgstr ""
  3038. #. type: Bullet: '2. '
  3039. #: en/./developers/06_GoogleReader_API.md:24
  3040. #, markdown-text
  3041. msgid ""
  3042. "Type the API address in a client, together with your FreshRSS username, and "
  3043. "the corresponding special API password."
  3044. msgstr ""
  3045. #. type: Plain text
  3046. #: en/./developers/06_GoogleReader_API.md:39
  3047. #, markdown-text, no-wrap
  3048. msgid ""
  3049. "| App "
  3050. "| Platform | License "
  3051. "|\n"
  3052. "|:----------------------------------------------------------------------------------:|:-------------------:|:--------------------------------------------------------:|\n"
  3053. "|[News+](https://github.com/noinnion/newsplus/blob/master/apk/NewsPlus_202.apk) "
  3054. "with [News+ Google Reader "
  3055. "extension](https://github.com/noinnion/newsplus/blob/master/apk/GoogleReaderCloneExtension_101.apk) "
  3056. "|Android|Closed Source (Free), [partially open "
  3057. "source](https://github.com/noinnion/newsplus/blob/master/extensions/GoogleReaderCloneExtension/src/com/noinnion/android/newsplus/extension/google_reader/GoogleReaderClient.java)|\n"
  3058. "|[FeedMe "
  3059. "3.5.3+](https://play.google.com/store/apps/details?id=com.seazon.feedme) "
  3060. "|Android |Closed Source (Free) "
  3061. "|\n"
  3062. "|[EasyRSS](https://github.com/Alkarex/EasyRSS) "
  3063. "|Android "
  3064. "|[GPLv3](https://github.com/Alkarex/EasyRSS/blob/master/license.txt) "
  3065. "([F-Droid](https://f-droid.org/packages/org.freshrss.easyrss/))|\n"
  3066. "|[Readrops](https://github.com/readrops/Readrops) |Android "
  3067. "|[GPLv3](https://github.com/readrops/Readrops/blob/develop/LICENSE) "
  3068. "|\n"
  3069. "|[Fluent Reader Lite](https://hyliu.me/fluent-reader-lite/) |Android, iOS "
  3070. "|[BSD-3](https://github.com/yang991178/fluent-reader-lite) "
  3071. "|\n"
  3072. "|[FocusReader](https://play.google.com/store/apps/details?id=allen.town.focus.reader) "
  3073. "|Android |Closed Source(Free) "
  3074. "|\n"
  3075. "|[Newsflash](https://gitlab.com/news-flash/news_flash_gtk/) "
  3076. "|Linux "
  3077. "|[GPLv3](https://gitlab.com/news-flash/news_flash_gtk/) |\n"
  3078. "|[lire](https://lireapp.com/) "
  3079. "|iOS, macOS |Closed Source "
  3080. "|\n"
  3081. "|[Newsboat 2.24+](https://newsboat.org/) |Linux "
  3082. "|[MIT](https://github.com/newsboat/newsboat/blob/master/LICENSE) "
  3083. "|\n"
  3084. "|[Vienna RSS](http://www.vienna-rss.com/) |macOS "
  3085. "|[Apache-2.0](https://github.com/ViennaRSS/vienna-rss/blob/master/LICENCE.md) "
  3086. "|\n"
  3087. "|[Reeder](https://www.reederapp.com/) |macOS, iOS "
  3088. "|Closed Source |\n"
  3089. "|[FreshRSS-Notify](https://addons.mozilla.org/firefox/addon/freshrss-notify-webextension/) "
  3090. "|Firefox |Open Source "
  3091. "|\n"
  3092. msgstr ""
  3093. #. type: Plain text
  3094. #: en/./developers/06_GoogleReader_API.md:41
  3095. #, markdown-text, no-wrap
  3096. msgid ""
  3097. "> ℹ️ See a [better table of compatible clients in our main "
  3098. "Readme](https://github.com/FreshRSS/FreshRSS/blob/edge/README.md#apis--native-apps).\n"
  3099. msgstr ""
  3100. #. type: Title ##
  3101. #: en/./developers/06_GoogleReader_API.md:42
  3102. #, markdown-text, no-wrap
  3103. msgid "Google Reader compatible API"
  3104. msgstr ""
  3105. #. type: Plain text
  3106. #: en/./developers/06_GoogleReader_API.md:45
  3107. #, markdown-text
  3108. msgid "Examples of basic queries:"
  3109. msgstr ""
  3110. #. type: Fenced code block (sh)
  3111. #: en/./developers/06_GoogleReader_API.md:46
  3112. #, no-wrap
  3113. msgid ""
  3114. "# Initial login, using API password (Email and Passwd can be given either as "
  3115. "GET, or POST - better)\n"
  3116. "curl "
  3117. "'https://freshrss.example.net/api/greader.php/accounts/ClientLogin?Email=alice&Passwd=Abcdef123456'\n"
  3118. "SID=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
  3119. "Auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\n"
  3120. "\n"
  3121. "# Examples of read-only requests\n"
  3122. "curl -s -H \"Authorization:GoogleLogin "
  3123. "auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
  3124. " "
  3125. "'https://freshrss.example.net/api/greader.php/reader/api/0/subscription/list?output=json'\n"
  3126. "\n"
  3127. "curl -s -H \"Authorization:GoogleLogin "
  3128. "auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
  3129. " "
  3130. "'https://freshrss.example.net/api/greader.php/reader/api/0/unread-count?output=json'\n"
  3131. "\n"
  3132. "curl -s -H \"Authorization:GoogleLogin "
  3133. "auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
  3134. " "
  3135. "'https://freshrss.example.net/api/greader.php/reader/api/0/tag/list?output=json'\n"
  3136. "\n"
  3137. "# Retrieve a token for requests making modifications\n"
  3138. "curl -H \"Authorization:GoogleLogin "
  3139. "auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
  3140. " 'https://freshrss.example.net/api/greader.php/reader/api/0/token'\n"
  3141. "8e6845e089457af25303abc6f53356eb60bdb5f8ZZZZZZZZZZZZZZZZZ\n"
  3142. "\n"
  3143. "# Get articles, piped to jq for easier JSON reading\n"
  3144. "curl -s -H \"Authorization:GoogleLogin "
  3145. "auth=alice/8e6845e089457af25303abc6f53356eb60bdb5f8\" \\\n"
  3146. " "
  3147. "'https://freshrss.example.net/api/greader.php/reader/api/0/stream/contents/reading-list' "
  3148. "| jq .\n"
  3149. msgstr ""
  3150. #. type: Bullet: '* '
  3151. #: en/./developers/06_GoogleReader_API.md:73
  3152. #, markdown-text
  3153. msgid ""
  3154. "[Source code of our API "
  3155. "implementation](https://github.com/FreshRSS/FreshRSS/blob/edge/p/api/greader.php)"
  3156. msgstr ""
  3157. #. type: Title ###
  3158. #: en/./developers/06_GoogleReader_API.md:74
  3159. #, markdown-text, no-wrap
  3160. msgid "API documentation from the original Google Reader"
  3161. msgstr ""
  3162. #. type: Bullet: '* '
  3163. #: en/./developers/06_GoogleReader_API.md:81
  3164. #, markdown-text
  3165. msgid ""
  3166. "[By Daniel "
  3167. "Arowser](https://web.archive.org/web/20130710044440/http://undoc.in/api.html) "
  3168. "([source](https://github.com/arowser/google-reader-api))"
  3169. msgstr ""
  3170. #. type: Bullet: '* '
  3171. #: en/./developers/06_GoogleReader_API.md:81
  3172. #, markdown-text
  3173. msgid ""
  3174. "[By Martin "
  3175. "Doms](https://web.archive.org/web/20210126115837/https://blog.martindoms.com/2009/10/16/using-the-google-reader-api-part-2/)"
  3176. msgstr ""
  3177. #. type: Bullet: '* '
  3178. #: en/./developers/06_GoogleReader_API.md:81
  3179. #, markdown-text
  3180. msgid ""
  3181. "[By Nick "
  3182. "Bradbury](https://inessential.com/2013/03/14/google_reader_api_documentation)"
  3183. msgstr ""
  3184. #. type: Bullet: '* '
  3185. #: en/./developers/06_GoogleReader_API.md:81
  3186. #, markdown-text
  3187. msgid ""
  3188. "[By Niall "
  3189. "Kennedy](https://web.archive.org/web/20170426184845/http://www.niallkennedy.com/blog/2005/12/google-reader-api.html)"
  3190. msgstr ""
  3191. #. type: Bullet: '* '
  3192. #: en/./developers/06_GoogleReader_API.md:81
  3193. #, markdown-text
  3194. msgid ""
  3195. "[By Mihai "
  3196. "Parparita](https://web.archive.org/web/20140919042419/http://code.google.com/p/google-reader-api/w/list) "
  3197. "([source](https://github.com/mihaip/google-reader-api))"
  3198. msgstr ""
  3199. #. type: Title ###
  3200. #: en/./developers/06_GoogleReader_API.md:82
  3201. #, markdown-text, no-wrap
  3202. msgid "API documentation from other compatible clients"
  3203. msgstr ""
  3204. #. type: Bullet: '* '
  3205. #: en/./developers/06_GoogleReader_API.md:89
  3206. #, markdown-text
  3207. msgid "[FeedHQ](https://feedhq.readthedocs.io/en/latest/api/index.html)"
  3208. msgstr ""
  3209. #. type: Bullet: '* '
  3210. #: en/./developers/06_GoogleReader_API.md:89
  3211. #, markdown-text
  3212. msgid "[Inoreader](https://www.inoreader.com/developers/)"
  3213. msgstr ""
  3214. #. type: Bullet: '* '
  3215. #: en/./developers/06_GoogleReader_API.md:89
  3216. #, markdown-text
  3217. msgid "[The Old Reader](https://github.com/theoldreader/api)"
  3218. msgstr ""
  3219. #. type: Bullet: '* '
  3220. #: en/./developers/06_GoogleReader_API.md:89
  3221. #, markdown-text
  3222. msgid "[pyrfeed](http://code.google.com/p/pyrfeed/wiki/GoogleReaderAPI)"
  3223. msgstr ""
  3224. #. type: Bullet: '* '
  3225. #: en/./developers/06_GoogleReader_API.md:89
  3226. #, markdown-text
  3227. msgid "[BazQux](https://github.com/bazqux/bazqux-api)"
  3228. msgstr ""
  3229. #. type: Title ###
  3230. #: en/./developers/06_GoogleReader_API.md:90
  3231. #, markdown-text, no-wrap
  3232. msgid "Synchronisation strategy"
  3233. msgstr ""
  3234. #. type: Plain text
  3235. #: en/./developers/06_GoogleReader_API.md:94
  3236. #, markdown-text, no-wrap
  3237. msgid ""
  3238. "> ℹ️ If you are maintaining a client or planning to develop a new one, "
  3239. "please read carefully the following pieces of advice,\n"
  3240. "as many clients start by having a very inneficient synchronisation "
  3241. "strategy.\n"
  3242. msgstr ""
  3243. #. type: Bullet: '* '
  3244. #: en/./developers/06_GoogleReader_API.md:96
  3245. #, markdown-text
  3246. msgid ""
  3247. "[*Synchronisation recommendation* by "
  3248. "Alkarex](https://github.com/FreshRSS/FreshRSS/issues/2566#issuecomment-541317776)"
  3249. msgstr ""
  3250. #. type: Bullet: '* '
  3251. #: en/./developers/06_GoogleReader_API.md:96
  3252. #, markdown-text
  3253. msgid ""
  3254. "[*The Right Way to Sync* by "
  3255. "BazQux](https://github.com/bazqux/bazqux-api#user-content-the-right-way-to-sync)"
  3256. msgstr ""
  3257. #. type: Title #
  3258. #: en/./developers/06_Reporting_Bugs.md:1
  3259. #, markdown-text, no-wrap
  3260. msgid "Reporting a bug or a suggestion"
  3261. msgstr ""
  3262. #. type: Plain text
  3263. #: en/./developers/06_Reporting_Bugs.md:4
  3264. #, markdown-text
  3265. msgid ""
  3266. "Despite the care given to FreshRSS, it’s still possible that bugs "
  3267. "occur. Development is dynamic, so issues can be corrected quickly. You might "
  3268. "also have a feature in mind that doesn’t yet exist. Regardless whether your "
  3269. "idea seems silly, far-fetched, useless or too specific, please don’t "
  3270. "hesitate to propose it to us! “Ideas in the air” often find an attentive "
  3271. "ear. It’s new external perspectives that make the project evolve the most."
  3272. msgstr ""
  3273. #. type: Plain text
  3274. #: en/./developers/06_Reporting_Bugs.md:6
  3275. #, markdown-text
  3276. msgid ""
  3277. "If you’re convinced that you should be heard, here’s how you can go about "
  3278. "it."
  3279. msgstr ""
  3280. #. type: Title ##
  3281. #: en/./developers/06_Reporting_Bugs.md:7
  3282. #, markdown-text, no-wrap
  3283. msgid "On GitHub"
  3284. msgstr ""
  3285. #. type: Plain text
  3286. #: en/./developers/06_Reporting_Bugs.md:10
  3287. #, markdown-text
  3288. msgid ""
  3289. "GitHub is the ideal platform to submit your requests. It allows us to "
  3290. "discuss a problem or suggestion with others and it often generates new "
  3291. "ideas. Let’s not neglect this “social” aspect!"
  3292. msgstr ""
  3293. #. type: Bullet: '1. '
  3294. #: en/./developers/06_Reporting_Bugs.md:16
  3295. #, markdown-text
  3296. msgid "[Go to the bug ticket manager](https://github.com/FreshRSS/FreshRSS/issues)"
  3297. msgstr ""
  3298. #. type: Bullet: '2. '
  3299. #: en/./developers/06_Reporting_Bugs.md:16
  3300. #, markdown-text
  3301. msgid ""
  3302. "Start by checking if a similar request hasn’t already been made. If so, "
  3303. "please feel free to add your voice to the request."
  3304. msgstr ""
  3305. #. type: Bullet: '3. '
  3306. #: en/./developers/06_Reporting_Bugs.md:16
  3307. #, markdown-text
  3308. msgid ""
  3309. "If your request is new, [open a new bug "
  3310. "ticket](https://github.com/FreshRSS/FreshRSS/issues/new)"
  3311. msgstr ""
  3312. #. type: Bullet: '4. '
  3313. #: en/./developers/06_Reporting_Bugs.md:16
  3314. #, markdown-text
  3315. msgid ""
  3316. "Finally, write your request. If you’re fluent in English, it’s the preferred "
  3317. "language because it allows for discussion with the largest number of people."
  3318. msgstr ""
  3319. #. type: Bullet: '5. '
  3320. #: en/./developers/06_Reporting_Bugs.md:16
  3321. #, markdown-text
  3322. msgid "Please follow the tips below to make it easier to let your ticket be heard."
  3323. msgstr ""
  3324. #. type: Title ##
  3325. #: en/./developers/06_Reporting_Bugs.md:17
  3326. #, markdown-text, no-wrap
  3327. msgid "Informal"
  3328. msgstr ""
  3329. #. type: Plain text
  3330. #: en/./developers/06_Reporting_Bugs.md:20
  3331. #, markdown-text
  3332. msgid ""
  3333. "Not everyone likes or uses GitHub for a variety of legitimate reasons. That "
  3334. "is why you can also contact us in a more informal way."
  3335. msgstr ""
  3336. #. type: Bullet: '* '
  3337. #: en/./developers/06_Reporting_Bugs.md:26
  3338. #, markdown-text
  3339. msgid ""
  3340. "On [our Mattermost "
  3341. "chat](https://framateam.org/signup_user_complete/?id=e2680d3e3128b9fac8fdb3003b0024ee)"
  3342. msgstr ""
  3343. #. type: Bullet: '* '
  3344. #: en/./developers/06_Reporting_Bugs.md:26
  3345. #, markdown-text
  3346. msgid "On [our subreddit](https://www.reddit.com/r/freshrss/)"
  3347. msgstr ""
  3348. #. type: Bullet: '* '
  3349. #: en/./developers/06_Reporting_Bugs.md:26
  3350. #, markdown-text
  3351. msgid "At events / meetings around Free Software"
  3352. msgstr ""
  3353. #. type: Bullet: '* '
  3354. #: en/./developers/06_Reporting_Bugs.md:26
  3355. #, markdown-text
  3356. msgid "Over a beer in a bar"
  3357. msgstr ""
  3358. #. type: Bullet: '* '
  3359. #: en/./developers/06_Reporting_Bugs.md:26
  3360. #, markdown-text
  3361. msgid "Etc."
  3362. msgstr ""
  3363. #. type: Title ##
  3364. #: en/./developers/06_Reporting_Bugs.md:27
  3365. #, markdown-text, no-wrap
  3366. msgid "Tips"
  3367. msgstr ""
  3368. #. type: Plain text
  3369. #: en/./developers/06_Reporting_Bugs.md:30
  3370. #, markdown-text
  3371. msgid "Here are some tips to help you present your bug report or suggestion:"
  3372. msgstr ""
  3373. #. type: Bullet: '* '
  3374. #: en/./developers/06_Reporting_Bugs.md:41
  3375. #, markdown-text
  3376. msgid "**Pay attention to spelling**. Even if it’s not always easy, try your best!"
  3377. msgstr ""
  3378. #. type: Bullet: '* '
  3379. #: en/./developers/06_Reporting_Bugs.md:41
  3380. #, markdown-text
  3381. msgid ""
  3382. "**Give an explicit title to your request**, even if it’s a bit long. This "
  3383. "not only helps us understand your request, but also to find your ticket "
  3384. "later."
  3385. msgstr ""
  3386. #. type: Bullet: '* '
  3387. #: en/./developers/06_Reporting_Bugs.md:41
  3388. #, markdown-text
  3389. msgid ""
  3390. "**One request = one ticket.** You may have lots of ideas while being afraid "
  3391. "to spam the bug manager: it doesn’t matter. It’s better to have a few too "
  3392. "many tickets than too many requests in one. We’ll close and consolidate "
  3393. "requests when possible."
  3394. msgstr ""
  3395. #. type: Bullet: '* '
  3396. #: en/./developers/06_Reporting_Bugs.md:41
  3397. #, markdown-text
  3398. msgid ""
  3399. "If you report a bug, think about **providing us with the FreshRSS logs** "
  3400. "(accessible in the FreshRSS `data/log/` folder) and the **PHP logs** (the "
  3401. "location may vary by distribution, but consider searching in "
  3402. "`/var/log/httpd` or `/var/log/apache`)."
  3403. msgstr ""
  3404. #. type: Bullet: ' * '
  3405. #: en/./developers/06_Reporting_Bugs.md:41
  3406. #, markdown-text
  3407. msgid ""
  3408. "If you can’t find the log files, specify it in your ticket so we know you’ve "
  3409. "already searched."
  3410. msgstr ""
  3411. #. type: Bullet: ' * '
  3412. #: en/./developers/06_Reporting_Bugs.md:41
  3413. #, markdown-text
  3414. msgid ""
  3415. "Not all bugs require logs, but if you have any doubts, it is better to "
  3416. "provide them to us. Logs are important and very useful for debugging!"
  3417. msgstr ""
  3418. #. type: Bullet: ' * '
  3419. #: en/./developers/06_Reporting_Bugs.md:41
  3420. #, markdown-text
  3421. msgid ""
  3422. "The logs may reveal confidential information, so **be careful not to "
  3423. "disclose anything sensitive.**"
  3424. msgstr ""
  3425. #. type: Plain text
  3426. #: en/./developers/06_Reporting_Bugs.md:41
  3427. #, markdown-text, no-wrap
  3428. msgid ""
  3429. "* If you report a feed problem, it will be easier if you could provide a "
  3430. "snapshot of its content in a text file.\n"
  3431. "See [here](#how-to-provide-feed-data) for more information.\n"
  3432. msgstr ""
  3433. #. type: Plain text
  3434. #: en/./developers/06_Reporting_Bugs.md:43
  3435. #, markdown-text
  3436. msgid ""
  3437. "In addition, when facing a bug, you’re encouraged to follow this message "
  3438. "format (from the [Sam & Max "
  3439. "website](http://sametmax.com/template-de-demande-daide-en-informatique/):"
  3440. msgstr ""
  3441. #. type: Title ###
  3442. #: en/./developers/06_Reporting_Bugs.md:44
  3443. #, markdown-text, no-wrap
  3444. msgid "What’s my goal?"
  3445. msgstr ""
  3446. #. type: Plain text
  3447. #: en/./developers/06_Reporting_Bugs.md:47
  3448. #, markdown-text
  3449. msgid "Give the general context of what you were trying to do."
  3450. msgstr ""
  3451. #. type: Title ###
  3452. #: en/./developers/06_Reporting_Bugs.md:48
  3453. #, markdown-text, no-wrap
  3454. msgid "What have I been trying to do?"
  3455. msgstr ""
  3456. #. type: Plain text
  3457. #: en/./developers/06_Reporting_Bugs.md:51
  3458. #, markdown-text
  3459. msgid "Explain step by step what you have done so that we can reproduce the bug."
  3460. msgstr ""
  3461. #. type: Title ###
  3462. #: en/./developers/06_Reporting_Bugs.md:52
  3463. #, markdown-text, no-wrap
  3464. msgid "What results have I achieved?"
  3465. msgstr ""
  3466. #. type: Plain text
  3467. #: en/./developers/06_Reporting_Bugs.md:55
  3468. #, markdown-text
  3469. msgid ""
  3470. "The bug: what you see that shouldn’t have happened. Here you can provide the "
  3471. "logs."
  3472. msgstr ""
  3473. #. type: Title ###
  3474. #: en/./developers/06_Reporting_Bugs.md:56
  3475. #, markdown-text, no-wrap
  3476. msgid "What was the expected result?"
  3477. msgstr ""
  3478. #. type: Plain text
  3479. #: en/./developers/06_Reporting_Bugs.md:59
  3480. #, markdown-text
  3481. msgid "So that we understand what you consider to be the problem."
  3482. msgstr ""
  3483. #. type: Title ###
  3484. #: en/./developers/06_Reporting_Bugs.md:60
  3485. #, markdown-text, no-wrap
  3486. msgid "What are my circumstances?"
  3487. msgstr ""
  3488. #. type: Plain text
  3489. #: en/./developers/06_Reporting_Bugs.md:63
  3490. #, markdown-text
  3491. msgid "Remember to give the following information if you know it:"
  3492. msgstr ""
  3493. #. type: Bullet: '1. '
  3494. #: en/./developers/06_Reporting_Bugs.md:69
  3495. #, markdown-text
  3496. msgid "Which browser? Which version?"
  3497. msgstr ""
  3498. #. type: Bullet: '2. '
  3499. #: en/./developers/06_Reporting_Bugs.md:69
  3500. #, markdown-text
  3501. msgid "Which server: Apache, Nginx? Which version?"
  3502. msgstr ""
  3503. #. type: Bullet: '3. '
  3504. #: en/./developers/06_Reporting_Bugs.md:69
  3505. #, markdown-text
  3506. msgid "Which version of PHP?"
  3507. msgstr ""
  3508. #. type: Bullet: '4. '
  3509. #: en/./developers/06_Reporting_Bugs.md:69
  3510. #, markdown-text
  3511. msgid "Which database: SQLite, MySQL, MariaDB, PostgreSQL? Which version?"
  3512. msgstr ""
  3513. #. type: Bullet: '5. '
  3514. #: en/./developers/06_Reporting_Bugs.md:69
  3515. #, markdown-text
  3516. msgid "Which distribution runs on the server? And… which version?"
  3517. msgstr ""
  3518. #. type: Title ##
  3519. #: en/./developers/06_Reporting_Bugs.md:70
  3520. #, markdown-text, no-wrap
  3521. msgid "How to provide feed data"
  3522. msgstr ""
  3523. #. type: Plain text
  3524. #: en/./developers/06_Reporting_Bugs.md:74
  3525. #, markdown-text
  3526. msgid ""
  3527. "If you need us to investigate a feed problem, it will be easier if you "
  3528. "provide a snapshot of the feed data. To do that, you can launch the "
  3529. "following command:"
  3530. msgstr ""
  3531. #. type: Fenced code block (bash)
  3532. #: en/./developers/06_Reporting_Bugs.md:75
  3533. #, no-wrap
  3534. msgid "wget <feed url> -O output.rss.txt\n"
  3535. msgstr ""
  3536. #. type: Plain text
  3537. #: en/./developers/06_Reporting_Bugs.md:78
  3538. #, markdown-text
  3539. msgid "Then you can drag-and-drop the generated file into the issue."
  3540. msgstr ""
  3541. #. type: Plain text
  3542. #: en/./developers/Minz/index.md:4
  3543. #, markdown-text
  3544. msgid "Minz is the homemade PHP framework used by FreshRSS."
  3545. msgstr ""
  3546. #. type: Plain text
  3547. #: en/./developers/Minz/index.md:6
  3548. #, markdown-text
  3549. msgid ""
  3550. "This data sheet should refer to the official FreshRSS and Minz documentation "
  3551. "(the PHP framework on which FreshRSS is based). Unfortunately, this "
  3552. "documentation does not yet exist. In a few words, here are the main things "
  3553. "you should know. It is not necessary to read all the chapters in this "
  3554. "section if you don’t need to use a feature in your extension (if you don’t "
  3555. "need to translate your extension, no need to know more about the "
  3556. "`Minz_Translate` module for example)."
  3557. msgstr ""
  3558. #. type: Title ##
  3559. #: en/./developers/Minz/index.md:7
  3560. #, markdown-text, no-wrap
  3561. msgid "MVC Architecture"
  3562. msgstr ""
  3563. #. type: Plain text
  3564. #: en/./developers/Minz/index.md:10
  3565. #, markdown-text
  3566. msgid ""
  3567. "Minz relies on and imposes an MVC architecture on projects using it. This "
  3568. "architecture consists of three main components:"
  3569. msgstr ""
  3570. #. type: Bullet: '* '
  3571. #: en/./developers/Minz/index.md:14
  3572. #, markdown-text
  3573. msgid ""
  3574. "The model: this is the base object that we will manipulate. In FreshRSS, "
  3575. "categories, flows and articles are templates. The part of the code that "
  3576. "makes it possible to manipulate them in a database is also part of the model "
  3577. "but is separated from the base model: we speak of DAO (for \"Data Access "
  3578. "Object\"). The templates are stored in a `Models` folder."
  3579. msgstr ""
  3580. #. type: Bullet: '* '
  3581. #: en/./developers/Minz/index.md:14
  3582. #, markdown-text
  3583. msgid ""
  3584. "The view: this is what the user sees. The view is therefore simply HTML code "
  3585. "mixed with PHP to display dynamic information. The views are stored in a "
  3586. "`views` folder."
  3587. msgstr ""
  3588. #. type: Bullet: '* '
  3589. #: en/./developers/Minz/index.md:14
  3590. #, markdown-text
  3591. msgid ""
  3592. "The controller: this is what makes it possible to link models and "
  3593. "views. Typically, a controller will load templates from the database (like a "
  3594. "list of items) to \"pass\" them to a view for display. Controllers are "
  3595. "stored in a `Controllers` directory."
  3596. msgstr ""
  3597. #. type: Title ##
  3598. #: en/./developers/Minz/index.md:15
  3599. #, markdown-text, no-wrap
  3600. msgid "Routing"
  3601. msgstr ""
  3602. #. type: Plain text
  3603. #: en/./developers/Minz/index.md:19
  3604. #, markdown-text
  3605. msgid ""
  3606. "In order to link a URL to a controller, first you have to go through a "
  3607. "\"routing\" phase. In FreshRSS, this is particularly simple because it "
  3608. "suffices to specify the name of the controller to load into the URL using a "
  3609. "`c` parameter. For example, the address <http://example.com?c=hello> will "
  3610. "execute the code contained in the `hello` controller."
  3611. msgstr ""
  3612. #. type: Plain text
  3613. #: en/./developers/Minz/index.md:21
  3614. #, markdown-text
  3615. msgid ""
  3616. "One concept that has not yet been discussed is the \"actions\" system. An "
  3617. "action is executed *on* a controller. Concretely, a controller is "
  3618. "represented by a class and its actions by methods. To execute an action, it "
  3619. "is necessary to specify an `a` parameter in the URL."
  3620. msgstr ""
  3621. #. type: Plain text
  3622. #: en/./developers/Minz/index.md:23 en/./developers/Minz/index.md:143
  3623. #, markdown-text
  3624. msgid "Code example:"
  3625. msgstr ""
  3626. #. type: Fenced code block (php)
  3627. #: en/./developers/Minz/index.md:24
  3628. #, no-wrap
  3629. msgid ""
  3630. "<?php\n"
  3631. "\n"
  3632. "class FreshRSS_hello_Controller extends FreshRSS_ActionController {\n"
  3633. "\tpublic function indexAction() {\n"
  3634. "\t\t$this->view->a_variable = 'FooBar';\n"
  3635. "\t}\n"
  3636. "\n"
  3637. "\tpublic function worldAction() {\n"
  3638. "\t\t$this->view->a_variable = 'Hello World!';\n"
  3639. "\t}\n"
  3640. "}\n"
  3641. "\n"
  3642. "?>\n"
  3643. msgstr ""
  3644. #. type: Plain text
  3645. #: en/./developers/Minz/index.md:41
  3646. #, markdown-text
  3647. msgid ""
  3648. "When loading the address <http://example.com?c=hello&a=world>, the `world` "
  3649. "action is executed on the `hello` controller."
  3650. msgstr ""
  3651. #. type: Plain text
  3652. #: en/./developers/Minz/index.md:44
  3653. #, markdown-text
  3654. msgid ""
  3655. "Note: if `c` or `a` is not specified, the default value for each of these "
  3656. "variables is `index`. So the address <http://example.com?c=hello> will "
  3657. "execute the `index` action of the `hello` controller."
  3658. msgstr ""
  3659. #. type: Plain text
  3660. #: en/./developers/Minz/index.md:46
  3661. #, markdown-text
  3662. msgid ""
  3663. "From now on, the `hello/world` naming convention will be used to refer to a "
  3664. "controller/action pair."
  3665. msgstr ""
  3666. #. type: Title #
  3667. #: en/./developers/Minz/index.md:47 en/./users/03_Main_view.md:1
  3668. #, markdown-text, no-wrap
  3669. msgid "Views"
  3670. msgstr ""
  3671. #. type: Plain text
  3672. #: en/./developers/Minz/index.md:50
  3673. #, markdown-text
  3674. msgid ""
  3675. "Each view is associated with a controller and an action. The view associated "
  3676. "with `hello/world` will be stored in a very specific file: "
  3677. "`views/hello/world. phtml`. This convention is imposed by Minz."
  3678. msgstr ""
  3679. #. type: Plain text
  3680. #: en/./developers/Minz/index.md:52
  3681. #, markdown-text
  3682. msgid "As explained above, the views consist of HTML mixed with PHP. Code example:"
  3683. msgstr ""
  3684. #. type: Fenced code block (html)
  3685. #: en/./developers/Minz/index.md:53
  3686. #, no-wrap
  3687. msgid ""
  3688. "<p>\n"
  3689. "\tThis is a parameter passed from the controller: <?= $this->a_variable ?>\n"
  3690. "</p>\n"
  3691. msgstr ""
  3692. #. type: Plain text
  3693. #: en/./developers/Minz/index.md:60
  3694. #, markdown-text, no-wrap
  3695. msgid ""
  3696. "The variable `$this->a_variable` is passed by the controller (see previous "
  3697. "example). The difference is that in the controller it is necessary to pass "
  3698. "`$this->view`, while in the view `$this` suffices.\n"
  3699. msgstr ""
  3700. #. type: Title ##
  3701. #: en/./developers/Minz/index.md:61
  3702. #, markdown-text, no-wrap
  3703. msgid "Working with GET / POST"
  3704. msgstr ""
  3705. #. type: Plain text
  3706. #: en/./developers/Minz/index.md:65
  3707. #, markdown-text
  3708. msgid ""
  3709. "It is often necessary to take advantage of parameters passed by GET or "
  3710. "POST. In Minz, these parameters are accessible using the `Minz_Request` "
  3711. "class. Code example:"
  3712. msgstr ""
  3713. #. type: Fenced code block (php)
  3714. #: en/./developers/Minz/index.md:66
  3715. #, no-wrap
  3716. msgid ""
  3717. "<?php\n"
  3718. "\n"
  3719. "$default_value = 'foo';\n"
  3720. "$param = Minz_Request::paramString('bar') ?: $default_value;\n"
  3721. "\n"
  3722. "// Display the value of the parameter `bar` (passed via GET or POST)\n"
  3723. "// or \"foo\" if the parameter does not exist.\n"
  3724. "echo $param;\n"
  3725. "\n"
  3726. "// Sets the value of the `bar` parameter\n"
  3727. "Minz_Request::_param('bar', 'baz');\n"
  3728. "\n"
  3729. "// Will necessarily display \"baz\" since we have just forced its value.\n"
  3730. "// Note that the second parameter (default) is optional.\n"
  3731. "echo Minz_Request::paramString('bar');\n"
  3732. "\n"
  3733. "?>\n"
  3734. msgstr ""
  3735. #. type: Plain text
  3736. #: en/./developers/Minz/index.md:87
  3737. #, markdown-text
  3738. msgid ""
  3739. "The `Minz_Request::isPost()` method can be used to execute a piece of code "
  3740. "only if it is a POST request."
  3741. msgstr ""
  3742. #. type: Plain text
  3743. #: en/./developers/Minz/index.md:89
  3744. #, markdown-text
  3745. msgid ""
  3746. "Note: it is preferable to use `Minz_Request` only in controllers. It is "
  3747. "likely that you will encounter this method in FreshRSS views, or even in "
  3748. "templates, but be aware that this is **not** good practice."
  3749. msgstr ""
  3750. #. type: Title ##
  3751. #: en/./developers/Minz/index.md:90
  3752. #, markdown-text, no-wrap
  3753. msgid "Access session settings"
  3754. msgstr ""
  3755. #. type: Plain text
  3756. #: en/./developers/Minz/index.md:93
  3757. #, markdown-text
  3758. msgid ""
  3759. "The access to session parameters is strangely similar to the GET / POST "
  3760. "parameters but passes through the `Minz_Session` class this time! There is "
  3761. "no example here because you can repeat the previous example by changing all "
  3762. "`Minz_Request` to `Minz_Session`."
  3763. msgstr ""
  3764. #. type: Title ##
  3765. #: en/./developers/Minz/index.md:94
  3766. #, markdown-text, no-wrap
  3767. msgid "Working with URLs"
  3768. msgstr ""
  3769. #. type: Plain text
  3770. #: en/./developers/Minz/index.md:97
  3771. #, markdown-text
  3772. msgid ""
  3773. "To take full advantage of the Minz routing system, it is strongly "
  3774. "discouraged to write hard URLs in your code. For example, the following view "
  3775. "should be avoided:"
  3776. msgstr ""
  3777. #. type: Fenced code block (html)
  3778. #: en/./developers/Minz/index.md:98
  3779. #, no-wrap
  3780. msgid ""
  3781. "<p>\n"
  3782. "\tGo to page <a href=\"http://example.com?c=hello&amp;a=world\">Hello "
  3783. "world</a>!\n"
  3784. "</p>\n"
  3785. msgstr ""
  3786. #. type: Plain text
  3787. #: en/./developers/Minz/index.md:105
  3788. #, markdown-text
  3789. msgid ""
  3790. "If one day it was decided to use a \"url rewriting\" system to have "
  3791. "addresses in a <http://example.com/controller/action> format, all previous "
  3792. "addresses would become ineffective!"
  3793. msgstr ""
  3794. #. type: Plain text
  3795. #: en/./developers/Minz/index.md:107
  3796. #, markdown-text
  3797. msgid ""
  3798. "So use the `Minz_Url` class and its `display()` method "
  3799. "instead. `Minz_Url::display()` takes an array of the following form as its "
  3800. "argument:"
  3801. msgstr ""
  3802. #. type: Fenced code block (php)
  3803. #: en/./developers/Minz/index.md:108
  3804. #, no-wrap
  3805. msgid ""
  3806. "<?php\n"
  3807. "\n"
  3808. "$url_array = [\n"
  3809. "\t'c' => 'hello',\n"
  3810. "\t'a' => 'world',\n"
  3811. "\t'params' => [\n"
  3812. "\t\t'foo' => 'bar',\n"
  3813. "\t],\n"
  3814. "];\n"
  3815. "\n"
  3816. "// Show something like .?c=hello&amp;a=world&amp;foo=bar\n"
  3817. "echo Minz_Url::display($url_array);\n"
  3818. "\n"
  3819. "?>\n"
  3820. msgstr ""
  3821. #. type: Plain text
  3822. #: en/./developers/Minz/index.md:126
  3823. #, markdown-text
  3824. msgid ""
  3825. "Since this can become a bit tedious to use in the long run, especially in "
  3826. "views, it is preferable to use the `_url()` shortcut:"
  3827. msgstr ""
  3828. #. type: Fenced code block (php)
  3829. #: en/./developers/Minz/index.md:127
  3830. #, no-wrap
  3831. msgid ""
  3832. "<?php\n"
  3833. "\n"
  3834. "// Displays the same as above\n"
  3835. "echo _url('hello', 'world', 'foo', 'bar');\n"
  3836. "\n"
  3837. "?>\n"
  3838. msgstr ""
  3839. #. type: Plain text
  3840. #: en/./developers/Minz/index.md:137
  3841. #, markdown-text
  3842. msgid ""
  3843. "Note: as a general rule, the shortened form (`_url()`) should be used in "
  3844. "views, while the long form (`Minz_Url::display()`) should be used in "
  3845. "controllers."
  3846. msgstr ""
  3847. #. type: Title ##
  3848. #: en/./developers/Minz/index.md:138
  3849. #, markdown-text, no-wrap
  3850. msgid "Redirections"
  3851. msgstr ""
  3852. #. type: Plain text
  3853. #: en/./developers/Minz/index.md:141
  3854. #, markdown-text
  3855. msgid ""
  3856. "It is often necessary to redirect a user to another page. To do so, the "
  3857. "`Minz_Request` class offers another useful method: `forward()`. This method "
  3858. "takes the same URL format as the one seen just before as its argument."
  3859. msgstr ""
  3860. #. type: Fenced code block (php)
  3861. #: en/./developers/Minz/index.md:144
  3862. #, no-wrap
  3863. msgid ""
  3864. "<?php\n"
  3865. "\n"
  3866. "$url_array = [\n"
  3867. "\t'c' => 'hello',\n"
  3868. "\t'a' => 'world',\n"
  3869. "];\n"
  3870. "\n"
  3871. "// Tells Minz to redirect the user to the hello / world page.\n"
  3872. "// Note that this is a redirection in the Minz sense of the term, not a "
  3873. "redirection that the browser will have to manage (HTTP code 301 or 302)\n"
  3874. "// The code that follows forward() will thus be executed!\n"
  3875. "Minz_Request::forward($url_array);\n"
  3876. "\n"
  3877. "// To perform a type 302 redirect, add \"true\".\n"
  3878. "// The code that follows will never be executed.\n"
  3879. "Minz_Request::forward($url_array, true);\n"
  3880. "\n"
  3881. "?>\n"
  3882. msgstr ""
  3883. #. type: Plain text
  3884. #: en/./developers/Minz/index.md:165
  3885. #, markdown-text
  3886. msgid ""
  3887. "It is very common to want display a message to the user while performing a "
  3888. "redirect, to tell the user how the action was carried out (validation of a "
  3889. "form for example). Such a message is passed through a `notification` session "
  3890. "variable (note: we will talk about feedback from now on to avoid confusion "
  3891. "with a notification that can occur at any time). To facilitate this kind of "
  3892. "very frequent action, there are two shortcuts that both perform a 302 "
  3893. "redirect by assigning a feedback message:"
  3894. msgstr ""
  3895. #. type: Fenced code block (php)
  3896. #: en/./developers/Minz/index.md:166
  3897. #, no-wrap
  3898. msgid ""
  3899. "<?php\n"
  3900. "\n"
  3901. "$url_array = [\n"
  3902. "\t'c' => 'hello',\n"
  3903. "\t'a' => 'world',\n"
  3904. "];\n"
  3905. "$feedback_good = 'All went well!';\n"
  3906. "$feedback_bad = 'Oops, something went wrong.';\n"
  3907. "\n"
  3908. "Minz_Request::good($feedback_good, $url_array);\n"
  3909. "\n"
  3910. "// or\n"
  3911. "\n"
  3912. "Minz_Request::bad($feedback_bad, $url_array);\n"
  3913. "\n"
  3914. "?>\n"
  3915. msgstr ""
  3916. #. type: Title ##
  3917. #: en/./developers/Minz/index.md:185
  3918. #, markdown-text, no-wrap
  3919. msgid "Translation Management"
  3920. msgstr ""
  3921. #. type: Plain text
  3922. #: en/./developers/Minz/index.md:188
  3923. #, markdown-text
  3924. msgid "This part [is explained here](/docs/en/internationalization.md)."
  3925. msgstr ""
  3926. #. type: Title ##
  3927. #: en/./developers/Minz/index.md:189
  3928. #, markdown-text, no-wrap
  3929. msgid "Migration"
  3930. msgstr ""
  3931. #. type: Plain text
  3932. #: en/./developers/Minz/index.md:192
  3933. #, markdown-text
  3934. msgid "Existing documentation includes:"
  3935. msgstr ""
  3936. #. type: Bullet: '* '
  3937. #: en/./developers/Minz/index.md:193
  3938. #, markdown-text
  3939. msgid "[How to manage migrations](migrations.md)"
  3940. msgstr ""
  3941. #. type: Title #
  3942. #: en/./developers/Minz/migrations.md:1
  3943. #, markdown-text, no-wrap
  3944. msgid "How to manage migrations with Minz"
  3945. msgstr ""
  3946. #. type: Plain text
  3947. #: en/./developers/Minz/migrations.md:4
  3948. #, markdown-text
  3949. msgid ""
  3950. "Migrations are the way to modify the database or the structure of files "
  3951. "under the `data/` path."
  3952. msgstr ""
  3953. #. type: Title ##
  3954. #: en/./developers/Minz/migrations.md:5
  3955. #, markdown-text, no-wrap
  3956. msgid "How to write a migration?"
  3957. msgstr ""
  3958. #. type: Plain text
  3959. #: en/./developers/Minz/migrations.md:8
  3960. #, markdown-text
  3961. msgid "Migrations are placed under the `app/migrations` folder."
  3962. msgstr ""
  3963. #. type: Plain text
  3964. #: en/./developers/Minz/migrations.md:10
  3965. #, markdown-text
  3966. msgid ""
  3967. "Good practice is to prepend the filename by the current date and explain "
  3968. "what does the migration do in few words "
  3969. "(e.g. `2020_01_11_CreateFooTable.php`)."
  3970. msgstr ""
  3971. #. type: Plain text
  3972. #: en/./developers/Minz/migrations.md:12
  3973. #, markdown-text
  3974. msgid ""
  3975. "The files must contain a class which name starts with `FreshRSS_Migration_`, "
  3976. "followed by the basename of the file "
  3977. "(e.g. `FreshRSS_Migration_2020_01_11_CreateFooTable`)."
  3978. msgstr ""
  3979. #. type: Plain text
  3980. #: en/./developers/Minz/migrations.md:14
  3981. #, markdown-text
  3982. msgid ""
  3983. "The class must declare a `migrate` static function. It must return `true` or "
  3984. "a string to indicate the migration is applied, or `false` otherwise. It can "
  3985. "also raise an exception: the message will be used to detail the error."
  3986. msgstr ""
  3987. #. type: Plain text
  3988. #: en/./developers/Minz/migrations.md:16
  3989. #, markdown-text
  3990. msgid "Example:"
  3991. msgstr ""
  3992. #. type: Fenced code block (php)
  3993. #: en/./developers/Minz/migrations.md:17
  3994. #, no-wrap
  3995. msgid ""
  3996. "// File: app/migrations/2020_01_11_CreateFooTable.php\n"
  3997. "class FreshRSS_Migration_2020_01_11_CreateFooTable {\n"
  3998. "\tpublic static function migrate() {\n"
  3999. "\t\t$pdo = new Minz_PdoSqlite('sqlite:/some/path/db.sqlite');\n"
  4000. "\t\t$result = $pdo->exec('CREATE TABLE foos (bar TEXT)');\n"
  4001. "\t\tif ($result === false) {\n"
  4002. "\t\t\t$error = $pdo->errorInfo();\n"
  4003. "\t\t\traise Exception('Error in SQL statement: ' . $error[2]);\n"
  4004. "\t\t}\n"
  4005. "\n"
  4006. "\t\treturn true;\n"
  4007. "\t}\n"
  4008. "}\n"
  4009. msgstr ""
  4010. #. type: Title ##
  4011. #: en/./developers/Minz/migrations.md:33
  4012. #, markdown-text, no-wrap
  4013. msgid "How to apply migrations?"
  4014. msgstr ""
  4015. #. type: Plain text
  4016. #: en/./developers/Minz/migrations.md:36
  4017. #, markdown-text
  4018. msgid "They are automatically applied one by one when a user accesses FreshRSS."
  4019. msgstr ""
  4020. #. type: Plain text
  4021. #: en/./developers/Minz/migrations.md:38
  4022. #, markdown-text
  4023. msgid ""
  4024. "Before being applied, migrations are sorted by filenames (see the "
  4025. "[`strnatcmp`](https://php.net/strnatcmp) function). Already applied "
  4026. "migrations are skipped (the list can be found in the "
  4027. "`data/applied_migrations.txt` file)."
  4028. msgstr ""
  4029. #. type: Plain text
  4030. #: en/./developers/Minz/migrations.md:39
  4031. #, markdown-text
  4032. msgid ""
  4033. "To ensure migrations are not applied several times if two users access "
  4034. "FreshRSS at the same time, a folder named `data/applied_migrations.txt.lock` "
  4035. "is created, then deleted at the end of the process."
  4036. msgstr ""
  4037. #. type: Title #
  4038. #: en/./developers/OPML.md:1
  4039. #, markdown-text, no-wrap
  4040. msgid "OPML in FreshRSS"
  4041. msgstr ""
  4042. #. type: Plain text
  4043. #: en/./developers/OPML.md:4
  4044. #, markdown-text
  4045. msgid ""
  4046. "FreshRSS supports the [OPML](https://en.wikipedia.org/wiki/OPML) format to "
  4047. "export and import lists of RSS/Atom feeds in a standard way, compatible with "
  4048. "several other RSS aggregators."
  4049. msgstr ""
  4050. #. type: Plain text
  4051. #: en/./developers/OPML.md:7
  4052. #, markdown-text
  4053. msgid ""
  4054. "However, FreshRSS also supports several additional features not covered by "
  4055. "the basic OPML specification. Luckily, the [OPML "
  4056. "specification](http://opml.org/spec2.opml) allows extensions:"
  4057. msgstr ""
  4058. #. type: Plain text
  4059. #: en/./developers/OPML.md:9
  4060. #, markdown-text, no-wrap
  4061. msgid ""
  4062. "> *An OPML file may contain elements and attributes not described on this "
  4063. "page, only if those elements are defined in a namespace.*\n"
  4064. msgstr ""
  4065. #. type: Plain text
  4066. #: en/./developers/OPML.md:11
  4067. #, markdown-text
  4068. msgid "and:"
  4069. msgstr ""
  4070. #. type: Plain text
  4071. #: en/./developers/OPML.md:13
  4072. #, markdown-text, no-wrap
  4073. msgid ""
  4074. "> *OPML can also be extended by the addition of new values for the type "
  4075. "attribute.*\n"
  4076. msgstr ""
  4077. #. type: Title ##
  4078. #: en/./developers/OPML.md:14
  4079. #, markdown-text, no-wrap
  4080. msgid "FreshRSS OPML extension"
  4081. msgstr ""
  4082. #. type: Plain text
  4083. #: en/./developers/OPML.md:17
  4084. #, markdown-text
  4085. msgid ""
  4086. "FreshRSS uses the XML namespace <https://freshrss.org/opml> to export/import "
  4087. "extended information not covered by the basic OPML specification."
  4088. msgstr ""
  4089. #. type: Plain text
  4090. #: en/./developers/OPML.md:19
  4091. #, markdown-text
  4092. msgid ""
  4093. "The list of the custom FreshRSS attributes can be seen in [the source "
  4094. "code](https://github.com/FreshRSS/FreshRSS/blob/edge/app/views/helpers/export/opml.phtml), "
  4095. "and here is an overview:"
  4096. msgstr ""
  4097. #. type: Title ###
  4098. #: en/./developers/OPML.md:20
  4099. #, markdown-text, no-wrap
  4100. msgid "HTML+XPath or XML+XPath"
  4101. msgstr ""
  4102. #. type: Bullet: '* '
  4103. #: en/./developers/OPML.md:23
  4104. #, markdown-text
  4105. msgid ""
  4106. "`<outline type=\"HTML+XPath\" ...`: Additional type of source, which is not "
  4107. "RSS/Atom, but HTML Web Scraping using "
  4108. "[XPath](https://www.w3.org/TR/xpath-10/) 1.0."
  4109. msgstr ""
  4110. #. type: Plain text
  4111. #: en/./developers/OPML.md:25
  4112. #, markdown-text, no-wrap
  4113. msgid ""
  4114. "> ℹ️ [XPath 1.0](https://en.wikipedia.org/wiki/XPath) is a standard query "
  4115. "language, which FreshRSS supports to enable [Web "
  4116. "scraping](https://en.wikipedia.org/wiki/Web_scraping).\n"
  4117. msgstr ""
  4118. #. type: Bullet: '* '
  4119. #: en/./developers/OPML.md:27
  4120. #, markdown-text
  4121. msgid ""
  4122. "`<outline type=\"XML+XPath\" ...`: Same than `HTML+XPath` but using an XML "
  4123. "parser."
  4124. msgstr ""
  4125. #. type: Plain text
  4126. #: en/./developers/OPML.md:29
  4127. #, markdown-text
  4128. msgid ""
  4129. "The following attributes are using similar naming conventions than "
  4130. "[RSS-Bridge](https://rss-bridge.github.io/rss-bridge/Bridge_API/XPathAbstract.html)."
  4131. msgstr ""
  4132. #. type: Bullet: '* '
  4133. #: en/./developers/OPML.md:46
  4134. #, markdown-text
  4135. msgid ""
  4136. "`frss:xPathItem`: XPath expression for extracting the feed items from the "
  4137. "source page."
  4138. msgstr ""
  4139. #. type: Bullet: ' * '
  4140. #: en/./developers/OPML.md:46
  4141. #, markdown-text
  4142. msgid "Example: `//div[@class=\"news-item\"]`"
  4143. msgstr ""
  4144. #. type: Bullet: '* '
  4145. #: en/./developers/OPML.md:46
  4146. #, markdown-text
  4147. msgid ""
  4148. "`frss:xPathItemTitle`: XPath expression for extracting the item’s title from "
  4149. "the item context."
  4150. msgstr ""
  4151. #. type: Bullet: ' * '
  4152. #: en/./developers/OPML.md:46
  4153. #, markdown-text
  4154. msgid "Example: `descendant::h2`"
  4155. msgstr ""
  4156. #. type: Bullet: '* '
  4157. #: en/./developers/OPML.md:46
  4158. #, markdown-text
  4159. msgid ""
  4160. "`frss:xPathItemContent`: XPath expression for extracting an item’s content "
  4161. "from the item context."
  4162. msgstr ""
  4163. #. type: Bullet: ' * '
  4164. #: en/./developers/OPML.md:46
  4165. #, markdown-text
  4166. msgid "Example: `.`"
  4167. msgstr ""
  4168. #. type: Bullet: '* '
  4169. #: en/./developers/OPML.md:46
  4170. #, markdown-text
  4171. msgid ""
  4172. "`frss:xPathItemUri`: XPath expression for extracting an item link from the "
  4173. "item context."
  4174. msgstr ""
  4175. #. type: Bullet: ' * '
  4176. #: en/./developers/OPML.md:46
  4177. #, markdown-text
  4178. msgid "Example: `descendant::a/@href`"
  4179. msgstr ""
  4180. #. type: Bullet: '* '
  4181. #: en/./developers/OPML.md:46
  4182. #, markdown-text
  4183. msgid ""
  4184. "`frss:xPathItemAuthor`: XPath expression for extracting an item author from "
  4185. "the item context."
  4186. msgstr ""
  4187. #. type: Bullet: ' * '
  4188. #: en/./developers/OPML.md:46
  4189. #, markdown-text
  4190. msgid "Example: `\"Anonymous\"`"
  4191. msgstr ""
  4192. #. type: Bullet: '* '
  4193. #: en/./developers/OPML.md:46
  4194. #, markdown-text
  4195. msgid ""
  4196. "`frss:xPathItemTimestamp`: XPath expression for extracting an item timestamp "
  4197. "from the item context. The result will be parsed by "
  4198. "[`strtotime()`](https://php.net/strtotime)."
  4199. msgstr ""
  4200. #. type: Bullet: '* '
  4201. #: en/./developers/OPML.md:46
  4202. #, markdown-text
  4203. msgid ""
  4204. "`frss:xPathItemTimeFormat`: Date/Time format to parse the timestamp, "
  4205. "according to "
  4206. "[`DateTime::createFromFormat()`](https://php.net/datetime.createfromformat)."
  4207. msgstr ""
  4208. #. type: Bullet: '* '
  4209. #: en/./developers/OPML.md:46
  4210. #, markdown-text
  4211. msgid ""
  4212. "`frss:xPathItemThumbnail`: XPath expression for extracting an item’s "
  4213. "thumbnail (image) URL from the item context."
  4214. msgstr ""
  4215. #. type: Bullet: ' * '
  4216. #: en/./developers/OPML.md:46
  4217. #, markdown-text
  4218. msgid "Example: `descendant::img/@src`"
  4219. msgstr ""
  4220. #. type: Bullet: '* '
  4221. #: en/./developers/OPML.md:46
  4222. #, markdown-text
  4223. msgid ""
  4224. "`frss:xPathItemCategories`: XPath expression for extracting a list of "
  4225. "categories (tags) from the item context."
  4226. msgstr ""
  4227. #. type: Bullet: '* '
  4228. #: en/./developers/OPML.md:46
  4229. #, markdown-text
  4230. msgid ""
  4231. "`frss:xPathItemUid`: XPath expression for extracting an item’s unique ID "
  4232. "from the item context. If left empty, a hash is computed automatically."
  4233. msgstr ""
  4234. #. type: Bullet: '* '
  4235. #: en/./developers/OPML.md:54
  4236. #, markdown-text
  4237. msgid ""
  4238. "`frss:cssFullContent`: [CSS "
  4239. "Selector](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors) to "
  4240. "enable the download and extraction of the matching HTML section of each "
  4241. "articles’ Web address."
  4242. msgstr ""
  4243. #. type: Bullet: ' * '
  4244. #: en/./developers/OPML.md:54
  4245. #, markdown-text
  4246. msgid "Example: `div.main, .summary`"
  4247. msgstr ""
  4248. #. type: Bullet: '* '
  4249. #: en/./developers/OPML.md:54
  4250. #, markdown-text
  4251. msgid ""
  4252. "`frss:cssFullContentFilter`: [CSS "
  4253. "Selector](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors) to "
  4254. "remove the matching HTML elements from the full content retrieved by "
  4255. "`frss:cssFullContent`."
  4256. msgstr ""
  4257. #. type: Bullet: ' * '
  4258. #: en/./developers/OPML.md:54
  4259. #, markdown-text
  4260. msgid "Example: `.footer, .aside`"
  4261. msgstr ""
  4262. #. type: Bullet: '* '
  4263. #: en/./developers/OPML.md:54
  4264. #, markdown-text
  4265. msgid ""
  4266. "`frss:filtersActionRead`: List (separated by a new line) of search queries "
  4267. "to automatically mark a new article as read."
  4268. msgstr ""
  4269. #. type: Title ###
  4270. #: en/./developers/OPML.md:55
  4271. #, markdown-text, no-wrap
  4272. msgid "Dynamic OPML (reading lists)"
  4273. msgstr ""
  4274. #. type: Bullet: '* '
  4275. #: en/./developers/OPML.md:58
  4276. #, markdown-text
  4277. msgid ""
  4278. "`frss:opmlUrl`: If non-empty, indicates that this outline (category) should "
  4279. "be dynamically populated from a remote OPML at the specified URL."
  4280. msgstr ""
  4281. #. type: Title ###
  4282. #: en/./developers/OPML.md:59
  4283. #, markdown-text, no-wrap
  4284. msgid "Example"
  4285. msgstr ""
  4286. #. type: Fenced code block (xml)
  4287. #: en/./developers/OPML.md:61
  4288. #, no-wrap
  4289. msgid ""
  4290. "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
  4291. "<opml version=\"2.0\">\n"
  4292. "\t<head>\n"
  4293. "\t\t<title>FreshRSS OPML extension example</title>\n"
  4294. "\t</head>\n"
  4295. "\t<body>\n"
  4296. "\t\t<outline xmlns:frss=\"https://freshrss.org/opml\"\n"
  4297. "\t\t\ttext=\"Example\"\n"
  4298. "\t\t\ttype=\"HTML+XPath\"\n"
  4299. "\t\t\txmlUrl=\"https://www.example.net/page.html\"\n"
  4300. "\t\t\thtmlUrl=\"https://www.example.net/page.html\"\n"
  4301. "\t\t\tdescription=\"Example of Web scraping\"\n"
  4302. "\t\t\tfrss:xPathItem=\"//a[contains(@href, "
  4303. "'/interesting/')]/ancestor::article\"\n"
  4304. "\t\t\tfrss:xPathItemTitle=\"descendant::h2\"\n"
  4305. "\t\t\tfrss:xPathItemContent=\".\"\n"
  4306. "\t\t\tfrss:xPathItemUri=\"descendant::a[string-length(@href)&gt;0]/@href\"\n"
  4307. "\t\t\tfrss:xPathItemThumbnail=\"descendant::img/@src\"\n"
  4308. "\t\t\tfrss:cssFullContent=\"article\"\n"
  4309. "\t\t\tfrss:filtersActionRead=\"intitle:⚡️ OR intitle:🔥&#10;something\"\n"
  4310. "\t\t/>\n"
  4311. "\t</body>\n"
  4312. "</opml>\n"
  4313. msgstr ""
  4314. #. type: Plain text
  4315. #: en/./index.md:2
  4316. #, markdown-text
  4317. msgid "![FreshRSS logo](img/logo_freshrss.png)"
  4318. msgstr ""
  4319. #. type: Title #
  4320. #: en/./index.md:3
  4321. #, markdown-text, no-wrap
  4322. msgid "FreshRSS manual (English)"
  4323. msgstr ""
  4324. #. type: Plain text
  4325. #: en/./index.md:6
  4326. #, markdown-text
  4327. msgid ""
  4328. "FreshRSS is an RSS aggregator and reader. It allows you to read and follow "
  4329. "several news websites at a glance without the need to browse from one "
  4330. "website to another."
  4331. msgstr ""
  4332. #. type: Plain text
  4333. #: en/./index.md:10
  4334. #, markdown-text
  4335. msgid "FreshRSS has a lot of features including:"
  4336. msgstr ""
  4337. #. type: Bullet: '* '
  4338. #: en/./index.md:24
  4339. #, markdown-text
  4340. msgid "RSS and Atom aggregation"
  4341. msgstr ""
  4342. #. type: Bullet: '* '
  4343. #: en/./index.md:24
  4344. #, markdown-text
  4345. msgid "Mark article as favorite if you liked it or if you want to read it later"
  4346. msgstr ""
  4347. #. type: Bullet: '* '
  4348. #: en/./index.md:24
  4349. #, markdown-text
  4350. msgid "Filter and search functionality helps to easily find articles"
  4351. msgstr ""
  4352. #. type: Bullet: '* '
  4353. #: en/./index.md:24
  4354. #, markdown-text
  4355. msgid "Statistics to show you the publishing frequency all the websites you follow"
  4356. msgstr ""
  4357. #. type: Bullet: '* '
  4358. #: en/./index.md:24
  4359. #, markdown-text
  4360. msgid "Import/export of your feeds into OPML format"
  4361. msgstr ""
  4362. #. type: Bullet: '* '
  4363. #: en/./index.md:24
  4364. #, markdown-text
  4365. msgid "Several themes created by the community"
  4366. msgstr ""
  4367. #. type: Bullet: '* '
  4368. #: en/./index.md:24
  4369. #, markdown-text
  4370. msgid "Several extensions created by the community"
  4371. msgstr ""
  4372. #. type: Bullet: '* '
  4373. #: en/./index.md:24
  4374. #, markdown-text
  4375. msgid "\"Google Reader\"-like API to connect Android applications"
  4376. msgstr ""
  4377. #. type: Bullet: '* '
  4378. #: en/./index.md:24
  4379. #, markdown-text
  4380. msgid ""
  4381. "The application is \"responsive,\" which means it adapts to small screens so "
  4382. "you can bring articles in your pocket"
  4383. msgstr ""
  4384. #. type: Bullet: '* '
  4385. #: en/./index.md:24
  4386. #, markdown-text
  4387. msgid ""
  4388. "Self-hosted: the code is free (under AGPL3 licence), so you can host your "
  4389. "own instance of FreshRSS"
  4390. msgstr ""
  4391. #. type: Bullet: '* '
  4392. #: en/./index.md:24
  4393. #, markdown-text
  4394. msgid "Multi-user, so you can also host for your friends and family"
  4395. msgstr ""
  4396. #. type: Bullet: '* '
  4397. #: en/./index.md:24
  4398. #, markdown-text
  4399. msgid "share article links with a bunch of services"
  4400. msgstr ""
  4401. #. type: Bullet: '* '
  4402. #: en/./index.md:24
  4403. #, markdown-text
  4404. msgid "And a lot more!"
  4405. msgstr ""
  4406. #. type: Title ##
  4407. #: en/./index.md:25
  4408. #, markdown-text, no-wrap
  4409. msgid "Manual Chapters"
  4410. msgstr ""
  4411. #. type: Plain text
  4412. #: en/./index.md:28
  4413. #, markdown-text
  4414. msgid "This documentation is split into different sections:"
  4415. msgstr ""
  4416. #. type: Bullet: '* '
  4417. #: en/./index.md:33
  4418. #, markdown-text
  4419. msgid ""
  4420. "[User documentation](./users/02_First_steps.md), where you can discover all "
  4421. "the possibilities offered by FreshRSS"
  4422. msgstr ""
  4423. #. type: Bullet: '* '
  4424. #: en/./index.md:33
  4425. #, markdown-text
  4426. msgid ""
  4427. "[Administrator documentation](./admins/01_Index.md) for detailed "
  4428. "installation and maintenance related tasks"
  4429. msgstr ""
  4430. #. type: Bullet: '* '
  4431. #: en/./index.md:33
  4432. #, markdown-text
  4433. msgid ""
  4434. "[Developer documentation](./developers/01_Index.md) to guide you in the "
  4435. "source code of FreshRSS and to help you if you want to contribute"
  4436. msgstr ""
  4437. #. type: Bullet: '* '
  4438. #: en/./index.md:33
  4439. #, markdown-text
  4440. msgid ""
  4441. "[Contributor guidelines](./contributing.md) for those who want to help "
  4442. "improve FreshRSS"
  4443. msgstr ""
  4444. #. type: Title ##
  4445. #: en/./index.md:34
  4446. #, markdown-text, no-wrap
  4447. msgid "Demo"
  4448. msgstr ""
  4449. #. type: Plain text
  4450. #: en/./index.md:37
  4451. #, markdown-text
  4452. msgid ""
  4453. "The official demo of FreshRSS is available under "
  4454. "[https://demo.freshrss.org/](https://demo.freshrss.org/)."
  4455. msgstr ""
  4456. #. type: Plain text
  4457. #: en/./index.md:39
  4458. #, markdown-text
  4459. msgid "Login credentials:"
  4460. msgstr ""
  4461. #. type: Bullet: '* '
  4462. #: en/./index.md:42
  4463. #, markdown-text
  4464. msgid "Username: demo"
  4465. msgstr ""
  4466. #. type: Bullet: '* '
  4467. #: en/./index.md:42
  4468. #, markdown-text
  4469. msgid "Password: demodemo"
  4470. msgstr ""
  4471. #. type: Plain text
  4472. #: en/./index.md:44
  4473. #, markdown-text
  4474. msgid ""
  4475. "Another chance to try out, but not official supported by FreshRSS: The "
  4476. "application is listed on Softaculous "
  4477. "[https://www.softaculous.com/apps/rss/FreshRSS](https://www.softaculous.com/apps/rss/FreshRSS)."
  4478. msgstr ""
  4479. #. type: Title ##
  4480. #: en/./index.md:45
  4481. #, markdown-text, no-wrap
  4482. msgid "Licence"
  4483. msgstr ""
  4484. #. type: Plain text
  4485. #: en/./index.md:47
  4486. #, markdown-text
  4487. msgid "FreshRSS is licensed under the GNU Affero General Public License v3.0."
  4488. msgstr ""
  4489. #. type: Title #
  4490. #: en/./internationalization.md:1
  4491. #, markdown-text, no-wrap
  4492. msgid "Contributing to internationalization (i18n)"
  4493. msgstr ""
  4494. #. type: Plain text
  4495. #: en/./internationalization.md:4
  4496. #, markdown-text
  4497. msgid ""
  4498. "Thanks to our contributors, FreshRSS is translated into [more than 20 "
  4499. "languages](./users/05_Configuration.md#language). This section will explain "
  4500. "the basics of internationalization in FreshRSS, from translating the "
  4501. "application to your own language to making a specific change."
  4502. msgstr ""
  4503. #. type: Title ##
  4504. #: en/./internationalization.md:5
  4505. #, markdown-text, no-wrap
  4506. msgid "Overview"
  4507. msgstr ""
  4508. #. type: Plain text
  4509. #: en/./internationalization.md:8
  4510. #, markdown-text
  4511. msgid ""
  4512. "It is common (and that’s an understatement) to want to show some text to the "
  4513. "user. The problem is that FreshRSS has users of different nationalities. It "
  4514. "is therefore necessary to be able to manage different languages in order not "
  4515. "to remain confined to English or French."
  4516. msgstr ""
  4517. #. type: Plain text
  4518. #: en/./internationalization.md:10
  4519. #, markdown-text
  4520. msgid ""
  4521. "The solution is to use the `Minz_Translate` module, which allows dynamic "
  4522. "translation of FreshRSS. Before using this module, it is necessary to know "
  4523. "where to find the strings to be translated. Each language has its own "
  4524. "subdirectory in a parent directory named `app/i18n/`. For example, English "
  4525. "language files are located in [`app/i18n/en/`](/app/i18n/en/). There are "
  4526. "seven different files:"
  4527. msgstr ""
  4528. #. type: Bullet: '* '
  4529. #: en/./internationalization.md:19
  4530. #, markdown-text
  4531. msgid "`admin.php` for anything related to FreshRSS administration"
  4532. msgstr ""
  4533. #. type: Bullet: '* '
  4534. #: en/./internationalization.md:19
  4535. #, markdown-text
  4536. msgid "`conf.php` for configuration"
  4537. msgstr ""
  4538. #. type: Bullet: '* '
  4539. #: en/./internationalization.md:19
  4540. #, markdown-text
  4541. msgid "`feedback.php` contains translations of feedback messages"
  4542. msgstr ""
  4543. #. type: Bullet: '* '
  4544. #: en/./internationalization.md:19
  4545. #, markdown-text
  4546. msgid "`gen.php` stores what is global to FreshRSS (`gen` stands for “general”)"
  4547. msgstr ""
  4548. #. type: Bullet: '* '
  4549. #: en/./internationalization.md:19
  4550. #, markdown-text
  4551. msgid "`index.php` for the main page that lists feeds and the About page"
  4552. msgstr ""
  4553. #. type: Bullet: '* '
  4554. #: en/./internationalization.md:19
  4555. #, markdown-text
  4556. msgid "`install.php` contains strings related to the installation"
  4557. msgstr ""
  4558. #. type: Bullet: '* '
  4559. #: en/./internationalization.md:19
  4560. #, markdown-text
  4561. msgid "`sub.php` for subscription management (`sub` stands for “subscription”)"
  4562. msgstr ""
  4563. #. type: Bullet: '* '
  4564. #: en/./internationalization.md:19
  4565. #, markdown-text
  4566. msgid "`user.php` contains some strings related to the User model"
  4567. msgstr ""
  4568. #. type: Plain text
  4569. #: en/./internationalization.md:21
  4570. #, markdown-text
  4571. msgid "This organization makes it possible to avoid a single huge translation file."
  4572. msgstr ""
  4573. #. type: Plain text
  4574. #: en/./internationalization.md:23
  4575. #, markdown-text
  4576. msgid ""
  4577. "The translation files are quite simple: it’s only a matter of returning a "
  4578. "PHP array containing the translations. As an example, here’s an extract from "
  4579. "[`app/i18n/fr/gen.php`](/app/i18n/fr/gen.php):"
  4580. msgstr ""
  4581. #. type: Fenced code block (php)
  4582. #: en/./internationalization.md:24
  4583. #, no-wrap
  4584. msgid ""
  4585. "<?php\n"
  4586. "return array(\n"
  4587. "\t'action' => [\n"
  4588. "\t\t'actualize' => 'Actualiser',\n"
  4589. "\t\t'back_to_rss_feeds' => '← Retour à vos flux RSS',\n"
  4590. "\t\t'cancel' => 'Annuler',\n"
  4591. "\t\t'create' => 'Créer',\n"
  4592. "\t\t'disable' => 'Désactiver',\n"
  4593. "\t),\n"
  4594. "\t'freshrss' => array(\n"
  4595. "\t\t'_' => 'FreshRSS',\n"
  4596. "\t\t'about' => 'À propos de FreshRSS',\n"
  4597. "\t),\n"
  4598. "\t// ...\n"
  4599. ");\n"
  4600. msgstr ""
  4601. #. type: Plain text
  4602. #: en/./internationalization.md:43
  4603. #, markdown-text
  4604. msgid ""
  4605. "Each value can be referenced by a key: it consists of a series of "
  4606. "identifiers separated by dots. The first identifier indicates from which "
  4607. "file to extract the translation, while the following ones indicate array "
  4608. "entries. Thus, the `gen.freshrss.about` key is referencing the `about` entry "
  4609. "from the `freshrss` entry which is part of the main array returned by the "
  4610. "`gen.php` file. This allows us to further organize our translation files."
  4611. msgstr ""
  4612. #. type: Plain text
  4613. #: en/./internationalization.md:45
  4614. #, markdown-text
  4615. msgid ""
  4616. "You should not have to write the array by yourself and we provide several "
  4617. "commands to ease the manipulation of these files. Let’s see some common use "
  4618. "cases."
  4619. msgstr ""
  4620. #. type: Title ##
  4621. #: en/./internationalization.md:46
  4622. #, markdown-text, no-wrap
  4623. msgid "Add support for a new language"
  4624. msgstr ""
  4625. #. type: Plain text
  4626. #: en/./internationalization.md:49
  4627. #, markdown-text
  4628. msgid ""
  4629. "If you want to add support for a language which isn’t supported by FreshRSS "
  4630. "yet, you can run this command:"
  4631. msgstr ""
  4632. #. type: Fenced code block (sh)
  4633. #: en/./internationalization.md:50
  4634. #, no-wrap
  4635. msgid "make i18n-add-language lang=[your language code]\n"
  4636. msgstr ""
  4637. #. type: Plain text
  4638. #: en/./internationalization.md:55
  4639. #, markdown-text
  4640. msgid ""
  4641. "You must replace `[your language code]` by the language tag of your "
  4642. "language. It must follow the [IETF BCP 47 "
  4643. "standard](https://en.wikipedia.org/wiki/IETF_language_tag). For instance, "
  4644. "English is `en` and French is `fr`. You can target a specific region with a "
  4645. "subtag, for instance `pt-br` for Brazilian Portuguese. If you’re not sure of "
  4646. "the code, Wikipedia might be a good start to find it or you can ask us for "
  4647. "help too."
  4648. msgstr ""
  4649. #. type: Plain text
  4650. #: en/./internationalization.md:57
  4651. #, markdown-text
  4652. msgid ""
  4653. "The command will create a new subfolder under `app/i18n/` and copy the "
  4654. "strings from the reference language (i.e. English). It will also mark all "
  4655. "the translations with a special tag represented by a comment: `// TODO - "
  4656. "Translation`. We’ll see in the next section how to translate the strings."
  4657. msgstr ""
  4658. #. type: Title ##
  4659. #: en/./internationalization.md:58
  4660. #, markdown-text, no-wrap
  4661. msgid "Translate the interface"
  4662. msgstr ""
  4663. #. type: Plain text
  4664. #: en/./internationalization.md:61
  4665. #, markdown-text
  4666. msgid ""
  4667. "You might have noticed some strings are not yet translated from English even "
  4668. "though you’ve selected a different language. This is because we mostly speak "
  4669. "English or French and it’s pretty difficult to us to speak all the different "
  4670. "languages!"
  4671. msgstr ""
  4672. #. type: Plain text
  4673. #: en/./internationalization.md:63
  4674. #, markdown-text
  4675. msgid ""
  4676. "To update a string, you just have to open its file, find the string, and "
  4677. "change it (without removing the quotes around it!) You might want to remove "
  4678. "the comment at the end of the line, but you should prefer to use the "
  4679. "following command:"
  4680. msgstr ""
  4681. #. type: Fenced code block (sh)
  4682. #: en/./internationalization.md:64
  4683. #, no-wrap
  4684. msgid "make i18n-format\n"
  4685. msgstr ""
  4686. #. type: Plain text
  4687. #: en/./internationalization.md:69
  4688. #, markdown-text
  4689. msgid ""
  4690. "It will remove the comments on the lines that you’ve changed, and will "
  4691. "reformat the file correctly. If you’ve made any mistakes, it will fix them "
  4692. "automatically or it will tell you it can’t (well… the command will "
  4693. "dramatically fail without any damage, don’t worry)."
  4694. msgstr ""
  4695. #. type: Plain text
  4696. #: en/./internationalization.md:71
  4697. #, markdown-text
  4698. msgid ""
  4699. "The strings to translate can be easily found in the translations files "
  4700. "thanks to the tag we spoke about at the end of the previous section. Indeed, "
  4701. "it indicates to our tools that the strings are not translated yet. This "
  4702. "means you can find them with Git. For instance for the Greek language:"
  4703. msgstr ""
  4704. #. type: Fenced code block (sh)
  4705. #: en/./internationalization.md:72
  4706. #, no-wrap
  4707. msgid "git grep TODO app/i18n/he\n"
  4708. msgstr ""
  4709. #. type: Title ##
  4710. #: en/./internationalization.md:76
  4711. #, markdown-text, no-wrap
  4712. msgid "Acknowledge a false-positive"
  4713. msgstr ""
  4714. #. type: Plain text
  4715. #: en/./internationalization.md:79
  4716. #, markdown-text
  4717. msgid ""
  4718. "Our tool detects if a string needs to be translated if it equals to the "
  4719. "English version. For instance, the word “version” is the same in English and "
  4720. "French. Thus, our tool would mark the French word to be translated. This is, "
  4721. "in fact, the case for the `index.about.version` key. This case is considered "
  4722. "as a false-positive because the word _is_ actually translated. To aknowledge "
  4723. "such translations, you can run:"
  4724. msgstr ""
  4725. #. type: Fenced code block (sh)
  4726. #: en/./internationalization.md:80
  4727. #, no-wrap
  4728. msgid "make i18n-ignore-key lang=fr key=index.about.version\n"
  4729. msgstr ""
  4730. #. type: Plain text
  4731. #: en/./internationalization.md:85
  4732. #, markdown-text
  4733. msgid ""
  4734. "This command adds an IGNORE comment on the translation so the key can be "
  4735. "considered as translated."
  4736. msgstr ""
  4737. #. type: Title ##
  4738. #: en/./internationalization.md:86
  4739. #, markdown-text, no-wrap
  4740. msgid "Add/remove/update a key"
  4741. msgstr ""
  4742. #. type: Plain text
  4743. #: en/./internationalization.md:89
  4744. #, markdown-text
  4745. msgid ""
  4746. "If you’re developing a new part of the application, you might want to "
  4747. "declare a new translation key. Your first impulse would be to add the key to "
  4748. "each file manually: don’t do that, it’s very painful. We provide another "
  4749. "command:"
  4750. msgstr ""
  4751. #. type: Fenced code block (sh)
  4752. #: en/./internationalization.md:90
  4753. #, no-wrap
  4754. msgid "make i18n-add-key key=the.key.to.add value='Your string in English'\n"
  4755. msgstr ""
  4756. #. type: Plain text
  4757. #: en/./internationalization.md:95
  4758. #, markdown-text
  4759. msgid ""
  4760. "This adds the key to all the files. It’ll be in English, waiting for other "
  4761. "translators."
  4762. msgstr ""
  4763. #. type: Plain text
  4764. #: en/./internationalization.md:97
  4765. #, markdown-text
  4766. msgid ""
  4767. "Conversely, you may want to remove a key that is no longer used in the "
  4768. "application with:"
  4769. msgstr ""
  4770. #. type: Fenced code block (sh)
  4771. #: en/./internationalization.md:98
  4772. #, no-wrap
  4773. msgid "make i18n-remove-key key=the.key.to.remove\n"
  4774. msgstr ""
  4775. #. type: Plain text
  4776. #: en/./internationalization.md:103
  4777. #, markdown-text
  4778. msgid ""
  4779. "Finally, if the English version of a string needs to be changed, you need to "
  4780. "consider two cases. If the change doesn’t impact the meaning of the "
  4781. "sentence, and therefore other languages don’t need to change (e.g. to fix a "
  4782. "typo), you should make the change manually in the file. In any other case, "
  4783. "you should use the following command:"
  4784. msgstr ""
  4785. #. type: Fenced code block (sh)
  4786. #: en/./internationalization.md:104
  4787. #, no-wrap
  4788. msgid ""
  4789. "make i18n-update-key key=the.key.to.change value='The new string in "
  4790. "English'\n"
  4791. msgstr ""
  4792. #. type: Plain text
  4793. #: en/./internationalization.md:109
  4794. #, markdown-text
  4795. msgid "The key will simply be removed and added back with the new value."
  4796. msgstr ""
  4797. #. type: Title ##
  4798. #: en/./internationalization.md:110
  4799. #, markdown-text, no-wrap
  4800. msgid "How to access a translation programmatically"
  4801. msgstr ""
  4802. #. type: Plain text
  4803. #: en/./internationalization.md:113
  4804. #, markdown-text
  4805. msgid ""
  4806. "To access these translations, you must use the `_t()` function (which is a "
  4807. "shortcut for `Minz_Translate::t()`). Code example:"
  4808. msgstr ""
  4809. #. type: Fenced code block (html)
  4810. #: en/./internationalization.md:114
  4811. #, no-wrap
  4812. msgid ""
  4813. "<p>\n"
  4814. "\t<?= _t('gen.freshrss.about') ?>\n"
  4815. "</p>\n"
  4816. msgstr ""
  4817. #. type: Plain text
  4818. #: en/./internationalization.md:121
  4819. #, markdown-text
  4820. msgid ""
  4821. "The function expects a translation key, but there’s a special case that "
  4822. "sometimes makes life easier: the `_` identifier. This must necessarily be "
  4823. "present at the end of the chain and gives a value to the higher-level "
  4824. "identifier. It’s pretty hard to explain but very simple to understand. In "
  4825. "the example given above, an `_` is associated with the value `FreshRSS`: "
  4826. "this means that there is no need to write `_t('gen.freshrss._')` but "
  4827. "`_t('gen.freshrss')` suffices."
  4828. msgstr ""
  4829. #. type: Plain text
  4830. #: en/./internationalization.md:123
  4831. #, markdown-text
  4832. msgid ""
  4833. "`_t()` can take any number of variables. The variables will then be replaced "
  4834. "in the translation if it contains some “conversion specifications” (usually "
  4835. "`%s` or `%d`). You can learn more about these specifications in the "
  4836. "[`sprintf()` PHP function "
  4837. "documentation](https://www.php.net/manual/function.sprintf)."
  4838. msgstr ""
  4839. #. type: Plain text
  4840. #: en/./internationalization.md:125
  4841. #, markdown-text, no-wrap
  4842. msgid ""
  4843. "For instance, the English translation for `gen.auth.keep_logged_in` is `Keep "
  4844. "me logged in <small>(%s days)</small>`. It means this translation expects a "
  4845. "string to be passed as an argument to the `t()` function (well, it should be "
  4846. "a `%d` because we want a number here, but it doesn’t matter). For "
  4847. "instance:\n"
  4848. msgstr ""
  4849. #. type: Fenced code block (php)
  4850. #: en/./internationalization.md:126
  4851. #, no-wrap
  4852. msgid ""
  4853. "<label>\n"
  4854. "\t<input type=\"checkbox\" name=\"keep_logged_in\" />\n"
  4855. "\t<?= _t('gen.auth.keep_logged_in', 30) ?>\n"
  4856. "</label>\n"
  4857. msgstr ""
  4858. #. type: Plain text
  4859. #: en/./users/02_First_steps.md:2
  4860. #, markdown-text
  4861. msgid ""
  4862. "Learning how to handle a new application is not always easy. We’ve tried to "
  4863. "make FreshRSS as intuitive as possible, but you might still need a little "
  4864. "help to master the program."
  4865. msgstr ""
  4866. #. type: Plain text
  4867. #: en/./users/02_First_steps.md:4
  4868. #, markdown-text
  4869. msgid ""
  4870. "This section will guide you to the pages you need to get started. The order "
  4871. "is tailored to newcomers."
  4872. msgstr ""
  4873. #. type: Plain text
  4874. #: en/./users/02_First_steps.md:6
  4875. #, markdown-text
  4876. msgid ""
  4877. "[After installing the application](../admins/03_Installation.md), the first "
  4878. "step is to add some feeds. You have a few options:"
  4879. msgstr ""
  4880. #. type: Bullet: '1. '
  4881. #: en/./users/02_First_steps.md:10
  4882. #, markdown-text
  4883. msgid "[Add a feed manually](04_Subscriptions.md#adding-a-feed)"
  4884. msgstr ""
  4885. #. type: Bullet: '2. '
  4886. #: en/./users/02_First_steps.md:10
  4887. #, markdown-text
  4888. msgid "[Import an OPML or JSON file](04_Subscriptions.md#import-and-export)"
  4889. msgstr ""
  4890. #. type: Bullet: '3. '
  4891. #: en/./users/02_First_steps.md:10
  4892. #, markdown-text
  4893. msgid "[Use the bookmarklet](04_Subscriptions.md#use-bookmarklet)"
  4894. msgstr ""
  4895. #. type: Plain text
  4896. #: en/./users/02_First_steps.md:12
  4897. #, markdown-text
  4898. msgid ""
  4899. "Once you have added your feeds to FreshRSS, it is time to read them. There "
  4900. "are three available reading modes:"
  4901. msgstr ""
  4902. #. type: Bullet: '1. '
  4903. #: en/./users/02_First_steps.md:16
  4904. #, markdown-text
  4905. msgid ""
  4906. "[The normal view](03_Main_view.md#normal-view) enables you to quickly read "
  4907. "new articles"
  4908. msgstr ""
  4909. #. type: Bullet: '2. '
  4910. #: en/./users/02_First_steps.md:16
  4911. #, markdown-text
  4912. msgid ""
  4913. "[The global view](03_Main_view.md#global-view) shows you an overview of the "
  4914. "status of your feeds in one glance"
  4915. msgstr ""
  4916. #. type: Bullet: '3. '
  4917. #: en/./users/02_First_steps.md:16
  4918. #, markdown-text
  4919. msgid ""
  4920. "[The reader view](03_Main_view.md#reader-view) offers you a comfortable "
  4921. "reading experience"
  4922. msgstr ""
  4923. #. type: Plain text
  4924. #: en/./users/02_First_steps.md:18
  4925. #, markdown-text
  4926. msgid ""
  4927. "Now that you’ve mastered basic use, it’s time to configure FreshRSS to "
  4928. "improve your reading experience. It’s highly configurable, so it’s "
  4929. "recommended to play around with them to find a configuration that suits you "
  4930. "well. Here are a few resources to help you improve your daily FreshRSS "
  4931. "experience:"
  4932. msgstr ""
  4933. #. type: Bullet: '* '
  4934. #: en/./users/02_First_steps.md:27
  4935. #, markdown-text
  4936. msgid "[Organize your feeds in categories](04_Subscriptions.md#feed-management)"
  4937. msgstr ""
  4938. #. type: Bullet: '* '
  4939. #: en/./users/02_First_steps.md:27
  4940. #, markdown-text
  4941. msgid "[Change the home page](05_Configuration.md#changing-the-view)"
  4942. msgstr ""
  4943. #. type: Bullet: '* '
  4944. #: en/./users/02_First_steps.md:27
  4945. #, markdown-text
  4946. msgid "[Choose the reading options](05_Configuration.md#reading-options)"
  4947. msgstr ""
  4948. #. type: Bullet: '* '
  4949. #: en/./users/02_First_steps.md:27
  4950. #, markdown-text
  4951. msgid "[Refresh feeds](09_refreshing_feeds.md)"
  4952. msgstr ""
  4953. #. type: Bullet: '* '
  4954. #: en/./users/02_First_steps.md:27
  4955. #, markdown-text
  4956. msgid "[Filter articles](10_filter.md) for a fast access to a selection"
  4957. msgstr ""
  4958. #. type: Bullet: '* '
  4959. #: en/./users/02_First_steps.md:27
  4960. #, markdown-text
  4961. msgid ""
  4962. "[search for an article](10_filter.md#with-the-search-field) published some "
  4963. "time ago"
  4964. msgstr ""
  4965. #. type: Bullet: '* '
  4966. #: en/./users/02_First_steps.md:27
  4967. #, markdown-text
  4968. msgid "[Access your feeds on a mobile device](06_Mobile_access.md)"
  4969. msgstr ""
  4970. #. type: Bullet: '* '
  4971. #: en/./users/02_First_steps.md:27
  4972. #, markdown-text
  4973. msgid "[Add some extensions](https://github.com/FreshRSS/Extensions)"
  4974. msgstr ""
  4975. #. type: Bullet: '* '
  4976. #: en/./users/02_First_steps.md:27
  4977. #, markdown-text
  4978. msgid "[Frequently asked questions](07_Frequently_Asked_Questions.md)"
  4979. msgstr ""
  4980. #. type: Plain text
  4981. #: en/./users/03_Main_view.md:4
  4982. #, markdown-text
  4983. msgid "FreshRSS has three primary viewing modes: Normal, Global, and Reader view."
  4984. msgstr ""
  4985. #. type: Title ##
  4986. #: en/./users/03_Main_view.md:5
  4987. #, markdown-text, no-wrap
  4988. msgid "Normal view"
  4989. msgstr ""
  4990. #. type: Plain text
  4991. #: en/./users/03_Main_view.md:8
  4992. #, markdown-text
  4993. msgid ""
  4994. "Normal view will allow you to view articles in a compressed view. They can "
  4995. "be separated by category or individual feed, or viewed in the \"main "
  4996. "stream\" containing all feeds. Clicking a feed in the sidebar (mobile users "
  4997. "will need to click the folder icon to open it) will open that feed’s view."
  4998. msgstr ""
  4999. #. type: Title ###
  5000. #: en/./users/03_Main_view.md:9
  5001. #, markdown-text, no-wrap
  5002. msgid "Article List"
  5003. msgstr ""
  5004. #. type: Plain text
  5005. #: en/./users/03_Main_view.md:18
  5006. #, markdown-text
  5007. msgid ""
  5008. "By default, the normal view includes six items per article. From left to "
  5009. "right: * **Read status:** An envelope icon to show if the article has been "
  5010. "read or not. Closed envelopes are unread, open envelopes are read. Clicking "
  5011. "on the icon will toggle the read status. * **Favourite status:** A star "
  5012. "icon to show if the article has been favourited or not. Filled stars are "
  5013. "favourited, empty stars are not. Clicking on the icon will toggle the "
  5014. "favourite status. * **Feed name:** The name of the feed that the article is "
  5015. "from. Clicking the feed name will move to that feed’s view in normal view. "
  5016. "* **Article title:** The title of the article. Clicking will open the "
  5017. "article for viewing within FreshRSS. * **Article date/time:** The time the "
  5018. "article was posted. * **Link to original article:** A globe icon that can "
  5019. "be clicked to go to the article on the original website."
  5020. msgstr ""
  5021. #. type: Title ###
  5022. #: en/./users/03_Main_view.md:19
  5023. #, markdown-text, no-wrap
  5024. msgid "Normal View Sidebar"
  5025. msgstr ""
  5026. #. type: Plain text
  5027. #: en/./users/03_Main_view.md:28
  5028. #, markdown-text
  5029. msgid ""
  5030. "Clicking the gear icon next to an individual feed will display additional "
  5031. "options for that feed. * **Filter:** Run the defined filter to mark "
  5032. "articles as read * **Statistics:** View statistics about the feed * **See "
  5033. "website:** Open the feed’s website in another tab * **Manage:** Configure "
  5034. "the feed * **Actualize:** Force-update the feed * **Mark as read:** Mark all "
  5035. "items in the feed as read"
  5036. msgstr ""
  5037. #. type: Title ##
  5038. #: en/./users/03_Main_view.md:29
  5039. #, markdown-text, no-wrap
  5040. msgid "Global view"
  5041. msgstr ""
  5042. #. type: Plain text
  5043. #: en/./users/03_Main_view.md:32
  5044. #, markdown-text
  5045. msgid ""
  5046. "Global view allows quick views of feed’s statuses at once. Feeds and "
  5047. "categories are shown with the number of unread articles next to "
  5048. "them. Clicking a feed’s name will open it in a view similar to normal view."
  5049. msgstr ""
  5050. #. type: Title ##
  5051. #: en/./users/03_Main_view.md:33
  5052. #, markdown-text, no-wrap
  5053. msgid "Reader view"
  5054. msgstr ""
  5055. #. type: Plain text
  5056. #: en/./users/03_Main_view.md:36
  5057. #, markdown-text
  5058. msgid ""
  5059. "Reader view will display a feed will all articles already open for "
  5060. "reading. Feeds can be switched by clicking the folder icon at the top to "
  5061. "bring up the category/feed sidebar."
  5062. msgstr ""
  5063. #. type: Plain text
  5064. #: en/./users/03_Main_view.md:40
  5065. #, markdown-text
  5066. msgid ""
  5067. "Read more: * [Refreshing the feeds](./09_refreshing_feeds.md) * [Filter the "
  5068. "feeds and search](./10_filter.md)"
  5069. msgstr ""
  5070. #. type: Title #
  5071. #: en/./users/04_Subscriptions.md:1
  5072. #, markdown-text, no-wrap
  5073. msgid "Adding a feed"
  5074. msgstr ""
  5075. #. type: Bullet: '1. '
  5076. #: en/./users/04_Subscriptions.md:10
  5077. #, markdown-text
  5078. msgid ""
  5079. "To add a feed, copy the URL of its RSS or Atom file (for instance, the "
  5080. "Framablog RSS URL is `https://framablog.org/feed/`). FreshRSS is able to "
  5081. "automatically find the address of the feed for websites that are declaring "
  5082. "it in a standard way."
  5083. msgstr ""
  5084. #. type: Bullet: '2. '
  5085. #: en/./users/04_Subscriptions.md:10
  5086. #, markdown-text
  5087. msgid "In FreshRSS, click the \"**+**\" button next to “Subscriptions management”."
  5088. msgstr ""
  5089. #. type: Bullet: '3. '
  5090. #: en/./users/04_Subscriptions.md:10
  5091. #, markdown-text
  5092. msgid "Paste the URL in the “Feed URL” field."
  5093. msgstr ""
  5094. #. type: Bullet: '4. '
  5095. #: en/./users/04_Subscriptions.md:10
  5096. #, markdown-text
  5097. msgid ""
  5098. "(optional): You can select the category for your feed. By default, it will "
  5099. "be in “Uncategorized”."
  5100. msgstr ""
  5101. #. type: Bullet: '5. '
  5102. #: en/./users/04_Subscriptions.md:10
  5103. #, markdown-text
  5104. msgid ""
  5105. "(optional): If the subscription requires credentials, you can enter them in "
  5106. "the \"HTTP username\" and \"HTTP password\" fields."
  5107. msgstr ""
  5108. #. type: Bullet: '6. '
  5109. #: en/./users/04_Subscriptions.md:10
  5110. #, markdown-text
  5111. msgid "(optional): You can set a timeout for the feed request."
  5112. msgstr ""
  5113. #. type: Bullet: '7. '
  5114. #: en/./users/04_Subscriptions.md:10
  5115. #, markdown-text
  5116. msgid ""
  5117. "(optional): You can choose to ignore SSL certificate errors (such as with "
  5118. "self-signed certificates) by setting \"Verify SSL security\" to \"No\". This "
  5119. "is not recommended, and it is better to either add the root certificate to "
  5120. "the FreshRSS server or to fix the SSL certificate problems on the feed "
  5121. "hosting server."
  5122. msgstr ""
  5123. #. type: Title ##
  5124. #: en/./users/04_Subscriptions.md:11
  5125. #, markdown-text, no-wrap
  5126. msgid "Subscription management"
  5127. msgstr ""
  5128. #. type: Plain text
  5129. #: en/./users/04_Subscriptions.md:14
  5130. #, markdown-text
  5131. msgid ""
  5132. "The \"Subscription management\" submenu allows categories and feeds to be "
  5133. "configured. Feeds can be moved between categories by drag-and-drop, or in "
  5134. "the individual feed’s settings. Hovering over a feed/category will cause a "
  5135. "gear icon to appear. Clicking the icon will bring up the settings for that "
  5136. "item."
  5137. msgstr ""
  5138. #. type: Title ##
  5139. #: en/./users/04_Subscriptions.md:15
  5140. #, markdown-text, no-wrap
  5141. msgid "Category Settings"
  5142. msgstr ""
  5143. #. type: Title ###
  5144. #: en/./users/04_Subscriptions.md:17
  5145. #, markdown-text, no-wrap
  5146. msgid "Information"
  5147. msgstr ""
  5148. #. type: Bullet: '* '
  5149. #: en/./users/04_Subscriptions.md:21
  5150. #, markdown-text
  5151. msgid "**Title:** Name of category"
  5152. msgstr ""
  5153. #. type: Bullet: '* '
  5154. #: en/./users/04_Subscriptions.md:21
  5155. #, markdown-text
  5156. msgid ""
  5157. "**Display position:** Defines the order of categories. Lower numbers get "
  5158. "priority, non-numbered items come last, and equally numbered items will sort "
  5159. "by alphabetical order."
  5160. msgstr ""
  5161. #. type: Title ##
  5162. #: en/./users/04_Subscriptions.md:22 en/./users/05_Configuration.md:115
  5163. #, markdown-text, no-wrap
  5164. msgid "Archiving"
  5165. msgstr ""
  5166. #. type: Plain text
  5167. #: en/./users/04_Subscriptions.md:25
  5168. #, markdown-text
  5169. msgid ""
  5170. "If \"Purge Policy\" has \"By default\" selected, then the [default purge "
  5171. "policy](./05_Configuration.md) is used and the other options are not "
  5172. "displayed. Category options will override the default policy, but they will "
  5173. "not override feed-specific options."
  5174. msgstr ""
  5175. #. type: Title ##
  5176. #: en/./users/04_Subscriptions.md:26
  5177. #, markdown-text, no-wrap
  5178. msgid "Feed Settings"
  5179. msgstr ""
  5180. #. type: Plain text
  5181. #: en/./users/04_Subscriptions.md:29
  5182. #, markdown-text
  5183. msgid ""
  5184. "These fields will be auto-filled when adding a feed, but they can be "
  5185. "modified later. **Visibility** will define if the feed is displayed in the "
  5186. "main feed, only in specific categories, or not at all."
  5187. msgstr ""
  5188. #. type: Title #
  5189. #: en/./users/04_Subscriptions.md:30 en/./users/05_Configuration.md:113
  5190. #, markdown-text, no-wrap
  5191. msgid "Archival"
  5192. msgstr ""
  5193. #. type: Plain text
  5194. #: en/./users/04_Subscriptions.md:33
  5195. #, markdown-text
  5196. msgid ""
  5197. "This section will let you override the default settings for feed archiving "
  5198. "and update frequency."
  5199. msgstr ""
  5200. #. type: Title ###
  5201. #: en/./users/04_Subscriptions.md:34
  5202. #, markdown-text, no-wrap
  5203. msgid "Login"
  5204. msgstr ""
  5205. #. type: Plain text
  5206. #: en/./users/04_Subscriptions.md:37
  5207. #, markdown-text
  5208. msgid ""
  5209. "Some feeds require a username/password submitted over HTTP. These usually "
  5210. "aren’t needed for feeds."
  5211. msgstr ""
  5212. #. type: Title ###
  5213. #: en/./users/04_Subscriptions.md:38
  5214. #, markdown-text, no-wrap
  5215. msgid "Advanced"
  5216. msgstr ""
  5217. #. type: Title ####
  5218. #: en/./users/04_Subscriptions.md:40
  5219. #, markdown-text, no-wrap
  5220. msgid "Retrieve a truncated feed from within FreshRSS"
  5221. msgstr ""
  5222. #. type: Plain text
  5223. #: en/./users/04_Subscriptions.md:43
  5224. #, markdown-text
  5225. msgid ""
  5226. "This question comes up regularly, so we’ll try to clarify how one can "
  5227. "retrieve a truncated RSS feed with FreshRSS. Please note that the process is "
  5228. "absolutely not user friendly, but it works. :)"
  5229. msgstr ""
  5230. #. type: Plain text
  5231. #: en/./users/04_Subscriptions.md:45
  5232. #, markdown-text
  5233. msgid ""
  5234. "Please be aware that this way you’ll generate much more traffic to the "
  5235. "originating sites, and they might block you accordingly. FreshRSS "
  5236. "performance is also negatively affected, because you’ll have to fetch the "
  5237. "full article content one by one. So it’s a feature to use sparingly!"
  5238. msgstr ""
  5239. #. type: Plain text
  5240. #: en/./users/04_Subscriptions.md:47
  5241. #, markdown-text
  5242. msgid ""
  5243. "The \"Article CSS selector on original website\" corresponds to the \"path\" "
  5244. "consisting of IDs and classes (which in HTML, matches the id and class "
  5245. "attributes) to retrieve only the interesting part that corresponds to the "
  5246. "article. Ideally, this path starts with an id (which is unique to the "
  5247. "page). The basics are explained "
  5248. "[here](https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors)."
  5249. msgstr ""
  5250. #. type: Title #####
  5251. #: en/./users/04_Subscriptions.md:48
  5252. #, markdown-text, no-wrap
  5253. msgid "Example: Rue89"
  5254. msgstr ""
  5255. #. type: Plain text
  5256. #: en/./users/04_Subscriptions.md:52
  5257. #, markdown-text
  5258. msgid ""
  5259. "To find this path, you have to go to the address of one of the truncated "
  5260. "articles. You look have to look for the \"block\" of HTML that corresponds "
  5261. "to article content (in the source code!)."
  5262. msgstr ""
  5263. #. type: Plain text
  5264. #: en/./users/04_Subscriptions.md:54
  5265. #, markdown-text, no-wrap
  5266. msgid ""
  5267. "Here we find that the block that encompasses nothing but the content of the "
  5268. "article is ```<div class=\"content clearfix\">```. We’ll only use the "
  5269. "`.content` class here. Nevertheless, as said above, it’s best to start the "
  5270. "path with an id. If we go back to the parent block, we find ```<div "
  5271. "id=\"article\">``` and that’s perfect! The path will be ```#article "
  5272. ".content```.\n"
  5273. msgstr ""
  5274. #. type: Title #####
  5275. #: en/./users/04_Subscriptions.md:55
  5276. #, markdown-text, no-wrap
  5277. msgid ""
  5278. "Add the corresponding classes to the article CSS path on the feed "
  5279. "configuration page"
  5280. msgstr ""
  5281. #. type: Plain text
  5282. #: en/./users/04_Subscriptions.md:58
  5283. #, markdown-text
  5284. msgid "Examples:"
  5285. msgstr ""
  5286. #. type: Bullet: '* '
  5287. #: en/./users/04_Subscriptions.md:63
  5288. #, markdown-text
  5289. msgid "Rue89: ```#article .content```"
  5290. msgstr ""
  5291. #. type: Bullet: '* '
  5292. #: en/./users/04_Subscriptions.md:63
  5293. #, markdown-text
  5294. msgid "PCINpact: ```#actu_content```"
  5295. msgstr ""
  5296. #. type: Bullet: '* '
  5297. #: en/./users/04_Subscriptions.md:63
  5298. #, markdown-text
  5299. msgid "Lesnumériques: ```article#body div.text.clearfix```"
  5300. msgstr ""
  5301. #. type: Bullet: '* '
  5302. #: en/./users/04_Subscriptions.md:63
  5303. #, markdown-text
  5304. msgid "Phoronix: ```#main .content```"
  5305. msgstr ""
  5306. #. type: Title #####
  5307. #: en/./users/04_Subscriptions.md:64
  5308. #, markdown-text, no-wrap
  5309. msgid "Combining CSS Classes"
  5310. msgstr ""
  5311. #. type: Plain text
  5312. #: en/./users/04_Subscriptions.md:67
  5313. #, markdown-text
  5314. msgid ""
  5315. "Let’s say we have an article which contains ads, and we do not want to have "
  5316. "those ads retrieved by FreshRSS. Example HTML:"
  5317. msgstr ""
  5318. #. type: Fenced code block (html)
  5319. #: en/./users/04_Subscriptions.md:68
  5320. #, no-wrap
  5321. msgid ""
  5322. "<div id=\"article\">\n"
  5323. "<h2>wanted</h2>\n"
  5324. "<p class=\"content\">wanted content</p>\n"
  5325. "<p class=\"ad\">unwanted content</p>\n"
  5326. "<h2>wanted</h2>\n"
  5327. "<p class=\"content\">wanted content</p>\n"
  5328. "<h2>wanted</h2>\n"
  5329. "<p class=\"ad\">unwanted content</p>\n"
  5330. "<p class=\"content\">wanted content</p>\n"
  5331. "</div>\n"
  5332. msgstr ""
  5333. #. type: Plain text
  5334. #: en/./users/04_Subscriptions.md:82
  5335. #, markdown-text
  5336. msgid ""
  5337. "In this case it’s possible to combine multiple CSS selectors with a comma: "
  5338. "```#article p.content, #article h2```"
  5339. msgstr ""
  5340. #. type: Title ####
  5341. #: en/./users/04_Subscriptions.md:83
  5342. #, markdown-text, no-wrap
  5343. msgid "Retrieve a truncated feed with external tools"
  5344. msgstr ""
  5345. #. type: Plain text
  5346. #: en/./users/04_Subscriptions.md:86
  5347. #, markdown-text
  5348. msgid "Complementary tools can be used to retrieve full article content, such as:"
  5349. msgstr ""
  5350. #. type: Bullet: '* '
  5351. #: en/./users/04_Subscriptions.md:89
  5352. #, markdown-text
  5353. msgid "[RSS-Bridge](https://github.com/RSS-Bridge/rss-bridge)"
  5354. msgstr ""
  5355. #. type: Bullet: '* '
  5356. #: en/./users/04_Subscriptions.md:89
  5357. #, markdown-text
  5358. msgid "[Full-Text RSS](https://bitbucket.org/fivefilters/full-text-rss)"
  5359. msgstr ""
  5360. #. type: Title ###
  5361. #: en/./users/04_Subscriptions.md:90
  5362. #, markdown-text, no-wrap
  5363. msgid "Filter"
  5364. msgstr ""
  5365. #. type: Plain text
  5366. #: en/./users/04_Subscriptions.md:93
  5367. #, markdown-text
  5368. msgid ""
  5369. "Articles can be automatically marked as read based on some search terms. See "
  5370. "[filtering](./10_filter.md) for more information on how to create these "
  5371. "filters."
  5372. msgstr ""
  5373. #. type: Title ##
  5374. #: en/./users/04_Subscriptions.md:94
  5375. #, markdown-text, no-wrap
  5376. msgid "Import / export"
  5377. msgstr ""
  5378. #. type: Plain text
  5379. #: en/./users/04_Subscriptions.md:97
  5380. #, markdown-text
  5381. msgid ""
  5382. "See [SQLite export/import]( "
  5383. "https://github.com/FreshRSS/FreshRSS/tree/edge/cli) as an alternative."
  5384. msgstr ""
  5385. #. type: Title ##
  5386. #: en/./users/04_Subscriptions.md:98
  5387. #, markdown-text, no-wrap
  5388. msgid "Export"
  5389. msgstr ""
  5390. #. type: Bullet: '1. '
  5391. #: en/./users/04_Subscriptions.md:108
  5392. #, markdown-text
  5393. msgid "To export your list of feeds, go to “Subscriptions management”."
  5394. msgstr ""
  5395. #. type: Bullet: '2. '
  5396. #: en/./users/04_Subscriptions.md:108
  5397. #, markdown-text
  5398. msgid "Click on “Import / export”"
  5399. msgstr ""
  5400. #. type: Bullet: '3. '
  5401. #: en/./users/04_Subscriptions.md:108
  5402. #, markdown-text
  5403. msgid "You can select for your export:"
  5404. msgstr ""
  5405. #. type: Bullet: ' 1. '
  5406. #: en/./users/04_Subscriptions.md:108
  5407. #, markdown-text
  5408. msgid "the list of feeds"
  5409. msgstr ""
  5410. #. type: Bullet: ' 2. '
  5411. #: en/./users/04_Subscriptions.md:108
  5412. #, markdown-text
  5413. msgid "labelled articles"
  5414. msgstr ""
  5415. #. type: Bullet: ' 3. '
  5416. #: en/./users/04_Subscriptions.md:108
  5417. #, markdown-text
  5418. msgid "favourite articles"
  5419. msgstr ""
  5420. #. type: Bullet: ' 4. '
  5421. #: en/./users/04_Subscriptions.md:108
  5422. #, markdown-text
  5423. msgid ""
  5424. "and finally, you can select feeds you want to export (by default, all feeds "
  5425. "are selected)"
  5426. msgstr ""
  5427. #. type: Bullet: '4. '
  5428. #: en/./users/04_Subscriptions.md:108
  5429. #, markdown-text
  5430. msgid "Click on “export”."
  5431. msgstr ""
  5432. #. type: Title ##
  5433. #: en/./users/04_Subscriptions.md:109
  5434. #, markdown-text, no-wrap
  5435. msgid "Import"
  5436. msgstr ""
  5437. #. type: Bullet: '1. '
  5438. #: en/./users/04_Subscriptions.md:114
  5439. #, markdown-text
  5440. msgid "Go to the page “Import / export”."
  5441. msgstr ""
  5442. #. type: Bullet: '2. '
  5443. #: en/./users/04_Subscriptions.md:114
  5444. #, markdown-text
  5445. msgid "Click on “Browse” and select your OPML or archive file on your computer."
  5446. msgstr ""
  5447. #. type: Bullet: '3. '
  5448. #: en/./users/04_Subscriptions.md:114
  5449. #, markdown-text
  5450. msgid "Click on “Import”"
  5451. msgstr ""
  5452. #. type: Plain text
  5453. #: en/./users/04_Subscriptions.md:122
  5454. #, markdown-text, no-wrap
  5455. msgid ""
  5456. "> **Important**: you can not import directly a list of feeds from a text "
  5457. "file.\n"
  5458. "> You need to convert it beforehand to _OPML_.\n"
  5459. "> Here is some tools you could use :\n"
  5460. ">\n"
  5461. "> * [Pandoc](https://pandoc.org/) available for most systems,\n"
  5462. "> * [OPML generator](https://opml-gen.ovh/) available online,\n"
  5463. "> * [txt2opml](https://alterfiles.com/convert/txt/opml) available online.\n"
  5464. msgstr ""
  5465. #. type: Title ##
  5466. #: en/./users/04_Subscriptions.md:123
  5467. #, markdown-text, no-wrap
  5468. msgid "Use bookmarklet"
  5469. msgstr ""
  5470. #. type: Plain text
  5471. #: en/./users/04_Subscriptions.md:126
  5472. #, markdown-text
  5473. msgid ""
  5474. "Bookmarklets are little scripts that you can execute to perform various "
  5475. "tasks. FreshRSS offers a bookmarklet for subscribing to newsfeeds."
  5476. msgstr ""
  5477. #. type: Bullet: '1. '
  5478. #: en/./users/04_Subscriptions.md:129
  5479. #, markdown-text
  5480. msgid "Open “Subscriptions management”."
  5481. msgstr ""
  5482. #. type: Bullet: '2. '
  5483. #: en/./users/04_Subscriptions.md:129
  5484. #, markdown-text
  5485. msgid "Click on “Subscription tools”."
  5486. msgstr ""
  5487. #. type: Bullet: '3. '
  5488. #: en/./users/04_Subscriptions.md:129
  5489. #, markdown-text
  5490. msgid ""
  5491. "Drag the “Subscribe” button to your bookmark toolbar or right click and "
  5492. "choose your browser’s “Bookmark link” action."
  5493. msgstr ""
  5494. #. type: Title #
  5495. #: en/./users/05_Configuration.md:2
  5496. #, markdown-text, no-wrap
  5497. msgid "Display"
  5498. msgstr ""
  5499. #. type: Title ##
  5500. #: en/./users/05_Configuration.md:4
  5501. #, markdown-text, no-wrap
  5502. msgid "Language"
  5503. msgstr ""
  5504. #. type: Plain text
  5505. #: en/./users/05_Configuration.md:9
  5506. #, markdown-text
  5507. msgid ""
  5508. "FreshRSS is currently available in 22 languages. After confirming your "
  5509. "choice, the interface will be displayed in your preferred language. "
  5510. "Depending on the language chosen, parts of the interface may not be not "
  5511. "translated yet. If you’re willing to help translate the missing bits or "
  5512. "would like to add a new language, please take a look at how you can "
  5513. "[contribute to the "
  5514. "project](../contributing.md#contribute-to-internationalization-i18n)."
  5515. msgstr ""
  5516. #. type: Plain text
  5517. #: en/./users/05_Configuration.md:11
  5518. #, markdown-text
  5519. msgid ""
  5520. "Some parts of FreshRSS are not translated and are not intended to be "
  5521. "translated either. For now, this includes the logs visible in the "
  5522. "application as well as the log generated by automatic update scripts."
  5523. msgstr ""
  5524. #. type: Plain text
  5525. #: en/./users/05_Configuration.md:13
  5526. #, markdown-text
  5527. msgid "Available languages are:"
  5528. msgstr ""
  5529. #. type: Plain text
  5530. #: en/./users/05_Configuration.md:38
  5531. #, markdown-text, no-wrap
  5532. msgid ""
  5533. "| Language (English name) | Language (Endonym) | Ordered by language code "
  5534. "(ISO-639-1) |\n"
  5535. "|:------------------------|:-----------------------|:-------------------------------------|\n"
  5536. "| Czech | Čeština | cz "
  5537. "|\n"
  5538. "| German | Deutsch | de "
  5539. "|\n"
  5540. "| Greek | Ελληνικά | el "
  5541. "|\n"
  5542. "| English | English | en "
  5543. "|\n"
  5544. "| English (United States) | English (United States) | en-us "
  5545. "|\n"
  5546. "| Spanish | Español | es "
  5547. "|\n"
  5548. "| French | Français | fr "
  5549. "|\n"
  5550. "| Hebrew | עברית | he "
  5551. "|\n"
  5552. "| Indonesian | Bahasa Indonesia | id "
  5553. "|\n"
  5554. "| Italian | Italiano | it "
  5555. "|\n"
  5556. "| Japanease | 日本語 | ja "
  5557. "|\n"
  5558. "| Korean | 한국어 | ko "
  5559. "|\n"
  5560. "| Latvian | Latviešu | lv "
  5561. "|\n"
  5562. "| Dutch | Nederlands | nl "
  5563. "|\n"
  5564. "| Occitan | Occitan | oc "
  5565. "|\n"
  5566. "| Polish | Polski | pl "
  5567. "|\n"
  5568. "| Brazilian Portuguese | Português (Brasil) | pt-br "
  5569. "|\n"
  5570. "| Russian | Русский | ru "
  5571. "|\n"
  5572. "| Slovak | Slovenčina | sk "
  5573. "|\n"
  5574. "| Turkish | Türkçe | tr "
  5575. "|\n"
  5576. "| Chinese (Simplified, People’s Republic of China) | 简体中文 | zh-cn "
  5577. "|\n"
  5578. "| Chinese (Traditional, Taiwan) | 正體中文 | zh-tw "
  5579. "|\n"
  5580. msgstr ""
  5581. #. type: Title ##
  5582. #: en/./users/05_Configuration.md:39
  5583. #, markdown-text, no-wrap
  5584. msgid "Theme"
  5585. msgstr ""
  5586. #. type: Plain text
  5587. #: en/./users/05_Configuration.md:42
  5588. #, markdown-text
  5589. msgid ""
  5590. "There’s no accounting for tastes, which is why FreshRSS offers 13 official "
  5591. "themes:"
  5592. msgstr ""
  5593. #. type: Plain text
  5594. #: en/./users/05_Configuration.md:58
  5595. #, markdown-text, no-wrap
  5596. msgid ""
  5597. "| Theme | designed by | Notes "
  5598. "|\n"
  5599. "|:--------------|:-------------------------------------------------------|:--------------------------------------------------------------|\n"
  5600. "| Alternative Dark | Ghost | |\n"
  5601. "| Ansum | Thomas Guesnon | |\n"
  5602. "| Blue Lagoon |Mister aiR | No longer supported. Will be removed with "
  5603. "FreshRSS V1.22.0 |\n"
  5604. "| Dark | AD | |\n"
  5605. "| Dark pink | Miicat_47 | |\n"
  5606. "| Flat design | Marien Fressinaud | |\n"
  5607. "| Mapco | Thomas Guesnon | |\n"
  5608. "| Nord theme | joelchrono12 | |\n"
  5609. "| Origine | Marien Fressinaud | (default theme) |\n"
  5610. "| Origine-compact | Kevin Papst | |\n"
  5611. "| Pafat | Plopoyop | |\n"
  5612. "| Screwdriver | Mister aiR | No longer supported. Will be removed with "
  5613. "FreshRSS V1.22.0 |\n"
  5614. "| Swage | Patrick Crandol | |\n"
  5615. msgstr ""
  5616. #. type: Plain text
  5617. #: en/./users/05_Configuration.md:60
  5618. #, markdown-text
  5619. msgid ""
  5620. "If you can’t find any themes you like, it’s always possible to [create your "
  5621. "own](../developers/04_Frontend/02_Design.md)."
  5622. msgstr ""
  5623. #. type: Plain text
  5624. #: en/./users/05_Configuration.md:62
  5625. #, markdown-text
  5626. msgid ""
  5627. "To select a theme, simply scroll through the themes and select one that "
  5628. "strikes your fancy. After confirmation, the theme will be applied to the "
  5629. "interface."
  5630. msgstr ""
  5631. #. type: Title ##
  5632. #: en/./users/05_Configuration.md:63
  5633. #, markdown-text, no-wrap
  5634. msgid "Content width"
  5635. msgstr ""
  5636. #. type: Plain text
  5637. #: en/./users/05_Configuration.md:66
  5638. #, markdown-text
  5639. msgid ""
  5640. "Some people prefer short lines of text, while others prefer to maximize the "
  5641. "available screen space. To satisfy the maximum number of people, it’s "
  5642. "possible to customize the width of the displayed content. There are four "
  5643. "settings available:"
  5644. msgstr ""
  5645. #. type: Bullet: '* '
  5646. #: en/./users/05_Configuration.md:71
  5647. #, markdown-text
  5648. msgid "**Fine** displays content up to a maximum width of 550 pixels"
  5649. msgstr ""
  5650. #. type: Bullet: '* '
  5651. #: en/./users/05_Configuration.md:71
  5652. #, markdown-text
  5653. msgid "**Medium** displays content up to a maximum width of 800 pixels"
  5654. msgstr ""
  5655. #. type: Bullet: '* '
  5656. #: en/./users/05_Configuration.md:71
  5657. #, markdown-text
  5658. msgid "**Large** displays content up to a maximum width of 1000 pixels"
  5659. msgstr ""
  5660. #. type: Bullet: '* '
  5661. #: en/./users/05_Configuration.md:71
  5662. #, markdown-text
  5663. msgid "**No limit** displays the content on 100% of the available space"
  5664. msgstr ""
  5665. #. type: Title ##
  5666. #: en/./users/05_Configuration.md:72
  5667. #, markdown-text, no-wrap
  5668. msgid "Article icons"
  5669. msgstr ""
  5670. #. type: Plain text
  5671. #: en/./users/05_Configuration.md:75
  5672. #, markdown-text
  5673. msgid "Please note that this section only affects normal view."
  5674. msgstr ""
  5675. #. type: Plain text
  5676. #: en/./users/05_Configuration.md:77
  5677. #, markdown-text
  5678. msgid "![Article icons configuration](../img/users/configuration.article.icons.png)"
  5679. msgstr ""
  5680. #. type: Plain text
  5681. #: en/./users/05_Configuration.md:80
  5682. #, markdown-text
  5683. msgid ""
  5684. "Each article is rendered with a header (top line) and a footer (bottom "
  5685. "line). In that section, you can choose what will be displayed in those."
  5686. msgstr ""
  5687. #. type: Plain text
  5688. #: en/./users/05_Configuration.md:84
  5689. #, markdown-text
  5690. msgid ""
  5691. "If you disable every item in the top line, you’ll still be able to see it "
  5692. "since it contains the feed name and the article title. But if you do the "
  5693. "same thing for the bottom line, it will be empty."
  5694. msgstr ""
  5695. #. type: Title ##
  5696. #: en/./users/05_Configuration.md:85
  5697. #, markdown-text, no-wrap
  5698. msgid "HTML5 notification timeout"
  5699. msgstr ""
  5700. #. type: Plain text
  5701. #: en/./users/05_Configuration.md:88
  5702. #, markdown-text
  5703. msgid ""
  5704. "After automatically updating the feeds, FreshRSS can pop up a notification "
  5705. "using the HTML5 notification API."
  5706. msgstr ""
  5707. #. type: Plain text
  5708. #: en/./users/05_Configuration.md:90
  5709. #, markdown-text
  5710. msgid "The duration of this notification can be set. By default, the value is 0."
  5711. msgstr ""
  5712. #. type: Title ##
  5713. #: en/./users/05_Configuration.md:91
  5714. #, markdown-text, no-wrap
  5715. msgid "Show the navigation button"
  5716. msgstr ""
  5717. #. type: Plain text
  5718. #: en/./users/05_Configuration.md:94
  5719. #, markdown-text
  5720. msgid ""
  5721. "By default, FreshRSS displays buttons to ease the article navigation when "
  5722. "browsing on mobile. The drawback is that they eat up some precious space."
  5723. msgstr ""
  5724. #. type: Plain text
  5725. #: en/./users/05_Configuration.md:96
  5726. #, markdown-text
  5727. msgid ""
  5728. "![navigation button "
  5729. "configuration](../img/users/configuration.navigation.button.png)"
  5730. msgstr ""
  5731. #. type: Plain text
  5732. #: en/./users/05_Configuration.md:98
  5733. #, markdown-text
  5734. msgid ""
  5735. "If you don’t use those buttons because you never browse on mobile or because "
  5736. "you browse with gestures, you can disable them from the interface."
  5737. msgstr ""
  5738. #. type: Title #
  5739. #: en/./users/05_Configuration.md:99
  5740. #, markdown-text, no-wrap
  5741. msgid "Reading"
  5742. msgstr ""
  5743. #. type: Title ##
  5744. #: en/./users/05_Configuration.md:101
  5745. #, markdown-text, no-wrap
  5746. msgid "Number of articles per page"
  5747. msgstr ""
  5748. #. type: Plain text
  5749. #: en/./users/05_Configuration.md:104
  5750. #, markdown-text
  5751. msgid ""
  5752. "This setting defines the number of articles to display at once before "
  5753. "needing to load more. In normal and reading view, more articles are loaded "
  5754. "automatically. In global view, a button will appear at the bottom of the "
  5755. "list."
  5756. msgstr ""
  5757. #. type: Title ##
  5758. #: en/./users/05_Configuration.md:105
  5759. #, markdown-text, no-wrap
  5760. msgid "Articles to display"
  5761. msgstr ""
  5762. #. type: Plain text
  5763. #: en/./users/05_Configuration.md:108
  5764. #, markdown-text
  5765. msgid ""
  5766. "The status of articles to display when loading FreshRSS. \"Adjust showing\" "
  5767. "will display only unread articles by default, but will display all articles "
  5768. "when there are no unread articles to show."
  5769. msgstr ""
  5770. #. type: Title ##
  5771. #: en/./users/05_Configuration.md:109
  5772. #, markdown-text, no-wrap
  5773. msgid "Use “lazy load” mode to load images"
  5774. msgstr ""
  5775. #. type: Plain text
  5776. #: en/./users/05_Configuration.md:112
  5777. #, markdown-text
  5778. msgid ""
  5779. "This will set images to load as they are viewed. This can save data, but "
  5780. "will can cause images to load in later."
  5781. msgstr ""
  5782. #. type: Plain text
  5783. #: en/./users/05_Configuration.md:118
  5784. #, markdown-text
  5785. msgid ""
  5786. "These are the global options for fetching and retaining articles from "
  5787. "feeds. They can be overridden by individual feed’s settings."
  5788. msgstr ""
  5789. #. type: Title ##
  5790. #: en/./users/05_Configuration.md:119
  5791. #, markdown-text, no-wrap
  5792. msgid "Maintenance"
  5793. msgstr ""
  5794. #. type: Plain text
  5795. #: en/./users/05_Configuration.md:122
  5796. #, markdown-text
  5797. msgid ""
  5798. "This allows for purging/optimizing the current user’s articles in the "
  5799. "database."
  5800. msgstr ""
  5801. #. type: Title #
  5802. #: en/./users/05_Configuration.md:123
  5803. #, markdown-text, no-wrap
  5804. msgid "Sharing"
  5805. msgstr ""
  5806. #. type: Plain text
  5807. #: en/./users/05_Configuration.md:126
  5808. #, markdown-text
  5809. msgid "To make your life easier, you can share articles straight from FreshRSS."
  5810. msgstr ""
  5811. #. type: Plain text
  5812. #: en/./users/05_Configuration.md:128
  5813. #, markdown-text
  5814. msgid ""
  5815. "At the moment, FreshRSS supports [20+ sharing "
  5816. "services](08_sharing_services.md), ranging from self-hosted services "
  5817. "(Shaarli, etc.) to proprietary services (Facebook, etc.)."
  5818. msgstr ""
  5819. #. type: Plain text
  5820. #: en/./users/05_Configuration.md:131
  5821. #, markdown-text
  5822. msgid ""
  5823. "By default, the sharing list is empty. ![Sharing "
  5824. "configuration](../img/users/configuration.sharing.png)"
  5825. msgstr ""
  5826. #. type: Plain text
  5827. #: en/./users/05_Configuration.md:133
  5828. #, markdown-text
  5829. msgid "To add a new item to the list, please follow the following simple steps:"
  5830. msgstr ""
  5831. #. type: Bullet: '1. '
  5832. #: en/./users/05_Configuration.md:138
  5833. #, markdown-text
  5834. msgid "Select the desired sharing method in the drop-down list."
  5835. msgstr ""
  5836. #. type: Bullet: '1. '
  5837. #: en/./users/05_Configuration.md:138
  5838. #, markdown-text
  5839. msgid "Press the ```✚``` button to add it to the list."
  5840. msgstr ""
  5841. #. type: Bullet: '1. '
  5842. #: en/./users/05_Configuration.md:138
  5843. #, markdown-text
  5844. msgid ""
  5845. "Configure the method in the list. All names can be modified in the "
  5846. "display. Some methods need the sharing URL to be able to work properly (ex: "
  5847. "Shaarli)."
  5848. msgstr ""
  5849. #. type: Bullet: '1. '
  5850. #: en/./users/05_Configuration.md:138 en/./users/05_Configuration.md:143
  5851. #, markdown-text
  5852. msgid "Submit your changes."
  5853. msgstr ""
  5854. #. type: Plain text
  5855. #: en/./users/05_Configuration.md:140
  5856. #, markdown-text
  5857. msgid "To remove an item from the list, follow those simple steps:"
  5858. msgstr ""
  5859. #. type: Bullet: '1. '
  5860. #: en/./users/05_Configuration.md:143
  5861. #, markdown-text
  5862. msgid "Press the ```❌``` button next to the share method you want to remove."
  5863. msgstr ""
  5864. #. type: Title #
  5865. #: en/./users/05_Configuration.md:145
  5866. #, markdown-text, no-wrap
  5867. msgid "Shortcuts"
  5868. msgstr ""
  5869. #. type: Plain text
  5870. #: en/./users/05_Configuration.md:149
  5871. #, markdown-text
  5872. msgid ""
  5873. "To ease the use of the application, FreshRSS comes with a lot of predefined "
  5874. "keyboard shortcuts. They allow actions to improve the user experience with "
  5875. "a keyboard."
  5876. msgstr ""
  5877. #. type: Plain text
  5878. #: en/./users/05_Configuration.md:151
  5879. #, markdown-text
  5880. msgid ""
  5881. "Of course, if you’re not satisfied with the key mapping, you can change you "
  5882. "configuration to fit your needs."
  5883. msgstr ""
  5884. #. type: Plain text
  5885. #: en/./users/05_Configuration.md:153
  5886. #, markdown-text
  5887. msgid "There are 4 types of shortcuts:"
  5888. msgstr ""
  5889. #. type: Bullet: '1. '
  5890. #: en/./users/05_Configuration.md:158
  5891. #, markdown-text
  5892. msgid "Views: they allow switching views with ease."
  5893. msgstr ""
  5894. #. type: Bullet: '1. '
  5895. #: en/./users/05_Configuration.md:158
  5896. #, markdown-text
  5897. msgid "Navigation: they allow navigation through articles, feeds, and categories."
  5898. msgstr ""
  5899. #. type: Bullet: '1. '
  5900. #: en/./users/05_Configuration.md:158
  5901. #, markdown-text
  5902. msgid ""
  5903. "Article actions: they allow interactions with an article, like sharing or "
  5904. "opening it on the original web-site."
  5905. msgstr ""
  5906. #. type: Bullet: '1. '
  5907. #: en/./users/05_Configuration.md:158
  5908. #, markdown-text
  5909. msgid ""
  5910. "Other actions: they allow other interactions with the application, like "
  5911. "opening the user queries menu or accessing the documentation."
  5912. msgstr ""
  5913. #. type: Plain text
  5914. #: en/./users/05_Configuration.md:161
  5915. #, markdown-text
  5916. msgid ""
  5917. "It’s worth noting that the share article action has two levels. Once you "
  5918. "press the shortcut, a menu containing all the share options opens. To "
  5919. "choose one share option, you need to select it by its number. When there is "
  5920. "only one option, it’s selected automatically though."
  5921. msgstr ""
  5922. #. type: Plain text
  5923. #: en/./users/05_Configuration.md:163
  5924. #, markdown-text
  5925. msgid "The same process applies to the user queries."
  5926. msgstr ""
  5927. #. type: Plain text
  5928. #: en/./users/05_Configuration.md:166
  5929. #, markdown-text
  5930. msgid ""
  5931. "Be aware that there is no validation on the selected shortcuts. This means "
  5932. "that if you assign a shortcut to more than one action, you’ll end up with "
  5933. "some unexpected behavior."
  5934. msgstr ""
  5935. #. type: Title #
  5936. #: en/./users/05_Configuration.md:167
  5937. #, markdown-text, no-wrap
  5938. msgid "User queries"
  5939. msgstr ""
  5940. #. type: Plain text
  5941. #: en/./users/05_Configuration.md:171
  5942. #, markdown-text
  5943. msgid ""
  5944. "You can configure your [user queries](./03_Main_view.md) in that "
  5945. "section. There is not much to say here as it is pretty straightforward. You "
  5946. "can only change user query titles or drop them."
  5947. msgstr ""
  5948. #. type: Plain text
  5949. #: en/./users/05_Configuration.md:173
  5950. #, markdown-text
  5951. msgid "At the moment, there is no helper to build a user query from here."
  5952. msgstr ""
  5953. #. type: Title #
  5954. #: en/./users/05_Configuration.md:174
  5955. #, markdown-text, no-wrap
  5956. msgid "Profile"
  5957. msgstr ""
  5958. #. type: Plain text
  5959. #: en/./users/05_Configuration.md:177
  5960. #, markdown-text
  5961. msgid ""
  5962. "You can change your email address or password here. The authentication token "
  5963. "is required for accessing the aggregated RSS feed for a user. A blank token "
  5964. "will disable accessing the RSS feed without being logged in."
  5965. msgstr ""
  5966. #. type: Plain text
  5967. #: en/./users/05_Configuration.md:181
  5968. #, markdown-text
  5969. msgid ""
  5970. "Extensions can be managed from this menu. Note that while extensions can be "
  5971. "removed from the web interface, they cannot be added from it."
  5972. msgstr ""
  5973. #. type: Title #
  5974. #: en/./users/05_Configuration.md:182
  5975. #, markdown-text, no-wrap
  5976. msgid "Users"
  5977. msgstr ""
  5978. #. type: Title ##
  5979. #: en/./users/05_Configuration.md:186
  5980. #, markdown-text, no-wrap
  5981. msgid "Authentication methods"
  5982. msgstr ""
  5983. #. type: Title ###
  5984. #: en/./users/05_Configuration.md:188
  5985. #, markdown-text, no-wrap
  5986. msgid "HTTP Authentication (Apache)"
  5987. msgstr ""
  5988. #. type: Bullet: '1. '
  5989. #: en/./users/05_Configuration.md:194
  5990. #, markdown-text
  5991. msgid "User control is based on the `.htaccess` file."
  5992. msgstr ""
  5993. #. type: Bullet: '2. '
  5994. #: en/./users/05_Configuration.md:194
  5995. #, markdown-text
  5996. msgid ""
  5997. "It is best practice to place the `.htaccess` file in the `./i/` subdirectory "
  5998. "so the API and other third party services can work."
  5999. msgstr ""
  6000. #. type: Bullet: '3. '
  6001. #: en/./users/05_Configuration.md:194
  6002. #, markdown-text
  6003. msgid ""
  6004. "If you want to limit all access to registered users only, place the file in "
  6005. "the FreshRSS directory itself or in a parent directory. Note that WebSub and "
  6006. "API will not work!"
  6007. msgstr ""
  6008. #. type: Bullet: '4. '
  6009. #: en/./users/05_Configuration.md:194
  6010. #, markdown-text
  6011. msgid "Example `.htaccess` file for a user \"marie\":"
  6012. msgstr ""
  6013. #. type: Fenced code block (apache)
  6014. #: en/./users/05_Configuration.md:195
  6015. #, no-wrap
  6016. msgid ""
  6017. "AuthUserFile /home/marie/repertoire/.htpasswd\n"
  6018. "AuthGroupFile /dev/null\n"
  6019. "AuthName \"Chez Marie\"\n"
  6020. "AuthType Basic\n"
  6021. "Require user marie\n"
  6022. msgstr ""
  6023. #. type: Plain text
  6024. #: en/./users/05_Configuration.md:204
  6025. #, markdown-text
  6026. msgid ""
  6027. "More information can be found in the [Apache "
  6028. "documentation](http://httpd.apache.org/docs/trunk/howto/auth.html#gettingitworking)."
  6029. msgstr ""
  6030. #. type: Plain text
  6031. #: en/./users/06_Mobile_access.md:2
  6032. #, markdown-text
  6033. msgid ""
  6034. "This page assumes you have completed the [server "
  6035. "setup](../admins/03_Installation.md)."
  6036. msgstr ""
  6037. #. type: Title #
  6038. #: en/./users/06_Mobile_access.md:3
  6039. #, markdown-text, no-wrap
  6040. msgid "Mobile Access"
  6041. msgstr ""
  6042. #. type: Plain text
  6043. #: en/./users/06_Mobile_access.md:6
  6044. #, markdown-text
  6045. msgid "You can access FreshRSS on mobile devices via browser and via mobile apps."
  6046. msgstr ""
  6047. #. type: Title ##
  6048. #: en/./users/06_Mobile_access.md:8
  6049. #, markdown-text, no-wrap
  6050. msgid "Access via Browser"
  6051. msgstr ""
  6052. #. type: Plain text
  6053. #: en/./users/06_Mobile_access.md:11
  6054. #, markdown-text
  6055. msgid ""
  6056. "The FreshRSS user interface is optimized for both small and large "
  6057. "screens. The content will fit nicely on small mobile device screens as well."
  6058. msgstr ""
  6059. #. type: Title ##
  6060. #: en/./users/06_Mobile_access.md:13
  6061. #, markdown-text, no-wrap
  6062. msgid "Access via Mobile App"
  6063. msgstr ""
  6064. #. type: Plain text
  6065. #: en/./users/06_Mobile_access.md:16
  6066. #, markdown-text
  6067. msgid ""
  6068. "FreshRSS supports access from mobile / native apps for Linux, Android, iOS, "
  6069. "Windows and macOS, via two distinct APIs: Google Reader API (best), and "
  6070. "Fever API (limited features and less efficient)."
  6071. msgstr ""
  6072. #. type: Plain text
  6073. #: en/./users/06_Mobile_access.md:18
  6074. #, markdown-text
  6075. msgid ""
  6076. "A list of known apps is available on the [FreshRSS GitHub "
  6077. "page](https://github.com/FreshRSS/FreshRSS#apis--native-apps)."
  6078. msgstr ""
  6079. #. type: Title ###
  6080. #: en/./users/06_Mobile_access.md:20
  6081. #, markdown-text, no-wrap
  6082. msgid "Enable the API in FreshRSS"
  6083. msgstr ""
  6084. #. type: Bullet: '1. '
  6085. #: en/./users/06_Mobile_access.md:26
  6086. #, markdown-text
  6087. msgid ""
  6088. "Under the section “Authentication”, enable the option “Allow API access "
  6089. "(required for mobile apps)”."
  6090. msgstr ""
  6091. #. type: Bullet: '2. '
  6092. #: en/./users/06_Mobile_access.md:26
  6093. #, markdown-text
  6094. msgid ""
  6095. "Under the section “Profile”, fill-in the field “API password (e.g., for "
  6096. "mobile apps)”."
  6097. msgstr ""
  6098. #. type: Bullet: ' * '
  6099. #: en/./users/06_Mobile_access.md:26
  6100. #, markdown-text
  6101. msgid "Every user must define an API password."
  6102. msgstr ""
  6103. #. type: Bullet: ' * '
  6104. #: en/./users/06_Mobile_access.md:26
  6105. #, markdown-text
  6106. msgid ""
  6107. "The reason for an API-specific password is that it may be used in less safe "
  6108. "situations than the main password, and does not grant access to as many "
  6109. "things."
  6110. msgstr ""
  6111. #. type: Plain text
  6112. #: en/./users/06_Mobile_access.md:29
  6113. #, markdown-text
  6114. msgid ""
  6115. "See the [page about the Google Reader compatible "
  6116. "API](../developers/06_GoogleReader_API.md) for more details. See the [page "
  6117. "about the Fever compatible API](../developers/06_Fever_API.md) for more "
  6118. "details."
  6119. msgstr ""
  6120. #. type: Title ###
  6121. #: en/./users/06_Mobile_access.md:31
  6122. #, markdown-text, no-wrap
  6123. msgid "Testing"
  6124. msgstr ""
  6125. #. type: Bullet: '1. '
  6126. #: en/./users/06_Mobile_access.md:38
  6127. #, markdown-text
  6128. msgid ""
  6129. "Under the section “Profile”, click on the link like "
  6130. "`https://rss.example.net/api/` next to the field “API password”."
  6131. msgstr ""
  6132. #. type: Bullet: '2. '
  6133. #: en/./users/06_Mobile_access.md:38
  6134. #, markdown-text
  6135. msgid "Click on first link “Check full server configuration”:"
  6136. msgstr ""
  6137. #. type: Bullet: ' * '
  6138. #: en/./users/06_Mobile_access.md:38
  6139. #, markdown-text
  6140. msgid "If you get *PASS* then you are done; all is well."
  6141. msgstr ""
  6142. #. type: Bullet: ' * '
  6143. #: en/./users/06_Mobile_access.md:38
  6144. #, markdown-text
  6145. msgid ""
  6146. "If you get *Bad Request!* or *Not Found*, then your server probably does not "
  6147. "accept slashes `/` that are escaped `%2F`, see the next section \"Fix server "
  6148. "configuration\"."
  6149. msgstr ""
  6150. #. type: Bullet: ' * '
  6151. #: en/./users/06_Mobile_access.md:38
  6152. #, markdown-text
  6153. msgid ""
  6154. "If you receive any other error message, see the next section “Fix server "
  6155. "configuration”."
  6156. msgstr ""
  6157. #. type: Title ###
  6158. #: en/./users/06_Mobile_access.md:39
  6159. #, markdown-text, no-wrap
  6160. msgid "Fix server configuration"
  6161. msgstr ""
  6162. #. type: Bullet: '* '
  6163. #: en/./users/06_Mobile_access.md:57
  6164. #, markdown-text
  6165. msgid ""
  6166. "Click on the second link “Check partial server configuration (without `%2F` "
  6167. "support)”:"
  6168. msgstr ""
  6169. #. type: Bullet: ' * '
  6170. #: en/./users/06_Mobile_access.md:57
  6171. #, markdown-text
  6172. msgid ""
  6173. "If you get `PASS`, then the problem is indeed that your server does not "
  6174. "accept slashes `/` that are escaped `%2F`."
  6175. msgstr ""
  6176. #. type: Bullet: ' * '
  6177. #: en/./users/06_Mobile_access.md:57
  6178. #, markdown-text
  6179. msgid ""
  6180. "With Apache, remember the directive [`AllowEncodedSlashes "
  6181. "On`](http://httpd.apache.org/docs/trunk/mod/core.html#allowencodedslashes)"
  6182. msgstr ""
  6183. #. type: Bullet: ' * '
  6184. #: en/./users/06_Mobile_access.md:57
  6185. #, markdown-text
  6186. msgid ""
  6187. "Or use a client that does not escape slashes (such as EasyRSS) ([`check "
  6188. "client list`](https://github.com/FreshRSS/FreshRSS#apis--native-apps))."
  6189. msgstr ""
  6190. #. type: Bullet: ' * '
  6191. #: en/./users/06_Mobile_access.md:57
  6192. #, markdown-text
  6193. msgid ""
  6194. "If you get *Service Unavailable!*, then check the preceding section “Enable "
  6195. "the API in FreshRSS” again."
  6196. msgstr ""
  6197. #. type: Bullet: ' * '
  6198. #: en/./users/06_Mobile_access.md:57
  6199. #, markdown-text
  6200. msgid "With __Apache__:"
  6201. msgstr ""
  6202. #. type: Bullet: ' * '
  6203. #: en/./users/06_Mobile_access.md:57
  6204. #, markdown-text
  6205. msgid ""
  6206. "If you get *FAIL getallheaders!*, the combination of your PHP version and "
  6207. "your Web server does not provide access to "
  6208. "[`getallheaders`](http://php.net/getallheaders)"
  6209. msgstr ""
  6210. #. type: Bullet: ' * '
  6211. #: en/./users/06_Mobile_access.md:57
  6212. #, markdown-text
  6213. msgid ""
  6214. "Turn on Apache `mod_setenvif` (often enabled by default), or `mod_rewrite` "
  6215. "with the following procedure:"
  6216. msgstr ""
  6217. #. type: Bullet: ' * '
  6218. #: en/./users/06_Mobile_access.md:57
  6219. #, markdown-text
  6220. msgid ""
  6221. "Allow [`FileInfo` in "
  6222. "`.htaccess`](http://httpd.apache.org/docs/trunk/mod/core.html#allowoverride): "
  6223. "see the [server setup](../admins/03_Installation.md) again."
  6224. msgstr ""
  6225. #. type: Bullet: ' * '
  6226. #: en/./users/06_Mobile_access.md:57
  6227. #, markdown-text
  6228. msgid ""
  6229. "Enable "
  6230. "[`mod_rewrite`](http://httpd.apache.org/docs/trunk/mod/mod_rewrite.html):"
  6231. msgstr ""
  6232. #. type: Bullet: ' * '
  6233. #: en/./users/06_Mobile_access.md:57
  6234. #, markdown-text
  6235. msgid "With Debian / Ubuntu: `sudo a2enmod rewrite`"
  6236. msgstr ""
  6237. #. type: Bullet: ' * '
  6238. #: en/./users/06_Mobile_access.md:57
  6239. #, markdown-text
  6240. msgid "With __nginx__:"
  6241. msgstr ""
  6242. #. type: Bullet: ' * '
  6243. #: en/./users/06_Mobile_access.md:57
  6244. #, markdown-text
  6245. msgid "If you get *Bad Request!*, check your server `PATH_INFO` configuration."
  6246. msgstr ""
  6247. #. type: Bullet: ' * '
  6248. #: en/./users/06_Mobile_access.md:57
  6249. #, markdown-text
  6250. msgid "If you get *File not found!*, check your server `fastcgi_split_path_info`."
  6251. msgstr ""
  6252. #. type: Bullet: ' * '
  6253. #: en/./users/06_Mobile_access.md:57
  6254. #, markdown-text
  6255. msgid ""
  6256. "If you get *FAIL 64-bit or GMP extension!*, then your PHP version does not "
  6257. "pass the requirement of being 64-bit and/or have PHP "
  6258. "[GMP](http://php.net/gmp) extension."
  6259. msgstr ""
  6260. #. type: Bullet: ' * '
  6261. #: en/./users/06_Mobile_access.md:57
  6262. #, markdown-text
  6263. msgid ""
  6264. "The easiest is to add the GMP extension. On Debian / Ubuntu: `sudo apt "
  6265. "install php-gmp`"
  6266. msgstr ""
  6267. #. type: Bullet: ' * '
  6268. #: en/./users/06_Mobile_access.md:57
  6269. #, markdown-text
  6270. msgid "Update and try again from the preceding section “Testing”."
  6271. msgstr ""
  6272. #. type: Plain text
  6273. #: en/./users/07_Frequently_Asked_Questions.md:2
  6274. #, markdown-text
  6275. msgid ""
  6276. "We may not have answered all of your questions in the previous sections. The "
  6277. "FAQ contains some questions that have not been answered elsewhere."
  6278. msgstr ""
  6279. #. type: Title ##
  6280. #: en/./users/07_Frequently_Asked_Questions.md:3
  6281. #, markdown-text, no-wrap
  6282. msgid "What is `/i` at the end of the application URL?"
  6283. msgstr ""
  6284. #. type: Plain text
  6285. #: en/./users/07_Frequently_Asked_Questions.md:6
  6286. #, markdown-text
  6287. msgid "Of course, ```/i``` has a purpose! It’s used for performance and usability:"
  6288. msgstr ""
  6289. #. type: Bullet: '* '
  6290. #: en/./users/07_Frequently_Asked_Questions.md:11
  6291. #, markdown-text
  6292. msgid ""
  6293. "It allows for serving icons, images, styles and scripts without "
  6294. "cookies. Without that trick, those files would be downloaded more often, "
  6295. "especially when form authentication is used. Also, HTTP requests would be "
  6296. "heavier."
  6297. msgstr ""
  6298. #. type: Bullet: '* '
  6299. #: en/./users/07_Frequently_Asked_Questions.md:11
  6300. #, markdown-text
  6301. msgid ""
  6302. "The ```./p/``` public root can be served without any HTTP access "
  6303. "restrictions. Whereas it could be implemented in ```./p/i/```."
  6304. msgstr ""
  6305. #. type: Bullet: '* '
  6306. #: en/./users/07_Frequently_Asked_Questions.md:11
  6307. #, markdown-text
  6308. msgid ""
  6309. "It avoids problems while serving public resources like ```favicon.ico```, "
  6310. "```robots.txt```, etc."
  6311. msgstr ""
  6312. #. type: Bullet: '* '
  6313. #: en/./users/07_Frequently_Asked_Questions.md:11
  6314. #, markdown-text
  6315. msgid ""
  6316. "It allows the logo to be displayed instead of a white page while hitting a "
  6317. "restriction or a delay during the loading process."
  6318. msgstr ""
  6319. #. type: Title ##
  6320. #: en/./users/07_Frequently_Asked_Questions.md:12
  6321. #, markdown-text, no-wrap
  6322. msgid "Why is `robots.txt` located in a sub-folder?"
  6323. msgstr ""
  6324. #. type: Plain text
  6325. #: en/./users/07_Frequently_Asked_Questions.md:15
  6326. #, markdown-text
  6327. msgid ""
  6328. "To increase security, FreshRSS is hosted in two sections. The first section "
  6329. "is public (the `./p` folder) and the second section is private (everything "
  6330. "else). Therefore the `robots.txt` file is located in the `./p` sub-folder."
  6331. msgstr ""
  6332. #. type: Plain text
  6333. #: en/./users/07_Frequently_Asked_Questions.md:18
  6334. #, markdown-text
  6335. msgid ""
  6336. "As explained in the [security section](../admins/09_AccessControl.html), "
  6337. "it’s highly recommended to make only the public section available at the "
  6338. "domain level. With that configuration, `./p` is the root folder for "
  6339. "<https://demo.freshrss.org/>, thus making `robots.txt` available at the root "
  6340. "of the application."
  6341. msgstr ""
  6342. #. type: Plain text
  6343. #: en/./users/07_Frequently_Asked_Questions.md:20
  6344. #, markdown-text
  6345. msgid "The same principle applies to `favicon.ico` and `.htaccess`."
  6346. msgstr ""
  6347. #. type: Title ##
  6348. #: en/./users/07_Frequently_Asked_Questions.md:21
  6349. #, markdown-text, no-wrap
  6350. msgid "Why do I have errors while registering a feed?"
  6351. msgstr ""
  6352. #. type: Plain text
  6353. #: en/./users/07_Frequently_Asked_Questions.md:27
  6354. #, markdown-text
  6355. msgid ""
  6356. "There can be different origins for that problem. The feed syntax can be "
  6357. "invalid, it can be unrecognized by the SimplePie library, the hosting server "
  6358. "can be the root of the problem, or FreshRSS can be buggy. The first step is "
  6359. "to identify what causes the problem. Here are the steps to follow:"
  6360. msgstr ""
  6361. #. type: Bullet: '1. '
  6362. #: en/./users/07_Frequently_Asked_Questions.md:31
  6363. #, markdown-text
  6364. msgid ""
  6365. "__Verify if the feed syntax is valid__ with the [W3C on-line "
  6366. "tool](https://validator.w3.org/feed/ \"RSS and Atom feed validator\"). If "
  6367. "it’s not valid, there’s nothing we can do."
  6368. msgstr ""
  6369. #. type: Bullet: '1. '
  6370. #: en/./users/07_Frequently_Asked_Questions.md:31
  6371. #, markdown-text
  6372. msgid ""
  6373. "__Verify SimplePie validation__ with the [SimplePie on-line "
  6374. "tool](https://simplepie.org/demo/ \"SimplePie official demo\"). If it’s not "
  6375. "recognized, there’s nothing we can do."
  6376. msgstr ""
  6377. #. type: Bullet: '1. '
  6378. #: en/./users/07_Frequently_Asked_Questions.md:31
  6379. #, markdown-text
  6380. msgid ""
  6381. "__Verify FreshRSS integration__ with the [demo](https://demo.freshrss.org "
  6382. "\"FreshRSS official demo\"). If it’s not working, you need to [create an "
  6383. "issue on Github](https://github.com/FreshRSS/FreshRSS/issues/new \"Create an "
  6384. "issue for FreshRSS\") so we can have a look at it. If it’s working, there’s "
  6385. "probably something fishy with the hosting server."
  6386. msgstr ""
  6387. #. type: Title ##
  6388. #: en/./users/07_Frequently_Asked_Questions.md:32
  6389. #, markdown-text, no-wrap
  6390. msgid "How can you change a forgotten password?"
  6391. msgstr ""
  6392. #. type: Plain text
  6393. #: en/./users/07_Frequently_Asked_Questions.md:36
  6394. #, markdown-text
  6395. msgid ""
  6396. "Since the [1.10.0](https://github.com/FreshRSS/FreshRSS/releases/tag/1.10.0) "
  6397. "release, admins can change user passwords directly from the interface. This "
  6398. "interface is available under ```Administration → Manage users```. Select a "
  6399. "user, enter a password, and validate."
  6400. msgstr ""
  6401. #. type: Plain text
  6402. #: en/./users/07_Frequently_Asked_Questions.md:38
  6403. #, markdown-text
  6404. msgid ""
  6405. "Since the [1.8.0](https://github.com/FreshRSS/FreshRSS/releases/tag/1.8.0) "
  6406. "release, admins can change user passwords using a terminal. It worth "
  6407. "mentioning that you must have access to PHP CLI. Open a terminal, and type "
  6408. "the following command:"
  6409. msgstr ""
  6410. #. type: Fenced code block (sh)
  6411. #: en/./users/07_Frequently_Asked_Questions.md:39
  6412. #, no-wrap
  6413. msgid "./cli/update_user.php --user <username> --password <password>\n"
  6414. msgstr ""
  6415. #. type: Plain text
  6416. #: en/./users/07_Frequently_Asked_Questions.md:44
  6417. #, markdown-text
  6418. msgid ""
  6419. "For more information on that matter, please refer to the [dedicated "
  6420. "documentation](https://github.com/FreshRSS/FreshRSS/blob/edge/cli/README.md)."
  6421. msgstr ""
  6422. #. type: Title ##
  6423. #: en/./users/07_Frequently_Asked_Questions.md:45
  6424. #, markdown-text, no-wrap
  6425. msgid "Permissions under SELinux"
  6426. msgstr ""
  6427. #. type: Plain text
  6428. #: en/./users/07_Frequently_Asked_Questions.md:48
  6429. #, markdown-text
  6430. msgid ""
  6431. "Some Linux distribution, like Fedora or RedHat Enterprise Linux, have "
  6432. "SELinux enabled. This acts similar to a firewall application, so that "
  6433. "applications can’t write or modify files under certain conditions. While "
  6434. "installing FreshRSS, step 2 can fail if the httpd process can’t write to "
  6435. "some data sub-directories. The following command should be executed as root "
  6436. "to fix this problem:"
  6437. msgstr ""
  6438. #. type: Fenced code block (sh)
  6439. #: en/./users/07_Frequently_Asked_Questions.md:49
  6440. #, no-wrap
  6441. msgid ""
  6442. "semanage fcontext -a -t httpd_sys_rw_content_t "
  6443. "'/usr/share/FreshRSS/data(/.*)?'\n"
  6444. "restorecon -Rv /usr/share/FreshRSS/data\n"
  6445. msgstr ""
  6446. #. type: Title ##
  6447. #: en/./users/07_Frequently_Asked_Questions.md:54
  6448. #, markdown-text, no-wrap
  6449. msgid "Why do I have a blank page while trying to configure the sharing options?"
  6450. msgstr ""
  6451. #. type: Plain text
  6452. #: en/./users/07_Frequently_Asked_Questions.md:57
  6453. #, markdown-text
  6454. msgid ""
  6455. "The `sharing` word in the URL is a trigger word for some ad-blocker "
  6456. "rules. Starting with version 1.16, `sharing` has been replaced by "
  6457. "`integration` in the faulty URL while keeping the exact same wording "
  6458. "throughout the application."
  6459. msgstr ""
  6460. #. type: Plain text
  6461. #: en/./users/07_Frequently_Asked_Questions.md:59
  6462. #, markdown-text
  6463. msgid ""
  6464. "If you are using a version prior to 1.16, you can disable your ad-blocker "
  6465. "for FreshRSS or you can add a rule to allow the `sharing` page to be "
  6466. "accessed."
  6467. msgstr ""
  6468. #. type: Plain text
  6469. #: en/./users/07_Frequently_Asked_Questions.md:61
  6470. #, markdown-text
  6471. msgid "Examples with _uBlock_:"
  6472. msgstr ""
  6473. #. type: Bullet: '* '
  6474. #: en/./users/07_Frequently_Asked_Questions.md:64
  6475. #, markdown-text
  6476. msgid ""
  6477. "Whitelist your FreshRSS instance by adding it in _uBlock > Open the "
  6478. "dashboard > Whitelist_."
  6479. msgstr ""
  6480. #. type: Bullet: '* '
  6481. #: en/./users/07_Frequently_Asked_Questions.md:64
  6482. #, markdown-text
  6483. msgid ""
  6484. "Authorize your FreshRSS instance to call `sharing` configuration page by "
  6485. "adding the rule `*sharing,domain=~yourdomain.com` in _uBlock > Open the "
  6486. "dashboard > My filters_"
  6487. msgstr ""
  6488. #. type: Title ##
  6489. #: en/./users/07_Frequently_Asked_Questions.md:65
  6490. #, markdown-text, no-wrap
  6491. msgid "Problems with firewalls"
  6492. msgstr ""
  6493. #. type: Plain text
  6494. #: en/./users/07_Frequently_Asked_Questions.md:68
  6495. #, markdown-text
  6496. msgid ""
  6497. "If you have the error \"Blast! This feed has encountered a problem. Please "
  6498. "verify that it is always reachable then update it.\", it might be because of "
  6499. "a firewall misconfiguration."
  6500. msgstr ""
  6501. #. type: Plain text
  6502. #: en/./users/07_Frequently_Asked_Questions.md:70
  6503. #, markdown-text
  6504. msgid "To identify the problem, here are the steps to follow:"
  6505. msgstr ""
  6506. #. type: Bullet: '* '
  6507. #: en/./users/07_Frequently_Asked_Questions.md:73
  6508. #, markdown-text
  6509. msgid ""
  6510. "step 1: Try to reach the feed locally to discard a problem with the feed "
  6511. "itself. You can use your browser to this purpose."
  6512. msgstr ""
  6513. #. type: Bullet: '* '
  6514. #: en/./users/07_Frequently_Asked_Questions.md:73
  6515. #, markdown-text
  6516. msgid ""
  6517. "step 2: Try to reach the feed from the host in which FreshRSS is "
  6518. "installed. Something like `time curl -v "
  6519. "'https://github.com/FreshRSS/FreshRSS/commits/edge.atom'` should make the "
  6520. "deal. If you are running FreshRSS within a Docker container, then you can "
  6521. "check connectivity from within the container itself with something similar "
  6522. "to `sudo docker exec freshrss php -r "
  6523. "\"readfile('https://github.com/FreshRSS/FreshRSS/commits/edge.atom');\"`. If "
  6524. "none of this works, then it might be a problem with your firewall."
  6525. msgstr ""
  6526. #. type: Plain text
  6527. #: en/./users/07_Frequently_Asked_Questions.md:75
  6528. #, markdown-text
  6529. msgid ""
  6530. "Then to fix it, you need to do check your firewall configuration and ensure "
  6531. "that you are not blocking connections to IPs and/or ports in which your "
  6532. "feeds are located. If using iptables and you are blocking inbound "
  6533. "connections to ports 80/443, check that the rules are properly configured "
  6534. "and you are not also blocking outbound connections to the very same ports."
  6535. msgstr ""
  6536. #. type: Plain text
  6537. #: en/./users/07_Frequently_Asked_Questions.md:76
  6538. #, markdown-text
  6539. msgid ""
  6540. "For example, when using the firewall provided by Synology, you can block "
  6541. "traffic for certain applications (i.e., ports). One could think that these "
  6542. "rules would be applied only to incoming connections but specifying * for the "
  6543. "originating host of the requests will also include your local networks. To "
  6544. "deal with this issue, you will have to add exceptions for your local "
  6545. "networks to be able to access those ports with a higher priority than the "
  6546. "one blocking incoming connections. This could be similar for other frontends "
  6547. "to iptables. Please check the following discussion about a [similar "
  6548. "issue](https://www.reddit.com/r/synology/comments/8fo2sj/ds918_firewall_blocking_outgoing_traffic_from/)."
  6549. msgstr ""
  6550. #. type: Title #
  6551. #: en/./users/08_sharing_services.md:1
  6552. #, markdown-text, no-wrap
  6553. msgid "Sharing Services"
  6554. msgstr ""
  6555. #. type: Plain text
  6556. #: en/./users/08_sharing_services.md:4
  6557. #, markdown-text
  6558. msgid "FreshRSS has the option to share links with a bunch of services."
  6559. msgstr ""
  6560. #. type: Title ##
  6561. #: en/./users/08_sharing_services.md:5
  6562. #, markdown-text, no-wrap
  6563. msgid "Available Services: Simple Sharing"
  6564. msgstr ""
  6565. #. type: Plain text
  6566. #: en/./users/08_sharing_services.md:12
  6567. #, markdown-text, no-wrap
  6568. msgid ""
  6569. "| Service | Short description | "
  6570. "Notes |\n"
  6571. "|:--------------|:-------------------------------------------------------|:--------------------------------------------------------------|\n"
  6572. "| Clipboard | Copy article link into the operation system clipboard | "
  6573. "|\n"
  6574. "| Email | Open the email app to send the article link | "
  6575. "|\n"
  6576. "| Print | Open browser’s print dialog to print out the article | "
  6577. "|\n"
  6578. msgstr ""
  6579. #. type: Title ##
  6580. #: en/./users/08_sharing_services.md:13
  6581. #, markdown-text, no-wrap
  6582. msgid "Available Services: Hosted Services"
  6583. msgstr ""
  6584. #. type: Plain text
  6585. #: en/./users/08_sharing_services.md:39
  6586. #, markdown-text, no-wrap
  6587. msgid ""
  6588. "| Service | Short description | "
  6589. "Links | Notes "
  6590. "|\n"
  6591. "|:------------------|:-----------------------------------------------------|:-------------------------------------------------|:--------------------------------------------------------------|\n"
  6592. "| Blogotext | A little more than a lightweight SQLite Blog-Engine. | "
  6593. "[GitHub](https://github.com/BlogoText/blogotext) | Deprecated since FreshRSS "
  6594. "V1.20.0 (2022). Will be deleted in 2023 (scheduled to FreshRSS V1.22.0) |\n"
  6595. "| Buffer | Buffer.com is a social media management platform for "
  6596. "scheduling, publishing, and analyzing content. | "
  6597. "[Website](https://buffer.com) ||\n"
  6598. "| Diaspora* | The online social world where you are in control | "
  6599. "[Website](https://diasporafoundation.org/), "
  6600. "[Wikipedia](https://en.wikipedia.org/wiki/Diaspora_(social_network)) | |\n"
  6601. "| Facebook | Worldwide social network (by Meta Platforms) | "
  6602. "[Website](https://facebook.com), "
  6603. "[Wikipedia](https://en.wikipedia.org/wiki/Facebook)\n"
  6604. "| GNU social | Social communication software for both public and "
  6605. "private communications | [Website](https://gnu.io/social/) | |\n"
  6606. "| Journal du hacker | Le Journal du hacker s'inspire directement du site "
  6607. "anglophone Hacker News | [Website](https://www.journalduhacker.net/) |\n"
  6608. "| Known based sites | Its robust open source framework can be used to build "
  6609. "fully-fledged community sites, or a blog for a single user. | "
  6610. "[Website](https://withknown.com/) | |\n"
  6611. "| Lemmy | Selfhosted social link aggregation and discussion "
  6612. "platform | [Website](https://join-lemmy.org/) | |\n"
  6613. "| Linkding | Selfhosted bookmark service | "
  6614. "[Website](https://github.com/sissbruecker/linkding) | |\n"
  6615. "| LinkedIn | Business and employment-oriented online service | "
  6616. "[Website](https://www.linkedin.com/), "
  6617. "[Wikipedia](https://en.wikipedia.org/wiki/LinkedIn)| |\n"
  6618. "| Mastodon | Self-hosted social networking & microblogging services "
  6619. "| [Website](https://joinmastodon.org/), "
  6620. "[Wikipedia](https://en.wikipedia.org/wiki/Mastodon_(software)) | |\n"
  6621. "| Movim | A powerful web frontend for XMPP | "
  6622. "[Website](https://movim.eu/) | |\n"
  6623. "| Pinboard | Social Bookmarking for Introverts | "
  6624. "[Website](https://pinboard.in/) | |\n"
  6625. "| Pinterest | Is an image sharing and social media service designed "
  6626. "to enable saving and discovery of information| "
  6627. "[Website](https://pinterest.com/), "
  6628. "[Wikipedia](https://en.wikipedia.org/wiki/Pinterest) | |\n"
  6629. "| Pocket | Social bookmarking (previous \"Read it Later\", owned "
  6630. "by Mozilla) | [Website](https://getpocket.com), "
  6631. "[Wikipedia](https://en.wikipedia.org/wiki/Pocket_(service)) | |\n"
  6632. "| Raindrop.io | All-in-one bookmark manager | "
  6633. "[Website](https://raindrop.io/)| |\n"
  6634. "| Reddit | A network of communities where people can dive into "
  6635. "their interests, hobbies and passions| [Website](https://www.reddit.com/), "
  6636. "[Wikipedia](https://en.wikipedia.org/wiki/Reddit)| |\n"
  6637. "| Shaarli | Self-hosted minimalist bookmark manager and link "
  6638. "sharing service | [Website](https://shaarli.readthedocs.io/) | |\n"
  6639. "| Twitter | Microblogging social network | "
  6640. "[Website](https://twitter.com), "
  6641. "[Wikipedia](https://de.wikipedia.org/wiki/Twitter) | |\n"
  6642. "| wallabag | Save and classify articles. Read them later. Freely | "
  6643. "[Website](https://www.wallabag.org) | Compatible to version 1 and 2\n"
  6644. "| Whatsapp | Instant messaging and voice-over-IP service owned by "
  6645. "Meta Platforms| [Website](https://www.whatsapp.com), "
  6646. "[Wikipedia](https://en.wikipedia.org/wiki/WhatsApp) | |\n"
  6647. "| XING | Career-oriented social networking site, operated by "
  6648. "New Work SE | [Website](https://www.xing.com/), "
  6649. "[Wikipedia](https://en.wikipedia.org/wiki/XING) | |\n"
  6650. msgstr ""
  6651. #. type: Title ##
  6652. #: en/./users/08_sharing_services.md:40
  6653. #, markdown-text, no-wrap
  6654. msgid "Configuration"
  6655. msgstr ""
  6656. #. type: Plain text
  6657. #: en/./users/08_sharing_services.md:43
  6658. #, markdown-text
  6659. msgid ""
  6660. "Select the needed sharing services in the configuration menu (Configuration "
  6661. "/ Sharing)."
  6662. msgstr ""
  6663. #. type: Title ##
  6664. #: en/./users/08_sharing_services.md:44
  6665. #, markdown-text, no-wrap
  6666. msgid "Usage"
  6667. msgstr ""
  6668. #. type: Plain text
  6669. #: en/./users/08_sharing_services.md:47
  6670. #, markdown-text
  6671. msgid ""
  6672. "Activate the sharing menu in configuration menu (Configuration / "
  6673. "Display). It is only available for the bottom line."
  6674. msgstr ""
  6675. #. type: Plain text
  6676. #: en/./users/08_sharing_services.md:49
  6677. #, markdown-text
  6678. msgid "The menu with the selected services is available in the footer of article."
  6679. msgstr ""
  6680. #. type: Title ##
  6681. #: en/./users/08_sharing_services.md:50
  6682. #, markdown-text, no-wrap
  6683. msgid "Add More Sharing Services"
  6684. msgstr ""
  6685. #. type: Plain text
  6686. #: en/./users/08_sharing_services.md:52
  6687. #, markdown-text
  6688. msgid ""
  6689. "Please open a new issue on "
  6690. "[GitHub](https://github.com/FreshRSS/FreshRSS/issues) and support us with "
  6691. "information."
  6692. msgstr ""
  6693. #. type: Title #
  6694. #: en/./users/09_refreshing_feeds.md:1
  6695. #, markdown-text, no-wrap
  6696. msgid "Refreshing feeds"
  6697. msgstr ""
  6698. #. type: Plain text
  6699. #: en/./users/09_refreshing_feeds.md:4
  6700. #, markdown-text
  6701. msgid ""
  6702. "To take full advantage of FreshRSS, it needs to retrieve new items from the "
  6703. "feeds you have subscribed to. There are several ways to do this:"
  6704. msgstr ""
  6705. #. type: Bullet: '- '
  6706. #: en/./users/09_refreshing_feeds.md:17
  6707. #, markdown-text
  6708. msgid "[Manual update](#manual-update)"
  6709. msgstr ""
  6710. #. type: Bullet: ' - '
  6711. #: en/./users/09_refreshing_feeds.md:17
  6712. #, markdown-text
  6713. msgid "[Complete update](#complete-update)"
  6714. msgstr ""
  6715. #. type: Bullet: ' - '
  6716. #: en/./users/09_refreshing_feeds.md:17
  6717. #, markdown-text
  6718. msgid "[Partial update](#partial-update)"
  6719. msgstr ""
  6720. #. type: Bullet: '- '
  6721. #: en/./users/09_refreshing_feeds.md:17
  6722. #, markdown-text
  6723. msgid "[Automatic update with cron](#automatic-update-with-cron)"
  6724. msgstr ""
  6725. #. type: Bullet: '- '
  6726. #: en/./users/09_refreshing_feeds.md:17
  6727. #, markdown-text
  6728. msgid "[Online cron](#online-cron)"
  6729. msgstr ""
  6730. #. type: Bullet: ' - '
  6731. #: en/./users/09_refreshing_feeds.md:17
  6732. #, markdown-text
  6733. msgid "[For Form Authentication](#for-form-authentication)"
  6734. msgstr ""
  6735. #. type: Bullet: ' - '
  6736. #: en/./users/09_refreshing_feeds.md:17
  6737. #, markdown-text
  6738. msgid "[For HTTP authentication](#for-http-authentication)"
  6739. msgstr ""
  6740. #. type: Bullet: ' - '
  6741. #: en/./users/09_refreshing_feeds.md:17
  6742. #, markdown-text
  6743. msgid "[For No authentication None](#for-no-authentication-none)"
  6744. msgstr ""
  6745. #. type: Bullet: '- '
  6746. #: en/./users/09_refreshing_feeds.md:17
  6747. #, markdown-text
  6748. msgid ""
  6749. "[Feed configuration of “Do not automatically refresh more often "
  6750. "than”](#feed-configuration-of-do-not-automatically-refresh-more-often-than)"
  6751. msgstr ""
  6752. #. type: Bullet: ' - '
  6753. #: en/./users/09_refreshing_feeds.md:17
  6754. #, markdown-text
  6755. msgid "[Background](#background)"
  6756. msgstr ""
  6757. #. type: Bullet: ' - '
  6758. #: en/./users/09_refreshing_feeds.md:17
  6759. #, markdown-text
  6760. msgid "[Default value](#default-value)"
  6761. msgstr ""
  6762. #. type: Bullet: ' - '
  6763. #: en/./users/09_refreshing_feeds.md:17
  6764. #, markdown-text
  6765. msgid "[Individual feed configuration](#individual-feed-configuration)"
  6766. msgstr ""
  6767. #. type: Title ##
  6768. #: en/./users/09_refreshing_feeds.md:18
  6769. #, markdown-text, no-wrap
  6770. msgid "Manual update"
  6771. msgstr ""
  6772. #. type: Plain text
  6773. #: en/./users/09_refreshing_feeds.md:21
  6774. #, markdown-text
  6775. msgid ""
  6776. "If you can’t or don’t want to use the automatic method, you can update "
  6777. "manually. There are two methods for updating all or some of the feeds."
  6778. msgstr ""
  6779. #. type: Title ###
  6780. #: en/./users/09_refreshing_feeds.md:22
  6781. #, markdown-text, no-wrap
  6782. msgid "Complete update"
  6783. msgstr ""
  6784. #. type: Plain text
  6785. #: en/./users/09_refreshing_feeds.md:25
  6786. #, markdown-text
  6787. msgid ""
  6788. "This update occurs on all feeds. To trigger it, simply click on the update "
  6789. "link in the navigation menu."
  6790. msgstr ""
  6791. #. type: Plain text
  6792. #: en/./users/09_refreshing_feeds.md:27
  6793. #, markdown-text
  6794. msgid "![Navigation menu](../img/users/refresh.1.png)"
  6795. msgstr ""
  6796. #. type: Plain text
  6797. #: en/./users/09_refreshing_feeds.md:29
  6798. #, markdown-text
  6799. msgid ""
  6800. "When the update starts, a progress bar appears and changes while feeds are "
  6801. "processed."
  6802. msgstr ""
  6803. #. type: Plain text
  6804. #: en/./users/09_refreshing_feeds.md:31
  6805. #, markdown-text
  6806. msgid "![Progress bar](../img/users/refresh.5.png)"
  6807. msgstr ""
  6808. #. type: Title ###
  6809. #: en/./users/09_refreshing_feeds.md:32
  6810. #, markdown-text, no-wrap
  6811. msgid "Partial update"
  6812. msgstr ""
  6813. #. type: Plain text
  6814. #: en/./users/09_refreshing_feeds.md:35
  6815. #, markdown-text
  6816. msgid ""
  6817. "This update occurs on the selected feed only. To trigger it, simply click on "
  6818. "the update link in the feed menu."
  6819. msgstr ""
  6820. #. type: Plain text
  6821. #: en/./users/09_refreshing_feeds.md:37
  6822. #, markdown-text
  6823. msgid "![Feed menu](../img/users/refresh.2.png)"
  6824. msgstr ""
  6825. #. type: Title ##
  6826. #: en/./users/09_refreshing_feeds.md:38
  6827. #, markdown-text, no-wrap
  6828. msgid "Automatic update with cron"
  6829. msgstr ""
  6830. #. type: Plain text
  6831. #: en/./users/09_refreshing_feeds.md:41
  6832. #, markdown-text
  6833. msgid "This is the recommended method."
  6834. msgstr ""
  6835. #. type: Plain text
  6836. #: en/./users/09_refreshing_feeds.md:43
  6837. #, markdown-text
  6838. msgid ""
  6839. "This method is only available if you have access to the scheduled tasks of "
  6840. "the machine on which your FreshRSS instance is installed."
  6841. msgstr ""
  6842. #. type: Plain text
  6843. #: en/./users/09_refreshing_feeds.md:45
  6844. #, markdown-text
  6845. msgid ""
  6846. "The script is named *actualize_script.php* and is located in the *app* "
  6847. "folder. The scheduled task syntax will not be explained here. However, here "
  6848. "is [a quick introduction to "
  6849. "crontab](http://www.adminschoice.com/crontab-quick-reference/) that might "
  6850. "help you."
  6851. msgstr ""
  6852. #. type: Plain text
  6853. #: en/./users/09_refreshing_feeds.md:47
  6854. #, markdown-text
  6855. msgid "Here is an example to trigger article update every hour."
  6856. msgstr ""
  6857. #. type: Fenced code block (cron)
  6858. #: en/./users/09_refreshing_feeds.md:48
  6859. #, no-wrap
  6860. msgid ""
  6861. "0 * * * * php /path/to/FreshRSS/app/actualize_script.php > /tmp/FreshRSS.log "
  6862. "2>&1\n"
  6863. msgstr ""
  6864. #. type: Title ##
  6865. #: en/./users/09_refreshing_feeds.md:52
  6866. #, markdown-text, no-wrap
  6867. msgid "Online cron"
  6868. msgstr ""
  6869. #. type: Plain text
  6870. #: en/./users/09_refreshing_feeds.md:55
  6871. #, markdown-text
  6872. msgid ""
  6873. "If you do not have access to the installation server scheduled task, you can "
  6874. "still automate the update process."
  6875. msgstr ""
  6876. #. type: Plain text
  6877. #: en/./users/09_refreshing_feeds.md:58
  6878. #, markdown-text
  6879. msgid ""
  6880. "To do so, you need to create a scheduled task, which need to call a specific "
  6881. "URL: <https://freshrss.example.net/i/?c=feed&a=actualize> (it could be "
  6882. "different depending on your installation). Depending on your application "
  6883. "authentication method, you need to adapt the scheduled task."
  6884. msgstr ""
  6885. #. type: Plain text
  6886. #: en/./users/09_refreshing_feeds.md:60
  6887. #, markdown-text
  6888. msgid "Special parameters to configure the script - all parameters can be combined:"
  6889. msgstr ""
  6890. #. type: Plain text
  6891. #: en/./users/09_refreshing_feeds.md:64
  6892. #, markdown-text
  6893. msgid ""
  6894. "- Parameter \"force\" "
  6895. "<https://freshrss.example.net/i/?c=feed&a=actualize&force=1> If *force* is "
  6896. "set to 1 all feeds will be refreshed at once."
  6897. msgstr ""
  6898. #. type: Plain text
  6899. #: en/./users/09_refreshing_feeds.md:68
  6900. #, markdown-text
  6901. msgid ""
  6902. "- Parameter \"ajax\" "
  6903. "<https://freshrss.example.net/i/?c=feed&a=actualize&ajax=1> Only a status "
  6904. "site is returned and not a complete website. Example: \"OK\""
  6905. msgstr ""
  6906. #. type: Plain text
  6907. #: en/./users/09_refreshing_feeds.md:72
  6908. #, markdown-text
  6909. msgid ""
  6910. "- Parameter \"maxFeeds\" "
  6911. "<https://freshrss.example.net/i/?c=feed&a=actualize&maxFeeds=30> If "
  6912. "*maxFeeds* is set the configured amount of feeds is refreshed at once. The "
  6913. "default setting is \"10\"."
  6914. msgstr ""
  6915. #. type: Plain text
  6916. #: en/./users/09_refreshing_feeds.md:76
  6917. #, markdown-text
  6918. msgid ""
  6919. "- Parameter \"token\" "
  6920. "<https://freshrss.example.net/i/?c=feed&a=actualize&token=542345872345734> "
  6921. "Security parameter to prevent unauthorized refreshes. For detailed "
  6922. "Documentation see \"Form authentication\"."
  6923. msgstr ""
  6924. #. type: Title ###
  6925. #: en/./users/09_refreshing_feeds.md:77
  6926. #, markdown-text, no-wrap
  6927. msgid "For Form Authentication"
  6928. msgstr ""
  6929. #. type: Plain text
  6930. #: en/./users/09_refreshing_feeds.md:80
  6931. #, markdown-text
  6932. msgid ""
  6933. "If your FreshRSS instance is using Form Authentication, you can configure an "
  6934. "authentication token to grant access to the online cron."
  6935. msgstr ""
  6936. #. type: Plain text
  6937. #: en/./users/09_refreshing_feeds.md:82
  6938. #, markdown-text
  6939. msgid "![Token configuration](../img/users/token.1.png)"
  6940. msgstr ""
  6941. #. type: Plain text
  6942. #: en/./users/09_refreshing_feeds.md:84
  6943. #, markdown-text
  6944. msgid ""
  6945. "You can target a specific user by adding their username to the query string, "
  6946. "with `&user=insert-username`:"
  6947. msgstr ""
  6948. #. type: Plain text
  6949. #: en/./users/09_refreshing_feeds.md:86
  6950. #, markdown-text
  6951. msgid "The scheduled task syntax should look as follows:"
  6952. msgstr ""
  6953. #. type: Plain text
  6954. #: en/./users/09_refreshing_feeds.md:88
  6955. #, markdown-text
  6956. msgid "<https://freshrss.example.net/i/?c=feed&a=actualize&maxFeeds=10&ajax=1&user=someone&token=my-token>"
  6957. msgstr ""
  6958. #. type: Plain text
  6959. #: en/./users/09_refreshing_feeds.md:90
  6960. #, markdown-text
  6961. msgid ""
  6962. "Alternatively, but not recommended, if you configure the application to "
  6963. "allow anonymous reading, you can also allow anonymous users to update feeds "
  6964. "(“Allow anonymous refresh of the articles”), and that does not require a "
  6965. "token."
  6966. msgstr ""
  6967. #. type: Plain text
  6968. #: en/./users/09_refreshing_feeds.md:92
  6969. #, markdown-text
  6970. msgid "![Anonymous access configuration](../img/users/anonymous_access.1.png)"
  6971. msgstr ""
  6972. #. type: Title ###
  6973. #: en/./users/09_refreshing_feeds.md:93
  6974. #, markdown-text, no-wrap
  6975. msgid "For HTTP authentication"
  6976. msgstr ""
  6977. #. type: Plain text
  6978. #: en/./users/09_refreshing_feeds.md:96
  6979. #, markdown-text
  6980. msgid ""
  6981. "If your FreshRSS instance is using HTTP authentication, you’ll need to "
  6982. "provide your credentials to the scheduled task."
  6983. msgstr ""
  6984. #. type: Plain text
  6985. #: en/./users/09_refreshing_feeds.md:98
  6986. #, markdown-text, no-wrap
  6987. msgid ""
  6988. "**Note:** This method is discouraged as your credentials are stored in plain "
  6989. "text.\n"
  6990. msgstr ""
  6991. #. type: Fenced code block (cron)
  6992. #: en/./users/09_refreshing_feeds.md:99
  6993. #, no-wrap
  6994. msgid ""
  6995. "0 * * * * curl -u alice:password123 "
  6996. "'https://freshrss.example.net/i/?c=feed&a=actualize&maxFeeds=10&ajax=1&user=alice'\n"
  6997. msgstr ""
  6998. #. type: Plain text
  6999. #: en/./users/09_refreshing_feeds.md:104
  7000. #, markdown-text
  7001. msgid "On some systems, that syntax might also work:"
  7002. msgstr ""
  7003. #. type: Plain text
  7004. #: en/./users/09_refreshing_feeds.md:106
  7005. #, markdown-text
  7006. msgid "<https://alice:password123@freshrss.example.net/i/?c=feed&a=actualize&maxFeeds=10&ajax=1&user=alice>"
  7007. msgstr ""
  7008. #. type: Title ###
  7009. #: en/./users/09_refreshing_feeds.md:107
  7010. #, markdown-text, no-wrap
  7011. msgid "For No authentication (None)"
  7012. msgstr ""
  7013. #. type: Plain text
  7014. #: en/./users/09_refreshing_feeds.md:110
  7015. #, markdown-text
  7016. msgid ""
  7017. "If your FreshRSS instance uses no authentication (public instance, default "
  7018. "user):"
  7019. msgstr ""
  7020. #. type: Plain text
  7021. #: en/./users/09_refreshing_feeds.md:112
  7022. #, markdown-text
  7023. msgid "<https://freshrss.example.net/i/?c=feed&a=actualize&maxFeeds=10&ajax=1>"
  7024. msgstr ""
  7025. #. type: Title ##
  7026. #: en/./users/09_refreshing_feeds.md:113
  7027. #, markdown-text, no-wrap
  7028. msgid "Feed configuration of “Do not automatically refresh more often than”"
  7029. msgstr ""
  7030. #. type: Title ###
  7031. #: en/./users/09_refreshing_feeds.md:115
  7032. #, markdown-text, no-wrap
  7033. msgid "Background"
  7034. msgstr ""
  7035. #. type: Plain text
  7036. #: en/./users/09_refreshing_feeds.md:118
  7037. #, markdown-text
  7038. msgid ""
  7039. "FreshRSS does not, by design, supports pull refreshes at frequencies higher "
  7040. "than once every 15 minutes. But FreshRSS supports instant push (WebSub)."
  7041. msgstr ""
  7042. #. type: Plain text
  7043. #: en/./users/09_refreshing_feeds.md:120
  7044. #, markdown-text
  7045. msgid ""
  7046. "FreshRSS is part of an RSS ecosystem. A typical reaction that we have seen "
  7047. "from several servers is to simply ban by, IP, user-agent, or to remove their "
  7048. "RSS feed altogether. Bad user behaviours affect the larger community."
  7049. msgstr ""
  7050. #. type: Title ###
  7051. #: en/./users/09_refreshing_feeds.md:121
  7052. #, markdown-text, no-wrap
  7053. msgid "Default value"
  7054. msgstr ""
  7055. #. type: Plain text
  7056. #: en/./users/09_refreshing_feeds.md:124
  7057. #, markdown-text, no-wrap
  7058. msgid ""
  7059. "The default value of “Do not automatically refresh more often than” is set "
  7060. "in Configuration -> Archiving.\n"
  7061. msgstr ""
  7062. #. type: Plain text
  7063. #: en/./users/09_refreshing_feeds.md:126
  7064. #, markdown-text
  7065. msgid ""
  7066. "The lowest global/default purposely cannot be set faster than every 20 "
  7067. "minutes, to avoid wasting resources and make sure the RSS ecosystem remains "
  7068. "sane."
  7069. msgstr ""
  7070. #. type: Title ###
  7071. #: en/./users/09_refreshing_feeds.md:127
  7072. #, markdown-text, no-wrap
  7073. msgid "Individual feed configuration"
  7074. msgstr ""
  7075. #. type: Plain text
  7076. #: en/./users/09_refreshing_feeds.md:130
  7077. #, markdown-text
  7078. msgid "Under the settings for individual feeds, you can go down to 15min."
  7079. msgstr ""
  7080. #. type: Plain text
  7081. #: en/./users/09_refreshing_feeds.md:134
  7082. #, markdown-text
  7083. msgid ""
  7084. "Read more: - [Normal, Global and Reader view](./03_Main_view.md) - [Filter "
  7085. "the feeds and search](./10_filter.md)"
  7086. msgstr ""
  7087. #. type: Title #
  7088. #: en/./users/10_filter.md:2
  7089. #, markdown-text, no-wrap
  7090. msgid "Filtering articles"
  7091. msgstr ""
  7092. #. type: Title ##
  7093. #: en/./users/10_filter.md:4
  7094. #, markdown-text, no-wrap
  7095. msgid "Purpose"
  7096. msgstr ""
  7097. #. type: Plain text
  7098. #: en/./users/10_filter.md:7
  7099. #, markdown-text
  7100. msgid ""
  7101. "When the number of articles stored by FreshRSS inevitably grows larger, it’s "
  7102. "important to use efficient filters to display only a subset of the "
  7103. "articles. There are several methods that filter with different "
  7104. "criteria. Usually those methods can be combined."
  7105. msgstr ""
  7106. #. type: Title ##
  7107. #: en/./users/10_filter.md:8
  7108. #, markdown-text, no-wrap
  7109. msgid "By category"
  7110. msgstr ""
  7111. #. type: Plain text
  7112. #: en/./users/10_filter.md:11
  7113. #, markdown-text
  7114. msgid ""
  7115. "This is the easiest method. You only need to click on the category title in "
  7116. "the side panel. There are two special categories at the top of the panel:"
  7117. msgstr ""
  7118. #. type: Bullet: '* '
  7119. #: en/./users/10_filter.md:14
  7120. #, markdown-text
  7121. msgid ""
  7122. "*Main feed* displays only articles from feeds marked as available in that "
  7123. "category"
  7124. msgstr ""
  7125. #. type: Bullet: '* '
  7126. #: en/./users/10_filter.md:14
  7127. #, markdown-text
  7128. msgid "*Favourites* displays only articles marked as favourites"
  7129. msgstr ""
  7130. #. type: Title ##
  7131. #: en/./users/10_filter.md:15
  7132. #, markdown-text, no-wrap
  7133. msgid "By feed"
  7134. msgstr ""
  7135. #. type: Plain text
  7136. #: en/./users/10_filter.md:18
  7137. #, markdown-text
  7138. msgid "There are several methods to filter articles by feed:"
  7139. msgstr ""
  7140. #. type: Bullet: '* '
  7141. #: en/./users/10_filter.md:23
  7142. #, markdown-text
  7143. msgid "by clicking the feed title in the side panel"
  7144. msgstr ""
  7145. #. type: Bullet: '* '
  7146. #: en/./users/10_filter.md:23
  7147. #, markdown-text
  7148. msgid "by clicking the feed title in the article details"
  7149. msgstr ""
  7150. #. type: Bullet: '* '
  7151. #: en/./users/10_filter.md:23
  7152. #, markdown-text
  7153. msgid "by filtering in the feed options from the side panel"
  7154. msgstr ""
  7155. #. type: Bullet: '* '
  7156. #: en/./users/10_filter.md:23
  7157. #, markdown-text
  7158. msgid "by filtering in the feed configuration"
  7159. msgstr ""
  7160. #. type: Plain text
  7161. #: en/./users/10_filter.md:25
  7162. #, markdown-text
  7163. msgid "![Feed filter](../img/users/feed.filter.1.png)"
  7164. msgstr ""
  7165. #. type: Title ##
  7166. #: en/./users/10_filter.md:26
  7167. #, markdown-text, no-wrap
  7168. msgid "By status"
  7169. msgstr ""
  7170. #. type: Plain text
  7171. #: en/./users/10_filter.md:29
  7172. #, markdown-text
  7173. msgid ""
  7174. "Each article has two attributes that can be combined. The first attribute "
  7175. "indicates whether or not the article has been read. The second attribute "
  7176. "indicates if the article was marked as favorite or not."
  7177. msgstr ""
  7178. #. type: Plain text
  7179. #: en/./users/10_filter.md:31
  7180. #, markdown-text
  7181. msgid ""
  7182. "In version 0.7, attribute filters are available in the article display "
  7183. "dropdown list. With this version, it’s not possible to combine filters. For "
  7184. "instance, it’s not possible to display only read and favorite articles."
  7185. msgstr ""
  7186. #. type: Plain text
  7187. #: en/./users/10_filter.md:33
  7188. #, markdown-text
  7189. msgid "![Attribute filters in 0.7](../img/users/status.filter.0.7.png)"
  7190. msgstr ""
  7191. #. type: Plain text
  7192. #: en/./users/10_filter.md:35
  7193. #, markdown-text
  7194. msgid ""
  7195. "Starting with version 0.8, all attribute filters are visible as toggle "
  7196. "icons. They can be combined. As any combination is possible, some have the "
  7197. "same result. For instance, the result for all filters selected is the same "
  7198. "as no filter selected."
  7199. msgstr ""
  7200. #. type: Plain text
  7201. #: en/./users/10_filter.md:37
  7202. #, markdown-text
  7203. msgid "![Attribute filters in 0.8](../img/users/status.filter.0.8.png)"
  7204. msgstr ""
  7205. #. type: Plain text
  7206. #: en/./users/10_filter.md:39
  7207. #, markdown-text
  7208. msgid "By default, this filter displays only unread articles"
  7209. msgstr ""
  7210. #. type: Title ##
  7211. #: en/./users/10_filter.md:40
  7212. #, markdown-text, no-wrap
  7213. msgid "By content"
  7214. msgstr ""
  7215. #. type: Plain text
  7216. #: en/./users/10_filter.md:43
  7217. #, markdown-text
  7218. msgid ""
  7219. "It is possible to filter articles by their content by inputting a string in "
  7220. "the search field."
  7221. msgstr ""
  7222. #. type: Title ##
  7223. #: en/./users/10_filter.md:44
  7224. #, markdown-text, no-wrap
  7225. msgid "With the search field"
  7226. msgstr ""
  7227. #. type: Plain text
  7228. #: en/./users/10_filter.md:47
  7229. #, markdown-text
  7230. msgid "You can use the search field to further refine results:"
  7231. msgstr ""
  7232. #. type: Bullet: '* '
  7233. #: en/./users/10_filter.md:93
  7234. #, markdown-text
  7235. msgid "by feed ID: `f:123` or multiple feed IDs (*or*): `f:123,234,345`"
  7236. msgstr ""
  7237. #. type: Bullet: '* '
  7238. #: en/./users/10_filter.md:93
  7239. #, markdown-text
  7240. msgid "by author: `author:name` or `author:'composed name'`"
  7241. msgstr ""
  7242. #. type: Bullet: '* '
  7243. #: en/./users/10_filter.md:93
  7244. #, markdown-text
  7245. msgid "by title: `intitle:keyword` or `intitle:'composed keyword'`"
  7246. msgstr ""
  7247. #. type: Bullet: '* '
  7248. #: en/./users/10_filter.md:93
  7249. #, markdown-text
  7250. msgid "by URL: `inurl:keyword` or `inurl:'composed keyword'`"
  7251. msgstr ""
  7252. #. type: Bullet: '* '
  7253. #: en/./users/10_filter.md:93
  7254. #, markdown-text
  7255. msgid "by tag: `#tag` or `#tag+with+whitespace`"
  7256. msgstr ""
  7257. #. type: Bullet: '* '
  7258. #: en/./users/10_filter.md:93
  7259. #, markdown-text
  7260. msgid "by free-text: `keyword` or `'composed keyword'`"
  7261. msgstr ""
  7262. #. type: Bullet: '* '
  7263. #: en/./users/10_filter.md:93
  7264. #, markdown-text
  7265. msgid ""
  7266. "by date of discovery, using the [ISO 8601 time interval "
  7267. "format](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals): "
  7268. "`date:<date-interval>`"
  7269. msgstr ""
  7270. #. type: Bullet: ' * '
  7271. #: en/./users/10_filter.md:93
  7272. #, markdown-text
  7273. msgid "From a specific day, or month, or year:"
  7274. msgstr ""
  7275. #. type: Bullet: ' * '
  7276. #: en/./users/10_filter.md:93
  7277. #, markdown-text
  7278. msgid "`date:2014-03-30`"
  7279. msgstr ""
  7280. #. type: Bullet: ' * '
  7281. #: en/./users/10_filter.md:93
  7282. #, markdown-text
  7283. msgid "`date:2014-03` or `date:201403`"
  7284. msgstr ""
  7285. #. type: Bullet: ' * '
  7286. #: en/./users/10_filter.md:93
  7287. #, markdown-text
  7288. msgid "`date:2014`"
  7289. msgstr ""
  7290. #. type: Bullet: ' * '
  7291. #: en/./users/10_filter.md:93
  7292. #, markdown-text
  7293. msgid "From a specific time of a given day:"
  7294. msgstr ""
  7295. #. type: Bullet: ' * '
  7296. #: en/./users/10_filter.md:93
  7297. #, markdown-text
  7298. msgid "`date:2014-05-30T13`"
  7299. msgstr ""
  7300. #. type: Bullet: ' * '
  7301. #: en/./users/10_filter.md:93
  7302. #, markdown-text
  7303. msgid "`date:2014-05-30T13:30`"
  7304. msgstr ""
  7305. #. type: Bullet: ' * '
  7306. #: en/./users/10_filter.md:93
  7307. #, markdown-text
  7308. msgid "Between two given dates:"
  7309. msgstr ""
  7310. #. type: Bullet: ' * '
  7311. #: en/./users/10_filter.md:93
  7312. #, markdown-text
  7313. msgid "`date:2014-02/2014-04`"
  7314. msgstr ""
  7315. #. type: Bullet: ' * '
  7316. #: en/./users/10_filter.md:93
  7317. #, markdown-text
  7318. msgid "`date:2014-02--2014-04`"
  7319. msgstr ""
  7320. #. type: Bullet: ' * '
  7321. #: en/./users/10_filter.md:93
  7322. #, markdown-text
  7323. msgid "`date:2014-02/04`"
  7324. msgstr ""
  7325. #. type: Bullet: ' * '
  7326. #: en/./users/10_filter.md:93
  7327. #, markdown-text
  7328. msgid "`date:2014-02-03/05`"
  7329. msgstr ""
  7330. #. type: Bullet: ' * '
  7331. #: en/./users/10_filter.md:93
  7332. #, markdown-text
  7333. msgid "`date:2014-02-03T22:00/22:15`"
  7334. msgstr ""
  7335. #. type: Bullet: ' * '
  7336. #: en/./users/10_filter.md:93
  7337. #, markdown-text
  7338. msgid "`date:2014-02-03T22:00/15`"
  7339. msgstr ""
  7340. #. type: Bullet: ' * '
  7341. #: en/./users/10_filter.md:93
  7342. #, markdown-text
  7343. msgid "After a given date:"
  7344. msgstr ""
  7345. #. type: Bullet: ' * '
  7346. #: en/./users/10_filter.md:93
  7347. #, markdown-text
  7348. msgid "`date:2014-03/`"
  7349. msgstr ""
  7350. #. type: Bullet: ' * '
  7351. #: en/./users/10_filter.md:93
  7352. #, markdown-text
  7353. msgid "Before a given date:"
  7354. msgstr ""
  7355. #. type: Bullet: ' * '
  7356. #: en/./users/10_filter.md:93
  7357. #, markdown-text
  7358. msgid "`date:/2014-03`"
  7359. msgstr ""
  7360. #. type: Bullet: ' * '
  7361. #: en/./users/10_filter.md:93
  7362. #, markdown-text
  7363. msgid "For a specific duration after a given date:"
  7364. msgstr ""
  7365. #. type: Bullet: ' * '
  7366. #: en/./users/10_filter.md:93
  7367. #, markdown-text
  7368. msgid "`date:2014-03/P1W`"
  7369. msgstr ""
  7370. #. type: Bullet: ' * '
  7371. #: en/./users/10_filter.md:93
  7372. #, markdown-text
  7373. msgid "For a specific duration before a given date:"
  7374. msgstr ""
  7375. #. type: Bullet: ' * '
  7376. #: en/./users/10_filter.md:93
  7377. #, markdown-text
  7378. msgid "`date:P1W/2014-05-25T23:59:59`"
  7379. msgstr ""
  7380. #. type: Bullet: ' * '
  7381. #: en/./users/10_filter.md:93
  7382. #, markdown-text
  7383. msgid "For the past duration before now (the trailing slash is optional):"
  7384. msgstr ""
  7385. #. type: Bullet: ' * '
  7386. #: en/./users/10_filter.md:93
  7387. #, markdown-text
  7388. msgid "`date:P1Y/` or `date:P1Y` (past year)"
  7389. msgstr ""
  7390. #. type: Bullet: ' * '
  7391. #: en/./users/10_filter.md:93
  7392. #, markdown-text
  7393. msgid "`date:P2M/` (past two months)"
  7394. msgstr ""
  7395. #. type: Bullet: ' * '
  7396. #: en/./users/10_filter.md:93
  7397. #, markdown-text
  7398. msgid "`date:P3W/` (past three weeks)"
  7399. msgstr ""
  7400. #. type: Bullet: ' * '
  7401. #: en/./users/10_filter.md:93
  7402. #, markdown-text
  7403. msgid "`date:P4D/` (past four days)"
  7404. msgstr ""
  7405. #. type: Bullet: ' * '
  7406. #: en/./users/10_filter.md:93
  7407. #, markdown-text
  7408. msgid "`date:PT5H/` (past five hours)"
  7409. msgstr ""
  7410. #. type: Bullet: ' * '
  7411. #: en/./users/10_filter.md:93
  7412. #, markdown-text
  7413. msgid "`date:PT30M/` (past thirty minutes)"
  7414. msgstr ""
  7415. #. type: Bullet: ' * '
  7416. #: en/./users/10_filter.md:93
  7417. #, markdown-text
  7418. msgid "`date:PT90S/` (past ninety seconds)"
  7419. msgstr ""
  7420. #. type: Bullet: ' * '
  7421. #: en/./users/10_filter.md:93
  7422. #, markdown-text
  7423. msgid "`date:P1DT1H/` (past one day and one hour)"
  7424. msgstr ""
  7425. #. type: Bullet: '* '
  7426. #: en/./users/10_filter.md:93
  7427. #, markdown-text
  7428. msgid "by date of publication, using the same format: `pubdate:<date-interval>`"
  7429. msgstr ""
  7430. #. type: Bullet: '* '
  7431. #: en/./users/10_filter.md:93
  7432. #, markdown-text
  7433. msgid ""
  7434. "by custom label ID `L:12` or multiple label IDs: `L:12,13,14` or with any "
  7435. "label: `L:*`"
  7436. msgstr ""
  7437. #. type: Bullet: '* '
  7438. #: en/./users/10_filter.md:93
  7439. #, markdown-text
  7440. msgid ""
  7441. "by custom label name `label:label`, `label:\"my label\"` or any label name "
  7442. "from a list (*or*): `labels:\"my label,my other label\"`"
  7443. msgstr ""
  7444. #. type: Bullet: '* '
  7445. #: en/./users/10_filter.md:93
  7446. #, markdown-text
  7447. msgid ""
  7448. "by several label names (*and*): `label:\"my label\" label:\"my other "
  7449. "label\"`"
  7450. msgstr ""
  7451. #. type: Bullet: '* '
  7452. #: en/./users/10_filter.md:93
  7453. #, markdown-text
  7454. msgid ""
  7455. "by entry (article) ID: `e:1639310674957894` or multiple entry IDs (*or*): "
  7456. "`e:1639310674957894,1639310674957893`"
  7457. msgstr ""
  7458. #. type: Bullet: '* '
  7459. #: en/./users/10_filter.md:93
  7460. #, markdown-text
  7461. msgid ""
  7462. "by user query (saved search) name: `search:myQuery`, `search:\"My query\"` "
  7463. "or saved search ID: `S:3`"
  7464. msgstr ""
  7465. #. type: Bullet: ' * '
  7466. #: en/./users/10_filter.md:93
  7467. #, markdown-text
  7468. msgid ""
  7469. "internally, those references are replaced by the corresponding user query in "
  7470. "the search expression"
  7471. msgstr ""
  7472. #. type: Plain text
  7473. #: en/./users/10_filter.md:95
  7474. #, markdown-text
  7475. msgid "Be careful not to enter a space between the operator and the search value."
  7476. msgstr ""
  7477. #. type: Plain text
  7478. #: en/./users/10_filter.md:98
  7479. #, markdown-text
  7480. msgid ""
  7481. "Some operators can be used negatively, to exclude articles, with the same "
  7482. "syntax as above, but prefixed by a `!` or `-`: `!f:234`, `-author:name`, "
  7483. "`-intitle:keyword`, `-inurl:keyword`, `-#tag`, `!keyword`, `!date:2019`, "
  7484. "`!date:P1W`, `!pubdate:P3d/`."
  7485. msgstr ""
  7486. #. type: Plain text
  7487. #: en/./users/10_filter.md:101
  7488. #, markdown-text
  7489. msgid ""
  7490. "It is also possible to combine keywords to create a more precise filter. "
  7491. "For example, you can enter multiple instances of `f:`, `author:`, "
  7492. "`intitle:`, `inurl:`, `#`, and free-text."
  7493. msgstr ""
  7494. #. type: Plain text
  7495. #: en/./users/10_filter.md:104
  7496. #, markdown-text
  7497. msgid ""
  7498. "Combining several search criteria implies a logical *and*, but the keyword ` "
  7499. "OR ` can be used to combine several search criteria with a logical *or* "
  7500. "instead: `author:Dupont OR author:Dupond`"
  7501. msgstr ""
  7502. #. type: Plain text
  7503. #: en/./users/10_filter.md:107
  7504. #, markdown-text
  7505. msgid ""
  7506. "You don’t have to do anything special to combine multiple negative "
  7507. "operators. Writing `!intitle:'thing1' !intitle:'thing2'` implies AND, see "
  7508. "above. For more pointers on how AND and OR interact with negation, see [this "
  7509. "GitHub "
  7510. "comment](https://github.com/FreshRSS/FreshRSS/issues/3236#issuecomment-891219460). "
  7511. "Additional reading: [De Morgan’s "
  7512. "laws](https://en.wikipedia.org/wiki/De_Morgan%27s_laws)."
  7513. msgstr ""
  7514. #. type: Plain text
  7515. #: en/./users/10_filter.md:109
  7516. #, markdown-text
  7517. msgid ""
  7518. "Finally, parentheses may be used to express more complex queries, with basic "
  7519. "negation support:"
  7520. msgstr ""
  7521. #. type: Bullet: '* '
  7522. #: en/./users/10_filter.md:115
  7523. #, markdown-text
  7524. msgid "`(author:Alice OR intitle:hello) (author:Bob OR intitle:world)`"
  7525. msgstr ""
  7526. #. type: Bullet: '* '
  7527. #: en/./users/10_filter.md:115
  7528. #, markdown-text
  7529. msgid "`(author:Alice intitle:hello) OR (author:Bob intitle:world)`"
  7530. msgstr ""
  7531. #. type: Bullet: '* '
  7532. #: en/./users/10_filter.md:115
  7533. #, markdown-text
  7534. msgid "`!((author:Alice intitle:hello) OR (author:Bob intitle:world))`"
  7535. msgstr ""
  7536. #. type: Bullet: '* '
  7537. #: en/./users/10_filter.md:115
  7538. #, markdown-text
  7539. msgid "`(author:Alice intitle:hello) !(author:Bob intitle:world)`"
  7540. msgstr ""
  7541. #. type: Bullet: '* '
  7542. #: en/./users/10_filter.md:115
  7543. #, markdown-text
  7544. msgid "`!(S:1 OR S:2)`"
  7545. msgstr ""
  7546. #. type: Plain text
  7547. #: en/./users/10_filter.md:117
  7548. #, markdown-text, no-wrap
  7549. msgid ""
  7550. "> ℹ️ If you need to search for a parenthesis, it needs to be escaped like "
  7551. "`\\(` or `\\)`\n"
  7552. msgstr ""
  7553. #. type: Title ##
  7554. #: en/./users/10_filter.md:118
  7555. #, markdown-text, no-wrap
  7556. msgid "By sorting by date"
  7557. msgstr ""
  7558. #. type: Plain text
  7559. #: en/./users/10_filter.md:121
  7560. #, markdown-text
  7561. msgid ""
  7562. "You can change the sort order by clicking the toggle button available in the "
  7563. "header."
  7564. msgstr ""
  7565. #. type: Title ##
  7566. #: en/./users/10_filter.md:122
  7567. #, markdown-text, no-wrap
  7568. msgid "Store your filters"
  7569. msgstr ""
  7570. #. type: Plain text
  7571. #: en/./users/10_filter.md:125
  7572. #, markdown-text
  7573. msgid ""
  7574. "Once you came up with your perfect filter, it would be a shame if you need "
  7575. "to recreate it every time you need to use it."
  7576. msgstr ""
  7577. #. type: Plain text
  7578. #: en/./users/10_filter.md:129
  7579. #, markdown-text
  7580. msgid ""
  7581. "Hopefully, there is a way to bookmark them for later use. We call them "
  7582. "*user queries*. You can create as many as you want, the only limit is how "
  7583. "they will be displayed on your screen."
  7584. msgstr ""
  7585. #. type: Title ###
  7586. #: en/./users/10_filter.md:130
  7587. #, markdown-text, no-wrap
  7588. msgid "Bookmark the current query"
  7589. msgstr ""
  7590. #. type: Plain text
  7591. #: en/./users/10_filter.md:134
  7592. #, markdown-text
  7593. msgid ""
  7594. "Display the user queries drop-down by clicking the button next to the state "
  7595. "buttons. ![User queries "
  7596. "drop-down](../img/users/user.queries.drop-down.empty.png)"
  7597. msgstr ""
  7598. #. type: Plain text
  7599. #: en/./users/10_filter.md:136
  7600. #, markdown-text
  7601. msgid "Then click on the bookmark action."
  7602. msgstr ""
  7603. #. type: Plain text
  7604. #: en/./users/10_filter.md:138
  7605. #, markdown-text
  7606. msgid "Congratulations, you’re done!"
  7607. msgstr ""
  7608. #. type: Title ###
  7609. #: en/./users/10_filter.md:139
  7610. #, markdown-text, no-wrap
  7611. msgid "Using a bookmarked query"
  7612. msgstr ""
  7613. #. type: Plain text
  7614. #: en/./users/10_filter.md:143
  7615. #, markdown-text
  7616. msgid ""
  7617. "Display the user queries drop-down by clicking the button next to the state "
  7618. "buttons. ![User queries "
  7619. "drop-down](../img/users/user.queries.drop-down.not.empty.png)"
  7620. msgstr ""
  7621. #. type: Plain text
  7622. #: en/./users/10_filter.md:145
  7623. #, markdown-text
  7624. msgid ""
  7625. "Then click on the bookmarked query, the previously stored query will be "
  7626. "applied."
  7627. msgstr ""
  7628. #. type: Plain text
  7629. #: en/./users/10_filter.md:148
  7630. #, markdown-text, no-wrap
  7631. msgid ""
  7632. "> Note that only the query is stored, not the articles.\n"
  7633. "> The results you are seeing now could be different from the results on the "
  7634. "day you've created the query.\n"
  7635. msgstr ""
  7636. #. type: Plain text
  7637. #: en/./users/10_filter.md:152
  7638. #, markdown-text
  7639. msgid ""
  7640. "Read more: * [Normal, Global and Reader view](./03_Main_view.md) * "
  7641. "[Refreshing the feeds](./09_refreshing_feeds.md)"
  7642. msgstr ""