bpy.ops.transform.translate does not work as expected for object just linked from one collection to another
Objects need to be selected.

Since the operator works on all selected objects and you are translating each the same, could select and call the operator once.  Tip only need to set non default values in an operator call

As an example will use default file, and set active object to None and assume no other objects selected

&gt;&gt;&gt; C.view_layer.objects.active = None


Selecting works:

&gt;&gt;&gt; for o in D.collections['Collection 1'].objects:
...     o.select_set(True)
...     
&gt;&gt;&gt; bpy.ops.transform.translate(value=(0, 0, 1))
{'FINISHED'}


Overriding context

&gt;&gt;&gt; c = {"selected_objects" : D.collections['Collection 1'].objects}
&gt;&gt;&gt; bpy.ops.transform.translate(c, value=(0, 0, 1))
{'FINISHED'}


Putting it together to add a copy of each object in 'Collection 1' to 'foo'.

Copies the objects, links them to foo and moves them using one call of overridden operator.  

&gt;&gt;&gt; bpy.ops.object.select_all(action='DESELECT')
{'FINISHED'}

&gt;&gt;&gt; foo = D.collections.new(name="Foo")
&gt;&gt;&gt; C.scene.collection.children.link(foo)


&gt;&gt;&gt; obs = [o.copy() for o in D.collections['Collection 1'].objects]
&gt;&gt;&gt; for o in obs:
...     foo.objects.link(o)
...     

&gt;&gt;&gt; bpy.ops.transform.translate({"selected_objects" : obs}, value=(0, 0, 1))
{'FINISHED'}


Ditch ops when possible


  but still I would like to use the methods that the API provides and
  learn those, instead of patching the matrices directly.


IMO it's the other way around, the operator is basically a bridge between UI and API.  For transforms you are far better off manipulating the matrices directly. There are some ops I would suggest you never use, eg adding a modifier.  Why? see  

https://blender.stackexchange.com/question/7358/python-performance-with-blender-operators

Hence you have already found what would have been my suggestion re answering this and manipulate the matrices directly and not rely on operators and a lot of diddling around to get context.