How do I make my pagination work?

The root of your problem is the call to query_posts. You’re asking WordPress to load a page and template, and pull posts from the database, then throw away those queries, and repeat them all over again but with new parameters.

It’s like asking a PA for a cup of tea every morning, then throwing it away and saying you actually wanted coffee. It’s easier to just ask for coffee the first time.

The new problem here is that WordPress had handled the pagination for you, but you’ve just thrown it all away, and the query you’ve replaced it with has no concept of pagination. If you’re on page 2, how would it know? You haven’t passed in the page 2 option into your query, so it always shows page 1, as you asked it to.

So instead, you should use the pre_get_posts filter. This filter runs before WordPress goes to the database and lets you change the variables passed in. E.g.

// only show 4 posts per page on the homepage
function homepage_set_posts_per_page( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'posts_per_page', 4 );
    }
}
add_filter( 'pre_get_posts', 'homepage_set_posts_per_page' );

You can set and unset the query options this way, and use get and other methods to do more specific checks

If you ever have to display posts that aren’t in the main query/loop, perhaps for a widget or a sidebar, you should use the WP_Query object. e.g.

// lets query the DB for pages
$loop = new WP_Query( array(
    'post_type' => 'page'
));
// did we find posts?
if ( $loop->have_posts() ) {
    // yes we did! yay
    while( $loop->have_posts() ) {
        $loop->the_post();
        // display each post
    }
    // clean up after our loop
    wp_reset_postdata();
} else {
    // no posts found, we don't need to cleanup, but we should probably tell the user we found nothing
}

On the other hand, you could just point users to the /category/publicatii and implement a category-publicatii.php in your theme and sidestep all the hacking queries etc