freshrss.pot 240 KB

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